- {!banner &&
}
{banner &&
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 b3e9950e9..7d59d616d 100644
--- a/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js
+++ b/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js
@@ -1,7 +1,6 @@
import { connect } from 'react-redux';
-import { ReactComponent as NotificationsIcon } from '@material-symbols/svg-600/outlined/notifications-fill.svg';
-
+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 3fd8ff127..658436460 100644
--- a/app/javascript/mastodon/features/ui/components/report_modal.jsx
+++ b/app/javascript/mastodon/features/ui/components/report_modal.jsx
@@ -7,8 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux';
-import { ReactComponent as CloseIcon } from '@material-symbols/svg-600/outlined/close.svg';
-
+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 5e71da9d9..272a3cff0 100644
--- a/app/javascript/mastodon/features/ui/components/zoomable_image.jsx
+++ b/app/javascript/mastodon/features/ui/components/zoomable_image.jsx
@@ -3,9 +3,8 @@ import { PureComponent } from 'react';
import { defineMessages, injectIntl } from 'react-intl';
-import { ReactComponent as FullscreenExitIcon } from '@material-symbols/svg-600/outlined/fullscreen_exit.svg';
-import { ReactComponent as RectangleIcon } from '@material-symbols/svg-600/outlined/rectangle.svg';
-
+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/ui/containers/status_list_container.js b/app/javascript/mastodon/features/ui/containers/status_list_container.js
index 36a8f58f8..5ffa4353f 100644
--- a/app/javascript/mastodon/features/ui/containers/status_list_container.js
+++ b/app/javascript/mastodon/features/ui/containers/status_list_container.js
@@ -1,6 +1,6 @@
+import { createSelector } from '@reduxjs/toolkit';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { connect } from 'react-redux';
-import { createSelector } from 'reselect';
import { debounce } from 'lodash';
@@ -14,7 +14,7 @@ const makeGetStatusIds = (pending = false) => createSelector([
(state) => state.get('statuses'),
], (columnSettings, statusIds, statuses) => {
return statusIds.filter(id => {
- if (id === null) return true;
+ if (id === null || id === 'inline-follow-suggestions') return true;
const statusForId = statuses.get(id);
let showStatus = true;
diff --git a/app/javascript/mastodon/features/video/index.jsx b/app/javascript/mastodon/features/video/index.jsx
index cacc94f96..3141cee72 100644
--- a/app/javascript/mastodon/features/video/index.jsx
+++ b/app/javascript/mastodon/features/video/index.jsx
@@ -7,16 +7,16 @@ import classNames from 'classnames';
import { is } from 'immutable';
-import { ReactComponent as FullscreenIcon } from '@material-symbols/svg-600/outlined/fullscreen.svg';
-import { ReactComponent as FullscreenExitIcon } from '@material-symbols/svg-600/outlined/fullscreen_exit.svg';
-import { ReactComponent as PauseIcon } from '@material-symbols/svg-600/outlined/pause.svg';
-import { ReactComponent as PlayArrowIcon } from '@material-symbols/svg-600/outlined/play_arrow-fill.svg';
-import { ReactComponent as RectangleIcon } from '@material-symbols/svg-600/outlined/rectangle.svg';
-import { ReactComponent as VisibilityOffIcon } from '@material-symbols/svg-600/outlined/visibility_off.svg';
-import { ReactComponent as VolumeOffIcon } from '@material-symbols/svg-600/outlined/volume_off-fill.svg';
-import { ReactComponent as VolumeUpIcon } from '@material-symbols/svg-600/outlined/volume_up-fill.svg';
import { throttle } from 'lodash';
+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/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index 6c37cdf5c..d2ac2f8f2 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -3,6 +3,7 @@
"about.contact": "Kontak:",
"about.disclaimer": "Mastodon is gratis oopbronsagteware en ’n handelsmerk van Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Rede nie beskikbaar nie",
+ "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
"about.domain_blocks.silenced.title": "Beperk",
"about.domain_blocks.suspended.title": "Opgeskort",
"about.not_available": "Hierdie inligting is nie op hierdie bediener beskikbaar gestel nie.",
@@ -65,7 +66,6 @@
"alert.unexpected.message": "Iets het skeefgeloop.",
"alert.unexpected.title": "Oeps!",
"announcement.announcement": "Aankondiging",
- "autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "Druk {combo} om dit volgende keer oor te slaan",
"bundle_column_error.error.title": "Ag nee!",
"bundle_column_error.network.title": "Netwerkfout",
@@ -110,19 +110,12 @@
"compose_form.lock_disclaimer": "Jou rekening is nie {locked} nie. Enigiemand kan jou volg en sien wat jy vir jou volgers plaas.",
"compose_form.lock_disclaimer.lock": "gesluit",
"compose_form.placeholder": "Wat wil jy deel?",
- "compose_form.poll.add_option": "Voeg ’n keuse by",
"compose_form.poll.duration": "Duur van peiling",
- "compose_form.poll.option_placeholder": "Keuse {number}",
- "compose_form.poll.remove_option": "Verwyder hierdie keuse",
"compose_form.poll.switch_to_multiple": "Verander peiling om meer as een keuse toe te laat",
"compose_form.poll.switch_to_single": "Verander die peiling om slegs een keuse toe te laat",
- "compose_form.publish": "Publiseer",
"compose_form.publish_form": "Publiseer",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Stoor veranderinge",
"compose_form.spoiler.marked": "Verwyder inhoudswaarskuwing",
"compose_form.spoiler.unmarked": "Voeg inhoudswaarskuwing by",
- "compose_form.spoiler_placeholder": "Skryf jou waarskuwing hier",
"confirmation_modal.cancel": "Kanselleer",
"confirmations.block.block_and_report": "Blokkeer en rapporteer",
"confirmations.block.confirm": "Blokkeer",
@@ -233,7 +226,6 @@
"navigation_bar.community_timeline": "Plaaslike tydlyn",
"navigation_bar.compose": "Skep nuwe plasing",
"navigation_bar.domain_blocks": "Geblokkeerde domeine",
- "navigation_bar.edit_profile": "Redigeer profiel",
"navigation_bar.lists": "Lyste",
"navigation_bar.logout": "Teken uit",
"navigation_bar.personal": "Persoonlik",
@@ -266,14 +258,7 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Verander privaatheid van plasing",
- "privacy.direct.long": "Slegs sigbaar vir genoemde gebruikers",
- "privacy.direct.short": "Slegs genoemde persone",
- "privacy.private.long": "Slegs sigbaar vir volgelinge",
- "privacy.private.short": "Slegs volgelinge",
- "privacy.public.long": "Sigbaar vir almal",
"privacy.public.short": "Publiek",
- "privacy.unlisted.long": "Sigbaar vir almal, maar onttrek uit verkennings-kenmerke",
- "privacy.unlisted.short": "Ongelys",
"privacy_policy.last_updated": "Laaste bywerking op {date}",
"privacy_policy.title": "Privaatheidsbeleid",
"regeneration_indicator.sublabel": "Jou tuis-voer word voorberei!",
diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json
index 23899b100..e9d609a1c 100644
--- a/app/javascript/mastodon/locales/an.json
+++ b/app/javascript/mastodon/locales/an.json
@@ -75,7 +75,6 @@
"announcement.announcement": "Anuncio",
"attachments_list.unprocessed": "(sin procesar)",
"audio.hide": "Amagar audio",
- "autosuggest_hashtag.per_week": "{count} per semana",
"boost_modal.combo": "Puetz fer clic en {combo} pa blincar este aviso la proxima vegada",
"bundle_column_error.copy_stacktrace": "Copiar informe d'error",
"bundle_column_error.error.body": "La pachina solicitada no podió estar renderizada. Podría deber-se a una error en o nuestro codigo u a un problema de compatibilidat con o navegador.",
@@ -126,22 +125,12 @@
"compose_form.lock_disclaimer": "La tuya cuenta no ye {locked}. Totz pueden seguir-te pa veyer las tuyas publicacions nomás pa seguidores.",
"compose_form.lock_disclaimer.lock": "blocau",
"compose_form.placeholder": "En qué yes pensando?",
- "compose_form.poll.add_option": "Anyadir una opción",
"compose_form.poll.duration": "Duración d'a enqüesta",
- "compose_form.poll.option_placeholder": "Elección {number}",
- "compose_form.poll.remove_option": "Eliminar esta opción",
"compose_form.poll.switch_to_multiple": "Modificar enqüesta pa permitir multiples opcions",
"compose_form.poll.switch_to_single": "Modificar enqüesta pa permitir una sola opción",
- "compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Alzar cambios",
- "compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
- "compose_form.sensitive.marked": "{count, plural, one {Material marcau como sensible} other {Material marcau como sensible}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Material no marcau como sensible} other {Material no marcau como sensible}}",
"compose_form.spoiler.marked": "Texto amagau dimpués de l'alvertencia",
"compose_form.spoiler.unmarked": "Texto no amagau",
- "compose_form.spoiler_placeholder": "Alvertencia de conteniu",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Blocar y Denunciar",
"confirmations.block.confirm": "Blocar",
@@ -345,7 +334,6 @@
"navigation_bar.compose": "Escribir nueva publicación",
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios amagaus",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explorar",
"navigation_bar.filters": "Parolas silenciadas",
"navigation_bar.follow_requests": "Solicitutz pa seguir-te",
@@ -429,14 +417,7 @@
"poll_button.add_poll": "Anyadir una enqüesta",
"poll_button.remove_poll": "Eliminar enqüesta",
"privacy.change": "Achustar privacidat",
- "privacy.direct.long": "Nomás amostrar a los usuarios mencionaus",
- "privacy.direct.short": "Nomás contas mencionadas",
- "privacy.private.long": "Nomás amostrar a seguidores",
- "privacy.private.short": "Solo seguidores",
- "privacy.public.long": "Visible pa totz",
"privacy.public.short": "Publico",
- "privacy.unlisted.long": "Visible pa totz, pero excluyiu d'as funcions d'escubrimiento",
- "privacy.unlisted.short": "No listau",
"privacy_policy.last_updated": "Ultima vegada actualizau {date}",
"privacy_policy.title": "Politica de Privacidat",
"refresh": "Actualizar",
@@ -590,10 +571,8 @@
"upload_error.poll": "Puyada de fichers no permitida con enqüestas.",
"upload_form.audio_description": "Describir pa personas con problemas auditivos",
"upload_form.description": "Describir pa los usuarios con dificultat visual",
- "upload_form.description_missing": "Garra descripción anyadida",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
- "upload_form.undo": "Borrar",
"upload_form.video_description": "Describir pa personas con problemas auditivos u visuals",
"upload_modal.analyzing_picture": "Analisando imachen…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index c0d07cc64..5f2d151fa 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -86,7 +86,6 @@
"announcement.announcement": "إعلان",
"attachments_list.unprocessed": "(غير معالَج)",
"audio.hide": "إخفاء المقطع الصوتي",
- "autosuggest_hashtag.per_week": "{count} في الأسبوع",
"boost_modal.combo": "يُمكنك الضّغط على {combo} لتخطي هذا في المرة المُقبلة",
"bundle_column_error.copy_stacktrace": "انسخ تقرير الخطأ",
"bundle_column_error.error.body": "لا يمكن تقديم الصفحة المطلوبة. قد يكون بسبب خطأ في التعليمات البرمجية، أو مشكلة توافق المتصفح.",
@@ -143,22 +142,12 @@
"compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
"compose_form.lock_disclaimer.lock": "مُقفَل",
"compose_form.placeholder": "فِيمَ تُفكِّر؟",
- "compose_form.poll.add_option": "إضافة خيار",
"compose_form.poll.duration": "مُدَّة اِستطلاع الرأي",
- "compose_form.poll.option_placeholder": "الخيار {number}",
- "compose_form.poll.remove_option": "إزالة هذا الخيار",
"compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
"compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
- "compose_form.publish": "نشر",
"compose_form.publish_form": "منشور جديد",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "احفظ التعديلات",
- "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
- "compose_form.sensitive.marked": "{count, plural, one {تمَّ الإشارة إلى الوسط كمُحتوى حسّاس} two{تمَّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {تمَّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {لم تَتِمّ الإشارة إلى الوسط كمُحتوى حسّاس} two{لم تَتِمّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {لم تَتِمّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
"compose_form.spoiler.marked": "إزالة تحذير المحتوى",
"compose_form.spoiler.unmarked": "إضافة تحذير للمحتوى",
- "compose_form.spoiler_placeholder": "اُكتُب تحذيركَ هُنا",
"confirmation_modal.cancel": "إلغاء",
"confirmations.block.block_and_report": "حظره والإبلاغ عنه",
"confirmations.block.confirm": "حظر",
@@ -402,7 +391,6 @@
"navigation_bar.direct": "الإشارات الخاصة",
"navigation_bar.discover": "اكتشف",
"navigation_bar.domain_blocks": "النطاقات المحظورة",
- "navigation_bar.edit_profile": "عدّل الملف التعريفي",
"navigation_bar.explore": "استكشف",
"navigation_bar.favourites": "المفضلة",
"navigation_bar.filters": "الكلمات المكتومة",
@@ -509,14 +497,7 @@
"poll_button.add_poll": "إضافة استطلاع للرأي",
"poll_button.remove_poll": "إزالة استطلاع الرأي",
"privacy.change": "اضبط خصوصية المنشور",
- "privacy.direct.long": "مرئي للمستخدمين المذكورين فقط",
- "privacy.direct.short": "الأشخاص المشار إليهم فقط",
- "privacy.private.long": "أنشر لمتابعيك فقط",
- "privacy.private.short": "للمتابِعين فقط",
- "privacy.public.long": "مرئي للكل",
"privacy.public.short": "للعامة",
- "privacy.unlisted.long": "مرئي للجميع، ولكن مِن دون ميزات الاكتشاف",
- "privacy.unlisted.short": "غير مدرج",
"privacy_policy.last_updated": "آخر تحديث {date}",
"privacy_policy.title": "سياسة الخصوصية",
"refresh": "أنعِش",
@@ -696,10 +677,8 @@
"upload_error.poll": "لا يمكن إدراج ملفات في استطلاعات الرأي.",
"upload_form.audio_description": "وصف للأشخاص ذي قِصر السمع",
"upload_form.description": "وصف للمعاقين بصريا",
- "upload_form.description_missing": "لم يُضف وصف",
"upload_form.edit": "تعديل",
"upload_form.thumbnail": "غيّر الصورة المصغرة",
- "upload_form.undo": "حذف",
"upload_form.video_description": "وصف للمعاقين بصريا أو لِذي قِصر السمع",
"upload_modal.analyzing_picture": "جارٍ فحص الصورة…",
"upload_modal.apply": "طبّق",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index c4238edcd..479c9c924 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}",
@@ -71,7 +66,6 @@
"alert.unexpected.title": "¡Meca!",
"announcement.announcement": "Anunciu",
"attachments_list.unprocessed": "(ensin procesar)",
- "autosuggest_hashtag.per_week": "{count} per selmana",
"bundle_column_error.error.body": "La páxina solicitada nun se pudo renderizar. Ye posible que seya pola mor d'un fallu nel códigu o por un problema de compatibilidá del restolador.",
"bundle_column_error.error.title": "¡Oh, non!",
"bundle_column_error.network.body": "Hebo un error al tentar de cargar esta páxina. Esto pudo ser pola mor d'un problema temporal cola conexón a internet o con esti sirvidor.",
@@ -108,19 +102,15 @@
"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.",
"compose_form.lock_disclaimer.lock": "privada",
"compose_form.placeholder": "¿En qué pienses?",
- "compose_form.poll.add_option": "Amestar una opción",
"compose_form.poll.option_placeholder": "Opción {number}",
- "compose_form.poll.remove_option": "Quitar esta opción",
- "compose_form.publish": "Espublizar",
+ "compose_form.poll.type": "Estilu",
"compose_form.publish_form": "Artículu nuevu",
- "compose_form.publish_loud": "¡{publish}!",
- "compose_form.save_changes": "Guardar los cambeos",
- "compose_form.spoiler.unmarked": "Text is not hidden",
"confirmation_modal.cancel": "Encaboxar",
"confirmations.block.block_and_report": "Bloquiar ya informar",
"confirmations.block.confirm": "Bloquiar",
@@ -150,6 +140,7 @@
"dismissable_banner.community_timeline": "Esta seición contién los artículos públicos más actuales de los perfiles agospiaos nel dominiu {domain}.",
"dismissable_banner.dismiss": "Escartar",
"dismissable_banner.explore_tags": "Esta seición contién les etiquetes del fediversu que tán ganando popularidá güei. Les etiquetes más usaes polos perfiles apaecen no cimero.",
+ "dismissable_banner.public_timeline": "Esta seición contién los artículos más nuevos de les persones na web social que les persones de {domain} siguen.",
"embed.instructions": "Empotra esti artículu nel to sitiu web pente la copia del códigu d'abaxo.",
"embed.preview": "Va apaecer asina:",
"emoji_button.activity": "Actividá",
@@ -159,6 +150,7 @@
"emoji_button.not_found": "Nun s'atoparon fustaxes que concasen",
"emoji_button.objects": "Oxetos",
"emoji_button.people": "Persones",
+ "emoji_button.recent": "D'usu frecuente",
"emoji_button.search": "Buscar…",
"emoji_button.search_results": "Resultaos de la busca",
"emoji_button.symbols": "Símbolos",
@@ -221,7 +213,6 @@
"hashtag.column_header.tag_mode.any": "o {additional}",
"hashtag.column_header.tag_mode.none": "ensin {additional}",
"hashtag.column_settings.select.no_options_message": "Nun s'atopó nenguna suxerencia",
- "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
"hashtag.counter_by_accounts": "{count, plural, one {{counter} participante} other {{counter} participantes}}",
"hashtag.follow": "Siguir a la etiqueta",
"hashtag.unfollow": "Dexar de siguir a la etiqueta",
@@ -263,7 +254,6 @@
"keyboard_shortcuts.reply": "Responder a un artículu",
"keyboard_shortcuts.requests": "Abrir la llista de solicitúes de siguimientu",
"keyboard_shortcuts.search": "Enfocar la barra de busca",
- "keyboard_shortcuts.spoilers": "to show/hide CW field",
"keyboard_shortcuts.start": "Abrir la columna «Entamar»",
"keyboard_shortcuts.toggle_sensitivity": "Amosar/anubrir el conteníu multimedia",
"keyboard_shortcuts.toot": "Comenzar un artículu nuevu",
@@ -291,7 +281,6 @@
"navigation_bar.community_timeline": "Llinia de tiempu llocal",
"navigation_bar.direct": "Menciones privaes",
"navigation_bar.domain_blocks": "Dominios bloquiaos",
- "navigation_bar.edit_profile": "Editar el perfil",
"navigation_bar.explore": "Esploración",
"navigation_bar.filters": "Pallabres desactivaes",
"navigation_bar.follow_requests": "Solicitúes de siguimientu",
@@ -299,6 +288,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 +324,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.",
@@ -350,12 +340,7 @@
"poll_button.add_poll": "Amestar una encuesta",
"poll_button.remove_poll": "Quitar la encuesta",
"privacy.change": "Configurar la privacidá del artículu",
- "privacy.direct.long": "Artículu visible namás pa los perfiles mentaos",
- "privacy.private.long": "Artículu visible namás pa los perfiles siguidores",
- "privacy.private.short": "Namás pa siguidores",
- "privacy.public.long": "Tol mundu pue ver l'artículu",
"privacy.public.short": "Artículu públicu",
- "privacy.unlisted.long": "Artículu visible pa tol mundu mas escluyíu de les funciones de descubrimientu",
"privacy_policy.last_updated": "Data del últimu anovamientu: {date}",
"privacy_policy.title": "Política de privacidá",
"refresh": "Anovar",
@@ -372,6 +357,7 @@
"relative_time.seconds": "{number} s",
"relative_time.today": "güei",
"reply_indicator.cancel": "Encaboxar",
+ "reply_indicator.poll": "Encuesta",
"report.block": "Bloquiar",
"report.categories.spam": "Spam",
"report.categories.violation": "El conteníu incumple una o más normes del sirvidor",
@@ -415,12 +401,16 @@
"search.quick_action.go_to_hashtag": "Dir a la etiqueta {x}",
"search.quick_action.status_search": "Artículos que concasen con {x}",
"search.search_or_paste": "Busca o apiega una URL",
+ "search_popout.language_code": "códigu de llingua ISO",
"search_popout.quick_actions": "Aiciones rápides",
"search_popout.recent": "Busques de recién",
+ "search_popout.specific_date": "data específica",
+ "search_popout.user": "perfil",
"search_results.accounts": "Perfiles",
"search_results.all": "Too",
"search_results.hashtags": "Etiquetes",
"search_results.nothing_found": "Nun se pudo atopar nada con esos términos de busca",
+ "search_results.see_all": "Ver too",
"search_results.statuses": "Artículos",
"search_results.title": "Busca de: {q}",
"server_banner.introduction": "{domain} ye parte de la rede social descentralizada que tien la teunoloxía de {mastodon}.",
@@ -463,6 +453,7 @@
"status.replied_to": "En rempuesta a {name}",
"status.reply": "Responder",
"status.replyAll": "Responder al filu",
+ "status.report": "Informar de @{name}",
"status.sensitive_warning": "Conteníu sensible",
"status.show_filter_reason": "Amosar de toes toes",
"status.show_less": "Amosar menos",
@@ -491,9 +482,7 @@
"upload_button.label": "Amestar ficheros multimedia",
"upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.",
"upload_form.audio_description": "Describi'l conteníu pa persones sordes ya/o ciegues",
- "upload_form.description_missing": "Nun s'amestó la descripción",
"upload_form.edit": "Editar",
- "upload_form.undo": "Desaniciar",
"upload_modal.analyzing_picture": "Analizando la semeya…",
"upload_modal.apply": "Aplicar",
"upload_modal.applying": "Aplicando…",
diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json
index 773af4034..e06951510 100644
--- a/app/javascript/mastodon/locales/be.json
+++ b/app/javascript/mastodon/locales/be.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Аб'ява",
"attachments_list.unprocessed": "(неапрацаваны)",
"audio.hide": "Схаваць аўдыя",
- "autosuggest_hashtag.per_week": "{count} за тыдзень",
"boost_modal.combo": "Націсніце {combo}, каб прапусціць наступным разам",
"bundle_column_error.copy_stacktrace": "Скапіраваць справаздачу пра памылку",
"bundle_column_error.error.body": "Запытаная старонка не можа быць адлюстраваная. Гэта магло стацца праз хібу ў нашым кодзе, або праз памылку сумяшчальнасці з браўзерам.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Ваш уліковы запіс не {locked}. Усе могуць падпісацца на вас, каб бачыць допісы толькі для падпісчыкаў.",
"compose_form.lock_disclaimer.lock": "закрыты",
"compose_form.placeholder": "Што здарылася?",
- "compose_form.poll.add_option": "Дадаць варыянт",
"compose_form.poll.duration": "Працягласць апытання",
- "compose_form.poll.option_placeholder": "Варыянт {number}",
- "compose_form.poll.remove_option": "Выдаліць гэты варыянт",
"compose_form.poll.switch_to_multiple": "Змяніце апытанне, каб дазволіць некалькі варыянтаў адказу",
"compose_form.poll.switch_to_single": "Змяніце апытанне, каб дазволіць адзіны варыянт адказу",
- "compose_form.publish": "Апублікаваць",
"compose_form.publish_form": "Апублікаваць",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Захаваць змены",
- "compose_form.sensitive.hide": "{count, plural, one {Пазначыць кантэнт як далікатны} other {Пазначыць кантэнт як далікатны}}",
- "compose_form.sensitive.marked": "{count, plural, one {Кантэнт пазначаны як далікатны} other {Кантэнт пазначаны як далікатны}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Кантэнт не пазначаны як далікатны} other {Кантэнт не пазначаны як далікатны}}",
"compose_form.spoiler.marked": "Выдаліць папярэджанне аб змесціве",
"compose_form.spoiler.unmarked": "Дадаць папярэджанне аб змесціве",
- "compose_form.spoiler_placeholder": "Напішыце сваё папярэджанне тут",
"confirmation_modal.cancel": "Скасаваць",
"confirmations.block.block_and_report": "Заблакіраваць і паскардзіцца",
"confirmations.block.confirm": "Заблакіраваць",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Асабістыя згадванні",
"navigation_bar.discover": "Даведайцесь",
"navigation_bar.domain_blocks": "Заблакіраваныя дамены",
- "navigation_bar.edit_profile": "Рэдагаваць профіль",
"navigation_bar.explore": "Агляд",
"navigation_bar.favourites": "Упадабанае",
"navigation_bar.filters": "Ігнараваныя словы",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Дадаць апытанне",
"poll_button.remove_poll": "Выдаліць апытанне",
"privacy.change": "Змяніць прыватнасць допісу",
- "privacy.direct.long": "Паказаць толькі згаданым карыстальнікам",
- "privacy.direct.short": "Толькі згаданыя людзі",
- "privacy.private.long": "Паказаць толькі падпісчыкам",
- "privacy.private.short": "Толькі для падпісчыкаў",
- "privacy.public.long": "Бачны для ўсіх",
"privacy.public.short": "Публічны",
- "privacy.unlisted.long": "Бачна для ўсіх, але не праз магчымасці агляду",
- "privacy.unlisted.short": "Не ў стужках",
"privacy_policy.last_updated": "Адноўлена {date}",
"privacy_policy.title": "Палітыка канфідэнцыйнасці",
"recommended": "Рэкамендуем",
@@ -715,10 +696,8 @@
"upload_error.poll": "Немагчыма прымацаваць файл да апытання.",
"upload_form.audio_description": "Апісанне для людзей з парушэннямі слыху",
"upload_form.description": "Апісаць для людзей са слабым зрокам",
- "upload_form.description_missing": "Апісанне адсутнічае",
"upload_form.edit": "Рэдагаваць",
"upload_form.thumbnail": "Змяніць мініяцюру",
- "upload_form.undo": "Выдаліць",
"upload_form.video_description": "Апісанне для людзей з парушэннямі зроку і слыху",
"upload_modal.analyzing_picture": "Аналіз выявы…",
"upload_modal.apply": "Ужыць",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 7ee3c868a..213ac090a 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Оповестяване",
"attachments_list.unprocessed": "(необработено)",
"audio.hide": "Скриване на звука",
- "autosuggest_hashtag.per_week": "{count} на седмица",
"boost_modal.combo": "Можете да натиснете {combo}, за да пропуснете това следващия път",
"bundle_column_error.copy_stacktrace": "Копиране на доклада за грешката",
"bundle_column_error.error.body": "Заявената страница не може да се изобрази. Това може да е заради грешка в кода ни или проблем със съвместимостта на браузъра.",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "Какво мислите?",
"compose_form.poll.add_option": "Добавяне на избор",
"compose_form.poll.duration": "Времетраене на анкетата",
+ "compose_form.poll.multiple": "Множествен избор",
"compose_form.poll.option_placeholder": "Избор {number}",
- "compose_form.poll.remove_option": "Премахване на този избор",
+ "compose_form.poll.remove_option": "Премахване на тази възможност",
+ "compose_form.poll.single": "Подберете нещо",
"compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора",
"compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор",
- "compose_form.publish": "Публикуване",
+ "compose_form.poll.type": "Стил",
+ "compose_form.publish": "Публикация",
"compose_form.publish_form": "Публикуване",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Запазване на промените",
- "compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
- "compose_form.sensitive.marked": "{count, plural, one {мултимедия е означена като деликатна} other {мултимедии са означени като деликатни}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Мултимедията не е маркирана като деликатна} other {Мултимедиите не са маркирани като деликатни}}",
+ "compose_form.reply": "Отговор",
+ "compose_form.save_changes": "Обновяване",
"compose_form.spoiler.marked": "Отстраняване на предупреждение за съдържание",
"compose_form.spoiler.unmarked": "Добавяне на предупреждение за съдържание",
- "compose_form.spoiler_placeholder": "Тук напишете предупреждението си",
+ "compose_form.spoiler_placeholder": "Предупреждение за съдържание (по избор)",
"confirmation_modal.cancel": "Отказ",
"confirmations.block.block_and_report": "Блокиране и докладване",
"confirmations.block.confirm": "Блокиране",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Частни споменавания",
"navigation_bar.discover": "Откриване",
"navigation_bar.domain_blocks": "Блокирани домейни",
- "navigation_bar.edit_profile": "Редактиране на профила",
"navigation_bar.explore": "Изследване",
"navigation_bar.favourites": "Любими",
"navigation_bar.filters": "Заглушени думи",
@@ -526,14 +524,14 @@
"poll_button.add_poll": "Анкетиране",
"poll_button.remove_poll": "Премахване на анкета",
"privacy.change": "Промяна на поверителността на публикация",
- "privacy.direct.long": "Видимо само за споменатите потребители",
- "privacy.direct.short": "Само споменатите хора",
- "privacy.private.long": "Видимо само за последователите",
- "privacy.private.short": "Само последователи",
- "privacy.public.long": "Видимо за всички",
+ "privacy.direct.long": "Всеки споменат в публикацията",
+ "privacy.direct.short": "Определени хора",
+ "privacy.private.long": "Само последователите ви",
+ "privacy.private.short": "Последователи",
+ "privacy.public.long": "Всеки във и извън Mastodon",
"privacy.public.short": "Публично",
- "privacy.unlisted.long": "Видимо за всички, но не чрез възможността за откриване",
- "privacy.unlisted.short": "Несписъчно",
+ "privacy.unlisted.long": "По-малко алгоритмични фанфари",
+ "privacy.unlisted.short": "Тиха публика",
"privacy_policy.last_updated": "Последно осъвременяване на {date}",
"privacy_policy.title": "Политика за поверителност",
"recommended": "Препоръчано",
@@ -551,7 +549,9 @@
"relative_time.minutes": "{number}м.",
"relative_time.seconds": "{number}с.",
"relative_time.today": "днес",
+ "reply_indicator.attachments": "{count, plural, one {# прикаване} other {# прикачвания}}",
"reply_indicator.cancel": "Отказ",
+ "reply_indicator.poll": "Анкета",
"report.block": "Блокиране",
"report.block_explanation": "Няма да им виждате публикациите. Те няма да могат да виждат публикациите ви или да ви последват. Те ще могат да казват, че са били блокирани.",
"report.categories.legal": "Правни въпроси",
@@ -715,10 +715,8 @@
"upload_error.poll": "Качването на файлове не е позволено с анкети.",
"upload_form.audio_description": "Опишете за хора, които са глухи или трудно чуват",
"upload_form.description": "Опишете за хора, които са слепи или имат слабо зрение",
- "upload_form.description_missing": "Няма добавен опис",
"upload_form.edit": "Редактиране",
"upload_form.thumbnail": "Промяна на миниобраза",
- "upload_form.undo": "Изтриване",
"upload_form.video_description": "Опишете за хора, които са глухи или трудно чуват, слепи или имат слабо зрение",
"upload_modal.analyzing_picture": "Снимков анализ…",
"upload_modal.apply": "Прилагане",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index fe3d2a627..508caa2f4 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -85,7 +85,6 @@
"announcement.announcement": "ঘোষণা",
"attachments_list.unprocessed": "(প্রক্রিয়া করা যায়নি)",
"audio.hide": "অডিও লুকান",
- "autosuggest_hashtag.per_week": "প্রতি সপ্তাহে {count}",
"boost_modal.combo": "পরেরবার আপনি {combo} টিপলে এটি আর আসবে না",
"bundle_column_error.copy_stacktrace": "এরর রিপোর্ট কপি করুন",
"bundle_column_error.error.body": "অনুরোধ করা পৃষ্ঠাটি রেন্ডার করা যায়নি। এটি আমাদের কোডে একটি বাগ বা ব্রাউজার সামঞ্জস্যের সমস্যার কারণে হতে পারে।",
@@ -142,22 +141,12 @@
"compose_form.lock_disclaimer": "আপনার নিবন্ধনে তালা দেওয়া নেই, যে কেও আপনাকে অনুসরণ করতে পারবে এবং অনুশারকদের জন্য লেখা দেখতে পারবে।",
"compose_form.lock_disclaimer.lock": "তালা দেওয়া",
"compose_form.placeholder": "আপনি কি ভাবছেন ?",
- "compose_form.poll.add_option": "আরেকটি বিকল্প যোগ করুন",
"compose_form.poll.duration": "ভোটগ্রহনের সময়",
- "compose_form.poll.option_placeholder": "বিকল্প {number}",
- "compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
"compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
"compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
- "compose_form.publish": "প্রকাশ করুন",
"compose_form.publish_form": "প্রকাশ করুন",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "পরিবর্তনগুলো প্রকাশ করুন",
- "compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
- "compose_form.sensitive.marked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়েছে",
- "compose_form.sensitive.unmarked": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করা হয়নি",
"compose_form.spoiler.marked": "সতর্কতার পিছনে লেখানটি লুকানো আছে",
"compose_form.spoiler.unmarked": "লেখাটি লুকানো নেই",
- "compose_form.spoiler_placeholder": "আপনার লেখা দেখার সাবধানবাণী লিখুন",
"confirmation_modal.cancel": "বাতিল করুন",
"confirmations.block.block_and_report": "ব্লক করুন এবং রিপোর্ট করুন",
"confirmations.block.confirm": "ব্লক করুন",
@@ -324,7 +313,6 @@
"navigation_bar.compose": "নতুন টুট লিখুন",
"navigation_bar.discover": "ঘুরে দেখুন",
"navigation_bar.domain_blocks": "লুকানো ডোমেনগুলি",
- "navigation_bar.edit_profile": "নিজের পাতা সম্পাদনা করতে",
"navigation_bar.explore": "পরিব্রাজন",
"navigation_bar.favourites": "পছন্দসমূহ",
"navigation_bar.filters": "বন্ধ করা শব্দ",
@@ -395,12 +383,7 @@
"poll_button.add_poll": "একটা নির্বাচন যোগ করতে",
"poll_button.remove_poll": "নির্বাচন বাদ দিতে",
"privacy.change": "লেখার গোপনীয়তা অবস্থা ঠিক করতে",
- "privacy.direct.long": "শুধুমাত্র উল্লেখিত ব্যবহারকারীদের কাছে লিখতে",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "শুধুমাত্র আপনার অনুসরণকারীদের লিখতে",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "সর্বজনীন প্রকাশ্য",
- "privacy.unlisted.short": "প্রকাশ্য নয়",
"refresh": "সতেজ করা",
"regeneration_indicator.label": "আসছে…",
"regeneration_indicator.sublabel": "আপনার বাড়ির-সময়রেখা প্রস্তূত করা হচ্ছে!",
@@ -506,7 +489,6 @@
"upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে",
"upload_form.edit": "সম্পাদন",
"upload_form.thumbnail": "থাম্বনেল পরিবর্তন করুন",
- "upload_form.undo": "মুছে ফেলতে",
"upload_form.video_description": "শ্রবণশক্তি হ্রাস বা চাক্ষুষ প্রতিবন্ধী ব্যক্তিদের জন্য বর্ণনা করুন",
"upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
"upload_modal.apply": "প্রয়োগ করুন",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index bea8b27b7..5e83ab4e6 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -1,5 +1,5 @@
{
- "about.blocks": "Servijerioù habaskaet",
+ "about.blocks": "Servijerioù evezhiet",
"about.contact": "Darempred :",
"about.disclaimer": "Mastodon zo ur meziant frank, open-source hag ur merk marilhet eus Mastodon gGmbH.",
"about.domain_blocks.no_reason_available": "Abeg dihegerz",
@@ -21,6 +21,8 @@
"account.blocked": "Stanket",
"account.browse_more_on_origin_server": "Furchal pelloc'h war ar profil orin",
"account.cancel_follow_request": "Nullañ ar reked heuliañ",
+ "account.copy": "Eilañ al liamm war-zu ho profil",
+ "account.direct": "Menegiñ @{name} ent-prevez",
"account.disable_notifications": "Paouez d'am c'hemenn pa vez embannet traoù gant @{name}",
"account.domain_blocked": "Domani stanket",
"account.edit_profile": "Kemmañ ar profil",
@@ -28,8 +30,9 @@
"account.endorse": "Lakaat war-wel war ar profil",
"account.featured_tags.last_status_at": "Toud diwezhañ : {date}",
"account.featured_tags.last_status_never": "Toud ebet",
- "account.featured_tags.title": "Penngerioù-klik {name}",
+ "account.featured_tags.title": "Hashtagoù pennañ {name}",
"account.follow": "Heuliañ",
+ "account.follow_back": "Heuliañ d'ho tro",
"account.followers": "Tud koumanantet",
"account.followers.empty": "Den na heul an implijer·ez-mañ c'hoazh.",
"account.followers_counter": "{count, plural, other{{counter} Heulier·ez}}",
@@ -38,6 +41,7 @@
"account.follows.empty": "An implijer·ez-mañ na heul den ebet.",
"account.go_to_profile": "Gwelet ar profil",
"account.hide_reblogs": "Kuzh skignadennoù gant @{name}",
+ "account.in_memoriam": "E koun.",
"account.joined_short": "Amañ abaoe",
"account.languages": "Cheñch ar yezhoù koumanantet",
"account.link_verified_on": "Gwiriet eo bet perc'hennidigezh al liamm d'an deiziad-mañ : {date}",
@@ -49,11 +53,13 @@
"account.mute_notifications_short": "Kuzhat ar c'hemennoù",
"account.mute_short": "Kuzhat",
"account.muted": "Kuzhet",
+ "account.no_bio": "Deskrivadur ebet da gaout.",
"account.open_original_page": "Digeriñ ar bajenn orin",
- "account.posts": "Toudoù",
- "account.posts_with_replies": "Toudoù ha respontoù",
+ "account.posts": "Embannadurioù",
+ "account.posts_with_replies": "Embannadurioù ha respontoù",
"account.report": "Disklêriañ @{name}",
"account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ",
+ "account.requested_follow": "Gant {name} eo bet goulennet ho heuliañ",
"account.share": "Skignañ profil @{name}",
"account.show_reblogs": "Diskouez skignadennoù @{name}",
"account.statuses_counter": "{count, plural, one {{counter} Toud} two {{counter} Doud} other {{counter} a Doudoù}}",
@@ -63,6 +69,7 @@
"account.unendorse": "Paouez da lakaat war-wel war ar profil",
"account.unfollow": "Diheuliañ",
"account.unmute": "Diguzhat @{name}",
+ "account.unmute_notifications_short": "Diguzhat ar c'hemennoù",
"account.unmute_short": "Diguzhat",
"account_note.placeholder": "Klikit evit ouzhpennañ un notenn",
"admin.dashboard.daily_retention": "Feur azdalc'h an implijerien·ezed dre zeiz goude bezañ lakaet o anv",
@@ -70,6 +77,9 @@
"admin.dashboard.retention.average": "Keidenn",
"admin.dashboard.retention.cohort": "Miz an enrolladur",
"admin.dashboard.retention.cohort_size": "Implijerien.erezed nevez",
+ "admin.impact_report.instance_accounts": "Profiloù kontoù a vefe dilamet",
+ "admin.impact_report.instance_followers": "Heulierien a gollfe hon implijerien",
+ "admin.impact_report.instance_follows": "Heulierien a gollfe o implijerien",
"alert.rate_limited.message": "Klaskit en-dro a-benn {retry_time, time, medium}.",
"alert.rate_limited.title": "Feur bevennet",
"alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
@@ -77,7 +87,6 @@
"announcement.announcement": "Kemennad",
"attachments_list.unprocessed": "(ket meret)",
"audio.hide": "Kuzhat ar c'hleved",
- "autosuggest_hashtag.per_week": "{count} bep sizhun",
"boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou",
"bundle_column_error.copy_stacktrace": "Eilañ an danevell fazi",
"bundle_column_error.error.body": "N'haller ket skrammañ ar bajenn goulennet. Gallout a ra bezañ abalamour d'ur beug er c'hod pe d'ur gudenn keverlec'hded gant ar merdeer.",
@@ -100,8 +109,10 @@
"column.blocks": "Implijer·ezed·ien berzet",
"column.bookmarks": "Sinedoù",
"column.community": "Red-amzer lec'hel",
+ "column.direct": "Menegoù prevez",
"column.directory": "Mont a-dreuz ar profiloù",
"column.domain_blocks": "Domani berzet",
+ "column.favourites": "Muiañ-karet",
"column.follow_requests": "Rekedoù heuliañ",
"column.home": "Degemer",
"column.lists": "Listennoù",
@@ -122,28 +133,21 @@
"community.column_settings.remote_only": "Nemet a-bell",
"compose.language.change": "Cheñch yezh",
"compose.language.search": "Klask yezhoù...",
+ "compose.published.body": "Embannet.",
+ "compose.published.open": "Digeriñ",
+ "compose.saved.body": "Enrollet.",
"compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
"compose_form.encryption_warning": "Toudoù war Mastodon na vezont ket sifret penn-da-benn. Na rannit ket titouroù kizidik dre Mastodon.",
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer": "N'eo ket {locked} ho kont. An holl a c'hal ho heuliañ evit gwelet ho toudoù prevez.",
"compose_form.lock_disclaimer.lock": "prennet",
"compose_form.placeholder": "Petra emaoc'h o soñjal e-barzh ?",
- "compose_form.poll.add_option": "Ouzhpenniñ un dibab",
"compose_form.poll.duration": "Pad ar sontadeg",
- "compose_form.poll.option_placeholder": "Dibab {number}",
- "compose_form.poll.remove_option": "Lemel an dibab-mañ",
"compose_form.poll.switch_to_multiple": "Kemmañ ar sontadeg evit aotren meur a zibab",
"compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken",
- "compose_form.publish": "Embann",
"compose_form.publish_form": "Embann",
- "compose_form.publish_loud": "{publish} !",
- "compose_form.save_changes": "Enrollañ ar cheñchamantoù",
- "compose_form.sensitive.hide": "Merkañ ar media evel kizidik",
- "compose_form.sensitive.marked": "Merket eo ar media evel kizidik",
- "compose_form.sensitive.unmarked": "N'eo ket merket ar media evel kizidik",
"compose_form.spoiler.marked": "Kuzhet eo an destenn a-dreñv ur c'hemenn",
"compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn",
- "compose_form.spoiler_placeholder": "Skrivit ho kemenn diwall amañ",
"confirmation_modal.cancel": "Nullañ",
"confirmations.block.block_and_report": "Berzañ ha Disklêriañ",
"confirmations.block.confirm": "Stankañ",
@@ -158,6 +162,7 @@
"confirmations.discard_edit_media.message": "Bez ez eus kemmoù n'int ket enrollet e deskrivadur ar media pe ar rakwel, nullañ anezho evelato?",
"confirmations.domain_block.confirm": "Berzañ an domani a-bezh",
"confirmations.domain_block.message": "Ha sur oc'h e fell deoc'h berzañ an {domain} a-bezh? Peurvuiañ eo trawalc'h berzañ pe mudañ un nebeud implijer·ezed·ien. Ne welot danvez ebet o tont eus an domani-mañ. Dilamet e vo ar c'houmanantoù war an domani-mañ.",
+ "confirmations.edit.confirm": "Kemmañ",
"confirmations.logout.confirm": "Digevreañ",
"confirmations.logout.message": "Ha sur oc'h e fell deoc'h digevreañ ?",
"confirmations.mute.confirm": "Kuzhat",
@@ -172,7 +177,9 @@
"conversation.mark_as_read": "Merkañ evel lennet",
"conversation.open": "Gwelout ar gaozeadenn",
"conversation.with": "Gant {names}",
+ "copy_icon_button.copied": "Eilet er golver",
"copypaste.copied": "Eilet",
+ "copypaste.copy_to_clipboard": "Eilañ er golver",
"directory.federated": "Eus ar fedibed anavezet",
"directory.local": "Eus {domain} hepken",
"directory.new_arrivals": "Degouezhet a-nevez",
@@ -209,7 +216,8 @@
"empty_column.domain_blocks": "N'eus domani kuzh ebet c'hoazh.",
"empty_column.explore_statuses": "N'eus tuadur ebet evit c'hoazh. Distroit diwezhatoc'h !",
"empty_column.follow_requests": "N'ho peus reked heuliañ ebet c'hoazh. Pa vo resevet unan e teuio war wel amañ.",
- "empty_column.hashtag": "N'eus netra er ger-klik-mañ c'hoazh.",
+ "empty_column.followed_tags": "N'emaoc'h oc'h heuliañ hashtag ebet evit poent. Pa vioc'h e vo d'o gwelet amañ.",
+ "empty_column.hashtag": "N'eus netra en hashtag-mañ c'hoazh.",
"empty_column.home": "Goullo eo ho red-amzer degemer! Kit da weladenniñ {public} pe implijit ar c'hlask evit kregiñ ganti ha kejañ gant implijer·ien·ezed all.",
"empty_column.list": "Goullo eo al listenn-mañ evit c'hoazh. Pa vo embannet toudoù nevez gant e izili e teuint war wel amañ.",
"empty_column.lists": "N'ho peus roll ebet c'hoazh. Pa vo krouet unan ganeoc'h e vo diskouezet amañ.",
@@ -223,7 +231,11 @@
"errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
"errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
"explore.search_results": "Disoc'hoù an enklask",
+ "explore.suggested_follows": "Tud",
"explore.title": "Furchal",
+ "explore.trending_links": "Keleier",
+ "explore.trending_statuses": "Embannadurioù",
+ "explore.trending_tags": "Hashtagoù",
"filter_modal.added.context_mismatch_title": "Kenarroud digenglotus !",
"filter_modal.added.expired_title": "Sil deuet d'e dermen !",
"filter_modal.added.review_and_configure_title": "Arventennoù ar sil",
@@ -237,9 +249,13 @@
"filter_modal.select_filter.subtitle": "Implijout ur rummad a zo anezhañ pe krouiñ unan nevez",
"filter_modal.select_filter.title": "Silañ an toud-mañ",
"filter_modal.title.status": "Silañ un toud",
+ "firehose.all": "Pep tra",
+ "firehose.local": "Ar servijer-mañ",
+ "firehose.remote": "Servijerioù all",
"follow_request.authorize": "Aotren",
"follow_request.reject": "Nac'hañ",
"follow_requests.unlocked_explanation": "Daoust ma n'eo ket ho kont prennet, skipailh {domain} a soñj e fellfe deoc'h gwiriekaat pedadennoù heuliañ deus ar c'hontoù-se diwar-zorn.",
+ "followed_tags": "Hashtagoù o heuliañ",
"footer.about": "Diwar-benn",
"footer.directory": "Kavlec'h ar profiloù",
"footer.get_app": "Pellgargañ an arload",
@@ -247,29 +263,40 @@
"footer.keyboard_shortcuts": "Berradennoù klavier",
"footer.privacy_policy": "Reolennoù prevezded",
"footer.source_code": "Gwelet kod mammenn",
+ "footer.status": "Statud",
"generic.saved": "Enrollet",
"getting_started.heading": "Loc'hañ",
- "hashtag.column_header.tag_mode.all": "ha {additional}",
+ "hashtag.column_header.tag_mode.all": "ha(g) {additional}",
"hashtag.column_header.tag_mode.any": "pe {additional}",
"hashtag.column_header.tag_mode.none": "hep {additional}",
"hashtag.column_settings.select.no_options_message": "N'eus bet kavet ali ebet",
- "hashtag.column_settings.select.placeholder": "Ouzhpennañ gerioù-klik…",
- "hashtag.column_settings.tag_mode.all": "An holl elfennoù-mañ",
+ "hashtag.column_settings.select.placeholder": "Ouzhpennañ hashtagoù…",
+ "hashtag.column_settings.tag_mode.all": "An holl anezho",
"hashtag.column_settings.tag_mode.any": "Unan e mesk anezho",
"hashtag.column_settings.tag_mode.none": "Hini ebet anezho",
"hashtag.column_settings.tag_toggle": "Endelc'her gerioù-alc'hwez ouzhpenn evit ar bannad-mañ",
+ "hashtag.counter_by_uses": "{count, plural, one {{counter} embannadur} other {{counter} embannadur}}",
+ "hashtag.counter_by_uses_today": "{count, plural, one {{counter} embannadur} other {{counter} embannadur}} hiziv",
"hashtag.follow": "Heuliañ ar ger-klik",
- "hashtag.unfollow": "Diheuliañ ar ger-klik",
+ "hashtag.unfollow": "Paouez heuliañ an hashtag",
+ "hashtags.and_other": "…{count, plural, one {hag # all} other {ha # all}}",
+ "home.actions.go_to_explore": "Gwelet petra zo diouzh ar c'hiz",
+ "home.actions.go_to_suggestions": "Kavout tud da heuliañ",
"home.column_settings.basic": "Diazez",
"home.column_settings.show_reblogs": "Diskouez ar skignadennoù",
"home.column_settings.show_replies": "Diskouez ar respontoù",
+ "home.explore_prompt.title": "Homañ eo ho pajenn degemer e-barzh Mastodon.",
"home.hide_announcements": "Kuzhat ar c'hemennoù",
+ "home.pending_critical_update.body": "Hizivait ho servijer Mastodon kerkent ha ma c'hallit mar plij!",
+ "home.pending_critical_update.link": "Gwelet an hizivadennoù",
"home.show_announcements": "Diskouez ar c'hemennoù",
"interaction_modal.description.follow": "Gant ur gont Mastodon e c'hellit heuliañ {name} evit resev an toudoù a embann war ho red degemer.",
"interaction_modal.description.reblog": "Gant ur gont Mastodon e c'hellit skignañ an toud-mañ evit rannañ anezhañ gant ho heulierien·ezed.",
"interaction_modal.description.reply": "Gant ur gont Mastodon e c'hellit respont d'an toud-mañ.",
+ "interaction_modal.no_account_yet": "N'eo ket war vMastodon?",
"interaction_modal.on_another_server": "War ur servijer all",
"interaction_modal.on_this_server": "War ar servijer-mañ",
+ "interaction_modal.title.favourite": "Ouzhpennañ embannadur {name} d'ar re vuiañ-karet",
"interaction_modal.title.follow": "Heuliañ {name}",
"interaction_modal.title.reblog": "Skignañ toud {name}",
"interaction_modal.title.reply": "Respont da doud {name}",
@@ -285,6 +312,8 @@
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "Diskennañ er roll",
"keyboard_shortcuts.enter": "Digeriñ an toud",
+ "keyboard_shortcuts.favourite": "Ouzhpennañ an embannadur d'ar re vuiañ-karet",
+ "keyboard_shortcuts.favourites": "Digeriñ roll an embannadurioù muiañ-karet",
"keyboard_shortcuts.federated": "Digeriñ ar red-amzer kevredet",
"keyboard_shortcuts.heading": "Berradennoù klavier",
"keyboard_shortcuts.home": "Digeriñ ho red-amzer degemer",
@@ -314,6 +343,8 @@
"lightbox.next": "Da-heul",
"lightbox.previous": "A-raok",
"limited_account_hint.action": "Diskouez an aelad memes tra",
+ "limited_account_hint.title": "Kuzhet eo bet ar profil-mañ gant an evezhierien eus {domain}.",
+ "link_preview.author": "Gant {name}",
"lists.account.add": "Ouzhpennañ d'al listenn",
"lists.account.remove": "Lemel kuit eus al listenn",
"lists.delete": "Dilemel al listenn",
@@ -328,6 +359,7 @@
"lists.search": "Klask e-touez tud heuliet ganeoc'h",
"lists.subheading": "Ho listennoù",
"load_pending": "{count, plural, one {# dra nevez} other {# dra nevez}}",
+ "loading_indicator.label": "O kargañ…",
"media_gallery.toggle_visible": "{number, plural, one {Kuzhat ar skeudenn} other {Kuzhat ar skeudenn}}",
"mute_modal.duration": "Padelezh",
"mute_modal.hide_notifications": "Kuzhat kemenadennoù eus an implijer-se ?",
@@ -337,12 +369,14 @@
"navigation_bar.bookmarks": "Sinedoù",
"navigation_bar.community_timeline": "Red-amzer lec'hel",
"navigation_bar.compose": "Skrivañ un toud nevez",
+ "navigation_bar.direct": "Menegoù prevez",
"navigation_bar.discover": "Dizoleiñ",
"navigation_bar.domain_blocks": "Domanioù kuzhet",
- "navigation_bar.edit_profile": "Kemmañ ar profil",
"navigation_bar.explore": "Furchal",
+ "navigation_bar.favourites": "Muiañ-karet",
"navigation_bar.filters": "Gerioù kuzhet",
"navigation_bar.follow_requests": "Pedadoù heuliañ",
+ "navigation_bar.followed_tags": "Hashtagoù o heuliañ",
"navigation_bar.follows_and_followers": "Heuliadennoù ha heulier·ezed·ien",
"navigation_bar.lists": "Listennoù",
"navigation_bar.logout": "Digennaskañ",
@@ -369,6 +403,7 @@
"notifications.column_settings.admin.report": "Disklêriadurioù nevez :",
"notifications.column_settings.admin.sign_up": "Enskrivadurioù nevez :",
"notifications.column_settings.alert": "Kemennoù war ar burev",
+ "notifications.column_settings.favourite": "Muiañ-karet:",
"notifications.column_settings.filter_bar.advanced": "Skrammañ an-holl rummadoù",
"notifications.column_settings.filter_bar.category": "Barrenn siloù prim",
"notifications.column_settings.filter_bar.show_bar": "Diskouezh barrenn siloù",
@@ -386,6 +421,7 @@
"notifications.column_settings.update": "Kemmoù :",
"notifications.filter.all": "Pep tra",
"notifications.filter.boosts": "Skignadennoù",
+ "notifications.filter.favourites": "Muiañ-karet",
"notifications.filter.follows": "Heuliañ",
"notifications.filter.mentions": "Menegoù",
"notifications.filter.polls": "Disoc'hoù ar sontadegoù",
@@ -399,22 +435,38 @@
"notifications_permission_banner.enable": "Lezel kemennoù war ar burev",
"notifications_permission_banner.how_to_control": "Evit reseviñ kemennoù pa ne vez ket digoret Mastodon, lezelit kemennoù war ar burev. Gallout a rit kontrollañ peseurt eskemmoù a c'henel kemennoù war ar burev gant ar {icon} nozelenn a-us kentre ma'z int lezelet.",
"notifications_permission_banner.title": "Na vankit netra morse",
+ "onboarding.action.back": "Distreiñ",
+ "onboarding.actions.back": "Distreiñ",
"onboarding.actions.go_to_explore": "See what's trending",
"onboarding.actions.go_to_home": "Go to your home feed",
+ "onboarding.compose.template": "Salud #Mastodon!",
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
"onboarding.follows.title": "Popular on Mastodon",
+ "onboarding.profile.display_name": "Anv diskouezet",
+ "onboarding.profile.display_name_hint": "Hoc'h anv klok pe hoc'h anv fentus…",
+ "onboarding.profile.note": "Berr-ha-berr",
+ "onboarding.profile.note_hint": "Gallout a rit @menegiñ tud all pe #hashtagoù…",
+ "onboarding.profile.save_and_continue": "Enrollañ ha kenderc'hel",
+ "onboarding.profile.upload_avatar": "Enporzhiañ ur skeudenn profil",
+ "onboarding.share.lead": "Roit da c'houzout d'an dud e c'hallont ho kavout war vMastondon!",
+ "onboarding.share.message": "Me a zo {username} war #Mastodon! Heuilhit ac'hanon war {url}",
+ "onboarding.share.title": "Skignañ ho profil",
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
"onboarding.start.skip": "Want to skip right ahead?",
+ "onboarding.start.title": "Deuet oc'h a-benn!",
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
"onboarding.steps.publish_status.body": "Say hello to the world.",
+ "onboarding.steps.publish_status.title": "Grit hoc'h embannadur kentañ",
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
"onboarding.steps.setup_profile.title": "Customize your profile",
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
+ "password_confirmation.mismatching": "Disheñvel eo an daou c'her-termen-se",
"picture_in_picture.restore": "Adlakaat",
"poll.closed": "Serret",
"poll.refresh": "Azbevaat",
+ "poll.reveal": "Gwelet an disoc'hoù",
"poll.total_people": "{count, plural, one {# den} other {# a zen}}",
"poll.total_votes": "{count, plural, one {# votadenn} other {# votadenn}}",
"poll.vote": "Mouezhiañ",
@@ -423,16 +475,10 @@
"poll_button.add_poll": "Ouzhpennañ ur sontadeg",
"poll_button.remove_poll": "Dilemel ar sontadeg",
"privacy.change": "Cheñch prevezded an toud",
- "privacy.direct.long": "Embann evit an implijer·ezed·ien meneget hepken",
- "privacy.direct.short": "Tud meneget hepken",
- "privacy.private.long": "Embann evit ar re a heuilh ac'hanon hepken",
- "privacy.private.short": "Tud koumanantet hepken",
- "privacy.public.long": "Gwelus d'an holl",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "Gwelus gant an holl, met hep arc'hweladur dizoleiñ",
- "privacy.unlisted.short": "Anlistennet",
"privacy_policy.last_updated": "Hizivadenn ziwezhañ {date}",
"privacy_policy.title": "Reolennoù Prevezded",
+ "recommended": "Erbedet",
"refresh": "Freskaat",
"regeneration_indicator.label": "O kargañ…",
"regeneration_indicator.sublabel": "War brientiñ emañ ho red degemer!",
@@ -450,6 +496,7 @@
"reply_indicator.cancel": "Nullañ",
"report.block": "Stankañ",
"report.block_explanation": "Ne vo ket gwelet toudoù ar gont-se ken. Ne welo ket ho toudoù ha ne c'hello ket ho heuliañ ken. Gouzout a raio eo bet stanket ganeoc'h.",
+ "report.categories.legal": "Lezennel",
"report.categories.other": "All",
"report.categories.spam": "Spam",
"report.categories.violation": "Torret e vez gant an endalc'had unan pe meur a reolenn",
@@ -467,6 +514,7 @@
"report.placeholder": "Askelennoù ouzhpenn",
"report.reasons.dislike": "Ne blij ket din",
"report.reasons.dislike_description": "An dra-se na fell ket deoc'h gwelet",
+ "report.reasons.legal": "Enep al lezenn eo",
"report.reasons.other": "Un abeg all eo",
"report.reasons.other_description": "Ar gudenn na glot ket gant ar rummadoù all",
"report.reasons.spam": "Spam eo",
@@ -482,16 +530,32 @@
"report.thanks.title": "Ne fell ket deoc'h gwelet an dra-se ?",
"report.thanks.title_actionable": "Trugarez evit bezañ disklêriet, emaomp o vont da glask pelloc'h.",
"report.unfollow": "Diheuliañ @{name}",
- "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached",
+ "report_notification.attached_statuses": "{count, plural, one {{count} embannadur} other {{count} embannadur}} stag",
+ "report_notification.categories.legal": "Lezennel",
"report_notification.categories.other": "All",
"report_notification.categories.spam": "Spam",
"report_notification.categories.violation": "Torradur da reolennoù ar servijer",
"report_notification.open": "Digeriñ an disklêriadur",
+ "search.no_recent_searches": "Klask nevez ebet",
"search.placeholder": "Klask",
+ "search.quick_action.account_search": "Profiloù a glot gant {x}",
+ "search.quick_action.go_to_account": "Mont d'ar profil {x}",
+ "search.quick_action.go_to_hashtag": "Mont d'an hashtag {x}",
+ "search.quick_action.open_url": "Digeriñ an URL e-barzh Mastodon",
+ "search.quick_action.status_search": "Embannadurioù a glot gant {x}",
"search.search_or_paste": "Klask pe pegañ un URL",
+ "search_popout.full_text_search_disabled_message": "N'eo ket da gaout war {domain}.",
+ "search_popout.language_code": "Kod yezh ISO",
+ "search_popout.options": "Dibarzhioù klask",
+ "search_popout.quick_actions": "Oberoù prim",
+ "search_popout.recent": "Klaskoù nevesañ",
+ "search_popout.specific_date": "deiziad resis",
+ "search_popout.user": "implijer·ez",
+ "search_results.accounts": "Profiloù",
"search_results.all": "Pep tra",
- "search_results.hashtags": "Gerioù-klik",
+ "search_results.hashtags": "Hashtagoù",
"search_results.nothing_found": "Disoc'h ebet gant ar gerioù-se",
+ "search_results.see_all": "Gwelet pep tra",
"search_results.statuses": "Toudoù",
"search_results.title": "Klask {q}",
"server_banner.active_users": "implijerien·ezed oberiant",
@@ -500,8 +564,10 @@
"server_banner.server_stats": "Stadegoù ar servijer :",
"sign_in_banner.create_account": "Krouiñ ur gont",
"sign_in_banner.sign_in": "Kevreañ",
- "status.admin_account": "Digeriñ etrefas evezherezh evit @{name}",
- "status.admin_status": "Digeriñ an toud e-barzh an etrefas evezherezh",
+ "sign_in_banner.sso_redirect": "Kennaskañ pe lakaat hoc'h anv",
+ "status.admin_account": "Digeriñ etrefas evezhiañ evit @{name}",
+ "status.admin_domain": "Digeriñ an etrefas evezhiañ evit {domain}",
+ "status.admin_status": "Digeriñ an embannadenn e-barzh an etrefas evezhiañ",
"status.block": "Berzañ @{name}",
"status.bookmark": "Ouzhpennañ d'ar sinedoù",
"status.cancel_reblog_private": "Nac'hañ ar skignadenn",
@@ -509,15 +575,21 @@
"status.copy": "Eilañ liamm ar c'hannad",
"status.delete": "Dilemel",
"status.detailed_status": "Gwel kaozeadenn munudek",
+ "status.direct": "Menegiñ @{name} ent-prevez",
+ "status.direct_indicator": "Meneg prevez",
"status.edit": "Kemmañ",
"status.edited": "Aozet {date}",
"status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}",
"status.embed": "Enframmañ",
+ "status.favourite": "Muiañ-karet",
"status.filter": "Silañ ar c'hannad-mañ",
"status.filtered": "Silet",
+ "status.hide": "Kuzhat an embannadur",
"status.history.created": "Krouet gant {name} {date}",
"status.history.edited": "Kemmet gant {name} {date}",
"status.load_more": "Kargañ muioc'h",
+ "status.media.open": "Klikit evit digeriñ",
+ "status.media.show": "Klikit evit diskouez",
"status.media_hidden": "Media kuzhet",
"status.mention": "Menegiñ @{name}",
"status.more": "Muioc'h",
@@ -548,6 +620,7 @@
"status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}",
"status.translate": "Treiñ",
"status.translated_from_with": "Troet diwar {lang} gant {provider}",
+ "status.uncached_media_warning": "Rakwel n'eo ket da gaout",
"status.unmute_conversation": "Diguzhat ar gaozeadenn",
"status.unpin": "Dispilhennañ eus ar profil",
"subscribed_languages.save": "Enrollañ ar cheñchamantoù",
@@ -575,10 +648,8 @@
"upload_error.poll": "Pellgargañ restroù n'eo ket aotreet gant sontadegoù.",
"upload_form.audio_description": "Diskrivañ evit tud a zo kollet o c'hlev",
"upload_form.description": "Diskrivañ evit tud a zo kollet o gweled",
- "upload_form.description_missing": "Deskrivadur diank",
"upload_form.edit": "Kemmañ",
"upload_form.thumbnail": "Kemmañ ar velvenn",
- "upload_form.undo": "Dilemel",
"upload_form.video_description": "Diskrivañ evit tud a zo kollet o gweled pe o c'hlev",
"upload_modal.analyzing_picture": "O tielfennañ ar skeudenn…",
"upload_modal.apply": "Arloañ",
@@ -592,6 +663,7 @@
"upload_modal.preview_label": "Rakwel ({ratio})",
"upload_progress.label": "O pellgargañ...",
"upload_progress.processing": "War ober…",
+ "username.taken": "Tapet eo an anv implijer-mañ dija. Klaskit skrivañ unan all",
"video.close": "Serriñ ar video",
"video.download": "Pellgargañ ar restr",
"video.exit_fullscreen": "Kuitaat ar mod skramm leun",
diff --git a/app/javascript/mastodon/locales/bs.json b/app/javascript/mastodon/locales/bs.json
index 9b6b49c3d..c978a8b01 100644
--- a/app/javascript/mastodon/locales/bs.json
+++ b/app/javascript/mastodon/locales/bs.json
@@ -66,8 +66,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 290b364a5..0d089bf8b 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Anunci",
"attachments_list.unprocessed": "(sense processar)",
"audio.hide": "Amaga l'àudio",
- "autosuggest_hashtag.per_week": "{count} per setmana",
"boost_modal.combo": "Pots prémer {combo} per a evitar-ho el pròxim cop",
"bundle_column_error.copy_stacktrace": "Copia l'informe d'error",
"bundle_column_error.error.body": "No s'ha pogut renderitzar la pàgina sol·licitada. Podria ser per un error en el nostre codi o per un problema de compatibilitat del navegador.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure els tuts de només per a seguidors.",
"compose_form.lock_disclaimer.lock": "blocat",
"compose_form.placeholder": "Què tens al cap?",
- "compose_form.poll.add_option": "Afegeix una opció",
+ "compose_form.poll.add_option": "Afegiu una opció",
"compose_form.poll.duration": "Durada de l'enquesta",
+ "compose_form.poll.multiple": "Opcions múltiples",
"compose_form.poll.option_placeholder": "Opció {number}",
- "compose_form.poll.remove_option": "Elimina aquesta opció",
- "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
+ "compose_form.poll.remove_option": "Treu aquesta opció",
+ "compose_form.poll.single": "Trieu-ne una",
+ "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre múltiples opcions",
"compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
- "compose_form.publish": "Tut",
+ "compose_form.poll.type": "Estil",
+ "compose_form.publish": "Publica",
"compose_form.publish_form": "Nou tut",
- "compose_form.publish_loud": "Tut!",
- "compose_form.save_changes": "Desa els canvis",
- "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
- "compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}",
+ "compose_form.reply": "Responeu",
+ "compose_form.save_changes": "Actualitza",
"compose_form.spoiler.marked": "Elimina l'avís de contingut",
"compose_form.spoiler.unmarked": "Afegeix avís de contingut",
- "compose_form.spoiler_placeholder": "Escriu l'avís aquí",
+ "compose_form.spoiler_placeholder": "Avís de contingut (opcional)",
"confirmation_modal.cancel": "Cancel·la",
"confirmations.block.block_and_report": "Bloca i denuncia",
"confirmations.block.confirm": "Bloca",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Mencions privades",
"navigation_bar.discover": "Descobreix",
"navigation_bar.domain_blocks": "Dominis blocats",
- "navigation_bar.edit_profile": "Edita el perfil",
"navigation_bar.explore": "Explora",
"navigation_bar.favourites": "Favorits",
"navigation_bar.filters": "Paraules silenciades",
@@ -521,19 +519,17 @@
"poll.total_people": "{count, plural, one {# persona} other {# persones}}",
"poll.total_votes": "{count, plural, one {# vot} other {# vots}}",
"poll.vote": "Vota",
- "poll.voted": "Vas votar per aquesta resposta",
+ "poll.voted": "Vau votar aquesta resposta",
"poll.votes": "{votes, plural, one {# vot} other {# vots}}",
"poll_button.add_poll": "Afegeix una enquesta",
"poll_button.remove_poll": "Elimina l'enquesta",
"privacy.change": "Canvia la privacitat del tut",
- "privacy.direct.long": "Visible només per als usuaris esmentats",
- "privacy.direct.short": "Només gent mencionada",
- "privacy.private.long": "Visible només per als seguidors",
- "privacy.private.short": "Només seguidors",
- "privacy.public.long": "Visible per a tothom",
+ "privacy.direct.long": "Tothom mencionat en aquesta publicació",
+ "privacy.direct.short": "Persones concretes",
+ "privacy.private.long": "Només els vostres seguidors",
+ "privacy.private.short": "Seguidors",
+ "privacy.public.long": "Tothom dins o fora Mastodon",
"privacy.public.short": "Públic",
- "privacy.unlisted.long": "Visible per a tothom però exclosa de les funcions de descobriment",
- "privacy.unlisted.short": "No llistada",
"privacy_policy.last_updated": "Darrera actualització {date}",
"privacy_policy.title": "Política de Privacitat",
"recommended": "Recomanat",
@@ -607,7 +603,7 @@
"search.quick_action.status_search": "Tuts coincidint amb {x}",
"search.search_or_paste": "Cerca o escriu l'URL",
"search_popout.full_text_search_disabled_message": "No disponible a {domain}.",
- "search_popout.full_text_search_logged_out_message": "Només disponible en iniciar la sessió.",
+ "search_popout.full_text_search_logged_out_message": "Només disponible amb la sessió iniciada.",
"search_popout.language_code": "Codi de llengua ISO",
"search_popout.options": "Opcions de cerca",
"search_popout.quick_actions": "Accions ràpides",
@@ -715,10 +711,8 @@
"upload_error.poll": "No es permet carregar fitxers a les enquestes.",
"upload_form.audio_description": "Descriu-ho per a persones amb problemes d'audició",
"upload_form.description": "Descriu-ho per a persones amb problemes de visió",
- "upload_form.description_missing": "No s'hi ha afegit cap descripció",
"upload_form.edit": "Edita",
"upload_form.thumbnail": "Canvia la miniatura",
- "upload_form.undo": "Elimina",
"upload_form.video_description": "Descriu-ho per a persones amb problemes de visió o audició",
"upload_modal.analyzing_picture": "S'analitza la imatge…",
"upload_modal.apply": "Aplica",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index f1cafd1ac..73910f9b7 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -76,7 +76,6 @@
"announcement.announcement": "بانگەواز",
"attachments_list.unprocessed": "(unprocessed)",
"audio.hide": "شاردنەوەی دەنگ",
- "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
"boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
"bundle_column_error.copy_stacktrace": "ڕاپۆرتی هەڵەی کۆپی بکە",
"bundle_column_error.error.body": "لاپەڕەی داواکراو نەتوانرا ڕەندەر بکرێت. دەکرێت بەهۆی هەڵەیەکی کۆدەکەمانەوە بێت، یان کێشەی گونجانی وێبگەڕ.",
@@ -128,22 +127,12 @@
"compose_form.lock_disclaimer": "هەژمێرەکەی لە حاڵەتی {locked}. هەر کەسێک دەتوانێت شوێنت بکەوێت بۆ پیشاندانی بابەتەکانی تەنها دوایخۆی.",
"compose_form.lock_disclaimer.lock": "قفڵ دراوە",
"compose_form.placeholder": "چی لە مێشکتدایە?",
- "compose_form.poll.add_option": "زیادکردنی هەڵبژاردەیەک",
"compose_form.poll.duration": "ماوەی ڕاپرسی",
- "compose_form.poll.option_placeholder": "هەڵبژاردن {number}",
- "compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
"compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
"compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
- "compose_form.publish": "بڵاوی بکەوە",
"compose_form.publish_form": "بڵاوی بکەوە",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
- "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
- "compose_form.sensitive.marked": "وادەی کۆتایی",
- "compose_form.sensitive.unmarked": "میدیا وەک هەستیار نیشان نەکراوە",
"compose_form.spoiler.marked": "دەق لە پشت ئاگاداریدا شاراوەتەوە",
"compose_form.spoiler.unmarked": "دەق شاراوە نییە",
- "compose_form.spoiler_placeholder": "ئاگاداریەکەت لێرە بنووسە",
"confirmation_modal.cancel": "هەڵوەشاندنەوه",
"confirmations.block.block_and_report": "بلۆک & گوزارشت",
"confirmations.block.confirm": "بلۆک",
@@ -354,7 +343,6 @@
"navigation_bar.direct": "ئاماژەی تایبەت",
"navigation_bar.discover": "دۆزینەوە",
"navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
- "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
"navigation_bar.explore": "گەڕان",
"navigation_bar.filters": "وشە کپەکان",
"navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
@@ -439,14 +427,7 @@
"poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
"poll_button.remove_poll": "دهنگدان بسڕهوه",
"privacy.change": "ڕێکخستنی تایبەتمەندی توت",
- "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
- "privacy.direct.short": "تەنها کەسانی باس کراو",
- "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
- "privacy.private.short": "تەنیا شوێنکەوتووان",
- "privacy.public.long": "بۆ هەمووان دیارە",
"privacy.public.short": "گشتی",
- "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە تایبەتمەندییەکانی دۆزینەوە دەرچووە",
- "privacy.unlisted.short": "لە لیست نەکراو",
"privacy_policy.last_updated": "دوایین نوێکردنەوە {date}",
"privacy_policy.title": "سیاسەتی تایبەتێتی",
"refresh": "نوێکردنەوە",
@@ -610,10 +591,8 @@
"upload_error.poll": "فایل و ڕاپرسی پێکەوە ڕێپێنەدراون.",
"upload_form.audio_description": "پەیامەکەت بۆ نابیستەکان",
"upload_form.description": "پەیامەکەت بۆ نابیناکان",
- "upload_form.description_missing": "هیچ وەسفێک زیاد نەکراوە",
"upload_form.edit": "دەستکاری",
"upload_form.thumbnail": "گۆڕانی وینۆچکە",
- "upload_form.undo": "بیسڕەوە",
"upload_form.video_description": "پەیامەکەت بۆ نابیست و نابیناکان",
"upload_modal.analyzing_picture": "وێنەکە شی دەکرێتەوە…",
"upload_modal.apply": "بیسەپێنە",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 9f90c3d21..9d0b0306c 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -45,7 +45,6 @@
"alert.unexpected.title": "Uups!",
"announcement.announcement": "Annunziu",
"attachments_list.unprocessed": "(micca trattata)",
- "autosuggest_hashtag.per_week": "{count} per settimana",
"boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta",
"bundle_column_error.retry": "Pruvà torna",
"bundle_modal_error.close": "Chjudà",
@@ -80,20 +79,12 @@
"compose_form.lock_disclaimer": "U vostru contu ùn hè micca {locked}. Tuttu u mondu pò seguitavi è vede i vostri statuti privati.",
"compose_form.lock_disclaimer.lock": "privatu",
"compose_form.placeholder": "À chè pensate?",
- "compose_form.poll.add_option": "Aghjunghje scelta",
"compose_form.poll.duration": "Durata di u scandagliu",
- "compose_form.poll.option_placeholder": "Scelta {number}",
- "compose_form.poll.remove_option": "Toglie sta scelta",
"compose_form.poll.switch_to_multiple": "Cambià u scandagliu per accittà parechje scelte",
"compose_form.poll.switch_to_single": "Cambià u scandagliu per ùn accittà ch'una scelta",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "{count, plural, one {Indicà u media cum'è sensibile} other {Indicà i media cum'è sensibili}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media indicatu cum'è sensibile} other {Media indicati cum'è sensibili}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media micca indicatu cum'è sensibile} other {Media micca indicati cum'è sensibili}}",
"compose_form.spoiler.marked": "Testu piattatu daret'à un'avertimentu",
"compose_form.spoiler.unmarked": "Testu micca piattatu",
- "compose_form.spoiler_placeholder": "Scrive u vostr'avertimentu quì",
"confirmation_modal.cancel": "Annullà",
"confirmations.block.block_and_report": "Bluccà è signalà",
"confirmations.block.confirm": "Bluccà",
@@ -245,7 +236,6 @@
"navigation_bar.compose": "Scrive un novu statutu",
"navigation_bar.discover": "Scopre",
"navigation_bar.domain_blocks": "Duminii piattati",
- "navigation_bar.edit_profile": "Mudificà u prufile",
"navigation_bar.filters": "Parolle silenzate",
"navigation_bar.follow_requests": "Dumande d'abbunamentu",
"navigation_bar.follows_and_followers": "Abbunati è abbunamenti",
@@ -318,12 +308,7 @@
"poll_button.add_poll": "Aghjunghje",
"poll_button.remove_poll": "Toglie u scandagliu",
"privacy.change": "Mudificà a cunfidenzialità di u statutu",
- "privacy.direct.long": "Mandà solu à quelli chì so mintuvati",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Mustrà solu à l'abbunati",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "Pubblicu",
- "privacy.unlisted.short": "Micca listatu",
"refresh": "Attualizà",
"regeneration_indicator.label": "Caricamentu…",
"regeneration_indicator.sublabel": "Priparazione di a vostra pagina d'accolta!",
@@ -409,7 +394,6 @@
"upload_form.description": "Discrizzione per i malvistosi",
"upload_form.edit": "Mudificà",
"upload_form.thumbnail": "Cambià vignetta",
- "upload_form.undo": "Sguassà",
"upload_form.video_description": "Discrizzione per i ciochi o cechi",
"upload_modal.analyzing_picture": "Analisi di u ritrattu…",
"upload_modal.apply": "Affettà",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index e18cabcec..7d91670de 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -87,7 +87,6 @@
"announcement.announcement": "Oznámení",
"attachments_list.unprocessed": "(nezpracováno)",
"audio.hide": "Skrýt zvuk",
- "autosuggest_hashtag.per_week": "{count} za týden",
"boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
"bundle_column_error.copy_stacktrace": "Zkopírovat zprávu o chybě",
"bundle_column_error.error.body": "Požadovanou stránku nelze vykreslit. Může to být způsobeno chybou v našem kódu nebo problémem s kompatibilitou prohlížeče.",
@@ -144,22 +143,12 @@
"compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky učené pouze pro sledující.",
"compose_form.lock_disclaimer.lock": "zamčený",
"compose_form.placeholder": "Co se vám honí hlavou?",
- "compose_form.poll.add_option": "Přidat volbu",
"compose_form.poll.duration": "Doba trvání ankety",
- "compose_form.poll.option_placeholder": "Volba {number}",
- "compose_form.poll.remove_option": "Odebrat tuto volbu",
"compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více voleb",
"compose_form.poll.switch_to_single": "Povolit u ankety výběr pouze jedné volby",
- "compose_form.publish": "Zveřejnit",
"compose_form.publish_form": "Zveřejnit",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Uložit změny",
- "compose_form.sensitive.hide": "{count, plural, one {Označit média za citlivá} few {Označit média za citlivá} many {Označit média za citlivá} other {Označit média za citlivá}}",
- "compose_form.sensitive.marked": "{count, plural, one {Média jsou označena za citlivá} few {Média jsou označena za citlivá} many {Média jsou označena za citlivá} other {Média jsou označena za citlivá}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Média nejsou označena za citlivá} few {Média nejsou označena za citlivá} many {Média nejsou označena za citlivá} other {Média nejsou označena za citlivá}}",
"compose_form.spoiler.marked": "Odebrat varování o obsahu",
"compose_form.spoiler.unmarked": "Přidat varování o obsahu",
- "compose_form.spoiler_placeholder": "Sem napište vaše varování",
"confirmation_modal.cancel": "Zrušit",
"confirmations.block.block_and_report": "Blokovat a nahlásit",
"confirmations.block.confirm": "Blokovat",
@@ -401,7 +390,6 @@
"navigation_bar.direct": "Soukromé zmínky",
"navigation_bar.discover": "Objevit",
"navigation_bar.domain_blocks": "Blokované domény",
- "navigation_bar.edit_profile": "Upravit profil",
"navigation_bar.explore": "Prozkoumat",
"navigation_bar.favourites": "Oblíbené",
"navigation_bar.filters": "Skrytá slova",
@@ -508,14 +496,7 @@
"poll_button.add_poll": "Přidat anketu",
"poll_button.remove_poll": "Odebrat anketu",
"privacy.change": "Změnit soukromí příspěvku",
- "privacy.direct.long": "Viditelný pouze pro zmíněné uživatele",
- "privacy.direct.short": "Pouze zmínění lidé",
- "privacy.private.long": "Viditelný pouze pro sledující",
- "privacy.private.short": "Pouze sledující",
- "privacy.public.long": "Viditelný pro všechny",
"privacy.public.short": "Veřejné",
- "privacy.unlisted.long": "Viditelný pro všechny, ale vyňat z funkcí objevování",
- "privacy.unlisted.short": "Neveřejný",
"privacy_policy.last_updated": "Naposledy aktualizováno {date}",
"privacy_policy.title": "Zásady ochrany osobních údajů",
"refresh": "Obnovit",
@@ -695,10 +676,8 @@
"upload_error.poll": "Nahrávání souborů není povoleno s anketami.",
"upload_form.audio_description": "Popis pro sluchově postižené",
"upload_form.description": "Popis pro zrakově postižené",
- "upload_form.description_missing": "Nebyl přidán popis",
"upload_form.edit": "Upravit",
"upload_form.thumbnail": "Změnit miniaturu",
- "upload_form.undo": "Smazat",
"upload_form.video_description": "Popis pro sluchově či zrakově postižené",
"upload_modal.analyzing_picture": "Analyzuji obrázek…",
"upload_modal.apply": "Použít",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 04b39904e..3cd090e18 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Cyhoeddiad",
"attachments_list.unprocessed": "(heb eu prosesu)",
"audio.hide": "Cuddio sain",
- "autosuggest_hashtag.per_week": "{count} yr wythnos",
"boost_modal.combo": "Mae modd pwyso {combo} er mwyn hepgor hyn tro nesa",
"bundle_column_error.copy_stacktrace": "Copïo'r adroddiad gwall",
"bundle_column_error.error.body": "Nid oedd modd cynhyrchu'r dudalen honno. Gall fod oherwydd gwall yn ein cod neu fater cydnawsedd porwr.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich postiadau dilynwyr-yn-unig.",
"compose_form.lock_disclaimer.lock": "wedi ei gloi",
"compose_form.placeholder": "Beth sydd ar eich meddwl?",
- "compose_form.poll.add_option": "Ychwanegu dewis",
"compose_form.poll.duration": "Cyfnod pleidlais",
- "compose_form.poll.option_placeholder": "Dewis {number}",
- "compose_form.poll.remove_option": "Tynnu'r dewis",
"compose_form.poll.switch_to_multiple": "Newid pleidlais i adael mwy nag un dewis",
"compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis",
- "compose_form.publish": "Cyhoeddi",
"compose_form.publish_form": "Cyhoeddi",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Cadw newidiadau",
- "compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif",
- "compose_form.sensitive.marked": "Cyfryngau wedi'u marcio'n sensitif",
- "compose_form.sensitive.unmarked": "Nid yw'r cyfryngau wedi'u marcio'n sensitif",
"compose_form.spoiler.marked": "Dileu rhybudd cynnwys",
"compose_form.spoiler.unmarked": "Ychwanegu rhybudd cynnwys",
- "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma",
"confirmation_modal.cancel": "Diddymu",
"confirmations.block.block_and_report": "Rhwystro ac Adrodd",
"confirmations.block.confirm": "Blocio",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Crybwylliadau preifat",
"navigation_bar.discover": "Darganfod",
"navigation_bar.domain_blocks": "Parthau wedi'u blocio",
- "navigation_bar.edit_profile": "Golygu proffil",
"navigation_bar.explore": "Darganfod",
"navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.filters": "Geiriau wedi'u tewi",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Ychwanegu pleidlais",
"poll_button.remove_poll": "Tynnu pleidlais",
"privacy.change": "Addasu preifatrwdd y post",
- "privacy.direct.long": "Dim ond yn weladwy i ddefnyddwyr a grybwyllwyd",
- "privacy.direct.short": "Dim ond pobl sy wedi'u crybwyll",
- "privacy.private.long": "Dim ond pobl sy'n ddilynwyr",
- "privacy.private.short": "Dilynwyr yn unig",
- "privacy.public.long": "Gweladwy i bawb",
"privacy.public.short": "Cyhoeddus",
- "privacy.unlisted.long": "Gweladwy i bawb, ond wedi optio allan o nodweddion darganfod",
- "privacy.unlisted.short": "Heb ei restru",
"privacy_policy.last_updated": "Diweddarwyd ddiwethaf ar {date}",
"privacy_policy.title": "Polisi Preifatrwydd",
"recommended": "Argymhellwyd",
@@ -715,10 +696,8 @@
"upload_error.poll": "Nid oes modd llwytho ffeiliau â phleidleisiau.",
"upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw",
"upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
- "upload_form.description_missing": "Dim disgrifiad wedi'i ychwanegu",
"upload_form.edit": "Golygu",
"upload_form.thumbnail": "Newid llun bach",
- "upload_form.undo": "Dileu",
"upload_form.video_description": "Disgrifio ar gyfer pobl sydd â cholled clyw neu amhariad golwg",
"upload_modal.analyzing_picture": "Yn dadansoddi llun…",
"upload_modal.apply": "Gosod",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 3bc830ad2..5d6cac69d 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Bekendtgørelse",
"attachments_list.unprocessed": "(ubehandlet)",
"audio.hide": "Skjul lyd",
- "autosuggest_hashtag.per_week": "{count} pr. uge",
"boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang",
"bundle_column_error.copy_stacktrace": "Kopiér fejlrapport",
"bundle_column_error.error.body": "Den anmodede side kunne ikke gengives. Dette kan skyldes flere typer fejl.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Hvad tænker du på?",
- "compose_form.poll.add_option": "Tilføj valgmulighed",
+ "compose_form.poll.add_option": "Tilføj mulighed",
"compose_form.poll.duration": "Afstemningens varighed",
+ "compose_form.poll.multiple": "Multivalg",
"compose_form.poll.option_placeholder": "Valgmulighed {number}",
"compose_form.poll.remove_option": "Fjern denne valgmulighed",
+ "compose_form.poll.single": "Vælg én",
"compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype",
"compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
- "compose_form.publish": "Publicér",
+ "compose_form.poll.type": "Stil",
+ "compose_form.publish": "Indsend",
"compose_form.publish_form": "Publicér",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Gem ændringer",
- "compose_form.sensitive.hide": "{count, plural, one {Markér medie som følsomt} other {Markér medier som følsomme}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medie er markeret som sensitivt} other {Medier er markerede som sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medie er ikke market som sensitivt} other {Medier er ikke markerede som sensitive}}",
+ "compose_form.reply": "Svar",
+ "compose_form.save_changes": "Opdatér",
"compose_form.spoiler.marked": "Fjern indholdsadvarsel",
"compose_form.spoiler.unmarked": "Tilføj indholdsadvarsel",
- "compose_form.spoiler_placeholder": "Skriv din advarsel hér",
+ "compose_form.spoiler_placeholder": "Indholdsadvarsel (valgfri)",
"confirmation_modal.cancel": "Afbryd",
"confirmations.block.block_and_report": "Blokér og Anmeld",
"confirmations.block.confirm": "Blokér",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Private omtaler",
"navigation_bar.discover": "Opdag",
"navigation_bar.domain_blocks": "Blokerede domæner",
- "navigation_bar.edit_profile": "Redigér profil",
"navigation_bar.explore": "Udforsk",
"navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Skjulte ord (mutede)",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Tilføj en afstemning",
"poll_button.remove_poll": "Fjern afstemning",
"privacy.change": "Tilpas indlægsfortrolighed",
- "privacy.direct.long": "Kun synlig for nævnte brugere",
- "privacy.direct.short": "Kun omtalte personer",
- "privacy.private.long": "Kun synlig for følgere",
- "privacy.private.short": "Kun følgere",
- "privacy.public.long": "Synlig for alle",
+ "privacy.direct.long": "Alle nævnt i indlægget",
+ "privacy.direct.short": "Bestemte personer",
+ "privacy.private.long": "Kun dine følgere",
+ "privacy.private.short": "Følgere",
+ "privacy.public.long": "Alle på og udenfor Mastodon",
"privacy.public.short": "Offentlig",
- "privacy.unlisted.long": "Synlig for alle, men med fravalgt visning i opdagelsesfunktioner",
- "privacy.unlisted.short": "Diskret",
+ "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i live feeds/hashtags, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.",
+ "privacy.unlisted.long": "Færre algoritmiske fanfarer",
+ "privacy.unlisted.short": "Tavsgøre offentligt",
"privacy_policy.last_updated": "Senest opdateret {date}",
"privacy_policy.title": "Privatlivspolitik",
"recommended": "Anbefalet",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "i dag",
+ "reply_indicator.attachments": "{count, plural, one {# vedhæftning} other {# vedhæftninger}}",
"reply_indicator.cancel": "Afbryd",
+ "reply_indicator.poll": "Afstemning",
"report.block": "Blokér",
"report.block_explanation": "Du vil ikke se vedkommendes indlæg. Vedkommende vil ikke kunne se dine indlæg eller følge dig. Vedkommende vil kunne se, at de er blokeret.",
"report.categories.legal": "Juridisk",
@@ -715,10 +716,8 @@
"upload_error.poll": "Filupload ikke tilladt for afstemninger.",
"upload_form.audio_description": "Beskrivelse til hørehæmmede",
"upload_form.description": "Beskrivelse til svagtseende",
- "upload_form.description_missing": "Ingen beskrivelse tilføjet",
"upload_form.edit": "Redigér",
"upload_form.thumbnail": "Skift miniature",
- "upload_form.undo": "Slet",
"upload_form.video_description": "Beskrivelse for hørehæmmede eller synshandicappede personer",
"upload_modal.analyzing_picture": "Analyserer billede…",
"upload_modal.apply": "Anvend",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index ddcbc58ce..a6dd098bb 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -62,7 +62,7 @@
"account.requested": "Die Genehmigung steht noch aus. Klicke hier, um die Follower-Anfrage zurückzuziehen",
"account.requested_follow": "{name} möchte dir folgen",
"account.share": "Profil von @{name} teilen",
- "account.show_reblogs": "Geteilte Beiträge von @{name} wieder anzeigen",
+ "account.show_reblogs": "Geteilte Beiträge von @{name} anzeigen",
"account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
"account.unblock": "Blockierung von @{name} aufheben",
"account.unblock_domain": "Blockierung von {domain} aufheben",
@@ -89,7 +89,6 @@
"announcement.announcement": "Ankündigung",
"attachments_list.unprocessed": "(ausstehend)",
"audio.hide": "Audio ausblenden",
- "autosuggest_hashtag.per_week": "{count} pro Woche",
"boost_modal.combo": "Mit {combo} wird dieses Fenster beim nächsten Mal nicht mehr angezeigt",
"bundle_column_error.copy_stacktrace": "Fehlerbericht kopieren",
"bundle_column_error.error.body": "Die angeforderte Seite konnte nicht dargestellt werden. Dies könnte auf einen Fehler in unserem Code oder auf ein Browser-Kompatibilitätsproblem zurückzuführen sein.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Andere können dir folgen und deine Beiträge sehen, die nur für Follower bestimmt sind.",
"compose_form.lock_disclaimer.lock": "geschützt",
"compose_form.placeholder": "Was gibt’s Neues?",
- "compose_form.poll.add_option": "Auswahl",
+ "compose_form.poll.add_option": "Auswahl hinzufügen",
"compose_form.poll.duration": "Umfragedauer",
- "compose_form.poll.option_placeholder": "{number}. Auswahl",
- "compose_form.poll.remove_option": "Auswahlfeld entfernen",
+ "compose_form.poll.multiple": "Mehrfachauswahl",
+ "compose_form.poll.option_placeholder": "{number}. Auswahlmöglichkeit",
+ "compose_form.poll.remove_option": "Dieses Auswahlfeld entfernen",
+ "compose_form.poll.single": "Einfachauswahl",
"compose_form.poll.switch_to_multiple": "Mehrfachauswahl erlauben",
- "compose_form.poll.switch_to_single": "Nur Einzelauswahl erlauben",
+ "compose_form.poll.switch_to_single": "Nur Einfachauswahl erlauben",
+ "compose_form.poll.type": "Art",
"compose_form.publish": "Veröffentlichen",
"compose_form.publish_form": "Neuer Beitrag",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Änderungen speichern",
- "compose_form.sensitive.hide": "{count, plural, one {Mit einer Inhaltswarnung versehen} other {Mit einer Inhaltswarnung versehen}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medien-Datei ist mit einer Inhaltswarnung versehen} other {Medien-Dateien sind mit einer Inhaltswarnung versehen}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medien-Datei ist nicht mit einer Inhaltswarnung versehen} other {Medien-Dateien sind nicht mit einer Inhaltswarnung versehen}}",
+ "compose_form.reply": "Antworten",
+ "compose_form.save_changes": "Aktualisieren",
"compose_form.spoiler.marked": "Inhaltswarnung entfernen",
"compose_form.spoiler.unmarked": "Inhaltswarnung hinzufügen",
- "compose_form.spoiler_placeholder": "Inhaltswarnung",
+ "compose_form.spoiler_placeholder": "Inhaltswarnung (optional)",
"confirmation_modal.cancel": "Abbrechen",
"confirmations.block.block_and_report": "Blockieren und melden",
"confirmations.block.confirm": "Blockieren",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Private Erwähnungen",
"navigation_bar.discover": "Entdecken",
"navigation_bar.domain_blocks": "Blockierte Domains",
- "navigation_bar.edit_profile": "Profil bearbeiten",
"navigation_bar.explore": "Entdecken",
"navigation_bar.favourites": "Favoriten",
"navigation_bar.filters": "Stummgeschaltete Wörter",
@@ -489,7 +487,7 @@
"onboarding.profile.lead": "Du kannst das später in den Einstellungen vervollständigen, wo noch mehr Anpassungsmöglichkeiten zur Verfügung stehen.",
"onboarding.profile.note": "Über mich",
"onboarding.profile.note_hint": "Du kannst andere @Profile erwähnen oder #Hashtags verwenden …",
- "onboarding.profile.save_and_continue": "Speichern und fortsetzen",
+ "onboarding.profile.save_and_continue": "Speichern und fortfahren",
"onboarding.profile.title": "Profil einrichten",
"onboarding.profile.upload_avatar": "Profilbild hochladen",
"onboarding.profile.upload_header": "Titelbild hochladen",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Umfrage erstellen",
"poll_button.remove_poll": "Umfrage entfernen",
"privacy.change": "Sichtbarkeit anpassen",
- "privacy.direct.long": "Nur für die erwähnten Profile sichtbar",
- "privacy.direct.short": "Nur erwähnte Profile",
- "privacy.private.long": "Nur für deine Follower sichtbar",
- "privacy.private.short": "Nur Follower",
- "privacy.public.long": "Für alle sichtbar",
+ "privacy.direct.long": "Alle in diesem Beitrag erwähnten Profile",
+ "privacy.direct.short": "Bestimmte Profile",
+ "privacy.private.long": "Nur deine Follower",
+ "privacy.private.short": "Follower",
+ "privacy.public.long": "Alle auf und außerhalb von Mastodon",
"privacy.public.short": "Öffentlich",
- "privacy.unlisted.long": "Für alle sichtbar, aber nicht über die Suche zu finden",
- "privacy.unlisted.short": "Nicht gelistet",
+ "privacy.unlisted.additional": "Das Verhalten ist wie bei „Öffentlich“, jedoch erscheint dieser Beitrag nicht in „Live-Feeds“, „Erkunden“, Hashtags oder über die Mastodon-Suchfunktion – selbst wenn du das in den Einstellungen aktiviert hast.",
+ "privacy.unlisted.long": "Weniger im Algorithmus berücksichtigt",
+ "privacy.unlisted.short": "Öffentlich (eingeschränkt)",
"privacy_policy.last_updated": "Stand: {date}",
"privacy_policy.title": "Datenschutzerklärung",
"recommended": "Empfohlen",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number} Min.",
"relative_time.seconds": "{number} Sek.",
"relative_time.today": "heute",
+ "reply_indicator.attachments": "{count, plural, one {# Anhang} other {# Anhänge}}",
"reply_indicator.cancel": "Abbrechen",
+ "reply_indicator.poll": "Umfrage",
"report.block": "Blockieren",
"report.block_explanation": "Du wirst keine Beiträge mehr von diesem Konto sehen. Das blockierte Konto wird deine Beiträge nicht mehr sehen oder dir folgen können. Die Person könnte mitbekommen, dass du sie blockiert hast.",
"report.categories.legal": "Rechtlich",
@@ -715,10 +716,8 @@
"upload_error.poll": "Medien-Anhänge sind zusammen mit Umfragen nicht erlaubt.",
"upload_form.audio_description": "Beschreibe für Menschen mit Hörbehinderung",
"upload_form.description": "Beschreibe für Menschen mit Sehbehinderung",
- "upload_form.description_missing": "Keine Beschreibung hinzugefügt",
"upload_form.edit": "Bearbeiten",
"upload_form.thumbnail": "Vorschaubild ändern",
- "upload_form.undo": "Löschen",
"upload_form.video_description": "Beschreibe für Menschen mit einer Hör- oder Sehbehinderung",
"upload_modal.analyzing_picture": "Bild wird analysiert …",
"upload_modal.apply": "Übernehmen",
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 17a0c9d4d..068d22890 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -85,7 +85,6 @@
"announcement.announcement": "Ανακοίνωση",
"attachments_list.unprocessed": "(μη επεξεργασμένο)",
"audio.hide": "Απόκρυψη αρχείου ήχου",
- "autosuggest_hashtag.per_week": "{count} ανά εβδομάδα",
"boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις την επόμενη φορά",
"bundle_column_error.copy_stacktrace": "Αντιγραφή αναφοράς σφάλματος",
"bundle_column_error.error.body": "Δεν ήταν δυνατή η απόδοση της σελίδας που ζήτησες. Μπορεί να οφείλεται σε σφάλμα στον κώδικά μας ή σε πρόβλημα συμβατότητας του προγράμματος περιήγησης.",
@@ -111,6 +110,7 @@
"column.direct": "Ιδιωτικές αναφορές",
"column.directory": "Περιήγηση στα προφίλ",
"column.domain_blocks": "Αποκλεισμένοι τομείς",
+ "column.favourites": "Αγαπημένα",
"column.follow_requests": "Αιτήματα ακολούθησης",
"column.home": "Αρχική",
"column.lists": "Λίστες",
@@ -131,6 +131,9 @@
"community.column_settings.remote_only": "Απομακρυσμένα μόνο",
"compose.language.change": "Αλλαγή γλώσσας",
"compose.language.search": "Αναζήτηση γλωσσών...",
+ "compose.published.body": "Η ανάρτηση δημοσιεύτηκε.",
+ "compose.published.open": "Άνοιγμα",
+ "compose.saved.body": "Η ανάρτηση αποθηκεύτηκε.",
"compose_form.direct_message_warning_learn_more": "Μάθε περισσότερα",
"compose_form.encryption_warning": "Οι δημοσιεύσεις στο Mastodon δεν είναι κρυπτογραφημένες από άκρο σε άκρο. Μη μοιράζεσαι ευαίσθητες πληροφορίες μέσω του Mastodon.",
"compose_form.hashtag_warning": "Αυτή η δημοσίευση δεν θα εμφανίζεται κάτω από οποιαδήποτε ετικέτα καθώς δεν είναι δημόσια. Μόνο οι δημόσιες δημοσιεύσεις μπορούν να αναζητηθούν με ετικέτα.",
@@ -139,20 +142,19 @@
"compose_form.placeholder": "Τι σκέφτεσαι;",
"compose_form.poll.add_option": "Προσθήκη επιλογής",
"compose_form.poll.duration": "Διάρκεια δημοσκόπησης",
+ "compose_form.poll.multiple": "Πολλαπλή επιλογή",
"compose_form.poll.option_placeholder": "Επιλογή {number}",
"compose_form.poll.remove_option": "Αφαίρεση επιλογής",
"compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές",
"compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
- "compose_form.publish": "Δημοσίευση",
+ "compose_form.poll.type": "Στυλ",
+ "compose_form.publish": "Ανάρτηση",
"compose_form.publish_form": "Δημοσίευση",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Αποθήκευση αλλαγών",
- "compose_form.sensitive.hide": "{count, plural, one {Επισήμανση πολυμέσου ως ευαίσθητο} other {Επισήμανση πολυμέσων ως ευαίσθητα}}",
- "compose_form.sensitive.marked": "{count, plural, one {Το πολυμέσο έχει σημειωθεί ως ευαίσθητο} other {Τα πολυμέσα έχουν σημειωθεί ως ευαίσθητα}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Το πολυμέσο δεν έχει σημειωθεί ως ευαίσθητο} other {Τα πολυμέσα δεν έχουν σημειωθεί ως ευαίσθητα}}",
+ "compose_form.reply": "Απάντηση",
+ "compose_form.save_changes": "Ενημέρωση",
"compose_form.spoiler.marked": "Αφαίρεση προειδοποίηση περιεχομένου",
"compose_form.spoiler.unmarked": "Προσθήκη προειδοποίησης περιεχομένου",
- "compose_form.spoiler_placeholder": "Γράψε την προειδοποίησή σου εδώ",
+ "compose_form.spoiler_placeholder": "Προειδοποίηση περιεχομένου (προαιρετική)",
"confirmation_modal.cancel": "Άκυρο",
"confirmations.block.block_and_report": "Αποκλεισμός & Αναφορά",
"confirmations.block.confirm": "Αποκλεισμός",
@@ -184,6 +186,7 @@
"conversation.mark_as_read": "Σήμανση ως αναγνωσμένο",
"conversation.open": "Προβολή συνομιλίας",
"conversation.with": "Με {names}",
+ "copy_icon_button.copied": "Αντιγράφηκε στο πρόχειρο",
"copypaste.copied": "Αντιγράφηκε",
"copypaste.copy_to_clipboard": "Αντιγραφή στο πρόχειρο",
"directory.federated": "Από το γνωστό fediverse",
@@ -260,6 +263,9 @@
"filter_modal.select_filter.subtitle": "Χρησιμοποιήστε μια υπάρχουσα κατηγορία ή δημιουργήστε μια νέα",
"filter_modal.select_filter.title": "Φιλτράρισμα αυτής της ανάρτησης",
"filter_modal.title.status": "Φιλτράρισμα μιας ανάρτησης",
+ "firehose.all": "Όλα",
+ "firehose.local": "Αυτός ο διακομιστής",
+ "firehose.remote": "Άλλοι διακομιστές",
"follow_request.authorize": "Εξουσιοδότησε",
"follow_request.reject": "Απέρριψε",
"follow_requests.unlocked_explanation": "Παρόλο που ο λογαριασμός σου δεν είναι κλειδωμένος, το προσωπικό του {domain} θεώρησαν πως ίσως να θέλεις να ελέγξεις χειροκίνητα αυτά τα αιτήματα ακολούθησης.",
@@ -285,11 +291,15 @@
"hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα",
"hashtag.follow": "Παρακολούθηση ετικέτας",
"hashtag.unfollow": "Διακοπή παρακολούθησης ετικέτας",
+ "home.actions.go_to_suggestions": "Βρείτε άτομα για να ακολουθήσετε",
"home.column_settings.basic": "Βασικές ρυθμίσεις",
"home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων",
"home.column_settings.show_replies": "Εμφάνιση απαντήσεων",
"home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:\nΗ τροφοδοσία της αρχικής σελίδας σας είναι ένα μίγμα από αναρτήσεις με τις ετικέτες και τα άτομα που επιλέξατε να ακολουθείτε, και τις αναρτήσεις που προωθούν. Εάν αυτό σας φαίνεται πολύ ήσυχο, μπορεί να θέλετε:",
+ "home.explore_prompt.title": "Αυτό είναι το σπίτι σας στο Mastodon.",
"home.hide_announcements": "Απόκρυψη ανακοινώσεων",
+ "home.pending_critical_update.link": "Δείτε ενημερώσεις",
+ "home.pending_critical_update.title": "Κρίσιμη ενημέρωση ασφαλείας διαθέσιμη!",
"home.show_announcements": "Εμφάνιση ανακοινώσεων",
"interaction_modal.description.follow": "Με έναν λογαριασμό Mastodon, μπορείς να ακολουθήσεις τον/την {name} ώστε να λαμβάνεις τις αναρτήσεις του/της στη δική σου ροή.",
"interaction_modal.description.reblog": "Με ένα λογαριασμό Mastodon, μπορείς να ενισχύσεις αυτή την ανάρτηση για να τη μοιραστείς με τους δικούς σου ακολούθους.",
@@ -314,6 +324,7 @@
"keyboard_shortcuts.direct": "για το άνοιγμα της στήλης ιδιωτικών επισημάνσεων",
"keyboard_shortcuts.down": "κίνηση προς τα κάτω στη λίστα",
"keyboard_shortcuts.enter": "Εμφάνιση ανάρτησης",
+ "keyboard_shortcuts.favourite": "Αγαπημένη δημοσίευση",
"keyboard_shortcuts.federated": "Άνοιγμα ροής συναλλαγών",
"keyboard_shortcuts.heading": "Συντομεύσεις πληκτρολογίου",
"keyboard_shortcuts.home": "Άνοιγμα ροής αρχικής σελίδας",
@@ -358,6 +369,7 @@
"lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς",
"lists.subheading": "Οι λίστες σου",
"load_pending": "{count, plural, one {# νέο στοιχείο} other {# νέα στοιχεία}}",
+ "loading_indicator.label": "Φόρτωση…",
"media_gallery.toggle_visible": "{number, plural, one {Απόκρυψη εικόνας} other {Απόκρυψη εικόνων}}",
"moved_to_account_banner.text": "Ο λογαριασμός σου {disabledAccount} είναι προσωρινά απενεργοποιημένος επειδή μεταφέρθηκες στον {movedToAccount}.",
"mute_modal.duration": "Διάρκεια",
@@ -371,7 +383,6 @@
"navigation_bar.direct": "Ιδιωτικές επισημάνσεις",
"navigation_bar.discover": "Ανακάλυψη",
"navigation_bar.domain_blocks": "Αποκλεισμένοι τομείς",
- "navigation_bar.edit_profile": "Επεξεργασία προφίλ",
"navigation_bar.explore": "Εξερεύνηση",
"navigation_bar.filters": "Αποσιωπημένες λέξεις",
"navigation_bar.follow_requests": "Αιτήματα ακολούθησης",
@@ -380,6 +391,7 @@
"navigation_bar.lists": "Λίστες",
"navigation_bar.logout": "Αποσύνδεση",
"navigation_bar.mutes": "Αποσιωπημένοι χρήστες",
+ "navigation_bar.opened_in_classic_interface": "Δημοσιεύσεις, λογαριασμοί και άλλες συγκεκριμένες σελίδες ανοίγονται από προεπιλογή στην κλασική διεπαφή ιστού.",
"navigation_bar.personal": "Προσωπικά",
"navigation_bar.pins": "Καρφιτσωμένες αναρτήσεις",
"navigation_bar.preferences": "Προτιμήσεις",
@@ -403,6 +415,7 @@
"notifications.column_settings.admin.report": "Νέες αναφορές:",
"notifications.column_settings.admin.sign_up": "Νέες εγγραφές:",
"notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
+ "notifications.column_settings.favourite": "Αγαπημένα:",
"notifications.column_settings.filter_bar.advanced": "Εμφάνιση όλων των κατηγοριών",
"notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
"notifications.column_settings.filter_bar.show_bar": "Εμφάνιση μπάρας φίλτρου",
@@ -439,6 +452,12 @@
"onboarding.actions.go_to_home": "Πηγαίνετε στην αρχική σας ροή",
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
"onboarding.follows.title": "Δημοφιλή στο Mastodon",
+ "onboarding.profile.note": "Βιογραφικό",
+ "onboarding.profile.note_hint": "Μπορείτε να @αναφέρετε άλλα άτομα ή #hashtags…",
+ "onboarding.profile.save_and_continue": "Αποθήκευση και συνέχεια",
+ "onboarding.profile.title": "Ρύθμιση προφίλ",
+ "onboarding.profile.upload_avatar": "Μεταφόρτωση εικόνας προφίλ",
+ "onboarding.profile.upload_header": "Μεταφόρτωση κεφαλίδας προφίλ",
"onboarding.share.lead": "Let people know how they can find you on Mastodon!\nΕνημερώστε άλλα άτομα πώς μπορούν να σας βρουν στο Mastodon!",
"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:",
@@ -447,6 +466,7 @@
"onboarding.steps.follow_people.body": "You curate your own feed. Lets fill it with interesting people.",
"onboarding.steps.follow_people.title": "Follow {count, plural, one {one person} other {# people}}",
"onboarding.steps.publish_status.body": "Say hello to the world.",
+ "onboarding.steps.publish_status.title": "Κάντε την πρώτη σας δημοσίευση",
"onboarding.steps.setup_profile.body": "Others are more likely to interact with you with a filled out profile.",
"onboarding.steps.setup_profile.title": "Customize your profile",
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
@@ -456,6 +476,7 @@
"picture_in_picture.restore": "Βάλε το πίσω",
"poll.closed": "Κλειστή",
"poll.refresh": "Ανανέωση",
+ "poll.reveal": "Δείτε τα αποτελέσματα",
"poll.total_people": "{count, plural, one {# άτομο} other {# άτομα}}",
"poll.total_votes": "{count, plural, one {# ψήφος} other {# ψήφοι}}",
"poll.vote": "Ψήφισε",
@@ -464,16 +485,14 @@
"poll_button.add_poll": "Προσθήκη δημοσκόπησης",
"poll_button.remove_poll": "Αφαίρεση δημοσκόπησης",
"privacy.change": "Προσαρμογή ιδιωτικότητας ανάρτησης",
- "privacy.direct.long": "Δημοσίευση μόνο σε όσους επισημαίνονται",
- "privacy.direct.short": "Αναφερόμενα άτομα μόνο",
- "privacy.private.long": "Ορατό μόνο για τους ακολούθους",
- "privacy.private.short": "Μόνο ακόλουθοι",
- "privacy.public.long": "Ορατό σε όλους",
+ "privacy.direct.long": "Όλοι όσοι αναφέρθηκαν στη δημοσίευση",
+ "privacy.direct.short": "Συγκεκριμένα άτομα",
+ "privacy.private.long": "Μόνο οι ακόλουθοί σας",
+ "privacy.private.short": "Ακόλουθοι",
"privacy.public.short": "Δημόσιο",
- "privacy.unlisted.long": "Ορατό για όλους, εκτός αυτών που δεν συμμετέχουν σε δυνατότητες ανακάλυψης",
- "privacy.unlisted.short": "Μη καταχωρημένα",
"privacy_policy.last_updated": "Τελευταία ενημέρωση {date}",
"privacy_policy.title": "Πολιτική Απορρήτου",
+ "recommended": "Προτεινόμενα",
"refresh": "Ανανέωση",
"regeneration_indicator.label": "Φορτώνει…",
"regeneration_indicator.sublabel": "Η αρχική σου ροή ετοιμάζεται!",
@@ -489,8 +508,10 @@
"relative_time.seconds": "{number}δ",
"relative_time.today": "σήμερα",
"reply_indicator.cancel": "Άκυρο",
+ "reply_indicator.poll": "Δημοσκόπηση",
"report.block": "Αποκλεισμός",
"report.block_explanation": "Δεν θα βλέπεις τις αναρτήσεις του. Δεν θα μπορεί να δει τις αναρτήσεις σου ή να σε ακολουθήσει. Θα μπορεί να δει ότι έχει αποκλειστεί.",
+ "report.categories.legal": "Νομικό περιεχόμενο",
"report.categories.other": "Άλλες",
"report.categories.spam": "Ανεπιθύμητα",
"report.categories.violation": "Το περιεχόμενο παραβιάζει έναν ή περισσότερους κανόνες διακομιστή",
@@ -508,6 +529,8 @@
"report.placeholder": "Επιπλέον σχόλια",
"report.reasons.dislike": "Δεν μου αρέσει",
"report.reasons.dislike_description": "Δεν είναι κάτι που θα ήθελες να δεις",
+ "report.reasons.legal": "Είναι παράνομο",
+ "report.reasons.legal_description": "Πιστεύετε ότι παραβιάζει το νόμο της χώρας σας ή της χώρας του διακομιστή",
"report.reasons.other": "Είναι κάτι άλλο",
"report.reasons.other_description": "Το ζήτημα δεν ταιριάζει σε άλλες κατηγορίες",
"report.reasons.spam": "Είναι σπαμ",
@@ -541,10 +564,12 @@
"search.search_or_paste": "Αναζήτηση ή εισαγωγή URL",
"search_popout.quick_actions": "Γρήγορες ενέργειες",
"search_popout.recent": "Πρόσφατες αναζητήσεις",
+ "search_popout.user": "χρήστης",
"search_results.accounts": "Προφίλ",
"search_results.all": "Όλα",
"search_results.hashtags": "Ετικέτες",
"search_results.nothing_found": "Δεν βρέθηκε τίποτα με αυτούς τους όρους αναζήτησης",
+ "search_results.see_all": "Δες τα όλα",
"search_results.statuses": "Αναρτήσεις",
"search_results.title": "Αναζήτηση για {q}",
"server_banner.about_active_users": "Άτομα που χρησιμοποιούν αυτόν τον διακομιστή κατά τις τελευταίες 30 ημέρες (Μηνιαία Ενεργοί Χρήστες)",
@@ -555,6 +580,8 @@
"server_banner.server_stats": "Στατιστικά διακομιστή:",
"sign_in_banner.create_account": "Δημιουργία λογαριασμού",
"sign_in_banner.sign_in": "Σύνδεση",
+ "sign_in_banner.sso_redirect": "Συνδεθείτε ή Εγγραφείτε",
+ "sign_in_banner.text": "Συνδεθείτε για να ακολουθήσετε προφίλ ή ετικέτες, αγαπήστε, μοιραστείτε και απαντήστε σε δημοσιεύσεις. Μπορείτε επίσης να αλληλεπιδράσετε από τον λογαριασμό σας σε διαφορετικό διακομιστή.",
"status.admin_account": "Άνοιγμα διεπαφής συντονισμού για τον/την @{name}",
"status.admin_domain": "Άνοιγμα λειτουργίας διαμεσολάβησης για {domain}",
"status.admin_status": "Άνοιγμα αυτής της ανάρτησης σε διεπαφή συντονισμού",
@@ -571,6 +598,7 @@
"status.edited": "Επεξεργάστηκε στις {date}",
"status.edited_x_times": "Επεξεργάστηκε {count, plural, one {{count} φορά} other {{count} φορές}}",
"status.embed": "Ενσωμάτωσε",
+ "status.favourite": "Αγαπημένα",
"status.filter": "Φιλτράρισμα αυτής της ανάρτησης",
"status.filtered": "Φιλτραρισμένα",
"status.hide": "Απόκρυψη ανάρτησης",
@@ -635,10 +663,8 @@
"upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
"upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
"upload_form.description": "Περιγραφή για άτομα με προβλήματα όρασης",
- "upload_form.description_missing": "Δεν προστέθηκε περιγραφή",
"upload_form.edit": "Επεξεργασία",
"upload_form.thumbnail": "Αλλαγή μικρογραφίας",
- "upload_form.undo": "Διαγραφή",
"upload_form.video_description": "Περιγραφή για άτομα με προβλήματα ακοής ή όρασης",
"upload_modal.analyzing_picture": "Ανάλυση εικόνας…",
"upload_modal.apply": "Εφαρμογή",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 37e5efa5b..2cf1b4dba 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -87,7 +87,6 @@
"announcement.announcement": "Announcement",
"attachments_list.unprocessed": "(unprocessed)",
"audio.hide": "Hide audio",
- "autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.copy_stacktrace": "Copy error report",
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
@@ -144,22 +143,12 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "What's on your mind?",
- "compose_form.poll.add_option": "Add a choice",
"compose_form.poll.duration": "Poll duration",
- "compose_form.poll.option_placeholder": "Choice {number}",
- "compose_form.poll.remove_option": "Remove this choice",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Publish",
"compose_form.publish_form": "New post",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
- "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
"compose_form.spoiler.marked": "Remove content warning",
"compose_form.spoiler.unmarked": "Add content warning",
- "compose_form.spoiler_placeholder": "Write your warning here",
"confirmation_modal.cancel": "Cancel",
"confirmations.block.block_and_report": "Block & Report",
"confirmations.block.confirm": "Block",
@@ -406,7 +395,6 @@
"navigation_bar.direct": "Private mentions",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Blocked domains",
- "navigation_bar.edit_profile": "Edit profile",
"navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favourites",
"navigation_bar.filters": "Muted words",
@@ -524,14 +512,7 @@
"poll_button.add_poll": "Add a poll",
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Change post privacy",
- "privacy.direct.long": "Visible for mentioned users only",
- "privacy.direct.short": "Mentioned people only",
- "privacy.private.long": "Visible for followers only",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "Visible for all",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
- "privacy.unlisted.short": "Unlisted",
"privacy_policy.last_updated": "Last updated {date}",
"privacy_policy.title": "Privacy Policy",
"recommended": "Recommended",
@@ -713,10 +694,8 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people who are deaf or hard of hearing",
"upload_form.description": "Describe for people who are blind or have low vision",
- "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
- "upload_form.undo": "Delete",
"upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
"upload_modal.analyzing_picture": "Analysing picture…",
"upload_modal.apply": "Apply",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index b4b5886c0..8155ca9ad 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Announcement",
"attachments_list.unprocessed": "(unprocessed)",
"audio.hide": "Hide audio",
- "autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "You can press {combo} to skip this next time",
"bundle_column_error.copy_stacktrace": "Copy error report",
"bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
@@ -146,22 +145,20 @@
"compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
"compose_form.lock_disclaimer.lock": "locked",
"compose_form.placeholder": "What's on your mind?",
- "compose_form.poll.add_option": "Add a choice",
"compose_form.poll.duration": "Poll duration",
- "compose_form.poll.option_placeholder": "Choice {number}",
- "compose_form.poll.remove_option": "Remove this choice",
+ "compose_form.poll.multiple": "Multiple choice",
+ "compose_form.poll.option_placeholder": "Option {number}",
+ "compose_form.poll.single": "Pick one",
"compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
"compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
- "compose_form.publish": "Publish",
+ "compose_form.poll.type": "Style",
+ "compose_form.publish": "Post",
"compose_form.publish_form": "New post",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save changes",
- "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+ "compose_form.reply": "Reply",
+ "compose_form.save_changes": "Update",
"compose_form.spoiler.marked": "Remove content warning",
"compose_form.spoiler.unmarked": "Add content warning",
- "compose_form.spoiler_placeholder": "Write your warning here",
+ "compose_form.spoiler_placeholder": "Content warning (optional)",
"confirmation_modal.cancel": "Cancel",
"confirmations.block.block_and_report": "Block & Report",
"confirmations.block.confirm": "Block",
@@ -282,6 +279,12 @@
"follow_request.authorize": "Authorize",
"follow_request.reject": "Reject",
"follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+ "follow_suggestions.curated_suggestion": "Editors' Choice",
+ "follow_suggestions.dismiss": "Don't show again",
+ "follow_suggestions.personalized_suggestion": "Personalized suggestion",
+ "follow_suggestions.popular_suggestion": "Popular suggestion",
+ "follow_suggestions.view_all": "View all",
+ "follow_suggestions.who_to_follow": "Who to follow",
"followed_tags": "Followed hashtags",
"footer.about": "About",
"footer.directory": "Profiles directory",
@@ -308,13 +311,9 @@
"hashtag.follow": "Follow hashtag",
"hashtag.unfollow": "Unfollow hashtag",
"hashtags.and_other": "…and {count, plural, other {# more}}",
- "home.actions.go_to_explore": "See what's trending",
- "home.actions.go_to_suggestions": "Find people to follow",
"home.column_settings.basic": "Basic",
"home.column_settings.show_reblogs": "Show boosts",
"home.column_settings.show_replies": "Show replies",
- "home.explore_prompt.body": "Your home feed will have a mix of posts from the hashtags you've chosen to follow, the people you've chosen to follow, and the posts they boost. If that feels too quiet, you may want to:",
- "home.explore_prompt.title": "This is your home base within Mastodon.",
"home.hide_announcements": "Hide announcements",
"home.pending_critical_update.body": "Please update your Mastodon server as soon as possible!",
"home.pending_critical_update.link": "See updates",
@@ -410,7 +409,6 @@
"navigation_bar.direct": "Private mentions",
"navigation_bar.discover": "Discover",
"navigation_bar.domain_blocks": "Blocked domains",
- "navigation_bar.edit_profile": "Edit profile",
"navigation_bar.explore": "Explore",
"navigation_bar.favourites": "Favorites",
"navigation_bar.filters": "Muted words",
@@ -528,14 +526,15 @@
"poll_button.add_poll": "Add a poll",
"poll_button.remove_poll": "Remove poll",
"privacy.change": "Change post privacy",
- "privacy.direct.long": "Visible for mentioned users only",
- "privacy.direct.short": "Mentioned people only",
- "privacy.private.long": "Visible for followers only",
- "privacy.private.short": "Followers only",
- "privacy.public.long": "Visible for all",
+ "privacy.direct.long": "Everyone mentioned in the post",
+ "privacy.direct.short": "Specific people",
+ "privacy.private.long": "Only your followers",
+ "privacy.private.short": "Followers",
+ "privacy.public.long": "Anyone on and off Mastodon",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
- "privacy.unlisted.short": "Unlisted",
+ "privacy.unlisted.additional": "This behaves exactly like public, except the post will not appear in live feeds or hashtags, explore, or Mastodon search, even if you are opted-in account-wide.",
+ "privacy.unlisted.long": "Fewer algorithmic fanfares",
+ "privacy.unlisted.short": "Quiet public",
"privacy_policy.last_updated": "Last updated {date}",
"privacy_policy.title": "Privacy Policy",
"recommended": "Recommended",
@@ -553,7 +552,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "today",
+ "reply_indicator.attachments": "{count, plural, one {# attachment} other {# attachments}}",
"reply_indicator.cancel": "Cancel",
+ "reply_indicator.poll": "Poll",
"report.block": "Block",
"report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
"report.categories.legal": "Legal",
@@ -721,10 +722,8 @@
"upload_error.poll": "File upload not allowed with polls.",
"upload_form.audio_description": "Describe for people who are deaf or hard of hearing",
"upload_form.description": "Describe for people who are blind or have low vision",
- "upload_form.description_missing": "No description added",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Change thumbnail",
- "upload_form.undo": "Delete",
"upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
"upload_modal.analyzing_picture": "Analyzing picture…",
"upload_modal.apply": "Apply",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 643329ba9..907a918af 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Anoncoj",
"attachments_list.unprocessed": "(neprilaborita)",
"audio.hide": "Kaŝi aŭdion",
- "autosuggest_hashtag.per_week": "po {count} por semajno",
"boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
"bundle_column_error.copy_stacktrace": "Kopii la eraran raporton",
"bundle_column_error.error.body": "La petita paĝo ne povas redonitis. Eble estas eraro.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn afiŝojn nur al la sekvantoj.",
"compose_form.lock_disclaimer.lock": "ŝlosita",
"compose_form.placeholder": "Kion vi pensas?",
- "compose_form.poll.add_option": "Aldoni elekteblon",
"compose_form.poll.duration": "Daŭro de la balotenketo",
- "compose_form.poll.option_placeholder": "Elekteblo {number}",
- "compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon",
"compose_form.poll.switch_to_multiple": "Ŝanĝi la balotenketon por permesi multajn elektojn",
"compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton",
- "compose_form.publish": "Afiŝi",
"compose_form.publish_form": "Afiŝi",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Konservi ŝanĝojn",
- "compose_form.sensitive.hide": "{count, plural, one {Marki la plurmedio kiel tikla} other {Marki la plurmedioj kiel tiklaj}}",
- "compose_form.sensitive.marked": "{count, plural, one {La plurmedio estas markita kiel tikla} other {La plurmedioj estas markitaj kiel tiklaj}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {La plurmedio ne estas markita kiel tikla} other {La plurmedioj ne estas markitaj kiel tiklaj}}",
"compose_form.spoiler.marked": "Forigi la averton de enhavo",
"compose_form.spoiler.unmarked": "Aldoni averton de enhavo",
- "compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie",
"confirmation_modal.cancel": "Nuligi",
"confirmations.block.block_and_report": "Bloki kaj raporti",
"confirmations.block.confirm": "Bloki",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Privataj mencioj",
"navigation_bar.discover": "Esplori",
"navigation_bar.domain_blocks": "Blokitaj domajnoj",
- "navigation_bar.edit_profile": "Redakti profilon",
"navigation_bar.explore": "Esplori",
"navigation_bar.favourites": "Stelumoj",
"navigation_bar.filters": "Silentigitaj vortoj",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Aldoni balotenketon",
"poll_button.remove_poll": "Forigi balotenketon",
"privacy.change": "Agordi mesaĝan privatecon",
- "privacy.direct.long": "Videbla nur al menciitaj uzantoj",
- "privacy.direct.short": "Nur menciitaj personoj",
- "privacy.private.long": "Videbla nur al viaj sekvantoj",
- "privacy.private.short": "Nur abonantoj",
- "privacy.public.long": "Videbla por ĉiuj",
"privacy.public.short": "Publika",
- "privacy.unlisted.long": "Videbla por ĉiuj, sed ekskluzive el la funkcio de esploro",
- "privacy.unlisted.short": "Nelistigita",
"privacy_policy.last_updated": "Laste ĝisdatigita en {date}",
"privacy_policy.title": "Politiko de privateco",
"recommended": "Rekomendita",
@@ -715,10 +696,8 @@
"upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.",
"upload_form.audio_description": "Priskribi por homoj kiuj malfacile aŭdi",
"upload_form.description": "Priskribi por personoj, kiuj estas blindaj aŭ havas vidmalsufiĉon",
- "upload_form.description_missing": "Neniu priskribo aldonita",
"upload_form.edit": "Redakti",
"upload_form.thumbnail": "Ŝanĝi etigita bildo",
- "upload_form.undo": "Forigi",
"upload_form.video_description": "Priskribi por homoj kiuj malfacile aŭdi aŭ vidi",
"upload_modal.analyzing_picture": "Bilda analizado…",
"upload_modal.apply": "Apliki",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 7c2e4f0d4..8816f18af 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Anuncio",
"attachments_list.unprocessed": "[sin procesar]",
"audio.hide": "Ocultar audio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez",
"bundle_column_error.copy_stacktrace": "Copiar informe de error",
"bundle_column_error.error.body": "La página solicitada no pudo ser cargada. Podría deberse a un error de programación en nuestro código o a un problema de compatibilidad con el navegador web.",
@@ -146,22 +145,21 @@
"compose_form.lock_disclaimer": "Tu cuenta no es {locked}. Todos pueden seguirte para ver tus mensajes marcados como \"Sólo para seguidores\".",
"compose_form.lock_disclaimer.lock": "privada",
"compose_form.placeholder": "¿Qué onda?",
- "compose_form.poll.add_option": "Agregá una opción",
"compose_form.poll.duration": "Duración de la encuesta",
+ "compose_form.poll.multiple": "Selección múltiple",
"compose_form.poll.option_placeholder": "Opción {number}",
"compose_form.poll.remove_option": "Quitar esta opción",
+ "compose_form.poll.single": "Elige uno",
"compose_form.poll.switch_to_multiple": "Cambiar encuesta para permitir opciones múltiples",
"compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción",
+ "compose_form.poll.type": "Estilo",
"compose_form.publish": "Publicar",
"compose_form.publish_form": "Nuevo mensaje",
- "compose_form.publish_loud": "¡{publish}!",
- "compose_form.save_changes": "Guardar cambios",
- "compose_form.sensitive.hide": "Marcar medio como sensible",
- "compose_form.sensitive.marked": "{count, plural, one {El medio está marcado como sensible} other {Los medios están marcados como sensibles}}",
- "compose_form.sensitive.unmarked": "El medio no está marcado como sensible",
+ "compose_form.reply": "Responder",
+ "compose_form.save_changes": "Actualizar",
"compose_form.spoiler.marked": "Quitar advertencia de contenido",
"compose_form.spoiler.unmarked": "Agregar advertencia de contenido",
- "compose_form.spoiler_placeholder": "Escribí tu advertencia acá",
+ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear y denunciar",
"confirmations.block.confirm": "Bloquear",
@@ -408,7 +406,6 @@
"navigation_bar.direct": "Menciones privadas",
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios bloqueados",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explorá",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
@@ -526,14 +523,10 @@
"poll_button.add_poll": "Agregar encuesta",
"poll_button.remove_poll": "Quitar encuesta",
"privacy.change": "Configurar privacidad del mensaje",
- "privacy.direct.long": "Visible sólo para los usuarios mencionados",
- "privacy.direct.short": "Sólo cuentas mencionadas",
- "privacy.private.long": "Visible sólo para los seguidores",
- "privacy.private.short": "Sólo para seguidores",
- "privacy.public.long": "Visible para todos",
+ "privacy.direct.short": "Personas específicas",
+ "privacy.private.long": "Solo tus seguidores",
+ "privacy.private.short": "Seguidores",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visible para todos, pero excluido de las características de descubrimiento",
- "privacy.unlisted.short": "No listado",
"privacy_policy.last_updated": "Última actualización: {date}",
"privacy_policy.title": "Política de privacidad",
"recommended": "Opción recomendada",
@@ -715,10 +708,8 @@
"upload_error.poll": "No se permite la subida de archivos en encuestas.",
"upload_form.audio_description": "Agregá una descripción para personas con dificultades auditivas",
"upload_form.description": "Agregá una descripción para personas con dificultades visuales",
- "upload_form.description_missing": "No se agregó descripción",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
- "upload_form.undo": "Eliminar",
"upload_form.video_description": "Agregá una descripción para personas con dificultades auditivas o visuales",
"upload_modal.analyzing_picture": "Analizando imagen…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index fab5f6ec9..fdc57ac6d 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Anuncio",
"attachments_list.unprocessed": "(sin procesar)",
"audio.hide": "Ocultar audio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
"bundle_column_error.copy_stacktrace": "Copiar informe de error",
"bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
"compose_form.lock_disclaimer.lock": "bloqueado",
"compose_form.placeholder": "¿En qué estás pensando?",
- "compose_form.poll.add_option": "Añadir una opción",
+ "compose_form.poll.add_option": "Agregar opción",
"compose_form.poll.duration": "Duración de la encuesta",
- "compose_form.poll.option_placeholder": "Elección {number}",
+ "compose_form.poll.multiple": "Selección múltiple",
+ "compose_form.poll.option_placeholder": "Opción {number}",
"compose_form.poll.remove_option": "Eliminar esta opción",
+ "compose_form.poll.single": "Seleccione uno",
"compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
- "compose_form.publish": "Publicar",
+ "compose_form.poll.type": "Estilo",
+ "compose_form.publish": "Publicación",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "¡{publish}!",
- "compose_form.save_changes": "Guardar cambios",
- "compose_form.sensitive.hide": "Marcar multimedia como sensible",
- "compose_form.sensitive.marked": "Material marcado como sensible",
- "compose_form.sensitive.unmarked": "Material no marcado como sensible",
+ "compose_form.reply": "Respuesta",
+ "compose_form.save_changes": "Actualización",
"compose_form.spoiler.marked": "Texto oculto tras la advertencia",
"compose_form.spoiler.unmarked": "Texto no oculto",
- "compose_form.spoiler_placeholder": "Advertencia de contenido",
+ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear y Denunciar",
"confirmations.block.confirm": "Bloquear",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Menciones privadas",
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios ocultos",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Añadir una encuesta",
"poll_button.remove_poll": "Eliminar encuesta",
"privacy.change": "Ajustar privacidad",
- "privacy.direct.long": "Sólo mostrar a los usuarios mencionados",
- "privacy.direct.short": "Solo personas mencionadas",
- "privacy.private.long": "Sólo mostrar a seguidores",
- "privacy.private.short": "Solo seguidores",
- "privacy.public.long": "Visible para todos",
+ "privacy.direct.long": "Todos los mencionados en la publicación",
+ "privacy.direct.short": "Personas específicas",
+ "privacy.private.long": "Sólo tus seguidores",
+ "privacy.private.short": "Seguidores",
+ "privacy.public.long": "Cualquiera dentro y fuera de Mastodon",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento",
- "privacy.unlisted.short": "No listado",
+ "privacy.unlisted.additional": "Esto se comporta exactamente igual que el público, excepto que el post no aparecerá en las cronologías en directo o en los hashtags, la exploración o busquedas en Mastodon, incluso si está optado por activar la cuenta de usuario.",
+ "privacy.unlisted.long": "Menos fanfares algorítmicos",
+ "privacy.unlisted.short": "Público silencioso",
"privacy_policy.last_updated": "Actualizado por última vez {date}",
"privacy_policy.title": "Política de Privacidad",
"recommended": "Recomendado",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number} m",
"relative_time.seconds": "{number} s",
"relative_time.today": "hoy",
+ "reply_indicator.attachments": "{count, plural, one {# adjunto} other {# adjuntos}}",
"reply_indicator.cancel": "Cancelar",
+ "reply_indicator.poll": "Encuesta",
"report.block": "Bloquear",
"report.block_explanation": "No veras sus publicaciones. No podrán ver tus publicaciones ni seguirte. Podrán saber que están bloqueados.",
"report.categories.legal": "Legal",
@@ -715,10 +716,8 @@
"upload_error.poll": "Subida de archivos no permitida con encuestas.",
"upload_form.audio_description": "Describir para personas con problemas auditivos",
"upload_form.description": "Describir para los usuarios con dificultad visual",
- "upload_form.description_missing": "Sin descripción añadida",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
- "upload_form.undo": "Borrar",
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
"upload_modal.analyzing_picture": "Analizando imagen…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 0d6149f5f..2e4ea9317 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Anuncio",
"attachments_list.unprocessed": "(sin procesar)",
"audio.hide": "Ocultar audio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
"bundle_column_error.copy_stacktrace": "Copiar informe de error",
"bundle_column_error.error.body": "La página solicitada no pudo ser renderizada. Podría deberse a un error en nuestro código o a un problema de compatibilidad con el navegador.",
@@ -146,22 +145,21 @@
"compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus publicaciones solo para seguidores.",
"compose_form.lock_disclaimer.lock": "bloqueado",
"compose_form.placeholder": "¿En qué estás pensando?",
- "compose_form.poll.add_option": "Añadir una opción",
"compose_form.poll.duration": "Duración de la encuesta",
- "compose_form.poll.option_placeholder": "Elección {number}",
- "compose_form.poll.remove_option": "Eliminar esta opción",
+ "compose_form.poll.multiple": "Selección múltiple",
+ "compose_form.poll.option_placeholder": "Opción {number}",
+ "compose_form.poll.remove_option": "Quitar esta opción",
+ "compose_form.poll.single": "Elige uno",
"compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
"compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
+ "compose_form.poll.type": "Estilo",
"compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "¡{publish}!",
- "compose_form.save_changes": "Guardar cambios",
- "compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
- "compose_form.sensitive.marked": "{count, plural, one {Material marcado como sensible} other {Material marcado como sensible}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Material no marcado como sensible} other {Material no marcado como sensible}}",
+ "compose_form.reply": "Responder",
+ "compose_form.save_changes": "Actualizar",
"compose_form.spoiler.marked": "Quitar advertencia de contenido",
"compose_form.spoiler.unmarked": "Añadir advertencia de contenido",
- "compose_form.spoiler_placeholder": "Escribe aquí tu advertencia",
+ "compose_form.spoiler_placeholder": "Advertencia de contenido (opcional)",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear y Reportar",
"confirmations.block.confirm": "Bloquear",
@@ -408,7 +406,6 @@
"navigation_bar.direct": "Menciones privadas",
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios ocultos",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palabras silenciadas",
@@ -526,14 +523,10 @@
"poll_button.add_poll": "Añadir una encuesta",
"poll_button.remove_poll": "Eliminar encuesta",
"privacy.change": "Ajustar privacidad",
- "privacy.direct.long": "Visible solo para usuarios mencionados",
- "privacy.direct.short": "Sólo cuentas mencionadas",
- "privacy.private.long": "Sólo mostrar a seguidores",
- "privacy.private.short": "Solo seguidores",
- "privacy.public.long": "Visible para todos",
+ "privacy.direct.short": "Personas específicas",
+ "privacy.private.long": "Solo tus seguidores",
+ "privacy.private.short": "Seguidores",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visible para todos, pero excluido de las funciones de descubrimiento",
- "privacy.unlisted.short": "No listado",
"privacy_policy.last_updated": "Actualizado por última vez {date}",
"privacy_policy.title": "Política de Privacidad",
"recommended": "Recomendado",
@@ -715,10 +708,8 @@
"upload_error.poll": "No se permite la subida de archivos con encuestas.",
"upload_form.audio_description": "Describir para personas con problemas auditivos",
"upload_form.description": "Describir para personas con discapacidad visual",
- "upload_form.description_missing": "No se ha añadido ninguna descripción",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar miniatura",
- "upload_form.undo": "Eliminar",
"upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
"upload_modal.analyzing_picture": "Analizando imagen…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 26657d402..5034c2554 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Teadaanne",
"attachments_list.unprocessed": "(töötlemata)",
"audio.hide": "Peida audio",
- "autosuggest_hashtag.per_week": "{count} nädalas",
"boost_modal.combo": "Vajutades {combo}, saab selle edaspidi vahele jätta",
"bundle_column_error.copy_stacktrace": "Kopeeri veateade",
"bundle_column_error.error.body": "Soovitud lehte ei õnnestunud esitada. See võib olla meie koodiviga või probleem brauseri ühilduvusega.",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "Millest mõtled?",
"compose_form.poll.add_option": "Lisa valik",
"compose_form.poll.duration": "Küsitluse kestus",
+ "compose_form.poll.multiple": "Valikvastustega",
"compose_form.poll.option_placeholder": "Valik {number}",
"compose_form.poll.remove_option": "Eemalda see valik",
+ "compose_form.poll.single": "Vali üks",
"compose_form.poll.switch_to_multiple": "Muuda küsitlust mitmikvaliku lubamiseks",
"compose_form.poll.switch_to_single": "Muuda küsitlust ainult ühe valiku lubamiseks",
+ "compose_form.poll.type": "Stiil",
"compose_form.publish": "Postita",
"compose_form.publish_form": "Postita",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Salvesta muudatused",
- "compose_form.sensitive.hide": "{count, plural, one {Märgi meedia tundlikuks} other {Märgi meediad tundlikuks}}",
- "compose_form.sensitive.marked": "{count, plural, one {Meedia on märgitud tundlikuks} other {Meediad on märgitud tundlikuks}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Meedia ei ole tundlikuks märgitud} other {Meediad ei ole märgitud tundlikuks}}",
+ "compose_form.reply": "Vasta",
+ "compose_form.save_changes": "Uuenda",
"compose_form.spoiler.marked": "Tekst on hoiatuse taha peidetud",
"compose_form.spoiler.unmarked": "Märgi sisu tundlikuks",
- "compose_form.spoiler_placeholder": "Kirjuta hoiatus siia",
+ "compose_form.spoiler_placeholder": "Sisuhoiatus (valikuline)",
"confirmation_modal.cancel": "Katkesta",
"confirmations.block.block_and_report": "Blokeeri ja teata",
"confirmations.block.confirm": "Blokeeri",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Privaatsed mainimised",
"navigation_bar.discover": "Avasta",
"navigation_bar.domain_blocks": "Peidetud domeenid",
- "navigation_bar.edit_profile": "Muuda profiili",
"navigation_bar.explore": "Avasta",
"navigation_bar.favourites": "Lemmikud",
"navigation_bar.filters": "Vaigistatud sõnad",
@@ -526,14 +524,14 @@
"poll_button.add_poll": "Lisa küsitlus",
"poll_button.remove_poll": "Eemalda küsitlus",
"privacy.change": "Muuda postituse nähtavust",
- "privacy.direct.long": "Postita ainult mainitud kasutajatele",
- "privacy.direct.short": "Mainitud inimesed ainult",
- "privacy.private.long": "Postita ainult jälgijatele",
- "privacy.private.short": "Jälgijad ainult",
- "privacy.public.long": "Kõigile nähtav",
+ "privacy.direct.long": "Kõik postituses mainitud",
+ "privacy.direct.short": "Määratud kasutajad",
+ "privacy.private.long": "Ainult jälgijad",
+ "privacy.private.short": "Jälgijad",
+ "privacy.public.long": "Nii kasutajad kui mittekasutajad",
"privacy.public.short": "Avalik",
- "privacy.unlisted.long": "Kõigile nähtav, aga ei ilmu avastamise vaadetes",
- "privacy.unlisted.short": "Määramata",
+ "privacy.unlisted.long": "Vähem algoritmilisi teavitusi",
+ "privacy.unlisted.short": "Vaikselt avalik",
"privacy_policy.last_updated": "Viimati uuendatud {date}",
"privacy_policy.title": "Isikuandmete kaitse",
"recommended": "Soovitatud",
@@ -551,7 +549,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "täna",
+ "reply_indicator.attachments": "{count, plural, one {# lisa} other {# lisa}}",
"reply_indicator.cancel": "Tühista",
+ "reply_indicator.poll": "Küsitlus",
"report.block": "Blokeeri",
"report.block_explanation": "Sa ei näe tema postitusi. Tema ei saa näha sinu postitusi ega sind jälgida. Talle on näha, et ta on blokeeritud.",
"report.categories.legal": "Juriidiline",
@@ -715,10 +715,8 @@
"upload_error.poll": "Küsitlustes pole faili üleslaadimine lubatud.",
"upload_form.audio_description": "Kirjelda kuulmispuudega inimeste jaoks",
"upload_form.description": "Kirjelda vaegnägijatele",
- "upload_form.description_missing": "Kirjeldus puudub",
"upload_form.edit": "Muuda",
"upload_form.thumbnail": "Muuda pisipilti",
- "upload_form.undo": "Kustuta",
"upload_form.video_description": "Kirjelda kuulmis- või nägemispuudega inimeste jaoks",
"upload_modal.analyzing_picture": "Analüüsime pilti…",
"upload_modal.apply": "Rakenda",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index c75f697e4..cee18e7a5 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -25,7 +25,7 @@
"account.direct": "Aipatu pribatuki @{name}",
"account.disable_notifications": "Utzi jakinarazteari @{name} erabiltzaileak argitaratzean",
"account.domain_blocked": "Ezkutatutako domeinua",
- "account.edit_profile": "Aldatu profila",
+ "account.edit_profile": "Editatu profila",
"account.enable_notifications": "Jakinarazi @{name} erabiltzaileak argitaratzean",
"account.endorse": "Nabarmendu profilean",
"account.featured_tags.last_status_at": "Azken bidalketa {date} datan",
@@ -89,7 +89,6 @@
"announcement.announcement": "Iragarpena",
"attachments_list.unprocessed": "(prozesatu gabe)",
"audio.hide": "Ezkutatu audioa",
- "autosuggest_hashtag.per_week": "{count} asteko",
"boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko",
"bundle_column_error.copy_stacktrace": "Kopiatu errore-txostena",
"bundle_column_error.error.body": "Eskatutako orria ezin izan da bistaratu. Kodeko errore bategatik izan daiteke edo nabigatzailearen bateragarritasun arazo bategatik.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.",
"compose_form.lock_disclaimer.lock": "giltzapetuta",
"compose_form.placeholder": "Zer duzu buruan?",
- "compose_form.poll.add_option": "Gehitu aukera bat",
+ "compose_form.poll.add_option": "Gehitu aukera",
"compose_form.poll.duration": "Inkestaren iraupena",
+ "compose_form.poll.multiple": "Aukera aniza",
"compose_form.poll.option_placeholder": "{number}. aukera",
"compose_form.poll.remove_option": "Kendu aukera hau",
+ "compose_form.poll.single": "Hautatu bat",
"compose_form.poll.switch_to_multiple": "Aldatu inkesta hainbat aukera onartzeko",
"compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko",
+ "compose_form.poll.type": "Estiloa",
"compose_form.publish": "Argitaratu",
"compose_form.publish_form": "Argitaratu",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Gorde aldaketak",
- "compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa",
- "compose_form.sensitive.marked": "Multimedia edukia hunkigarri gisa markatu da",
- "compose_form.sensitive.unmarked": "Multimedia edukia ez da hunkigarri gisa markatu",
+ "compose_form.reply": "Erantzun",
+ "compose_form.save_changes": "Eguneratu",
"compose_form.spoiler.marked": "Testua abisu batek ezkutatzen du",
"compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta",
- "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen",
+ "compose_form.spoiler_placeholder": "Edukiaren abisua (aukerakoa)",
"confirmation_modal.cancel": "Utzi",
"confirmations.block.block_and_report": "Blokeatu eta salatu",
"confirmations.block.confirm": "Blokeatu",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Aipamen pribatuak",
"navigation_bar.discover": "Aurkitu",
"navigation_bar.domain_blocks": "Ezkutatutako domeinuak",
- "navigation_bar.edit_profile": "Aldatu profila",
"navigation_bar.explore": "Arakatu",
"navigation_bar.favourites": "Gogokoak",
"navigation_bar.filters": "Mutututako hitzak",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Gehitu inkesta bat",
"poll_button.remove_poll": "Kendu inkesta",
"privacy.change": "Aldatu bidalketaren pribatutasuna",
- "privacy.direct.long": "Bidali aipatutako erabiltzaileei besterik ez",
- "privacy.direct.short": "Aipatutako jendea soilik",
- "privacy.private.long": "Bidali jarraitzaileei besterik ez",
- "privacy.private.short": "Jarraitzaileak soilik",
- "privacy.public.long": "Guztientzat ikusgai",
+ "privacy.direct.long": "Argitalpen honetan aipatutako denak",
+ "privacy.direct.short": "Jende jakina",
+ "privacy.private.long": "Soilik jarraitzaileak",
+ "privacy.private.short": "Jarraitzaileak",
+ "privacy.public.long": "Mastodonen dagoen edo ez dagoen edonor",
"privacy.public.short": "Publikoa",
- "privacy.unlisted.long": "Guztientzat ikusgai, baina ez aurkitzeko ezaugarrietan",
- "privacy.unlisted.short": "Zerrendatu gabea",
+ "privacy.unlisted.additional": "Aukera honek publiko modua bezala funtzionatzen du, baina argitalpena ez da agertuko zuzeneko jarioetan edo traoletan, \"Arakatu\" atalean edo Mastodonen bilaketan, nahiz eta kontua zabaltzeko onartu duzun.",
+ "privacy.unlisted.long": "Tontakeria algoritmiko gutxiago",
+ "privacy.unlisted.short": "Deiadar urrikoa",
"privacy_policy.last_updated": "Azkenengo eguneraketa {date}",
"privacy_policy.title": "Pribatutasun politika",
"recommended": "Gomendatua",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "gaur",
+ "reply_indicator.attachments": "{count, plural, one {# eranskin} other {# eranskin}}",
"reply_indicator.cancel": "Utzi",
+ "reply_indicator.poll": "Inkesta",
"report.block": "Blokeatu",
"report.block_explanation": "Ez dituzu bere bidalketak ikusiko. Ezingo dituzte zure bidalketak ikusi eta ez jarraitu. Blokeatu dituzula jakin dezakete.",
"report.categories.legal": "Juridikoa",
@@ -715,10 +716,8 @@
"upload_error.poll": "Ez da inkestetan fitxategiak igotzea onartzen.",
"upload_form.audio_description": "Deskribatu entzumen galera duten pertsonentzat",
"upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
- "upload_form.description_missing": "Ez da deskribapenik gehitu",
"upload_form.edit": "Editatu",
"upload_form.thumbnail": "Aldatu koadro txikia",
- "upload_form.undo": "Ezabatu",
"upload_form.video_description": "Deskribatu entzumen galera edo ikusmen urritasuna duten pertsonentzat",
"upload_modal.analyzing_picture": "Irudia aztertzen…",
"upload_modal.apply": "Aplikatu",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 9f3201ca7..0b078d1ab 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -89,7 +89,6 @@
"announcement.announcement": "اعلامیه",
"attachments_list.unprocessed": "(پردازش نشده)",
"audio.hide": "نهفتن صدا",
- "autosuggest_hashtag.per_week": "{count} در هفته",
"boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
"bundle_column_error.copy_stacktrace": "رونوشت از گزارش خطا",
"bundle_column_error.error.body": "صفحهٔ درخواستی نتوانست پرداخت شود. ممکن است به خاطر اشکالی در کدمان یا مشکل سازگاری مرورگر باشد.",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "تازه چه خبر؟",
"compose_form.poll.add_option": "افزودن گزینه",
"compose_form.poll.duration": "مدت نظرسنجی",
+ "compose_form.poll.multiple": "چند گزینهای",
"compose_form.poll.option_placeholder": "گزینهٔ {number}",
"compose_form.poll.remove_option": "برداشتن این گزینه",
+ "compose_form.poll.single": "گزینش یکی",
"compose_form.poll.switch_to_multiple": "تغییر نظرسنجی برای اجازه به چندین گزینه",
"compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تکگزینهای",
- "compose_form.publish": "انتشار",
+ "compose_form.poll.type": "سبک",
+ "compose_form.publish": "فرستادن",
"compose_form.publish_form": "انتشار",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "ذخیرهٔ تغییرات",
- "compose_form.sensitive.hide": "{count, plural, one {علامتگذاری رسانه به عنوان حساس} other {علامتگذاری رسانهها به عنوان حساس}}",
- "compose_form.sensitive.marked": "{count, plural, one {رسانه به عنوان حساس علامتگذاری شد} other {رسانهها به عنوان حساس علامتگذاری شدند}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {رسانه به عنوان حساس علامتگذاری نشد} other {رسانهها به عنوان حساس علامتگذاری نشدند}}",
+ "compose_form.reply": "پاسخ",
+ "compose_form.save_changes": "بهروز رسانی",
"compose_form.spoiler.marked": "برداشتن هشدار محتوا",
"compose_form.spoiler.unmarked": "افزودن هشدار محتوا",
- "compose_form.spoiler_placeholder": "هشدارتان را اینجا بنویسید",
+ "compose_form.spoiler_placeholder": "هشدار محتوا (اختیاری)",
"confirmation_modal.cancel": "لغو",
"confirmations.block.block_and_report": "انسداد و گزارش",
"confirmations.block.confirm": "انسداد",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "اشارههای خصوصی",
"navigation_bar.discover": "گشت و گذار",
"navigation_bar.domain_blocks": "دامنههای مسدود شده",
- "navigation_bar.edit_profile": "ویرایش نمایه",
"navigation_bar.explore": "کاوش",
"navigation_bar.favourites": "برگزیدهها",
"navigation_bar.filters": "واژههای خموش",
@@ -524,14 +522,14 @@
"poll_button.add_poll": "افزودن نظرسنجی",
"poll_button.remove_poll": "برداشتن نظرسنجی",
"privacy.change": "تغییر محرمانگی فرسته",
- "privacy.direct.long": "نمایان فقط برای کاربران اشاره شده",
- "privacy.direct.short": "فقط افراد اشاره شده",
- "privacy.private.long": "نمایان فقط برای پیگیرندگان",
- "privacy.private.short": "فقط پیگیرندگان",
- "privacy.public.long": "نمایان برای همه",
+ "privacy.direct.long": "هرکسی که در فرسته نام برده شده",
+ "privacy.direct.short": "افراد مشخّص",
+ "privacy.private.long": "تنها پیگیرندگانتان",
+ "privacy.private.short": "پیگیرندگان",
+ "privacy.public.long": "هرکسی در و بیرون از ماستودون",
"privacy.public.short": "عمومی",
- "privacy.unlisted.long": "نمایان برای همه، ولی خارج از قابلیتهای کشف",
- "privacy.unlisted.short": "فهرست نشده",
+ "privacy.unlisted.long": "سروصدای الگوریتمی کمتر",
+ "privacy.unlisted.short": "عمومی ساکت",
"privacy_policy.last_updated": "آخرین بهروز رسانی در {date}",
"privacy_policy.title": "سیاست محرمانگی",
"recommended": "پیشنهادشده",
@@ -550,6 +548,7 @@
"relative_time.seconds": "{number} ثانیه",
"relative_time.today": "امروز",
"reply_indicator.cancel": "لغو",
+ "reply_indicator.poll": "نظرسنجی",
"report.block": "انسداد",
"report.block_explanation": "شما فرستههایشان را نخواهید دید. آنها نمیتوانند فرستههایتان را ببینند یا شما را پیبگیرند. آنها میتوانند بگویند که مسدود شدهاند.",
"report.categories.legal": "حقوقی",
@@ -713,10 +712,8 @@
"upload_error.poll": "بارگذاری پرونده در نظرسنجیها مجاز نیست.",
"upload_form.audio_description": "برای ناشنوایان توصیفش کنید",
"upload_form.description": "برای کمبینایان توصیفش کنید",
- "upload_form.description_missing": "شرحی افزوده نشده",
"upload_form.edit": "ویرایش",
"upload_form.thumbnail": "تغییر بندانگشتی",
- "upload_form.undo": "حذف",
"upload_form.video_description": "برای کمبینایان یا ناشنوایان توصیفش کنید",
"upload_modal.analyzing_picture": "در حال پردازش تصویر…",
"upload_modal.apply": "اعمال",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 004898651..7b98f9983 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -21,7 +21,7 @@
"account.blocked": "Estetty",
"account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella",
"account.cancel_follow_request": "Peruuta seurantapyyntö",
- "account.copy": "Kopioi profiililinkki",
+ "account.copy": "Kopioi linkki profiiliin",
"account.direct": "Mainitse @{name} yksityisesti",
"account.disable_notifications": "Lopeta ilmoittamasta minulle, kun @{name} julkaisee",
"account.domain_blocked": "Verkkotunnus estetty",
@@ -53,7 +53,7 @@
"account.mute_notifications_short": "Mykistä ilmoitukset",
"account.mute_short": "Mykistä",
"account.muted": "Mykistetty",
- "account.mutual": "Molemmat",
+ "account.mutual": "Seuraatte toisianne",
"account.no_bio": "Kuvausta ei ole annettu.",
"account.open_original_page": "Avaa alkuperäinen sivu",
"account.posts": "Julkaisut",
@@ -89,7 +89,6 @@
"announcement.announcement": "Ilmoitus",
"attachments_list.unprocessed": "(käsittelemätön)",
"audio.hide": "Piilota ääni",
- "autosuggest_hashtag.per_week": "{count} viikossa",
"boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}",
"bundle_column_error.copy_stacktrace": "Kopioi virheraportti",
"bundle_column_error.error.body": "Pyydettyä sivua ei voitu hahmontaa. Se voi johtua virheestä koodissamme tai selaimen yhteensopivuudessa.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.",
"compose_form.lock_disclaimer.lock": "lukittu",
"compose_form.placeholder": "Mitä mietit?",
- "compose_form.poll.add_option": "Lisää valinta",
+ "compose_form.poll.add_option": "Lisää vaihtoehto",
"compose_form.poll.duration": "Äänestyksen kesto",
- "compose_form.poll.option_placeholder": "Valinta {number}",
- "compose_form.poll.remove_option": "Poista tämä valinta",
+ "compose_form.poll.multiple": "Monivalinta",
+ "compose_form.poll.option_placeholder": "Vaihtoehto {number}",
+ "compose_form.poll.remove_option": "Poista tämä vaihtoehto",
+ "compose_form.poll.single": "Valitse yksi",
"compose_form.poll.switch_to_multiple": "Muuta äänestys monivalinnaksi",
"compose_form.poll.switch_to_single": "Muuta äänestys sallimaan vain yksi valinta",
+ "compose_form.poll.type": "Tyyli",
"compose_form.publish": "Julkaise",
"compose_form.publish_form": "Uusi julkaisu",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Tallenna muutokset",
- "compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluonteiseksi} other {Merkitse mediat arkaluonteisiksi}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media on merkitty arkaluonteiseksi} other {Mediat on merkitty arkaluonteisiksi}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Mediaa ei ole merkitty arkaluonteiseksi} other {Medioita ei ole merkitty arkaluonteisiksi}}",
+ "compose_form.reply": "Vastaa",
+ "compose_form.save_changes": "Päivitä",
"compose_form.spoiler.marked": "Poista sisältövaroitus",
"compose_form.spoiler.unmarked": "Lisää sisältövaroitus",
- "compose_form.spoiler_placeholder": "Kirjoita varoituksesi tähän",
+ "compose_form.spoiler_placeholder": "Sisältövaroitus (valinnainen)",
"confirmation_modal.cancel": "Peruuta",
"confirmations.block.block_and_report": "Estä ja raportoi",
"confirmations.block.confirm": "Estä",
@@ -193,7 +192,7 @@
"conversation.mark_as_read": "Merkitse luetuksi",
"conversation.open": "Näytä keskustelu",
"conversation.with": "{names} kanssa",
- "copy_icon_button.copied": "Kopioitiin leikepöydälle",
+ "copy_icon_button.copied": "Sisältö kopioitiin leikepöydälle",
"copypaste.copied": "Kopioitu",
"copypaste.copy_to_clipboard": "Kopioi leikepöydälle",
"directory.federated": "Koko tunnettu fediversumi",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Yksityiset maininnat",
"navigation_bar.discover": "Löydä uutta",
"navigation_bar.domain_blocks": "Estetyt verkkotunnukset",
- "navigation_bar.edit_profile": "Muokkaa profiilia",
"navigation_bar.explore": "Selaa",
"navigation_bar.favourites": "Suosikit",
"navigation_bar.filters": "Mykistetyt sanat",
@@ -483,10 +481,10 @@
"onboarding.follows.lead": "Kokoat oman kotisyötteesi itse. Mitä enemmän ihmisiä seuraat, sitä aktiivisempi ja kiinnostavampi syöte on. Nämä profiilit voivat olla alkuun hyvä lähtökohta — voit aina lopettaa niiden seuraamisen myöhemmin!",
"onboarding.follows.title": "Mukauta kotisyötettäsi",
"onboarding.profile.discoverable": "Aseta profiilini löydettäväksi",
- "onboarding.profile.discoverable_hint": "Kun olet määrittänyt itsesi löydettäväksi Mastodonista, julkaisusi voivat näkyä hakutuloksissa ja suosituissa kohteissa ja profiiliasi voidaan ehdottaa käyttäjille, jotka ovat kiinnostuneet samoista aiheista kuin sinä.",
+ "onboarding.profile.discoverable_hint": "Kun olet määrittänyt itsesi löydettäväksi Mastodonista, julkaisusi voivat näkyä hakutuloksissa ja suosituissa kohteissa. Lisäksi profiiliasi voidaan ehdottaa käyttäjille, jotka ovat kiinnostuneita kanssasi samoista aiheista.",
"onboarding.profile.display_name": "Näyttönimi",
"onboarding.profile.display_name_hint": "Koko nimesi tai lempinimesi…",
- "onboarding.profile.lead": "Voit viimeistellä tämän milloin tahansa asetuksista, jotka tarjoavat vielä enemmän mukautusvalintoja.",
+ "onboarding.profile.lead": "Voit viimeistellä tämän milloin tahansa asetuksista. Sieltä löydät myös lisää mukautusvaihtoehtoja.",
"onboarding.profile.note": "Elämäkerta",
"onboarding.profile.note_hint": "Voit @mainita muita käyttäjiä tai #aihetunnisteita…",
"onboarding.profile.save_and_continue": "Tallenna ja jatka",
@@ -526,14 +524,13 @@
"poll_button.add_poll": "Lisää äänestys",
"poll_button.remove_poll": "Poista äänestys",
"privacy.change": "Muuta julkaisun näkyvyyttä",
- "privacy.direct.long": "Näkyy vain mainituille käyttäjille",
- "privacy.direct.short": "Vain mainitut käyttäjät",
- "privacy.private.long": "Näkyy vain seuraajille",
- "privacy.private.short": "Vain seuraajat",
- "privacy.public.long": "Näkyy kaikille",
+ "privacy.direct.long": "Kaikki tässä julkaisussa mainitut",
+ "privacy.direct.short": "Tietyt henkilöt",
+ "privacy.private.long": "Vain seuraajasi",
+ "privacy.private.short": "Seuraajat",
+ "privacy.public.long": "Kuka tahansa Mastodonissa ja sen ulkopuolella",
"privacy.public.short": "Julkinen",
- "privacy.unlisted.long": "Näkyy kaikille mutta jää pois löytämisominaisuuksista",
- "privacy.unlisted.short": "Listaamaton",
+ "privacy.unlisted.additional": "Tämä toimii kuten julkinen, paitsi että julkaisu ei näy livesyötteissä, aihetunnisteissa, selaa-näkymässä tai Mastodon-haussa, vaikka olisit sallinut ne käyttäjätilin laajuisesti.",
"privacy_policy.last_updated": "Viimeksi päivitetty {date}",
"privacy_policy.title": "Tietosuojakäytäntö",
"recommended": "Suositeltu",
@@ -551,7 +548,9 @@
"relative_time.minutes": "{number} min",
"relative_time.seconds": "{number} s",
"relative_time.today": "tänään",
+ "reply_indicator.attachments": "{count, plural, one {# liite} other {# liitettä}}",
"reply_indicator.cancel": "Peruuta",
+ "reply_indicator.poll": "Kysely",
"report.block": "Estä",
"report.block_explanation": "Et näe hänen viestejään, eikä hän voi nähdä viestejäsi tai seurata sinua. Hän näkee, että olet estänyt hänet.",
"report.categories.legal": "Lakiasiat",
@@ -715,10 +714,8 @@
"upload_error.poll": "Tiedoston lataaminen ei ole sallittua äänestyksissä.",
"upload_form.audio_description": "Kuvaile sisältöä kuuroille ja kuulorajoitteisille",
"upload_form.description": "Kuvaile sisältöä sokeille ja näkörajoitteisille",
- "upload_form.description_missing": "Kuvausta ei ole lisätty",
"upload_form.edit": "Muokkaa",
"upload_form.thumbnail": "Vaihda pikkukuva",
- "upload_form.undo": "Poista",
"upload_form.video_description": "Kuvaile sisältöä kuuroille, kuulorajoitteisille, sokeille tai näkörajoitteisille",
"upload_modal.analyzing_picture": "Analysoidaan kuvaa…",
"upload_modal.apply": "Käytä",
diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json
index 9259f2015..a4c529608 100644
--- a/app/javascript/mastodon/locales/fo.json
+++ b/app/javascript/mastodon/locales/fo.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Kunngerð",
"attachments_list.unprocessed": "(óviðgjørt)",
"audio.hide": "Fjal ljóð",
- "autosuggest_hashtag.per_week": "{count} um vikuna",
"boost_modal.combo": "Tú kanst trýsta á {combo} fyri at loypa uppum hetta næstu ferð",
"bundle_column_error.copy_stacktrace": "Avrita feilfráboðan",
"bundle_column_error.error.body": "Umbidna síðan kann ikki vísast. Tað kann vera orsakað av einum feili í koduni hjá okkum ella tað kann vera orsakað av kaganum, sum tú brúkar.",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "Hvat hevur tú í huga?",
"compose_form.poll.add_option": "Legg valmøguleika afturat",
"compose_form.poll.duration": "Atkvøðugreiðslutíð",
+ "compose_form.poll.multiple": "Fleiri valmøguleikar",
"compose_form.poll.option_placeholder": "Valmøguleiki {number}",
- "compose_form.poll.remove_option": "Strika valmøguleikan",
+ "compose_form.poll.remove_option": "Strika hendan valmøguleikan",
+ "compose_form.poll.single": "Vel ein",
"compose_form.poll.switch_to_multiple": "Broyt atkvøðugreiðslu til at loyva fleiri svarum",
"compose_form.poll.switch_to_single": "Broyt atkvøðugreiðslu til einstakt svar",
- "compose_form.publish": "Legg út",
+ "compose_form.poll.type": "Stílur",
+ "compose_form.publish": "Posta",
"compose_form.publish_form": "Legg út",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Goym broytingar",
- "compose_form.sensitive.hide": "{count, plural, one {Frámerk tilfar sum viðkvæmt} other {Frámerk tilfar sum viðkvæmt}}",
- "compose_form.sensitive.marked": "{count, plural, one {Tilfarið er frámerkt sum viðkvæmt} other {Tilfarið er frámerkt sum viðkvæmt}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Tilfarið er ikki merkt sum viðkvæmt} other {Tilfarið er ikki merkt sum viðkvæmt}}",
+ "compose_form.reply": "Svara",
+ "compose_form.save_changes": "Dagfør",
"compose_form.spoiler.marked": "Ávaring um at strika innihald",
"compose_form.spoiler.unmarked": "Skriva ávaring um innihald",
- "compose_form.spoiler_placeholder": "Skriva tína ávaring her",
+ "compose_form.spoiler_placeholder": "Innihaldsávaring (valfrí)",
"confirmation_modal.cancel": "Strika",
"confirmations.block.block_and_report": "Banna og melda",
"confirmations.block.confirm": "Banna",
@@ -393,6 +392,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",
@@ -407,7 +407,6 @@
"navigation_bar.direct": "Privatar umrøður",
"navigation_bar.discover": "Uppdaga",
"navigation_bar.domain_blocks": "Bannað økisnøvn",
- "navigation_bar.edit_profile": "Broyt vanga",
"navigation_bar.explore": "Rannsaka",
"navigation_bar.favourites": "Dámdir postar",
"navigation_bar.filters": "Doyvd orð",
@@ -483,6 +482,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:",
@@ -516,14 +524,15 @@
"poll_button.add_poll": "Legg atkvøðugreiðslu afturat",
"poll_button.remove_poll": "Strika atkvøðugreiðslu",
"privacy.change": "Broyt privatverju av posti",
- "privacy.direct.long": "Bert sjónligt hjá nevndum brúkarum",
- "privacy.direct.short": "Bert nevnd fólk",
- "privacy.private.long": "Bert sjónligt hjá fylgjarum",
- "privacy.private.short": "Einans fylgjarar",
- "privacy.public.long": "Sjónligt hjá øllum",
+ "privacy.direct.long": "Øll, sum eru nevnd í postinum",
+ "privacy.direct.short": "Ávís fólk",
+ "privacy.private.long": "Einans tey, ið fylgja tær",
+ "privacy.private.short": "Fylgjarar",
+ "privacy.public.long": "Øll í og uttanfyri Mastodon",
"privacy.public.short": "Alment",
- "privacy.unlisted.long": "Sjónligur fyri øll, men ikki gjøgnum uppdagingarhentleikarnar",
- "privacy.unlisted.short": "Ikki listað",
+ "privacy.unlisted.additional": "Hetta er júst sum almenn, tó verður posturin ikki vístur í samtíðarrásum ella frámerkjum, rannsakan ella Mastodon leitingum, sjálvt um valið er galdandi fyri alla kontuna.",
+ "privacy.unlisted.long": "Færri algoritmiskar fanfarur",
+ "privacy.unlisted.short": "Stillur almenningur",
"privacy_policy.last_updated": "Seinast dagført {date}",
"privacy_policy.title": "Privatlívspolitikkur",
"recommended": "Viðmælt",
@@ -541,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "í dag",
+ "reply_indicator.attachments": "{count, plural, one {# viðfesti} other {# viðfesti}}",
"reply_indicator.cancel": "Ógilda",
+ "reply_indicator.poll": "Atkvøðugreiðsla",
"report.block": "Blokera",
"report.block_explanation": "Tú fer ikki at síggja postarnar hjá teimum. Tey kunnu ikki síggja tínar postar ella fylgja tær. Tey síggja, at tey eru blokeraði.",
"report.categories.legal": "Løgfrøðisligt",
@@ -705,10 +716,8 @@
"upload_error.poll": "Ikki loyvt at leggja fílur upp í spurnarkanningum.",
"upload_form.audio_description": "Lýs fyri teimum, sum eru deyv ella hava ringa hoyrn",
"upload_form.description": "Lýs fyri teimum, sum eru blind ella eru sjónveik",
- "upload_form.description_missing": "Lýsing vantar",
"upload_form.edit": "Rætta",
"upload_form.thumbnail": "Broyt smámynd",
- "upload_form.undo": "Strika",
"upload_form.video_description": "Lýs fyri teimum, sum eru deyv, hava ringa hoyrn, eru blind ella eru sjónveik",
"upload_modal.analyzing_picture": "Greini mynd…",
"upload_modal.apply": "Ger virkið",
diff --git a/app/javascript/mastodon/locales/fr-QC.json b/app/javascript/mastodon/locales/fr-CA.json
similarity index 97%
rename from app/javascript/mastodon/locales/fr-QC.json
rename to app/javascript/mastodon/locales/fr-CA.json
index f2d99412d..66a7da6d1 100644
--- a/app/javascript/mastodon/locales/fr-QC.json
+++ b/app/javascript/mastodon/locales/fr-CA.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Annonce",
"attachments_list.unprocessed": "(non traité)",
"audio.hide": "Masquer l'audio",
- "autosuggest_hashtag.per_week": "{count} par semaine",
"boost_modal.combo": "Vous pouvez appuyer sur {combo} pour sauter ceci la prochaine fois",
"bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur",
"bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela pourrait être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos publications privés.",
"compose_form.lock_disclaimer.lock": "verrouillé",
"compose_form.placeholder": "À quoi pensez-vous?",
- "compose_form.poll.add_option": "Ajouter un choix",
"compose_form.poll.duration": "Durée du sondage",
- "compose_form.poll.option_placeholder": "Choix {number}",
- "compose_form.poll.remove_option": "Supprimer ce choix",
"compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix",
"compose_form.poll.switch_to_single": "Changer le sondage pour n'autoriser qu'un seul choix",
- "compose_form.publish": "Publier",
"compose_form.publish_form": "Publier",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Enregistrer les modifications",
- "compose_form.sensitive.hide": "{count, plural, one {Marquer média comme sensible} other {Marquer médias comme sensibles}}",
- "compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Le média n’est pas marqué comme sensible} other {Les médias ne sont pas marqués comme sensibles}}",
"compose_form.spoiler.marked": "Enlever l'avertissement de contenu",
"compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu",
- "compose_form.spoiler_placeholder": "Écrivez votre avertissement ici",
"confirmation_modal.cancel": "Annuler",
"confirmations.block.block_and_report": "Bloquer et signaler",
"confirmations.block.confirm": "Bloquer",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Mention privée",
"navigation_bar.discover": "Découvrir",
"navigation_bar.domain_blocks": "Domaines bloqués",
- "navigation_bar.edit_profile": "Modifier le profil",
"navigation_bar.explore": "Explorer",
"navigation_bar.favourites": "Favoris",
"navigation_bar.filters": "Mots masqués",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Ajouter un sondage",
"poll_button.remove_poll": "Supprimer le sondage",
"privacy.change": "Changer la confidentialité des messages",
- "privacy.direct.long": "Visible uniquement par les comptes mentionnés",
- "privacy.direct.short": "Personnes mentionnées uniquement",
- "privacy.private.long": "Visible uniquement pour vos abonné·e·s",
- "privacy.private.short": "Abonné·e·s seulement",
- "privacy.public.long": "Visible pour tous",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible pour tous, mais sans fonctionnalités de découverte",
- "privacy.unlisted.short": "Non listé",
"privacy_policy.last_updated": "Dernière mise à jour {date}",
"privacy_policy.title": "Politique de confidentialité",
"recommended": "Recommandé",
@@ -715,10 +696,8 @@
"upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
"upload_form.description": "Décrire pour les malvoyants",
- "upload_form.description_missing": "Description manquante",
"upload_form.edit": "Modifier",
"upload_form.thumbnail": "Changer la vignette",
- "upload_form.undo": "Supprimer",
"upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition",
"upload_modal.analyzing_picture": "Analyse de l’image en cours…",
"upload_modal.apply": "Appliquer",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 774702f98..2d0fa3b7d 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Annonce",
"attachments_list.unprocessed": "(non traité)",
"audio.hide": "Masquer l'audio",
- "autosuggest_hashtag.per_week": "{count} par semaine",
"boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
"bundle_column_error.copy_stacktrace": "Copier le rapport d'erreur",
"bundle_column_error.error.body": "La page demandée n'a pas pu être affichée. Cela peut être dû à un bogue dans notre code, ou à un problème de compatibilité avec le navigateur.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre pour voir vos messages réservés à vos abonné⋅e⋅s.",
"compose_form.lock_disclaimer.lock": "verrouillé",
"compose_form.placeholder": "Qu’avez-vous en tête ?",
- "compose_form.poll.add_option": "Ajouter un choix",
"compose_form.poll.duration": "Durée du sondage",
- "compose_form.poll.option_placeholder": "Choix {number}",
- "compose_form.poll.remove_option": "Supprimer ce choix",
"compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix",
"compose_form.poll.switch_to_single": "Modifier le sondage pour autoriser qu'un seul choix",
- "compose_form.publish": "Publier",
"compose_form.publish_form": "Nouvelle publication",
- "compose_form.publish_loud": "{publish} !",
- "compose_form.save_changes": "Enregistrer les modifications",
- "compose_form.sensitive.hide": "{count, plural, one {Marquer le média comme sensible} other {Marquer les médias comme sensibles}}",
- "compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Le média n’est pas marqué comme sensible} other {Les médias ne sont pas marqués comme sensibles}}",
"compose_form.spoiler.marked": "Enlever l’avertissement de contenu",
"compose_form.spoiler.unmarked": "Ajouter un avertissement de contenu",
- "compose_form.spoiler_placeholder": "Écrivez votre avertissement ici",
"confirmation_modal.cancel": "Annuler",
"confirmations.block.block_and_report": "Bloquer et signaler",
"confirmations.block.confirm": "Bloquer",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Mention privée",
"navigation_bar.discover": "Découvrir",
"navigation_bar.domain_blocks": "Domaines bloqués",
- "navigation_bar.edit_profile": "Modifier le profil",
"navigation_bar.explore": "Explorer",
"navigation_bar.favourites": "Favoris",
"navigation_bar.filters": "Mots masqués",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Ajouter un sondage",
"poll_button.remove_poll": "Supprimer le sondage",
"privacy.change": "Ajuster la confidentialité du message",
- "privacy.direct.long": "Visible uniquement par les comptes mentionnés",
- "privacy.direct.short": "Personnes mentionnées uniquement",
- "privacy.private.long": "Visible uniquement par vos abonnés",
- "privacy.private.short": "Abonnés uniquement",
- "privacy.public.long": "Visible pour tous",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible pour tous, mais sans fonctionnalités de découverte",
- "privacy.unlisted.short": "Non listé",
"privacy_policy.last_updated": "Dernière mise à jour {date}",
"privacy_policy.title": "Politique de confidentialité",
"recommended": "Recommandé",
@@ -715,10 +696,8 @@
"upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
"upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
"upload_form.description": "Décrire pour les malvoyant·e·s",
- "upload_form.description_missing": "Description manquante",
"upload_form.edit": "Modifier",
"upload_form.thumbnail": "Changer la vignette",
- "upload_form.undo": "Supprimer",
"upload_form.video_description": "Décrire pour les personnes ayant des problèmes de vue ou d'audition",
"upload_modal.analyzing_picture": "Analyse de l’image en cours…",
"upload_modal.apply": "Appliquer",
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
index ea42ef91c..d5f22d2ee 100644
--- a/app/javascript/mastodon/locales/fy.json
+++ b/app/javascript/mastodon/locales/fy.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Oankundiging",
"attachments_list.unprocessed": "(net ferwurke)",
"audio.hide": "Audio ferstopje",
- "autosuggest_hashtag.per_week": "{count} yn ’e wike",
"boost_modal.combo": "Jo kinne op {combo} drukke om dit de folgjende kear oer te slaan",
"bundle_column_error.copy_stacktrace": "Flaterrapport kopiearje",
"bundle_column_error.error.body": "De opfrege side koe net werjûn wurde. It kin wêze troch in flater yn ús koade, of in probleem mei browserkompatibiliteit.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Jo account is net {locked}. Elkenien kin jo folgje en kin de berjochten sjen dy’t jo allinnich oan jo folgers rjochte hawwe.",
"compose_form.lock_disclaimer.lock": "beskoattele",
"compose_form.placeholder": "Wat wolle jo kwyt?",
- "compose_form.poll.add_option": "Kar tafoegje",
"compose_form.poll.duration": "Doer fan de enkête",
- "compose_form.poll.option_placeholder": "Kar {number}",
- "compose_form.poll.remove_option": "Dizze kar fuortsmite",
"compose_form.poll.switch_to_multiple": "Enkête wizigje om meardere karren ta te stean",
"compose_form.poll.switch_to_single": "Enkête wizigje om in inkelde kar ta te stean",
- "compose_form.publish": "Publisearje",
"compose_form.publish_form": "Publisearje",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Wizigingen bewarje",
- "compose_form.sensitive.hide": "{count, plural, one {Media as gefoelich markearje} other {Media as gefoelich markearje}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media as gefoelich markearre} other {Media as gefoelich markearre}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is net as gefoelich markearre} other {Media is net as gefoelich markearre}}",
"compose_form.spoiler.marked": "Ynhâldswarskôging fuortsmite",
"compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje",
- "compose_form.spoiler_placeholder": "Warskôgingstekst",
"confirmation_modal.cancel": "Annulearje",
"confirmations.block.block_and_report": "Blokkearje en rapportearje",
"confirmations.block.confirm": "Blokkearje",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Priveefermeldingen",
"navigation_bar.discover": "Untdekke",
"navigation_bar.domain_blocks": "Blokkearre domeinen",
- "navigation_bar.edit_profile": "Profyl bewurkje",
"navigation_bar.explore": "Ferkenne",
"navigation_bar.favourites": "Favoriten",
"navigation_bar.filters": "Negearre wurden",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Poll tafoegje",
"poll_button.remove_poll": "Enkête fuortsmite",
"privacy.change": "Sichtberheid fan berjocht oanpasse",
- "privacy.direct.long": "Allinnich sichtber foar fermelde brûkers",
- "privacy.direct.short": "Allinnich fermelde minsken",
- "privacy.private.long": "Allinnich sichtber foar folgers",
- "privacy.private.short": "Allinnich folgers",
- "privacy.public.long": "Sichtber foar elkenien",
"privacy.public.short": "Iepenbier",
- "privacy.unlisted.long": "Foar elkenien sichtber, mar net ûnder trends, hashtags en op iepenbiere tiidlinen",
- "privacy.unlisted.short": "Minder iepenbier",
"privacy_policy.last_updated": "Lêst bywurke op {date}",
"privacy_policy.title": "Privacybelied",
"recommended": "Oanrekommandearre",
@@ -715,10 +696,8 @@
"upload_error.poll": "It opladen fan bestannen is yn enkêten net tastien.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
- "upload_form.description_missing": "Gjin omskriuwing tafoege",
"upload_form.edit": "Bewurkje",
"upload_form.thumbnail": "Miniatuerôfbylding wizigje",
- "upload_form.undo": "Fuortsmite",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.analyzing_picture": "Ofbylding analysearje…",
"upload_modal.apply": "Tapasse",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index f0f9c5554..855a27d05 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -76,7 +76,6 @@
"announcement.announcement": "Fógra",
"attachments_list.unprocessed": "(neamhphróiseáilte)",
"audio.hide": "Cuir fuaim i bhfolach",
- "autosuggest_hashtag.per_week": "{count} sa seachtain",
"boost_modal.combo": "Is féidir leat {combo} a bhrú chun é seo a scipeáil an chéad uair eile",
"bundle_column_error.copy_stacktrace": "Cóipeáil tuairisc earráide",
"bundle_column_error.error.body": "Ní féidir an leathanach a iarradh a sholáthar. Seans gurb amhlaidh mar gheall ar fhabht sa chód, nó mar gheall ar mhíréireacht leis an mbrabhsálaí.",
@@ -127,19 +126,12 @@
"compose_form.lock_disclaimer": "Níl an cuntas seo {locked}. Féadfaidh duine ar bith tú a leanúint agus na postálacha atá dírithe agat ar do lucht leanúna amháin a fheiceáil.",
"compose_form.lock_disclaimer.lock": "faoi ghlas",
"compose_form.placeholder": "Cad atá ag tarlú?",
- "compose_form.poll.add_option": "Cuir rogha isteach",
"compose_form.poll.duration": "Achar suirbhéanna",
- "compose_form.poll.option_placeholder": "Rogha {number}",
- "compose_form.poll.remove_option": "Bain an rogha seo",
"compose_form.poll.switch_to_multiple": "Athraigh suirbhé chun cead a thabhairt do ilrogha",
"compose_form.poll.switch_to_single": "Athraigh suirbhé chun cead a thabhairt do rogha amháin",
- "compose_form.publish": "Foilsigh",
"compose_form.publish_form": "Foilsigh\n",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Sábháil",
"compose_form.spoiler.marked": "Bain rabhadh ábhair",
"compose_form.spoiler.unmarked": "Cuir rabhadh ábhair",
- "compose_form.spoiler_placeholder": "Scríobh do rabhadh anseo",
"confirmation_modal.cancel": "Cealaigh",
"confirmations.block.block_and_report": "Bac ⁊ Tuairiscigh",
"confirmations.block.confirm": "Bac",
@@ -325,7 +317,6 @@
"navigation_bar.compose": "Cum postáil nua",
"navigation_bar.discover": "Faigh amach",
"navigation_bar.domain_blocks": "Fearainn bhactha",
- "navigation_bar.edit_profile": "Cuir an phróifíl in eagar",
"navigation_bar.explore": "Féach thart",
"navigation_bar.filters": "Focail bhalbhaithe",
"navigation_bar.follow_requests": "Iarratais leanúnaí",
@@ -401,12 +392,7 @@
"poll_button.add_poll": "Cruthaigh suirbhé",
"poll_button.remove_poll": "Bain suirbhé",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Sofheicthe do Leantóirí amháin",
- "privacy.private.short": "Leantóirí amháin",
- "privacy.public.long": "Infheicthe do chách",
"privacy.public.short": "Poiblí",
- "privacy.unlisted.short": "Neamhliostaithe",
"privacy_policy.title": "Polasaí príobháideachais",
"refresh": "Athnuaigh",
"regeneration_indicator.label": "Ag lódáil…",
@@ -529,7 +515,6 @@
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
"upload_form.edit": "Cuir in eagar",
- "upload_form.undo": "Scrios",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.analyzing_picture": "Ag anailísiú íomhá…",
"upload_modal.apply": "Cuir i bhFeidhm",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index 11d83d6ce..0c7ef79cd 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -86,7 +86,6 @@
"announcement.announcement": "Brath-fios",
"attachments_list.unprocessed": "(gun phròiseasadh)",
"audio.hide": "Falaich an fhuaim",
- "autosuggest_hashtag.per_week": "{count} san t-seachdain",
"boost_modal.combo": "Brùth air {combo} nam b’ fheàrr leat leum a ghearradh thar seo an ath-thuras",
"bundle_column_error.copy_stacktrace": "Dèan lethbhreac de aithris na mearachd",
"bundle_column_error.error.body": "Cha b’ urrainn dhuinn an duilleag a dh’iarr thu a reandaradh. Dh’fhaoidte gu bheil buga sa chòd againn no duilgheadas co-chòrdalachd leis a’ bhrabhsair.",
@@ -143,22 +142,12 @@
"compose_form.lock_disclaimer": "Chan eil an cunntas agad {locked}. ’S urrainn do dhuine sam bith ’gad leantainn is na postaichean agad a tha ag amas air an luchd-leantainn agad a-mhàin a shealltainn.",
"compose_form.lock_disclaimer.lock": "glaiste",
"compose_form.placeholder": "Dè tha air d’ aire?",
- "compose_form.poll.add_option": "Cuir roghainn ris",
"compose_form.poll.duration": "Faide a’ chunntais-bheachd",
- "compose_form.poll.option_placeholder": "Roghainn {number}",
- "compose_form.poll.remove_option": "Thoir an roghainn seo air falbh",
"compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh",
"compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh",
- "compose_form.publish": "Foillsich",
"compose_form.publish_form": "Post ùr",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Sàbhail na h-atharraichean",
- "compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}",
- "compose_form.sensitive.marked": "{count, plural, one {Tha comharra ris a’ mheadhan gu bheil e frionasach} two {Tha comharra ris na meadhanan gu bheil iad frionasach} few {Tha comharra ris na meadhanan gu bheil iad frionasach} other {Tha comharra ris na meadhanan gu bheil iad frionasach}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Chan eil comharra ris a’ mheadhan gun robh e frionasach} two {Chan eil comharra ris na meadhanan gun robh iad frionasach} few {Chan eil comharra ris na meadhanan gun robh iad frionasach} other {Chan eil comharra ris na meadhanan gun robh iad frionasach}}",
"compose_form.spoiler.marked": "Thoir air falbh an rabhadh susbainte",
"compose_form.spoiler.unmarked": "Cuir rabhadh susbainte ris",
- "compose_form.spoiler_placeholder": "Sgrìobh an rabhadh agad an-seo",
"confirmation_modal.cancel": "Sguir dheth",
"confirmations.block.block_and_report": "Bac ⁊ dèan gearan",
"confirmations.block.confirm": "Bac",
@@ -402,7 +391,6 @@
"navigation_bar.direct": "Iomraidhean prìobhaideach",
"navigation_bar.discover": "Rùraich",
"navigation_bar.domain_blocks": "Àrainnean bacte",
- "navigation_bar.edit_profile": "Deasaich a’ phròifil",
"navigation_bar.explore": "Rùraich",
"navigation_bar.favourites": "Annsachdan",
"navigation_bar.filters": "Faclan mùchte",
@@ -509,14 +497,7 @@
"poll_button.add_poll": "Cuir cunntas-bheachd ris",
"poll_button.remove_poll": "Thoir air falbh an cunntas-bheachd",
"privacy.change": "Cuir gleus air prìobhaideachd a’ phuist",
- "privacy.direct.long": "Chan fhaic ach na cleachdaichean le iomradh orra seo",
- "privacy.direct.short": "An fheadhainn le iomradh orra a-mhàin",
- "privacy.private.long": "Chan fhaic ach na daoine a tha ’gad leantainn seo",
- "privacy.private.short": "Luchd-leantainn a-mhàin",
- "privacy.public.long": "Chì a h-uile duine e",
"privacy.public.short": "Poblach",
- "privacy.unlisted.long": "Chì a h-uile duine e ach cha nochd e ann an gleusan rùrachaidh",
- "privacy.unlisted.short": "Falaichte o liostaichean",
"privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}",
"privacy_policy.title": "Poileasaidh prìobhaideachd",
"refresh": "Ath-nuadhaich",
@@ -696,10 +677,8 @@
"upload_error.poll": "Chan fhaod thu faidhle a luchdadh suas an cois cunntais-bheachd.",
"upload_form.audio_description": "Mìnich e dhan fheadhainn le èisteachd bheag",
"upload_form.description": "Mìnich e dhan fheadhainn le cion-lèirsinne",
- "upload_form.description_missing": "Cha deach tuairisgeul a chur ris",
"upload_form.edit": "Deasaich",
"upload_form.thumbnail": "Atharraich an dealbhag",
- "upload_form.undo": "Sguab às",
"upload_form.video_description": "Mìnich e dhan fheadhainn le èisteachd bheag no cion-lèirsinne",
"upload_modal.analyzing_picture": "A’ sgrùdadh an deilbh…",
"upload_modal.apply": "Cuir an sàs",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 48bbb6b30..ffd01a547 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",
@@ -89,7 +89,6 @@
"announcement.announcement": "Anuncio",
"attachments_list.unprocessed": "(sen procesar)",
"audio.hide": "Agochar audio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Preme {combo} para ignorar isto na seguinte vez",
"bundle_column_error.copy_stacktrace": "Copiar informe do erro",
"bundle_column_error.error.body": "Non se puido mostrar a páxina solicitada. Podería deberse a un problema no código, ou incompatiblidade co navegador.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "A túa conta non está {locked}. Todas poden seguirte para ollar os teus toots só para seguidoras.",
"compose_form.lock_disclaimer.lock": "bloqueada",
"compose_form.placeholder": "Que contas?",
- "compose_form.poll.add_option": "Engadir unha opción",
"compose_form.poll.duration": "Duración da enquisa",
- "compose_form.poll.option_placeholder": "Opción {number}",
- "compose_form.poll.remove_option": "Eliminar esta opción",
"compose_form.poll.switch_to_multiple": "Mudar a enquisa para permitir múltiples escollas",
"compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa opción",
- "compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Gardar cambios",
- "compose_form.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}",
- "compose_form.sensitive.marked": "{count, plural, one {Multimedia marcado como sensible} other {Multimedia marcados como sensibles}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Multimedia non marcado como sensible} other {Multimedia non marcado como sensible}}",
"compose_form.spoiler.marked": "Retirar o aviso sobre o contido",
"compose_form.spoiler.unmarked": "Engadir aviso sobre o contido",
- "compose_form.spoiler_placeholder": "Escribe o teu aviso aquí",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear e denunciar",
"confirmations.block.confirm": "Bloquear",
@@ -184,7 +173,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 +193,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 +229,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 +335,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 +372,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",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Mencións privadas",
"navigation_bar.discover": "Descubrir",
"navigation_bar.domain_blocks": "Dominios agochados",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Descubrir",
"navigation_bar.favourites": "Favoritas",
"navigation_bar.filters": "Palabras silenciadas",
@@ -480,8 +468,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 +482,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!",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Engadir unha enquisa",
"poll_button.remove_poll": "Eliminar enquisa",
"privacy.change": "Axustar privacidade",
- "privacy.direct.long": "Só para as usuarias mencionadas",
- "privacy.direct.short": "Só persoas mencionadas",
- "privacy.private.long": "Só para persoas que te seguen",
- "privacy.private.short": "Só para seguidoras",
- "privacy.public.long": "Visible por todas",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visible por todas, pero excluída da sección descubrir",
- "privacy.unlisted.short": "Sen listar",
"privacy_policy.last_updated": "Actualizado por última vez no {date}",
"privacy_policy.title": "Política de Privacidade",
"recommended": "Aconsellable",
@@ -573,7 +554,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",
@@ -715,10 +696,8 @@
"upload_error.poll": "Non se poden subir ficheiros nas enquisas.",
"upload_form.audio_description": "Describir para persoas con problemas auditivos",
"upload_form.description": "Describir para persoas cegas ou con problemas visuais",
- "upload_form.description_missing": "Sen descrición",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Cambiar a miniatura",
- "upload_form.undo": "Eliminar",
"upload_form.video_description": "Describe para persoas con problemas visuais ou auditivos",
"upload_modal.analyzing_picture": "Estase a analizar a imaxe…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 675845727..d88a8c49c 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -89,7 +89,6 @@
"announcement.announcement": "הכרזה",
"attachments_list.unprocessed": "(לא מעובד)",
"audio.hide": "השתק",
- "autosuggest_hashtag.per_week": "{count} לשבוע",
"boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
"bundle_column_error.copy_stacktrace": "העתקת הודעת שגיאה",
"bundle_column_error.error.body": "הדף המבוקש אינו זמין. זה עשוי להיות באג בקוד או בעייה בתאימות הדפדפן.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
"compose_form.lock_disclaimer.lock": "נעול",
"compose_form.placeholder": "על מה את.ה חושב.ת?",
- "compose_form.poll.add_option": "הוסיפו בחירה",
+ "compose_form.poll.add_option": "הוספת אפשרות",
"compose_form.poll.duration": "משך הסקר",
- "compose_form.poll.option_placeholder": "אפשרות מספר {number}",
- "compose_form.poll.remove_option": "הסר בחירה זו",
+ "compose_form.poll.multiple": "בחירה מרובה",
+ "compose_form.poll.option_placeholder": "אפשרות {number}",
+ "compose_form.poll.remove_option": "הסרת אפשרות זו",
+ "compose_form.poll.single": "נא לבחור",
"compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר",
"compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר",
- "compose_form.publish": "פרסום",
+ "compose_form.poll.type": "סוג משאל",
+ "compose_form.publish": "הודעה",
"compose_form.publish_form": "לפרסם",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "שמירת שינויים",
- "compose_form.sensitive.hide": "{count, plural, one {סימון מידע כרגיש} other {סימון מידע כרגיש}}",
- "compose_form.sensitive.marked": "{count, plural, one {מידע מסומן כרגיש} other {מידע מסומן כרגיש}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {מידע לא מסומן כרגיש} other {מידע לא מסומן כרגיש}}",
+ "compose_form.reply": "תגובה",
+ "compose_form.save_changes": "עדכון",
"compose_form.spoiler.marked": "הסר אזהרת תוכן",
"compose_form.spoiler.unmarked": "הוסף אזהרת תוכן",
- "compose_form.spoiler_placeholder": "כתוב את האזהרה שלך כאן",
+ "compose_form.spoiler_placeholder": "אזהרת תוכן (לא חובה)",
"confirmation_modal.cancel": "ביטול",
"confirmations.block.block_and_report": "לחסום ולדווח",
"confirmations.block.confirm": "לחסום",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "הודעות פרטיות",
"navigation_bar.discover": "גלה",
"navigation_bar.domain_blocks": "קהילות (שמות מתחם) חסומות",
- "navigation_bar.edit_profile": "עריכת פרופיל",
"navigation_bar.explore": "סיור",
"navigation_bar.favourites": "חיבובים",
"navigation_bar.filters": "מילים מושתקות",
@@ -526,14 +524,12 @@
"poll_button.add_poll": "הוספת סקר",
"poll_button.remove_poll": "הסרת סקר",
"privacy.change": "שינוי פרטיות ההודעה",
- "privacy.direct.long": "רק למשתמשים מאוזכרים (mentioned)",
- "privacy.direct.short": "למאוזכרים בלבד",
- "privacy.private.long": "הצג לעוקבים בלבד",
- "privacy.private.short": "לעוקבים בלבד",
- "privacy.public.long": "גלוי לכל",
+ "privacy.direct.long": "כל המוזכרים בהודעה",
+ "privacy.direct.short": "א.נשים מסוימים",
+ "privacy.private.long": "לעוקביך בלבד",
+ "privacy.private.short": "עוקבים",
+ "privacy.public.long": "כל הגולשים, מחוברים למסטודון או לא",
"privacy.public.short": "פומבי",
- "privacy.unlisted.long": "גלוי לכל, אבל מוסתר מאמצעי תגלית",
- "privacy.unlisted.short": "לא רשום (לא לפיד הכללי)",
"privacy_policy.last_updated": "עודכן לאחרונה {date}",
"privacy_policy.title": "מדיניות פרטיות",
"recommended": "מומלץ",
@@ -551,7 +547,9 @@
"relative_time.minutes": "{number} דקות",
"relative_time.seconds": "{number} שניות",
"relative_time.today": "היום",
+ "reply_indicator.attachments": "{count, plural,one {# קובץ מצורף}other {# קבצים מצורפים}}",
"reply_indicator.cancel": "ביטול",
+ "reply_indicator.poll": "משאל",
"report.block": "לחסום",
"report.block_explanation": "לא ניתן יהיה לראות את ההודעות שלהן. הן לא יוכלו לראות את ההודעות שלך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.",
"report.categories.legal": "חוקי",
@@ -715,10 +713,8 @@
"upload_error.poll": "לא ניתן להעלות קובץ עם סקר.",
"upload_form.audio_description": "תאר/י עבור לקויי שמיעה",
"upload_form.description": "תיאור לכבדי ראיה",
- "upload_form.description_missing": "לא הוסף תיאור",
"upload_form.edit": "עריכה",
"upload_form.thumbnail": "שנה/י תמונה ממוזערת",
- "upload_form.undo": "ביטול",
"upload_form.video_description": "תאר/י עבור לקויי שמיעה ולקויי ראייה",
"upload_modal.analyzing_picture": "מנתח תמונה…",
"upload_modal.apply": "החל",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 76d7c1d38..42f4ca4ef 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -83,7 +83,6 @@
"announcement.announcement": "घोषणा",
"attachments_list.unprocessed": "(असंसाधित)",
"audio.hide": "हाईड ऑडियो",
- "autosuggest_hashtag.per_week": "{count} हर सप्ताह",
"boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है",
"bundle_column_error.copy_stacktrace": "कॉपी एरर रिपोर्ट",
"bundle_column_error.error.body": "अनुरोधित पेज प्रस्तुत नहीं किया जा सका। यह हमारे कोड में बग या ब्राउज़र संगतता समस्या के कारण हो सकता है।",
@@ -138,22 +137,12 @@
"compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।",
"compose_form.lock_disclaimer.lock": "लॉक्ड",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.poll.add_option": "विकल्प जोड़े",
"compose_form.poll.duration": "चुनाव की अवधि",
- "compose_form.poll.option_placeholder": "कुल विकल्प {number}",
- "compose_form.poll.remove_option": "इस विकल्प को हटाएँ",
"compose_form.poll.switch_to_multiple": "कई विकल्पों की अनुमति देने के लिए पोल बदलें",
"compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें",
- "compose_form.publish": "पब्लिश",
"compose_form.publish_form": "पब्लिश",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "परिवर्तनों को सहेजें",
- "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
- "compose_form.sensitive.marked": "मीडिया संवेदनशील के रूप में चिह्नित है",
- "compose_form.sensitive.unmarked": "मीडिया संवेदनशील के रूप में चिह्नित नहीं है",
"compose_form.spoiler.marked": "चेतावनी के पीछे टेक्स्ट छिपा है",
"compose_form.spoiler.unmarked": "टेक्स्ट छिपा नहीं है",
- "compose_form.spoiler_placeholder": "अपनी चेतावनी यहाँ लिखें",
"confirmation_modal.cancel": "रद्द करें",
"confirmations.block.block_and_report": "ब्लॉक एवं रिपोर्ट",
"confirmations.block.confirm": "ब्लॉक",
@@ -370,7 +359,6 @@
"navigation_bar.direct": "निजी संदेश",
"navigation_bar.discover": "खोजें",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें",
"navigation_bar.explore": "अन्वेषण करें",
"navigation_bar.favourites": "पसंदीदा",
"navigation_bar.filters": "वारित शब्द",
@@ -386,6 +374,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 +388,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 +408,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:",
@@ -435,16 +428,13 @@
"poll.vote": "वोट",
"poll.voted": "आपने इसी उत्तर का चुनाव किया है।",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "सब को दिखाई देगा",
"privacy.public.short": "सार्वजनिक",
- "privacy.unlisted.short": "अनलिस्टेड",
"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 +444,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 +478,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} का उत्तर दें",
@@ -502,7 +513,6 @@
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
"upload_form.edit": "संशोधन करें",
- "upload_form.undo": "मिटाए",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.apply": "लागू करें",
"upload_modal.edit_media": "मीडिया में संशोधन करें",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index c535f1aff..cada365fc 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -88,7 +88,6 @@
"announcement.announcement": "Najava",
"attachments_list.unprocessed": "(neobrađeno)",
"audio.hide": "Sakrij audio",
- "autosuggest_hashtag.per_week": "{count} tjedno",
"boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put",
"bundle_column_error.copy_stacktrace": "Kopiraj izvješće o pogrešci",
"bundle_column_error.error.body": "Zaraženu stranicu nije moguće prikazati. To bi moglo biti zbog pogreške u našem kodu ili problema s kompatibilnošću preglednika.",
@@ -140,22 +139,12 @@
"compose_form.lock_disclaimer": "Vaš račun nije {locked}. Svatko Vas može pratiti kako bi vidjeli objave namijenjene Vašim pratiteljima.",
"compose_form.lock_disclaimer.lock": "zaključan",
"compose_form.placeholder": "Što ti je na umu?",
- "compose_form.poll.add_option": "Dodaj opciju",
"compose_form.poll.duration": "Trajanje ankete",
- "compose_form.poll.option_placeholder": "Opcija {number}",
- "compose_form.poll.remove_option": "Ukloni ovu opciju",
"compose_form.poll.switch_to_multiple": "Omogući višestruki odabir opcija ankete",
"compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete",
- "compose_form.publish": "Objavi",
"compose_form.publish_form": "Objavi",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Spremi promjene",
- "compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv",
- "compose_form.sensitive.marked": "Medijski sadržaj označen je kao osjetljiv",
- "compose_form.sensitive.unmarked": "Medijski sadržaj nije označen kao osjetljiv",
"compose_form.spoiler.marked": "Tekst je skriven iza upozorenja",
"compose_form.spoiler.unmarked": "Tekst nije skriven",
- "compose_form.spoiler_placeholder": "Ovdje upišite upozorenje",
"confirmation_modal.cancel": "Otkaži",
"confirmations.block.block_and_report": "Blokiraj i prijavi",
"confirmations.block.confirm": "Blokiraj",
@@ -346,7 +335,6 @@
"navigation_bar.direct": "Privatna spominjanja",
"navigation_bar.discover": "Istraživanje",
"navigation_bar.domain_blocks": "Blokirane domene",
- "navigation_bar.edit_profile": "Uredi profil",
"navigation_bar.explore": "Istraži",
"navigation_bar.favourites": "Favoriti",
"navigation_bar.filters": "Utišane riječi",
@@ -415,13 +403,7 @@
"poll_button.add_poll": "Dodaj anketu",
"poll_button.remove_poll": "Ukloni anketu",
"privacy.change": "Podesi privatnost toota",
- "privacy.direct.long": "Vidljivo samo spomenutim korisnicima",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Vidljivo samo pratiteljima",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "Vidljivo svima",
"privacy.public.short": "Javno",
- "privacy.unlisted.short": "Neprikazano",
"privacy_policy.last_updated": "Zadnje ažurirannje {date}",
"privacy_policy.title": "Pravila o zaštiti privatnosti",
"recommended": "Preporučeno",
@@ -561,10 +543,8 @@
"upload_error.poll": "Prijenos datoteka nije dopušten kod anketa.",
"upload_form.audio_description": "Opišite za ljude sa slabim sluhom",
"upload_form.description": "Opišite za ljude sa slabim vidom",
- "upload_form.description_missing": "Bez opisa",
"upload_form.edit": "Uredi",
"upload_form.thumbnail": "Promijeni pretpregled",
- "upload_form.undo": "Obriši",
"upload_form.video_description": "Opišite za ljude sa slabim sluhom ili vidom",
"upload_modal.analyzing_picture": "Analiza slike…",
"upload_modal.apply": "Primijeni",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 0d50e36fe..31bca5652 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Közlemény",
"attachments_list.unprocessed": "(feldolgozatlan)",
"audio.hide": "Hang elrejtése",
- "autosuggest_hashtag.per_week": "{count} hetente",
"boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}",
"bundle_column_error.copy_stacktrace": "Hibajelentés másolása",
"bundle_column_error.error.body": "A kért lap nem jeleníthető meg. Ez lehet, hogy kódhiba, vagy böngészőkompatibitási hiba.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt bejegyzéseket.",
"compose_form.lock_disclaimer.lock": "zárolva",
"compose_form.placeholder": "Mi jár a fejedben?",
- "compose_form.poll.add_option": "Lehetőség hozzáadása",
+ "compose_form.poll.add_option": "Opció hozzáadása",
"compose_form.poll.duration": "Szavazás időtartama",
- "compose_form.poll.option_placeholder": "{number}. lehetőség",
- "compose_form.poll.remove_option": "Lehetőség eltávolítása",
+ "compose_form.poll.multiple": "Több választás",
+ "compose_form.poll.option_placeholder": "Opció {number}",
+ "compose_form.poll.remove_option": "Opció eltávolítása",
+ "compose_form.poll.single": "Egy választása",
"compose_form.poll.switch_to_multiple": "Szavazás megváltoztatása több választásosra",
"compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra",
- "compose_form.publish": "Közzététel",
+ "compose_form.poll.type": "Stílus",
+ "compose_form.publish": "Bejegyzés",
"compose_form.publish_form": "Új bejegyzés",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Módosítások mentése",
- "compose_form.sensitive.hide": "{count, plural, one {Média kényesnek jelölése} other {Média kényesnek jelölése}}",
- "compose_form.sensitive.marked": "{count, plural, one {A médiát kényesnek jelölték} other {A médiát kényesnek jelölték}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {A médiát nem jelölték kényesnek} other {A médiát nem jelölték kényesnek}}",
+ "compose_form.reply": "Válasz",
+ "compose_form.save_changes": "Frissítés",
"compose_form.spoiler.marked": "Tartalmi figyelmeztetés eltávolítása",
"compose_form.spoiler.unmarked": "Tartalmi figyelmeztetés hozzáadása",
- "compose_form.spoiler_placeholder": "Írd ide a figyelmeztetést",
+ "compose_form.spoiler_placeholder": "Tartalom figyelmeztetés (opcionális)",
"confirmation_modal.cancel": "Mégsem",
"confirmations.block.block_and_report": "Letiltás és jelentés",
"confirmations.block.confirm": "Letiltás",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Személyes említések",
"navigation_bar.discover": "Felfedezés",
"navigation_bar.domain_blocks": "Letiltott tartományok",
- "navigation_bar.edit_profile": "Profil szerkesztése",
"navigation_bar.explore": "Felfedezés",
"navigation_bar.favourites": "Kedvencek",
"navigation_bar.filters": "Némított szavak",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Új szavazás",
"poll_button.remove_poll": "Szavazás eltávolítása",
"privacy.change": "Bejegyzés láthatóságának módosítása",
- "privacy.direct.long": "Csak a megemlített felhasználóknak látható",
- "privacy.direct.short": "Csak megemlítetteknek",
- "privacy.private.long": "Csak követőknek látható",
- "privacy.private.short": "Csak követők",
- "privacy.public.long": "Mindenki számára látható",
+ "privacy.direct.long": "Mindenki, akit a bejegyzésben említettek",
+ "privacy.direct.short": "Adott személyek",
+ "privacy.private.long": "Csak a követők",
+ "privacy.private.short": "Követők",
+ "privacy.public.long": "Bárki a Mastodonon és azon kívül",
"privacy.public.short": "Nyilvános",
- "privacy.unlisted.long": "Mindenki számára látható, de kimarad a felfedezős funkciókból",
- "privacy.unlisted.short": "Listázatlan",
+ "privacy.unlisted.additional": "Ez pontosan úgy viselkedik, mint a nyilvános, kivéve, hogy a bejegyzés nem jelenik meg élő hírcsatornákban vagy hashtagokban, felfedezésben vagy a Mastodon keresésben, még akkor sem, ha az egész fiókra bejelentkezetünk.",
+ "privacy.unlisted.long": "Kevesebb algoritmikus fanfár",
+ "privacy.unlisted.short": "Csendes nyilvánosság",
"privacy_policy.last_updated": "Utoljára frissítve: {date}",
"privacy_policy.title": "Adatvédelmi szabályzat",
"recommended": "Ajánlott",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}p",
"relative_time.seconds": "{number}mp",
"relative_time.today": "ma",
+ "reply_indicator.attachments": "{count, plural, one {# melléklet} other {# melléklet}}",
"reply_indicator.cancel": "Mégsem",
+ "reply_indicator.poll": "Szavazás",
"report.block": "Letiltás",
"report.block_explanation": "Nem fogod látni a bejegyzéseit. Nem fogja tudni megnézni a bejegyzéseidet és nem fog tudni követni sem. Azt is meg fogja tudni mondani, hogy letiltottad.",
"report.categories.legal": "Jogi információk",
@@ -715,10 +716,8 @@
"upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
"upload_form.audio_description": "Leírás siket vagy hallássérült emberek számára",
"upload_form.description": "Leírás vak vagy gyengénlátó emberek számára",
- "upload_form.description_missing": "Nincs leírás megadva",
"upload_form.edit": "Szerkesztés",
"upload_form.thumbnail": "Bélyegkép megváltoztatása",
- "upload_form.undo": "Törlés",
"upload_form.video_description": "Leírás siket, hallássérült, vak vagy gyengénlátó emberek számára",
"upload_modal.analyzing_picture": "Kép elemzése…",
"upload_modal.apply": "Alkalmaz",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 835105218..6ddcfcdb2 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -70,7 +70,6 @@
"alert.unexpected.title": "Վա՜յ",
"announcement.announcement": "Յայտարարութիւններ",
"audio.hide": "Թաքցնել աուդիոն",
- "autosuggest_hashtag.per_week": "շաբաթը՝ {count}",
"boost_modal.combo": "Կարող ես սեղմել {combo}՝ սա յաջորդ անգամ բաց թողնելու համար",
"bundle_column_error.error.title": "Օ՜, ոչ։",
"bundle_column_error.network.title": "Ցանցի սխալ",
@@ -117,22 +116,12 @@
"compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
"compose_form.lock_disclaimer.lock": "փակ",
"compose_form.placeholder": "Ի՞նչ կայ մտքիդ",
- "compose_form.poll.add_option": "Աւելացնել տարբերակ",
"compose_form.poll.duration": "Հարցման տեւողութիւնը",
- "compose_form.poll.option_placeholder": "Տարբերակ {number}",
- "compose_form.poll.remove_option": "Հեռացնել այս տարբերակը",
"compose_form.poll.switch_to_multiple": "Հարցումը դարձնել բազմակի ընտրութեամբ",
"compose_form.poll.switch_to_single": "Հարցումը դարձնել եզակի ընտրութեամբ",
- "compose_form.publish": "Հրապարակել",
"compose_form.publish_form": "Հրապարակել",
- "compose_form.publish_loud": "Հրապարակե՜լ",
- "compose_form.save_changes": "Պահպանել փոփոխութիւնները",
- "compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց",
- "compose_form.sensitive.marked": "Մեդիան նշուած է որպէս դիւրազգաց",
- "compose_form.sensitive.unmarked": "Մեդիան նշուած չէ որպէս դիւրազգաց",
"compose_form.spoiler.marked": "Տեքստը թաքցուած է զգուշացման ետեւում",
"compose_form.spoiler.unmarked": "Տեքստը թաքցուած չէ",
- "compose_form.spoiler_placeholder": "Գրիր նախազգուշացումդ այստեղ",
"confirmation_modal.cancel": "Չեղարկել",
"confirmations.block.block_and_report": "Արգելափակել եւ բողոքել",
"confirmations.block.confirm": "Արգելափակել",
@@ -325,7 +314,6 @@
"navigation_bar.direct": "Մասնաւոր յիշատակումներ",
"navigation_bar.discover": "Բացայայտել",
"navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
- "navigation_bar.edit_profile": "Խմբագրել հաշիւը",
"navigation_bar.explore": "Բացայայտել",
"navigation_bar.favourites": "Հաւանածներ",
"navigation_bar.filters": "Լռեցուած բառեր",
@@ -414,13 +402,7 @@
"poll_button.add_poll": "Աւելացնել հարցում",
"poll_button.remove_poll": "Հեռացնել հարցումը",
"privacy.change": "Կարգաւորել գրառման գաղտնիութիւնը",
- "privacy.direct.long": "Կը տեսնեն միայն նշուած օգտատէրերը",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Կը տեսնեն միայն հետեւորդները",
- "privacy.private.short": "Միայն հետեւողները",
- "privacy.public.long": "Տեսանելի բոլորին",
"privacy.public.short": "Հրապարակային",
- "privacy.unlisted.short": "Ծածուկ",
"privacy_policy.last_updated": "Վերջին անգամ թարմացուել է՝ {date}",
"privacy_policy.title": "Գաղտնիութեան քաղաքականութիւն",
"refresh": "Թարմացնել",
@@ -556,7 +538,6 @@
"upload_form.description": "Նկարագիր՝ տեսողական խնդիրներ ունեցողների համար",
"upload_form.edit": "Խմբագրել",
"upload_form.thumbnail": "Փոխել պատկերակը",
- "upload_form.undo": "Յետարկել",
"upload_form.video_description": "Նկարագրիր տեսանիւթը լսողական կամ տեսողական խնդիրներով անձանց համար",
"upload_modal.analyzing_picture": "Լուսանկարի վերլուծում…",
"upload_modal.apply": "Կիրառել",
diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json
index 9781d6aa7..14b75a17f 100644
--- a/app/javascript/mastodon/locales/ia.json
+++ b/app/javascript/mastodon/locales/ia.json
@@ -1,107 +1,310 @@
{
+ "about.blocks": "Servitores moderate",
+ "about.contact": "Contacto:",
+ "about.disclaimer": "Mastodon es software libere, de codice aperte, e un marca de Mastodon gGmbH.",
+ "about.rules": "Regulas del servitor",
+ "account.account_note_header": "Nota",
"account.add_or_remove_from_list": "Adder o remover ab listas",
"account.badges.group": "Gruppo",
"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}",
+ "account.languages": "Cambiar le linguas subscribite",
+ "account.link_verified_on": "Le proprietate de iste ligamine esseva verificate le {date}",
+ "account.locked_info": "Le stato de confidentialitate de iste conto es definite a blocate. Le proprietario revisa manualmente qui pote sequer lo.",
+ "account.mention": "Mentionar @{name}",
"account.moved_to": "{name} indicava que lor nove conto ora es:",
+ "account.mute": "Silentiar @{name}",
+ "account.mute_notifications_short": "Silentiar le notificationes",
+ "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}",
+ "account.show_reblogs": "Monstrar responsas de @{name}",
"account.unblock": "Disblocar @{name}",
+ "account.unblock_domain": "Disblocar dominio {domain}",
"account.unblock_short": "Disblocar",
"account.unendorse": "Non evidentiar sur le profilo",
+ "account.unmute": "Non plus silentiar @{name}",
+ "account.unmute_notifications_short": "Non plus silentiar le notificationes",
+ "account.unmute_short": "Non plus silentiar",
"account_note.placeholder": "Clicca pro adder un nota",
"admin.dashboard.retention.cohort_size": "Nove usatores",
+ "admin.impact_report.instance_followers": "Sequitores que nostre usatores poterea perder",
+ "admin.impact_report.instance_follows": "Sequitores que lor usatores poterea perder",
+ "alert.rate_limited.message": "Retenta depost {retry_time, time, medium}.",
+ "alert.unexpected.message": "Ocurreva un error inexpectate.",
+ "announcement.announcement": "Annuncio",
"audio.hide": "Celar audio",
- "autosuggest_hashtag.per_week": "{count} per septimana",
"bundle_column_error.network.title": "Error de rete",
"bundle_column_error.retry": "Tentar novemente",
"bundle_column_error.return": "Retornar al initio",
"bundle_modal_error.close": "Clauder",
"bundle_modal_error.retry": "Tentar novemente",
+ "closed_registrations_modal.find_another_server": "Trovar altere servitor",
+ "column.about": "A proposito de",
"column.blocks": "Usatores blocate",
+ "column.bookmarks": "Marcapaginas",
+ "column.community": "Chronologia local",
+ "column.direct": "Mentiones private",
"column.directory": "Navigar profilos",
+ "column.domain_blocks": "Dominios blocate",
"column.favourites": "Favoritos",
+ "column.firehose": "Fluxos in directe",
"column.home": "Initio",
"column.lists": "Listas",
+ "column.mutes": "Usatores silentiate",
"column.notifications": "Notificationes",
+ "column.public": "Chronologia federate",
"column_header.hide_settings": "Celar le parametros",
+ "column_header.moveLeft_settings": "Mover columna al sinistra",
+ "column_header.moveRight_settings": "Mover columna al dextra",
"column_header.show_settings": "Monstrar le parametros",
"column_subheading.settings": "Parametros",
"compose.language.change": "Cambiar le lingua",
"compose.language.search": "Cercar linguas...",
+ "compose.published.body": "Message publicate.",
"compose.published.open": "Aperir",
- "compose_form.poll.add_option": "Adder un option",
- "compose_form.poll.remove_option": "Remover iste option",
+ "compose.saved.body": "Message salvate.",
+ "compose_form.direct_message_warning_learn_more": "Apprender plus",
+ "compose_form.lock_disclaimer": "Tu conto non es {locked}. Quicunque pote sequer te pro vider tu messages solo pro sequitores.",
+ "compose_form.lock_disclaimer.lock": "blocate",
+ "compose_form.publish_form": "Nove message",
+ "compose_form.spoiler.marked": "Remover advertimento de contento",
+ "compose_form.spoiler.unmarked": "Adder advertimento de contento",
"confirmation_modal.cancel": "Cancellar",
+ "confirmations.block.confirm": "Blocar",
"confirmations.delete.confirm": "Deler",
+ "confirmations.delete.message": "Es tu secur que tu vole deler iste message?",
"confirmations.delete_list.confirm": "Deler",
+ "confirmations.delete_list.message": "Es tu secur que tu vole deler permanentemente iste lista?",
+ "confirmations.domain_block.confirm": "Blocar le dominio complete",
"confirmations.edit.confirm": "Modificar",
"confirmations.logout.confirm": "Clauder le session",
+ "confirmations.logout.message": "Es tu secur que tu vole clauder le session?",
+ "confirmations.mute.confirm": "Silentiar",
+ "confirmations.mute.message": "Es tu secur que tu vole silentiar {name}?",
+ "confirmations.reply.confirm": "Responder",
+ "conversation.delete": "Deler conversation",
+ "conversation.mark_as_read": "Marcar como legite",
+ "conversation.open": "Vider conversation",
+ "conversation.with": "Con {names}",
"copy_icon_button.copied": "Copiate al area de transferentia",
+ "copypaste.copied": "Copiate",
"copypaste.copy_to_clipboard": "Copiar al area de transferentia",
+ "directory.federated": "Ab le fediverso cognoscite",
+ "directory.local": "Solmente ab {domain}",
+ "directory.recently_active": "Recentemente active",
"disabled_account_banner.account_settings": "Parametros de conto",
+ "disabled_account_banner.text": "Tu conto {disabledAccount} es actualmente disactivate.",
"dismissable_banner.dismiss": "Dimitter",
"emoji_button.activity": "Activitate",
"emoji_button.clear": "Rader",
"emoji_button.custom": "Personalisate",
+ "emoji_button.recent": "Frequentemente usate",
+ "emoji_button.search": "Cercar...",
"emoji_button.search_results": "Resultatos de recerca",
+ "empty_column.account_suspended": "Conto suspendite",
+ "empty_column.account_timeline": "Nulle messages hic!",
"empty_column.account_unavailable": "Profilo non disponibile",
+ "empty_column.blocks": "Tu non ha blocate alcun usator ancora.",
"errors.unexpected_crash.report_issue": "Signalar un defecto",
"explore.search_results": "Resultatos de recerca",
+ "explore.title": "Explorar",
"explore.trending_links": "Novas",
+ "explore.trending_statuses": "Messages",
+ "explore.trending_tags": "Hashtags",
+ "filter_modal.added.review_and_configure_title": "Parametros de filtro",
+ "filter_modal.added.settings_link": "pagina de parametros",
+ "filter_modal.added.short_explanation": "Iste message esseva addite al sequente categoria de filtros: {title}.",
+ "filter_modal.added.title": "Filtro addite!",
+ "filter_modal.select_filter.prompt_new": "Nove categoria: {name}",
+ "filter_modal.select_filter.search": "Cercar o crear",
+ "filter_modal.select_filter.title": "Filtrar iste message",
+ "filter_modal.title.status": "Filtrar un message",
"firehose.all": "Toto",
"firehose.local": "Iste servitor",
"firehose.remote": "Altere servitores",
"footer.about": "A proposito de",
"footer.directory": "Directorio de profilos",
+ "footer.get_app": "Obtene le application",
+ "footer.keyboard_shortcuts": "Accessos directe de claviero",
"footer.privacy_policy": "Politica de confidentialitate",
"footer.source_code": "Vider le codice fonte",
"footer.status": "Stato",
+ "generic.saved": "Salvate",
+ "getting_started.heading": "Prime passos",
+ "hashtag.column_header.tag_mode.all": "e {additional}",
+ "hashtag.column_header.tag_mode.any": "o {additional}",
+ "hashtag.column_settings.select.no_options_message": "Nulle suggestiones trovate",
+ "hashtag.column_settings.select.placeholder": "Insere hashtags…",
+ "hashtag.follow": "Sequer hashtag",
+ "home.column_settings.show_reblogs": "Monstrar boosts",
+ "home.column_settings.show_replies": "Monstrar responsas",
+ "home.hide_announcements": "Celar annuncios",
+ "home.pending_critical_update.body": "Actualisa tu servitor de Mastodon le plus tosto possibile!",
"home.pending_critical_update.link": "Vider actualisationes",
+ "home.show_announcements": "Monstrar annuncios",
+ "interaction_modal.no_account_yet": "Non sur Mstodon?",
+ "interaction_modal.on_another_server": "In un servitor differente",
+ "interaction_modal.on_this_server": "In iste servitor",
+ "interaction_modal.title.follow": "Sequer {name}",
+ "interaction_modal.title.reblog": "Facer boost al message de {name}",
+ "interaction_modal.title.reply": "Responder al message de {name}",
+ "keyboard_shortcuts.blocked": "Aperir lista de usatores blocate",
+ "keyboard_shortcuts.boost": "Facer boost al message",
+ "keyboard_shortcuts.description": "Description",
+ "keyboard_shortcuts.enter": "Aperir message",
+ "keyboard_shortcuts.favourites": "Aperir lista de favoritos",
+ "keyboard_shortcuts.federated": "Aperir le chronologia federate",
+ "keyboard_shortcuts.heading": "Accessos directe de claviero",
+ "keyboard_shortcuts.home": "Aperir le chronologia de initio",
+ "keyboard_shortcuts.local": "Aperir le chronologia local",
+ "keyboard_shortcuts.muted": "Aperir lista de usatores silentiate",
"keyboard_shortcuts.my_profile": "Aperir tu profilo",
+ "keyboard_shortcuts.notifications": "Aperir columna de notificationes",
+ "keyboard_shortcuts.reply": "Responder al message",
+ "keyboard_shortcuts.spoilers": "Monstrar/celar le campo CW",
+ "keyboard_shortcuts.toot": "Initiar un nove message",
"lightbox.close": "Clauder",
"lightbox.next": "Sequente",
+ "lightbox.previous": "Precedente",
"link_preview.author": "Per {name}",
"lists.account.add": "Adder al lista",
+ "lists.account.remove": "Remover ab le lista",
+ "lists.delete": "Deler lista",
+ "lists.edit": "Modificar lista",
+ "lists.edit.submit": "Cambiar titulo",
+ "lists.exclusive": "Celar iste messages ab le initio",
+ "lists.new.create": "Adder lista",
+ "lists.new.title_placeholder": "Nove titulo del lista",
+ "lists.replies_policy.title": "Monstrar responsas a:",
+ "lists.subheading": "Tu listas",
"mute_modal.duration": "Duration",
"mute_modal.hide_notifications": "Celar notificationes de iste usator?",
"navigation_bar.about": "A proposito de",
"navigation_bar.advanced_interface": "Aperir in un interfacie web avantiate",
"navigation_bar.blocks": "Usatores blocate",
+ "navigation_bar.bookmarks": "Marcapaginas",
+ "navigation_bar.community_timeline": "Chronologia local",
+ "navigation_bar.direct": "Mentiones private",
"navigation_bar.discover": "Discoperir",
- "navigation_bar.edit_profile": "Modificar profilo",
+ "navigation_bar.domain_blocks": "Dominios blocate",
"navigation_bar.favourites": "Favoritos",
+ "navigation_bar.filters": "Parolas silentiate",
"navigation_bar.lists": "Listas",
"navigation_bar.logout": "Clauder le session",
+ "navigation_bar.mutes": "Usatores silentiate",
"navigation_bar.preferences": "Preferentias",
+ "navigation_bar.public_timeline": "Chronologia federate",
"navigation_bar.search": "Cercar",
"navigation_bar.security": "Securitate",
+ "notification.update": "{name} modificava un message",
+ "notifications.clear": "Rader notificationes",
"notifications.column_settings.alert": "Notificationes de scriptorio",
"notifications.column_settings.filter_bar.advanced": "Monstrar tote le categorias",
+ "notifications.column_settings.follow": "Nove sequitores:",
+ "notifications.column_settings.mention": "Mentiones:",
+ "notifications.column_settings.push": "Notificationes push",
"notifications.column_settings.sound": "Reproducer sono",
+ "notifications.column_settings.status": "Nove messages:",
"notifications.filter.all": "Toto",
+ "notifications.filter.favourites": "Favoritos",
+ "notifications.filter.mentions": "Mentiones",
"notifications.grant_permission": "Conceder permission.",
"notifications.group": "{count} notificationes",
"onboarding.compose.template": "Salute #Mastodon!",
"onboarding.profile.save_and_continue": "Salvar e continuar",
+ "onboarding.share.next_steps": "Sequente passos possibile:",
"onboarding.share.title": "Compartir tu profilo",
+ "onboarding.steps.follow_people.title": "Personalisa tu fluxo de initio",
+ "onboarding.steps.publish_status.title": "Face tu prime message",
+ "onboarding.steps.setup_profile.title": "Personalisa tu profilo",
"onboarding.steps.share_profile.title": "Compartir tu profilo de Mastodon",
+ "poll.closed": "Claudite",
+ "poll.reveal": "Vider le resultatos",
+ "privacy.change": "Cambiar privacitate del message",
+ "privacy.public.short": "Public",
+ "privacy_policy.last_updated": "Ultime actualisation {date}",
+ "privacy_policy.title": "Politica de confidentialitate",
"relative_time.just_now": "ora",
"relative_time.today": "hodie",
"reply_indicator.cancel": "Cancellar",
+ "report.block": "Blocar",
+ "report.categories.other": "Alteres",
+ "report.category.title_account": "profilo",
+ "report.category.title_status": "message",
+ "report.close": "Preste",
+ "report.mute": "Silentiar",
"report.next": "Sequente",
"report.placeholder": "Commentos additional",
"report.reasons.dislike": "Non me place",
+ "report_notification.categories.other": "Alteres",
"search.quick_action.go_to_account": "Vader al profilo {x}",
+ "search.quick_action.go_to_hashtag": "Vader al hashtag {x}",
+ "search.quick_action.open_url": "Aperir URL in Mastodon",
+ "search_popout.full_text_search_disabled_message": "Non disponibile sur {domain}.",
+ "search_popout.language_code": "Codice de lingua ISO",
+ "search_popout.options": "Optiones de recerca",
+ "search_popout.quick_actions": "Actiones rapide",
+ "search_popout.recent": "Recercas recente",
+ "search_popout.user": "usator",
"search_results.accounts": "Profilos",
+ "search_results.hashtags": "Hashtags",
"search_results.see_all": "Vider toto",
+ "search_results.statuses": "Messages",
+ "server_banner.learn_more": "Apprender plus",
+ "sign_in_banner.create_account": "Crear un conto",
+ "sign_in_banner.sign_in": "Initiar le session",
+ "status.block": "Blocar @{name}",
+ "status.copy": "Copiar ligamine a message",
"status.delete": "Deler",
+ "status.direct_indicator": "Mention private",
+ "status.edit": "Modificar",
+ "status.filter": "Filtrar iste message",
+ "status.hide": "Celar le message",
+ "status.history.created": "create per {name} le {date}",
+ "status.history.edited": "modificate per {name} le {date}",
+ "status.media.open": "Clicca pro aperir",
+ "status.media.show": "Clicca pro monstrar",
+ "status.more": "Plus",
+ "status.mute_conversation": "Silentiar conversation",
+ "status.read_more": "Leger plus",
"status.share": "Compartir",
"status.translate": "Traducer",
"status.translated_from_with": "Traducite ab {lang} usante {provider}",
"tabs_bar.home": "Initio",
- "tabs_bar.notifications": "Notificationes"
+ "tabs_bar.notifications": "Notificationes",
+ "timeline_hint.resources.statuses": "Messages ancian",
+ "trends.trending_now": "Ora in tendentias",
+ "upload_modal.choose_image": "Seliger un imagine",
+ "upload_modal.detect_text": "Deteger texto ab un pictura",
+ "video.close": "Clauder le video",
+ "video.download": "Discargar le file",
+ "video.fullscreen": "Schermo plen",
+ "video.hide": "Celar video",
+ "video.mute": "Silentiar le sono",
+ "video.pause": "Pausa",
+ "video.play": "Reproducer",
+ "video.unmute": "Non plus silentiar le sono"
}
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 5af20a97f..1670d616f 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -82,7 +82,6 @@
"announcement.announcement": "Pengumuman",
"attachments_list.unprocessed": "(tidak diproses)",
"audio.hide": "Sembunyikan audio",
- "autosuggest_hashtag.per_week": "{count} per minggu",
"boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
"bundle_column_error.copy_stacktrace": "Salin laporan kesalahan",
"bundle_column_error.error.body": "Laman yang diminta tidak dapat ditampilkan. Mungkin karena sebuah kutu dalam kode kami, atau masalah kompatibilitas peramban.",
@@ -134,22 +133,12 @@
"compose_form.lock_disclaimer": "Akun Anda tidak {locked}. Semua orang dapat mengikuti Anda untuk melihat kiriman khusus untuk pengikut Anda.",
"compose_form.lock_disclaimer.lock": "terkunci",
"compose_form.placeholder": "Apa yang ada di pikiran Anda?",
- "compose_form.poll.add_option": "Tambahkan pilihan",
"compose_form.poll.duration": "Durasi japat",
- "compose_form.poll.option_placeholder": "Pilihan {number}",
- "compose_form.poll.remove_option": "Hapus opsi ini",
"compose_form.poll.switch_to_multiple": "Ubah japat menjadi pilihan ganda",
"compose_form.poll.switch_to_single": "Ubah japat menjadi pilihan tunggal",
- "compose_form.publish": "Terbitkan",
"compose_form.publish_form": "Terbitkan",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Simpan perubahan",
- "compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}",
- "compose_form.sensitive.marked": "{count, plural, other {Media ini ditandai sebagai sensitif}}",
- "compose_form.sensitive.unmarked": "{count, plural, other {Media ini tidak ditandai sebagai sensitif}}",
"compose_form.spoiler.marked": "Hapus peringatan tentang isi konten",
"compose_form.spoiler.unmarked": "Tambahkan peringatan tentang isi konten",
- "compose_form.spoiler_placeholder": "Peringatan konten",
"confirmation_modal.cancel": "Batal",
"confirmations.block.block_and_report": "Blokir & Laporkan",
"confirmations.block.confirm": "Blokir",
@@ -364,7 +353,6 @@
"navigation_bar.compose": "Tulis toot baru",
"navigation_bar.discover": "Temukan",
"navigation_bar.domain_blocks": "Domain tersembunyi",
- "navigation_bar.edit_profile": "Ubah profil",
"navigation_bar.explore": "Jelajahi",
"navigation_bar.filters": "Kata yang dibisukan",
"navigation_bar.follow_requests": "Permintaan mengikuti",
@@ -454,14 +442,7 @@
"poll_button.add_poll": "Tambah japat",
"poll_button.remove_poll": "Hapus japat",
"privacy.change": "Ubah privasi kiriman",
- "privacy.direct.long": "Kirim hanya ke pengguna yang disebut",
- "privacy.direct.short": "Orang yang disebutkan saja",
- "privacy.private.long": "Kirim kiriman hanya kepada pengikut",
- "privacy.private.short": "Pengikut saja",
- "privacy.public.long": "Terlihat oleh semua",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "Terlihat oleh semua, tapi jangan tampilkan di fitur jelajah",
- "privacy.unlisted.short": "Tak Terdaftar",
"privacy_policy.last_updated": "Terakhir diperbarui {date}",
"privacy_policy.title": "Kebijakan Privasi",
"refresh": "Segarkan",
@@ -615,10 +596,8 @@
"upload_error.poll": "Unggah berkas tak diizinkan di japat ini.",
"upload_form.audio_description": "Penjelasan untuk orang dengan gangguan pendengaran",
"upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas",
- "upload_form.description_missing": "Tidak ada deskripsi yang ditambahkan",
"upload_form.edit": "Sunting",
"upload_form.thumbnail": "Ubah gambar kecil",
- "upload_form.undo": "Undo",
"upload_form.video_description": "Penjelasan untuk orang dengan gangguan pendengaran atau penglihatan",
"upload_modal.analyzing_picture": "Analisis gambar…",
"upload_modal.apply": "Terapkan",
diff --git a/app/javascript/mastodon/locales/ie.json b/app/javascript/mastodon/locales/ie.json
index 8579fc89c..5188d137e 100644
--- a/app/javascript/mastodon/locales/ie.json
+++ b/app/javascript/mastodon/locales/ie.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Proclamation",
"attachments_list.unprocessed": "(íntractat)",
"audio.hide": "Celar audio",
- "autosuggest_hashtag.per_week": "{count} per semane",
"boost_modal.combo": "Li proxim vez tu posse pressar {combo} por passar to-ci",
"bundle_column_error.copy_stacktrace": "Copiar erra-raporte",
"bundle_column_error.error.body": "Li demandat págine ne posset esser rendit. Fórsan it es un problema in nor code, o un problema de compatibilitá con li navigator.",
@@ -146,22 +145,21 @@
"compose_form.lock_disclaimer": "Tui conto ne es {locked}. Quicunc posse sequer te por vider tui postas solmen por sequitores.",
"compose_form.lock_disclaimer.lock": "cludet",
"compose_form.placeholder": "Quo es in tui spiritu?",
- "compose_form.poll.add_option": "Adjunter un option",
+ "compose_form.poll.add_option": "Adjunter option",
"compose_form.poll.duration": "Duration del balotation",
+ "compose_form.poll.multiple": "Selection multiplic",
"compose_form.poll.option_placeholder": "Option {number}",
"compose_form.poll.remove_option": "Remover ti-ci option",
+ "compose_form.poll.single": "Selecter un",
"compose_form.poll.switch_to_multiple": "Changea li balotation por permisser multiplic selectiones",
"compose_form.poll.switch_to_single": "Changea li balotation por permisser un singul selection",
- "compose_form.publish": "Publicar",
+ "compose_form.poll.type": "Stil",
+ "compose_form.publish": "Postar",
"compose_form.publish_form": "Nov posta",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Conservar changes",
- "compose_form.sensitive.hide": "{count, plural, one {Marcar medie quam sensitiv} other {Marcar medie quam sensitiv}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medie es marcat quam sensitiv} other {Medie es marcat quam sensitiv}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medie ne es marcat quam sensitiv} other {Medie ne es marcat quam sensitiv}}",
+ "compose_form.reply": "Responder",
+ "compose_form.save_changes": "Actualisar",
"compose_form.spoiler.marked": "Remover avise pri li contenete",
"compose_form.spoiler.unmarked": "Adjunter avise pri li contenete",
- "compose_form.spoiler_placeholder": "Scri tui avise ci",
"confirmation_modal.cancel": "Anullar",
"confirmations.block.block_and_report": "Bloccar & Raportar",
"confirmations.block.confirm": "Bloccar",
@@ -408,7 +406,6 @@
"navigation_bar.direct": "Privat mentiones",
"navigation_bar.discover": "Decovrir",
"navigation_bar.domain_blocks": "Bloccat dominias",
- "navigation_bar.edit_profile": "Redacter profil",
"navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favorites",
"navigation_bar.filters": "Silentiat paroles",
@@ -526,14 +523,11 @@
"poll_button.add_poll": "Adjunter un balotation",
"poll_button.remove_poll": "Remover balotation",
"privacy.change": "Changear li privatie del posta",
- "privacy.direct.long": "Visibil solmen a mentionat usatores",
- "privacy.direct.short": "Solmen persones mentionat",
- "privacy.private.long": "Visibil solmen por sequitores",
- "privacy.private.short": "Solmen sequitores",
- "privacy.public.long": "Visibil a omnes",
+ "privacy.direct.short": "Specific persones",
+ "privacy.private.long": "Solmen tui sequitores",
+ "privacy.private.short": "Sequitores",
+ "privacy.public.long": "Quicunc in e ex Mastodon",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visibil por omnes, ma excludet de functiones de decovrition",
- "privacy.unlisted.short": "Delistat",
"privacy_policy.last_updated": "Ultimmen actualisat ye {date}",
"privacy_policy.title": "Politica pri Privatie",
"recommended": "Recomandat",
@@ -715,10 +709,8 @@
"upload_error.poll": "On ne es permisset cargar medie con balotationes.",
"upload_form.audio_description": "Descrir por persones qui es surd o ne audi bon",
"upload_form.description": "Descrir por persones qui es ciec o have mal vision",
- "upload_form.description_missing": "Null descrition adjuntet",
"upload_form.edit": "Redacter",
"upload_form.thumbnail": "Changear previsual image",
- "upload_form.undo": "Deleter",
"upload_form.video_description": "Descrir por persones qui es surd, ciec, ne audi bon, o have mal vision",
"upload_modal.analyzing_picture": "Analisant image…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json
index f163567f1..a4f726842 100644
--- a/app/javascript/mastodon/locales/ig.json
+++ b/app/javascript/mastodon/locales/ig.json
@@ -107,8 +107,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"relative_time.full.just_now": "kịta",
"relative_time.just_now": "kịta",
"relative_time.today": "taa",
@@ -142,7 +140,6 @@
"trends.trending_now": "Na-ewu ewu kịta",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
- "upload_form.undo": "Hichapụ",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.choose_image": "Họrọ onyonyo",
"upload_progress.label": "Uploading…"
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 233b76845..a9dd32c06 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -86,7 +86,6 @@
"announcement.announcement": "Anunco",
"attachments_list.unprocessed": "(neprocedita)",
"audio.hide": "Celez audio",
- "autosuggest_hashtag.per_week": "{count} dum singla semano",
"boost_modal.combo": "Vu povas pulsar {combo} por omisar co venontafoye",
"bundle_column_error.copy_stacktrace": "Kopierorraporto",
"bundle_column_error.error.body": "La demandita pagino ne povas strukturigesar. Forsan ol esas eroro en kodexo hike o vidilkoncilieblesproblemo.",
@@ -143,22 +142,12 @@
"compose_form.lock_disclaimer": "Vua konto ne esas {locked}. Irgu povas sequar vu por vidar vua sequanto-nura posti.",
"compose_form.lock_disclaimer.lock": "klefagesas",
"compose_form.placeholder": "Quo esas en tua spirito?",
- "compose_form.poll.add_option": "Insertez selekto",
"compose_form.poll.duration": "Votpostoduro",
- "compose_form.poll.option_placeholder": "Selektato {number}",
- "compose_form.poll.remove_option": "Efacez ca selektajo",
"compose_form.poll.switch_to_multiple": "Chanjez votposto por permisar multiselektaji",
"compose_form.poll.switch_to_single": "Chanjez votposto por permisar una selektajo",
- "compose_form.publish": "Publikigez",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Sparez chanji",
- "compose_form.sensitive.hide": "{count, plural,one {Markizez medii quale privata} other {Markizez medii quale privata}}",
- "compose_form.sensitive.marked": "{count, plural,one {Medii markizesis quale privata} other {Medii markizesis quale privata}}",
- "compose_form.sensitive.unmarked": "{count, plural,one {Medii ne markizesis quale privata} other {Medii ne markizesis quale privata}}",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
- "compose_form.spoiler_placeholder": "Averto di kontenajo",
"confirmation_modal.cancel": "Anulez",
"confirmations.block.block_and_report": "Restriktez e Raportizez",
"confirmations.block.confirm": "Restriktez",
@@ -405,7 +394,6 @@
"navigation_bar.direct": "Privata mencioni",
"navigation_bar.discover": "Deskovrez",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "Modifikar profilo",
"navigation_bar.explore": "Explorez",
"navigation_bar.favourites": "Favoriziti",
"navigation_bar.filters": "Silencigita vorti",
@@ -519,14 +507,7 @@
"poll_button.add_poll": "Insertez votposto",
"poll_button.remove_poll": "Efacez votposto",
"privacy.change": "Aranjar privateso di mesaji",
- "privacy.direct.long": "Sendar nur a mencionata uzeri",
- "privacy.direct.short": "Mencionita personi nur",
- "privacy.private.long": "Sendar nur a sequanti",
- "privacy.private.short": "Sequanti nur",
- "privacy.public.long": "Videbla da omnu",
"privacy.public.short": "Publike",
- "privacy.unlisted.long": "Videbla da omnu ma voluntala ne inkluzas deskovrotraiti",
- "privacy.unlisted.short": "Ne enlistigota",
"privacy_policy.last_updated": "Antea novajo ye {date}",
"privacy_policy.title": "Privatesguidilo",
"recommended": "Rekomendata",
@@ -708,10 +689,8 @@
"upload_error.poll": "Failadchargo ne permisesas kun votposti.",
"upload_form.audio_description": "Deskriptez por personi kun audnekapableso",
"upload_form.description": "Deskriptez por personi kun vidnekapableso",
- "upload_form.description_missing": "Deskriptajo ne insertesis",
"upload_form.edit": "Modifikez",
"upload_form.thumbnail": "Chanjez imajeto",
- "upload_form.undo": "Desfacar",
"upload_form.video_description": "Deskriptez por personi kun audnekapableso o vidnekapableso",
"upload_modal.analyzing_picture": "Analizas imajo…",
"upload_modal.apply": "Aplikez",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index fb839503e..dfece102b 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Auglýsing",
"attachments_list.unprocessed": "(óunnið)",
"audio.hide": "Fela hljóð",
- "autosuggest_hashtag.per_week": "{count} á viku",
"boost_modal.combo": "Þú getur ýtt á {combo} til að sleppa þessu næst",
"bundle_column_error.copy_stacktrace": "Afrita villuskýrslu",
"bundle_column_error.error.body": "Umbeðna síðau var ekki hægt að myndgera. Það gæti verið vegna villu í kóðanum okkar eða vandamáls með samhæfni vafra.",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "Hvað liggur þér á hjarta?",
"compose_form.poll.add_option": "Bæta við valkosti",
"compose_form.poll.duration": "Tímalengd könnunar",
+ "compose_form.poll.multiple": "Margir valkostir",
"compose_form.poll.option_placeholder": "Valkostur {number}",
"compose_form.poll.remove_option": "Fjarlægja þennan valkost",
+ "compose_form.poll.single": "Veldu eitt",
"compose_form.poll.switch_to_multiple": "Breyta könnun svo hægt sé að hafa marga valkosti",
"compose_form.poll.switch_to_single": "Breyta könnun svo hægt sé að hafa einn stakan valkost",
+ "compose_form.poll.type": "Stíll",
"compose_form.publish": "Birta",
"compose_form.publish_form": "Birta",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Vista breytingar",
- "compose_form.sensitive.hide": "{count, plural, one {Merkja mynd sem viðkvæma} other {Merkja myndir sem viðkvæmar}}",
- "compose_form.sensitive.marked": "{count, plural, one {Mynd er merkt sem viðkvæm} other {Myndir eru merktar sem viðkvæmar}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Mynd er ekki merkt sem viðkvæm} other {Myndir eru ekki merktar sem viðkvæmar}}",
+ "compose_form.reply": "Svara",
+ "compose_form.save_changes": "Uppfæra",
"compose_form.spoiler.marked": "Fjarlægja aðvörun vegna efnis",
"compose_form.spoiler.unmarked": "Bæta við aðvörun vegna efnis",
- "compose_form.spoiler_placeholder": "Skrifaðu aðvörunina þína hér",
+ "compose_form.spoiler_placeholder": "Aðvörun vegna efnis (valkvætt)",
"confirmation_modal.cancel": "Hætta við",
"confirmations.block.block_and_report": "Útiloka og kæra",
"confirmations.block.confirm": "Útiloka",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Einkaspjall",
"navigation_bar.discover": "Uppgötva",
"navigation_bar.domain_blocks": "Útilokuð lén",
- "navigation_bar.edit_profile": "Breyta notandasniði",
"navigation_bar.explore": "Kanna",
"navigation_bar.favourites": "Eftirlæti",
"navigation_bar.filters": "Þögguð orð",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Bæta við könnun",
"poll_button.remove_poll": "Fjarlægja könnun",
"privacy.change": "Aðlaga gagnaleynd færslu",
- "privacy.direct.long": "Senda einungis á notendur sem minnst er á",
- "privacy.direct.short": "Aðeins fólk sem minnst er á",
- "privacy.private.long": "Senda einungis á fylgjendur",
- "privacy.private.short": "Einungis fylgjendur",
- "privacy.public.long": "Sýnilegt fyrir alla",
+ "privacy.direct.long": "Allir sem minnst er á í færslunni",
+ "privacy.direct.short": "Tilteknir aðilar",
+ "privacy.private.long": "Einungis þeir sem fylgjast með þér",
+ "privacy.private.short": "Fylgjendur",
+ "privacy.public.long": "Hver sem er, á og utan Mastodon",
"privacy.public.short": "Opinbert",
- "privacy.unlisted.long": "Sýnilegt öllum, en ekki tekið með í uppgötvunareiginleikum",
- "privacy.unlisted.short": "Óskráð",
+ "privacy.unlisted.additional": "Þetta hegðar sér eins og opinber færsla, fyrir utan að færslan birtist ekki í beinum streymum eða myllumerkjum, né heldur í Mastodon-leitum jafnvel þótt þú hafir valið að falla undir slíkt í notandasniðinu þínu.",
+ "privacy.unlisted.long": "Minni stælar í reikniritum",
+ "privacy.unlisted.short": "Hljóðlátt opinbert",
"privacy_policy.last_updated": "Síðast uppfært {date}",
"privacy_policy.title": "Persónuverndarstefna",
"recommended": "Mælt með",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}mín",
"relative_time.seconds": "{number}sek",
"relative_time.today": "í dag",
+ "reply_indicator.attachments": "{count, plural, one {# viðhengi} other {# viðhengi}}",
"reply_indicator.cancel": "Hætta við",
+ "reply_indicator.poll": "Könnun",
"report.block": "Útiloka",
"report.block_explanation": "Þú munt ekki sjá færslurnar þeirra. Þeir munu ekki geta séð færslurnar þínar eða fylgst með þér. Þeir munu ekki geta séð að lokað sé á þá.",
"report.categories.legal": "Lagalegt",
@@ -715,10 +716,8 @@
"upload_error.poll": "Innsending skráa er ekki leyfð í könnunum.",
"upload_form.audio_description": "Lýstu þessu fyrir heyrnarskerta",
"upload_form.description": "Lýstu þessu fyrir sjónskerta",
- "upload_form.description_missing": "Engri lýsingu bætt við",
"upload_form.edit": "Breyta",
"upload_form.thumbnail": "Skipta um smámynd",
- "upload_form.undo": "Eyða",
"upload_form.video_description": "Lýstu þessu fyrir fólk sem heyrir illa eða er með skerta sjón",
"upload_modal.analyzing_picture": "Greini mynd…",
"upload_modal.apply": "Virkja",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 4fb4d88cb..920b80d5a 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Annuncio",
"attachments_list.unprocessed": "(non elaborato)",
"audio.hide": "Nascondi audio",
- "autosuggest_hashtag.per_week": "{count} a settimana",
"boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio, la prossima volta",
"bundle_column_error.copy_stacktrace": "Copia rapporto sull'errore",
"bundle_column_error.error.body": "Impossibile rendedrizzare la pagina richiesta. Potrebbe dipendere da un bug nel nostro codice o da un problema di compatibilità di un browser.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti per visualizzare i tuoi post per soli seguaci.",
"compose_form.lock_disclaimer.lock": "bloccato",
"compose_form.placeholder": "Cos'hai in mente?",
- "compose_form.poll.add_option": "Aggiungi una scelta",
+ "compose_form.poll.add_option": "Aggiungi opzione",
"compose_form.poll.duration": "Durata del sondaggio",
- "compose_form.poll.option_placeholder": "Scelta {number}",
- "compose_form.poll.remove_option": "Rimuovi questa scelta",
+ "compose_form.poll.multiple": "Scelta multipla",
+ "compose_form.poll.option_placeholder": "Opzione {number}",
+ "compose_form.poll.remove_option": "Rimuovi questa opzione",
+ "compose_form.poll.single": "Scegli uno",
"compose_form.poll.switch_to_multiple": "Modifica il sondaggio per consentire scelte multiple",
"compose_form.poll.switch_to_single": "Modifica il sondaggio per consentire una singola scelta",
+ "compose_form.poll.type": "Stile",
"compose_form.publish": "Pubblica",
"compose_form.publish_form": "Nuovo post",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Salva le modifiche",
- "compose_form.sensitive.hide": "{count, plural, one {Segna media come sensibile} other {Segna media come sensibili}}",
- "compose_form.sensitive.marked": "{count, plural, one {Il media è contrassegnato come sensibile} other {I media sono contrassegnati come sensibili}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Il media non è contrassegnato come sensibile} other {I media non sono contrassegnati come sensibili}}",
+ "compose_form.reply": "Rispondi",
+ "compose_form.save_changes": "Aggiorna",
"compose_form.spoiler.marked": "Rimuovi l'avviso del contenuto",
"compose_form.spoiler.unmarked": "Aggiungi l'avviso del contenuto",
- "compose_form.spoiler_placeholder": "Scrivi qui il tuo avviso",
+ "compose_form.spoiler_placeholder": "Contenuto sensibile (facoltativo)",
"confirmation_modal.cancel": "Annulla",
"confirmations.block.block_and_report": "Blocca & Segnala",
"confirmations.block.confirm": "Blocca",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Menzioni private",
"navigation_bar.discover": "Scopri",
"navigation_bar.domain_blocks": "Domini bloccati",
- "navigation_bar.edit_profile": "Modifica il profilo",
"navigation_bar.explore": "Esplora",
"navigation_bar.favourites": "Preferiti",
"navigation_bar.filters": "Parole silenziate",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Aggiungi un sondaggio",
"poll_button.remove_poll": "Rimuovi il sondaggio",
"privacy.change": "Modifica privacy del post",
- "privacy.direct.long": "Visibile solo per gli utenti menzionati",
- "privacy.direct.short": "Solo persone menzionate",
- "privacy.private.long": "Visibile solo ai seguaci",
- "privacy.private.short": "Solo seguaci",
- "privacy.public.long": "Visibile a tutti",
+ "privacy.direct.long": "Tutti quelli menzioniati nel post",
+ "privacy.direct.short": "Persone specifiche",
+ "privacy.private.long": "Solo i tuoi follower",
+ "privacy.private.short": "Follower",
+ "privacy.public.long": "Chiunque dentro e fuori Mastodon",
"privacy.public.short": "Pubblico",
- "privacy.unlisted.long": "Visibile a tutti, ma escluso dalle funzioni di scoperta",
- "privacy.unlisted.short": "Non elencato",
+ "privacy.unlisted.additional": "Si comporta esattamente come pubblico, tranne per il fatto che il post non verrà visualizzato nei feed live o negli hashtag, nell'esplorazione o nella ricerca Mastodon, anche se hai attivato l'attivazione a livello di account.",
+ "privacy.unlisted.long": "Meno fanfare algoritmiche",
+ "privacy.unlisted.short": "Pubblico silenzioso",
"privacy_policy.last_updated": "Ultimo aggiornamento {date}",
"privacy_policy.title": "Politica sulla Privacy",
"recommended": "Consigliato",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "oggi",
+ "reply_indicator.attachments": "{count, plural, one {# allegato} other {# allegati}}",
"reply_indicator.cancel": "Annulla",
+ "reply_indicator.poll": "Sondaggio",
"report.block": "Blocca",
"report.block_explanation": "Non visualizzerai i suoi post. Non potrà vedere i tuoi post o seguirti. Potrà sapere di esser stato bloccato.",
"report.categories.legal": "Informazioni legali",
@@ -715,10 +716,8 @@
"upload_error.poll": "Caricamento del file non consentito con i sondaggi.",
"upload_form.audio_description": "Descrizione per persone con deficit uditivi",
"upload_form.description": "Descrizione per ipovedenti",
- "upload_form.description_missing": "Nessuna descrizione aggiunta",
"upload_form.edit": "Modifica",
"upload_form.thumbnail": "Cambia la miniatura",
- "upload_form.undo": "Elimina",
"upload_form.video_description": "Descrizione per persone con deficit uditivi o ipovedenti",
"upload_modal.analyzing_picture": "Analizzando l'immagine…",
"upload_modal.apply": "Applica",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 2db22d714..b22a4ede9 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -32,6 +32,7 @@
"account.featured_tags.last_status_never": "投稿がありません",
"account.featured_tags.title": "{name}の注目ハッシュタグ",
"account.follow": "フォロー",
+ "account.follow_back": "フォローバック",
"account.followers": "フォロワー",
"account.followers.empty": "まだ誰もフォローしていません。",
"account.followers_counter": "{counter} フォロワー",
@@ -52,6 +53,7 @@
"account.mute_notifications_short": "通知をオフにする",
"account.mute_short": "ミュート",
"account.muted": "ミュート済み",
+ "account.mutual": "相互フォロー中",
"account.no_bio": "説明が提供されていません。",
"account.open_original_page": "元のページを開く",
"account.posts": "投稿",
@@ -87,7 +89,6 @@
"announcement.announcement": "お知らせ",
"attachments_list.unprocessed": "(未処理)",
"audio.hide": "音声を閉じる",
- "autosuggest_hashtag.per_week": "{count} 回 / 週",
"boost_modal.combo": "次からは{combo}を押せばスキップできます",
"bundle_column_error.copy_stacktrace": "エラーレポートをコピー",
"bundle_column_error.error.body": "要求されたページをレンダリングできませんでした。コードのバグ、またはブラウザの互換性の問題が原因である可能性があります。",
@@ -144,22 +145,12 @@
"compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
"compose_form.lock_disclaimer.lock": "承認制",
"compose_form.placeholder": "今なにしてる?",
- "compose_form.poll.add_option": "追加",
"compose_form.poll.duration": "アンケート期間",
- "compose_form.poll.option_placeholder": "項目 {number}",
- "compose_form.poll.remove_option": "この項目を削除",
"compose_form.poll.switch_to_multiple": "複数選択に変更",
"compose_form.poll.switch_to_single": "単一選択に変更",
- "compose_form.publish": "投稿",
"compose_form.publish_form": "投稿",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "変更を保存",
- "compose_form.sensitive.hide": "メディアを閲覧注意にする",
- "compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
- "compose_form.sensitive.unmarked": "メディアに閲覧注意が設定されていません",
"compose_form.spoiler.marked": "本文は警告の後ろに隠されます",
"compose_form.spoiler.unmarked": "本文は隠されていません",
- "compose_form.spoiler_placeholder": "ここに警告を書いてください",
"confirmation_modal.cancel": "キャンセル",
"confirmations.block.block_and_report": "ブロックし通報",
"confirmations.block.confirm": "ブロック",
@@ -408,7 +399,6 @@
"navigation_bar.direct": "非公開の返信",
"navigation_bar.discover": "見つける",
"navigation_bar.domain_blocks": "ブロックしたドメイン",
- "navigation_bar.edit_profile": "プロフィールを編集",
"navigation_bar.explore": "探索する",
"navigation_bar.favourites": "お気に入り",
"navigation_bar.filters": "フィルター設定",
@@ -488,7 +478,7 @@
"onboarding.profile.display_name_hint": "フルネーム、あるいは面白い名前など",
"onboarding.profile.lead": "あとでいつでも修正できますし、設定画面にはこれ以外のカスタマイズ項目もあります。",
"onboarding.profile.note": "自己紹介",
- "onboarding.profile.note_hint": "ほかの人に @言及 したり、#ハッシュタグ を付けたりできます",
+ "onboarding.profile.note_hint": "ほかのユーザーへのメンション (@mention) や、 #ハッシュタグ が使用できます",
"onboarding.profile.save_and_continue": "保存して続ける",
"onboarding.profile.title": "プロフィールの設定",
"onboarding.profile.upload_avatar": "プロフィール画像をアップロード",
@@ -526,14 +516,7 @@
"poll_button.add_poll": "アンケートを追加",
"poll_button.remove_poll": "アンケートを削除",
"privacy.change": "公開範囲を変更",
- "privacy.direct.long": "指定された相手のみ閲覧可",
- "privacy.direct.short": "指定された相手のみ",
- "privacy.private.long": "フォロワーのみ閲覧可",
- "privacy.private.short": "フォロワーのみ",
- "privacy.public.long": "誰でも閲覧可",
"privacy.public.short": "公開",
- "privacy.unlisted.long": "誰でも閲覧可、サイレント",
- "privacy.unlisted.short": "非収載",
"privacy_policy.last_updated": "{date}に更新",
"privacy_policy.title": "プライバシーポリシー",
"recommended": "おすすめ",
@@ -719,10 +702,8 @@
"upload_error.poll": "アンケートではファイルをアップロードできません。",
"upload_form.audio_description": "聴き取りが難しいユーザーへの説明",
"upload_form.description": "視覚的に閲覧が難しいユーザーへの説明",
- "upload_form.description_missing": "説明を追加していません",
"upload_form.edit": "編集",
"upload_form.thumbnail": "サムネイルを変更",
- "upload_form.undo": "削除",
"upload_form.video_description": "聴き取りや視覚的に閲覧が難しいユーザーへの説明",
"upload_modal.analyzing_picture": "画像を解析中…",
"upload_modal.apply": "適用",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 9d977e933..8628cb38a 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -36,7 +36,6 @@
"admin.dashboard.retention.cohort_size": "ახალი მომხმარებელი",
"alert.unexpected.message": "წარმოიშვა მოულოდნელი შეცდომა.",
"alert.unexpected.title": "უპს!",
- "autosuggest_hashtag.per_week": "კვირაში {count}",
"boost_modal.combo": "შეგიძლიათ დააჭიროთ {combo}-ს რათა შემდეგ ჯერზე გამოტოვოთ ეს",
"bundle_column_error.retry": "სცადეთ კიდევ ერთხელ",
"bundle_modal_error.close": "დახურვა",
@@ -68,11 +67,8 @@
"compose_form.lock_disclaimer.lock": "ჩაკეტილი",
"compose_form.placeholder": "რაზე ფიქრობ?",
"compose_form.publish_form": "Publish",
- "compose_form.sensitive.marked": "მედია მონიშნულია მგრძნობიარედ",
- "compose_form.sensitive.unmarked": "მედია არაა მონიშნული მგრძნობიარედ",
"compose_form.spoiler.marked": "გაფრთხილების უკან ტექსტი დამალულია",
"compose_form.spoiler.unmarked": "ტექსტი არაა დამალული",
- "compose_form.spoiler_placeholder": "თქვენი გაფრთხილება დაწერეთ აქ",
"confirmation_modal.cancel": "უარყოფა",
"confirmations.block.confirm": "ბლოკი",
"confirmations.block.message": "დარწმუნებული ხართ, გსურთ დაბლოკოთ {name}?",
@@ -171,7 +167,6 @@
"navigation_bar.compose": "Compose new toot",
"navigation_bar.discover": "აღმოაჩინე",
"navigation_bar.domain_blocks": "დამალული დომენები",
- "navigation_bar.edit_profile": "შეცვალე პროფილი",
"navigation_bar.filters": "გაჩუმებული სიტყვები",
"navigation_bar.follow_requests": "დადევნების მოთხოვნები",
"navigation_bar.lists": "სიები",
@@ -211,12 +206,7 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "სტატუსის კონფიდენციალურობის მითითება",
- "privacy.direct.long": "დაიპოსტოს მხოლოდ დასახელებულ მომხმარებლებთან",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "დაიპოსტოს მხოლოდ მიმდევრებთან",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "საჯარო",
- "privacy.unlisted.short": "ჩამოუთვლელი",
"regeneration_indicator.label": "იტვირთება…",
"regeneration_indicator.sublabel": "თქვენი სახლის ლენტა მზადდება!",
"relative_time.days": "{number}დღ",
@@ -279,7 +269,6 @@
"upload_button.label": "მედიის დამატება",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "აღწერილობა ვიზუალურად უფასურისთვის",
- "upload_form.undo": "გაუქმება",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_progress.label": "იტვირთება...",
"video.close": "ვიდეოს დახურვა",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index 08c70a940..d9388c704 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -53,7 +53,6 @@
"alert.unexpected.title": "Ayhuh!",
"announcement.announcement": "Ulɣu",
"audio.hide": "Ffer amesli",
- "autosuggest_hashtag.per_week": "{count} i yimalas",
"boost_modal.combo": "Tzemreḍ ad tetekkiḍ ɣef {combo} akken ad tessurfeḍ aya tikelt-nniḍen",
"bundle_column_error.copy_stacktrace": "Nɣel tuccḍa n uneqqis",
"bundle_column_error.error.title": "Uh, ala !",
@@ -99,20 +98,10 @@
"compose_form.lock_disclaimer": "Amiḍan-ik·im ur yelli ara {locked}. Menwala yezmer ad k·kem-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik·im.",
"compose_form.lock_disclaimer.lock": "yettwacekkel",
"compose_form.placeholder": "D acu i itezzin deg wallaɣ?",
- "compose_form.poll.add_option": "Rnu afran",
"compose_form.poll.duration": "Tanzagt n tefrant",
- "compose_form.poll.option_placeholder": "Afran {number}",
- "compose_form.poll.remove_option": "Sfeḍ afran-agi",
- "compose_form.publish": "Suffeɣ",
"compose_form.publish_form": "Suffeɣ",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Sekles ibeddilen",
- "compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
- "compose_form.sensitive.marked": "Allal n teywalt yettwacreḍ d anafri",
- "compose_form.sensitive.unmarked": "{count, plural, one {Amidya ur yettwacreḍ ara d anafri} other {Imidyaten ur ttwacreḍen ara d inafriyen}}",
"compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu",
"compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu",
- "compose_form.spoiler_placeholder": "Aru alɣu-inek·inem da",
"confirmation_modal.cancel": "Sefsex",
"confirmations.block.block_and_report": "Sewḥel & sewɛed",
"confirmations.block.confirm": "Sewḥel",
@@ -284,7 +273,6 @@
"navigation_bar.compose": "Aru tajewwiqt tamaynut",
"navigation_bar.discover": "Ẓer",
"navigation_bar.domain_blocks": "Tiɣula yeffren",
- "navigation_bar.edit_profile": "Ẓreg amaɣnu",
"navigation_bar.explore": "Snirem",
"navigation_bar.favourites": "Imenyafen",
"navigation_bar.filters": "Awalen i yettwasgugmen",
@@ -359,12 +347,7 @@
"poll_button.add_poll": "Rnu asenqed",
"poll_button.remove_poll": "Kkes asenqed",
"privacy.change": "Seggem tabaḍnit n yizen",
- "privacy.direct.long": "Bḍu gar yimseqdacen i tbedreḍ kan",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Bḍu i yimeḍfaṛen-ik kan",
- "privacy.private.short": "Imeḍfaṛen kan",
"privacy.public.short": "Azayez",
- "privacy.unlisted.short": "War tabdert",
"privacy_policy.title": "Tasertit tabaḍnit",
"refresh": "Smiren",
"regeneration_indicator.label": "Yessalay-d…",
@@ -472,7 +455,6 @@
"upload_form.description": "Glem-d i yemdaneni yesɛan ugur deg yiẓri",
"upload_form.edit": "Ẓreg",
"upload_form.thumbnail": "Beddel tugna",
- "upload_form.undo": "Kkes",
"upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neɣ deg yiẓri",
"upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…",
"upload_modal.apply": "Snes",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 97b199180..1f6cc78a5 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -64,7 +64,6 @@
"alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
"alert.unexpected.title": "Өй!",
"announcement.announcement": "Хабарландыру",
- "autosuggest_hashtag.per_week": "{count} аптасына",
"boost_modal.combo": "Келесіде өткізіп жіберу үшін басыңыз {combo}",
"bundle_column_error.retry": "Қайтадан көріңіз",
"bundle_modal_error.close": "Жабу",
@@ -99,19 +98,12 @@
"compose_form.lock_disclaimer": "Аккаунтыңыз {locked} емес. Кез келген адам жазылып, сізді оқи алады.",
"compose_form.lock_disclaimer.lock": "жабық",
"compose_form.placeholder": "Не бөліскіңіз келеді?",
- "compose_form.poll.add_option": "Жауап қос",
"compose_form.poll.duration": "Сауалнама мерзімі",
- "compose_form.poll.option_placeholder": "Жауап {number}",
- "compose_form.poll.remove_option": "Бұл жауапты өшір",
"compose_form.poll.switch_to_multiple": "Бірнеше жауап таңдайтындай қылу",
"compose_form.poll.switch_to_single": "Тек бір жауап таңдайтындай қылу",
"compose_form.publish_form": "Publish",
- "compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
- "compose_form.sensitive.marked": "Медиа нәзік деп белгіленген",
- "compose_form.sensitive.unmarked": "Медиа нәзік деп белгіленбеген",
"compose_form.spoiler.marked": "Мәтін ескертумен жасырылған",
"compose_form.spoiler.unmarked": "Мәтін жасырылмаған",
- "compose_form.spoiler_placeholder": "Ескертуіңізді осында жазыңыз",
"confirmation_modal.cancel": "Қайтып алу",
"confirmations.block.block_and_report": "Блок және Шағым",
"confirmations.block.confirm": "Бұғаттау",
@@ -250,7 +242,6 @@
"navigation_bar.compose": "Жаңа жазба бастау",
"navigation_bar.discover": "шарлау",
"navigation_bar.domain_blocks": "Жабық домендер",
- "navigation_bar.edit_profile": "Профиль түзету",
"navigation_bar.filters": "Үнсіз сөздер",
"navigation_bar.follow_requests": "Жазылуға сұранғандар",
"navigation_bar.follows_and_followers": "Жазылымдар және оқырмандар",
@@ -311,12 +302,7 @@
"poll_button.add_poll": "Сауалнама қосу",
"poll_button.remove_poll": "Сауалнаманы өшіру",
"privacy.change": "Құпиялылықты реттеу",
- "privacy.direct.long": "Аталған адамдарға ғана көрінетін жазба",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Тек оқырмандарға арналған жазба",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "Ашық",
- "privacy.unlisted.short": "Тізімсіз",
"refresh": "Жаңарту",
"regeneration_indicator.label": "Жүктеу…",
"regeneration_indicator.sublabel": "Жергілікті желі құрылуда!",
@@ -399,7 +385,6 @@
"upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
"upload_form.edit": "Түзету",
"upload_form.thumbnail": "Суретті өзгерту",
- "upload_form.undo": "Өшіру",
"upload_form.video_description": "Есту немесе көру қабілеті нашар адамдарға сипаттама беріңіз",
"upload_modal.analyzing_picture": "Суретті анализ жасау…",
"upload_modal.apply": "Қолдану",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 473690070..396aebbdf 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -91,10 +91,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 264781baa..eae7f8fae 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -68,7 +68,7 @@
"account.unblock_domain": "도메인 {domain} 차단 해제",
"account.unblock_short": "차단 해제",
"account.unendorse": "프로필에 추천하지 않기",
- "account.unfollow": "팔로우 해제",
+ "account.unfollow": "언팔로우",
"account.unmute": "@{name} 뮤트 해제",
"account.unmute_notifications_short": "알림 뮤트 해제",
"account.unmute_short": "뮤트 해제",
@@ -89,7 +89,6 @@
"announcement.announcement": "공지사항",
"attachments_list.unprocessed": "(처리 안 됨)",
"audio.hide": "소리 숨기기",
- "autosuggest_hashtag.per_week": "주간 {count}회",
"boost_modal.combo": "다음엔 {combo}를 눌러서 이 과정을 건너뛸 수 있습니다",
"bundle_column_error.copy_stacktrace": "에러 리포트 복사하기",
"bundle_column_error.error.body": "요청한 페이지를 렌더링 할 수 없습니다. 저희의 코드에 버그가 있거나, 브라우저 호환성 문제일 수 있습니다.",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "지금 무슨 생각을 하고 있나요?",
"compose_form.poll.add_option": "항목 추가",
"compose_form.poll.duration": "투표 기간",
- "compose_form.poll.option_placeholder": "{number}번 항목",
+ "compose_form.poll.multiple": "다중 선택",
+ "compose_form.poll.option_placeholder": "{option}번째 항목",
"compose_form.poll.remove_option": "이 항목 삭제",
+ "compose_form.poll.single": "단일 선택",
"compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경",
"compose_form.poll.switch_to_single": "단일 선택 투표로 변경",
+ "compose_form.poll.type": "형식",
"compose_form.publish": "게시",
"compose_form.publish_form": "새 게시물",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "변경사항 저장",
- "compose_form.sensitive.hide": "미디어를 민감함으로 설정하기",
- "compose_form.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다",
- "compose_form.sensitive.unmarked": "미디어가 열람주의로 설정 되어 있지 않습니다",
+ "compose_form.reply": "답장",
+ "compose_form.save_changes": "수정",
"compose_form.spoiler.marked": "열람주의 제거",
"compose_form.spoiler.unmarked": "열람 주의 문구 추가",
- "compose_form.spoiler_placeholder": "경고 문구를 여기에 작성하세요",
+ "compose_form.spoiler_placeholder": "열람 주의 (옵션)",
"confirmation_modal.cancel": "취소",
"confirmations.block.block_and_report": "차단하고 신고하기",
"confirmations.block.confirm": "차단",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "개인적인 멘션",
"navigation_bar.discover": "발견하기",
"navigation_bar.domain_blocks": "차단한 도메인",
- "navigation_bar.edit_profile": "프로필 수정",
"navigation_bar.explore": "둘러보기",
"navigation_bar.favourites": "좋아요",
"navigation_bar.filters": "뮤트한 단어",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "설문 추가",
"poll_button.remove_poll": "설문 제거",
"privacy.change": "게시물의 프라이버시 설정을 변경",
- "privacy.direct.long": "언급된 사용자만 볼 수 있음",
- "privacy.direct.short": "멘션한 사람들만",
- "privacy.private.long": "팔로워에게만 공개",
- "privacy.private.short": "팔로워 전용",
- "privacy.public.long": "모두가 볼 수 있음",
+ "privacy.direct.long": "이 게시물에서 언급된 모두",
+ "privacy.direct.short": "특정 인물",
+ "privacy.private.long": "내 팔로워들에게만",
+ "privacy.private.short": "팔로워",
+ "privacy.public.long": "마스토돈 내외 모두",
"privacy.public.short": "공개",
- "privacy.unlisted.long": "모두가 볼 수 있지만, 발견하기 기능에서는 제외됨",
- "privacy.unlisted.short": "미등재",
+ "privacy.unlisted.additional": "공개와 똑같지만 게시물이 라이브 피드나 해시태그, 발견하기, (계정 설정에서 허용했더라도) 마스토돈 검색에서 제외됩니다.",
+ "privacy.unlisted.long": "더 적은 알고리즘 팡파레",
+ "privacy.unlisted.short": "조용한 공개",
"privacy_policy.last_updated": "{date}에 마지막으로 업데이트됨",
"privacy_policy.title": "개인정보처리방침",
"recommended": "추천함",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}분 전",
"relative_time.seconds": "{number}초 전",
"relative_time.today": "오늘",
+ "reply_indicator.attachments": "{count, plural, one {#} other {#}}개의 첨부파일",
"reply_indicator.cancel": "취소",
+ "reply_indicator.poll": "투표",
"report.block": "차단",
"report.block_explanation": "당신은 해당 계정의 게시물을 보지 않게 됩니다. 해당 계정은 당신의 게시물을 보거나 팔로우 할 수 없습니다. 해당 계정은 자신이 차단되었다는 사실을 알 수 있습니다.",
"report.categories.legal": "법적인 문제",
@@ -683,7 +684,7 @@
"status.show_more": "펼치기",
"status.show_more_all": "모두 펼치기",
"status.show_original": "원본 보기",
- "status.title.with_attachments": "{user} 님이 {attachmentCount, plural, one {첨부} other {{attachmentCount}개 첨부}}하여 게시",
+ "status.title.with_attachments": "{user} 님이 {attachmentCount, plural, one {첨부파일} other {{attachmentCount}개의 첨부파일}}과 함께 게시함",
"status.translate": "번역",
"status.translated_from_with": "{provider}에 의해 {lang}에서 번역됨",
"status.uncached_media_warning": "마리보기 허용되지 않음",
@@ -715,10 +716,8 @@
"upload_error.poll": "파일 업로드는 설문과 함께 쓸 수 없습니다.",
"upload_form.audio_description": "청각 장애인을 위한 설명",
"upload_form.description": "시각장애인을 위한 설명",
- "upload_form.description_missing": "설명이 추가되지 않음",
"upload_form.edit": "수정",
"upload_form.thumbnail": "썸네일 변경",
- "upload_form.undo": "삭제",
"upload_form.video_description": "청각, 시각 장애인을 위한 설명",
"upload_modal.analyzing_picture": "사진 분석 중…",
"upload_modal.apply": "적용",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 7d8603cae..4a0fd671d 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -77,7 +77,6 @@
"announcement.announcement": "Daxuyanî",
"attachments_list.unprocessed": "(bêpêvajo)",
"audio.hide": "Dengê veşêre",
- "autosuggest_hashtag.per_week": "Her hefte {count}",
"boost_modal.combo": "Ji bo derbas bî carekî din de pêlê {combo} bike",
"bundle_column_error.copy_stacktrace": "Rapora çewtiyê jê bigire",
"bundle_column_error.error.body": "Rûpela xwestî nehate pêşkêşkirin. Dibe ku ew ji ber şaşetiyeke koda me, an jî pirsgirêkeke lihevhatina gerokê be.",
@@ -129,22 +128,12 @@
"compose_form.lock_disclaimer": "Ajimêrê te ne {locked}. Herkes dikare te bişopîne da ku şandiyên te yên tenê ji şopînerên re têne xuyakirin bibînin.",
"compose_form.lock_disclaimer.lock": "girtî ye",
"compose_form.placeholder": "Çi di hişê te derbas dibe?",
- "compose_form.poll.add_option": "Hilbijartinekî tevlî bike",
"compose_form.poll.duration": "Dema rapirsî yê",
- "compose_form.poll.option_placeholder": "{number} Hilbijêre",
- "compose_form.poll.remove_option": "Vê hilbijarê rake",
"compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
"compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
- "compose_form.publish": "Biweşîne",
"compose_form.publish_form": "Biweşîne",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Guhertinan tomar bike",
- "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}",
"compose_form.spoiler.marked": "Hişyariya naverokê rake",
"compose_form.spoiler.unmarked": "Hişyariya naverokê tevlî bike",
- "compose_form.spoiler_placeholder": "Li vir hişyariya xwe binivîse",
"confirmation_modal.cancel": "Dev jê berde",
"confirmations.block.block_and_report": "Asteng bike & ragihîne",
"confirmations.block.confirm": "Asteng bike",
@@ -351,7 +340,6 @@
"navigation_bar.direct": "Qalkirinên taybet",
"navigation_bar.discover": "Vekolê",
"navigation_bar.domain_blocks": "Navperên astengkirî",
- "navigation_bar.edit_profile": "Profîlê serrast bike",
"navigation_bar.explore": "Vekole",
"navigation_bar.filters": "Peyvên bêdengkirî",
"navigation_bar.follow_requests": "Daxwazên şopandinê",
@@ -437,14 +425,7 @@
"poll_button.add_poll": "Rapirsîyek zêde bike",
"poll_button.remove_poll": "Rapirsî yê rake",
"privacy.change": "Nepênîtiya şandiyan biguherîne",
- "privacy.direct.long": "Tenê ji bo bikarhênerên qalkirî tê dîtin",
- "privacy.direct.short": "Tenê kesên qalkirî",
- "privacy.private.long": "Tenê bo şopîneran xuyabar e",
- "privacy.private.short": "Tenê şopîneran",
- "privacy.public.long": "Ji bo hemûyan xuyabar e",
"privacy.public.short": "Gelemperî",
- "privacy.unlisted.long": "Ji bo hemûyan xuyabar e, lê ji taybetmendiyên vekolînê veqetiya ye",
- "privacy.unlisted.short": "Nelîstekirî",
"privacy_policy.last_updated": "Rojanekirina dawî {date}",
"privacy_policy.title": "Politîka taybetiyê",
"refresh": "Nû bike",
@@ -608,10 +589,8 @@
"upload_error.poll": "Di rapirsîyan de mafê barkirina pelan nayê dayîn.",
"upload_form.audio_description": "Ji bona kesên kêm dibihîsin re pênase bike",
"upload_form.description": "Ji bona astengdarên dîtinê re vebêje",
- "upload_form.description_missing": "Ti danasîn nehatiye tevlîkirin",
"upload_form.edit": "Serrast bike",
"upload_form.thumbnail": "Wêneyê biçûk biguherîne",
- "upload_form.undo": "Jê bibe",
"upload_form.video_description": "Ji bo kesên kerr û lalan pênase bike",
"upload_modal.analyzing_picture": "Wêne tê analîzkirin…",
"upload_modal.apply": "Bisepîne",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 8f384fe12..e42f50aef 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -45,7 +45,6 @@
"alert.unexpected.message": "Gwall anwaytyadow re dharva.",
"alert.unexpected.title": "Oups!",
"announcement.announcement": "Deklaryans",
- "autosuggest_hashtag.per_week": "{count} an seythen",
"boost_modal.combo": "Hwi a yll gwaska {combo} dhe woheles hemma an nessa tro",
"bundle_column_error.retry": "Assayewgh arta",
"bundle_modal_error.close": "Degea",
@@ -80,20 +79,12 @@
"compose_form.lock_disclaimer": "Nyns yw agas akont {locked}. Piwpynag a yll agas holya dhe weles agas postow holyoryon-hepken.",
"compose_form.lock_disclaimer.lock": "Alhwedhys",
"compose_form.placeholder": "Pyth eus yn agas brys?",
- "compose_form.poll.add_option": "Keworra dewis",
"compose_form.poll.duration": "Duryans sondyans",
- "compose_form.poll.option_placeholder": "Dewis {number}",
- "compose_form.poll.remove_option": "Dilea'n dewis ma",
"compose_form.poll.switch_to_multiple": "Chanjya sondyans dhe asa lies dewis",
"compose_form.poll.switch_to_single": "Chanjya sondyans dhe asa unn dewis hepken",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.sensitive.hide": "{count, plural, one {Merkya myski vel tender} other {Merkya myski vel tender}}",
- "compose_form.sensitive.marked": "{count, plural, one {Myski merkys vel tender} other {Myski merkys vel tender}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Nyns yw myski merkys vel tender} other {Nyns yw myski merkys vel tender}}",
"compose_form.spoiler.marked": "Dilea gwarnyans dalgh",
"compose_form.spoiler.unmarked": "Keworra gwarnyans dalgh",
- "compose_form.spoiler_placeholder": "Skrifewgh agas gwarnyans omma",
"confirmation_modal.cancel": "Hedhi",
"confirmations.block.block_and_report": "Lettya & Reportya",
"confirmations.block.confirm": "Lettya",
@@ -244,7 +235,6 @@
"navigation_bar.compose": "Komposya post nowydh",
"navigation_bar.discover": "Diskudha",
"navigation_bar.domain_blocks": "Gorfarthow lettys",
- "navigation_bar.edit_profile": "Golegi profil",
"navigation_bar.filters": "Geryow tawhes",
"navigation_bar.follow_requests": "Govynnow holya",
"navigation_bar.follows_and_followers": "Holyansow ha holyoryon",
@@ -316,12 +306,7 @@
"poll_button.add_poll": "Keworra sondyans",
"poll_button.remove_poll": "Dilea sondyans",
"privacy.change": "Chanjya privetter an post",
- "privacy.direct.long": "Gweladow dhe'n dhevnydhyoryon menegys hepken",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Gweladow dhe holyoryon hepken",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "Poblek",
- "privacy.unlisted.short": "Anrelys",
"refresh": "Daskarga",
"regeneration_indicator.label": "Ow karga…",
"regeneration_indicator.sublabel": "Yma agas lin dre ow pos pareusys!",
@@ -407,7 +392,6 @@
"upload_form.description": "Deskrifewgh rag tus dhallek",
"upload_form.edit": "Golegi",
"upload_form.thumbnail": "Chanjya avenik",
- "upload_form.undo": "Dilea",
"upload_form.video_description": "Deskrifa rag tus vodharek po dallek",
"upload_modal.analyzing_picture": "Ow tytratya skeusen…",
"upload_modal.apply": "Gweytha",
diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json
index 3e5747ba8..698b3da4c 100644
--- a/app/javascript/mastodon/locales/la.json
+++ b/app/javascript/mastodon/locales/la.json
@@ -34,9 +34,7 @@
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer.lock": "clausum",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.publish": "Barrire",
"compose_form.publish_form": "Barrire",
- "compose_form.publish_loud": "{publish}!",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
"confirmations.block.confirm": "Impedire",
@@ -116,9 +114,6 @@
"poll_button.add_poll": "Addere electionem",
"poll_button.remove_poll": "Auferre electionem",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "Coram publico",
"privacy.public.short": "Coram publico",
"relative_time.full.just_now": "nunc",
"relative_time.just_now": "nunc",
@@ -153,7 +148,6 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
"upload_form.audio_description": "Describe for people who are hard of hearing",
"upload_form.edit": "Recolere",
- "upload_form.undo": "Oblitterare",
"upload_progress.label": "Uploading…",
"video.mute": "Confutare soni"
}
diff --git a/app/javascript/mastodon/locales/lad.json b/app/javascript/mastodon/locales/lad.json
index 2067edcc7..ba99f5cd3 100644
--- a/app/javascript/mastodon/locales/lad.json
+++ b/app/javascript/mastodon/locales/lad.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Pregon",
"attachments_list.unprocessed": "(no prosesado)",
"audio.hide": "Eskonder audio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Puedes klikar {combo} para ometer esto la proksima vez",
"bundle_column_error.copy_stacktrace": "Kopia el raporto de yerro",
"bundle_column_error.error.body": "La pajina solisitada no pudo ser renderada. Podria ser por un yerro en muestro kodiche o un problem de kompatibilita kon el navigador.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Tu kuento no esta {locked}. Todos pueden segirte para ver tus publikasyones solo para suivantes.",
"compose_form.lock_disclaimer.lock": "serrado",
"compose_form.placeholder": "Ke haber?",
- "compose_form.poll.add_option": "Adjusta opsyon",
"compose_form.poll.duration": "Durasion de anketa",
- "compose_form.poll.option_placeholder": "Opsyon {number}",
- "compose_form.poll.remove_option": "Kita esta opsyon",
"compose_form.poll.switch_to_multiple": "Trokar anketa para permeter a eskojer mas ke una opsyon",
"compose_form.poll.switch_to_single": "Trokar anketa para permeter a eskojer solo una opsyon",
- "compose_form.publish": "Publika",
"compose_form.publish_form": "Mueva publikasyon",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Guadra trokamientos",
- "compose_form.sensitive.hide": "{count, plural, one {Marka material komo sensivle} other {Marka material komo sensivle}}",
- "compose_form.sensitive.marked": "{count, plural, one {Material markado komo sensivle} other {Material markado komo sensivle}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Material no markado komo sensivle} other {Material no markado komo sensivle}}",
"compose_form.spoiler.marked": "Kita avertensya de kontenido",
"compose_form.spoiler.unmarked": "Adjusta avertensya de kontenido",
- "compose_form.spoiler_placeholder": "Eskrive tu avertensya aki",
"confirmation_modal.cancel": "Anula",
"confirmations.block.block_and_report": "Bloka i raporta",
"confirmations.block.confirm": "Bloka",
@@ -328,6 +317,7 @@
"interaction_modal.on_another_server": "En otro sirvidor",
"interaction_modal.on_this_server": "En este sirvidor",
"interaction_modal.sign_in": "No estas konektado kon este sirvidor. Ande tyenes tu kuento?",
+ "interaction_modal.sign_in_hint": "Konsejo: Akel es el sitio adonde te enrejistrates. Si no lo akodras, bushka el mesaj de posta elektronika de bienvenida en tu kuti de arivo. Tambien puedes eskrivir tu nombre de utilizador kompleto (por enshemplo @Mastodon@mastodon.social)",
"interaction_modal.title.favourite": "Endika ke te plaze publikasyon de {name}",
"interaction_modal.title.follow": "Sige a {name}",
"interaction_modal.title.reblog": "Repartaja publikasyon de {name}",
@@ -407,7 +397,6 @@
"navigation_bar.direct": "Enmentaduras privadas",
"navigation_bar.discover": "Diskuvre",
"navigation_bar.domain_blocks": "Domenos blokados",
- "navigation_bar.edit_profile": "Edita profil",
"navigation_bar.explore": "Eksplorar",
"navigation_bar.favourites": "Te plazen",
"navigation_bar.filters": "Biervos silensiados",
@@ -478,6 +467,7 @@
"onboarding.actions.go_to_explore": "Va a los trendes",
"onboarding.actions.go_to_home": "Va a tu linya prinsipala",
"onboarding.compose.template": "Ke haber, #Mastodon?",
+ "onboarding.follows.empty": "Malorozamente, no se pueden amostrar rezultados en este momento. Puedes aprovar uzar la bushkeda o navigar por la pajina de eksplorasyon para topar personas a las que segir, o aprovarlo de muevo mas tadre.",
"onboarding.follows.title": "Personaliza tu linya prinsipala",
"onboarding.profile.discoverable": "Faz ke mi profil apareska en bushkedas",
"onboarding.profile.display_name": "Nombre amostrado",
@@ -497,10 +487,13 @@
"onboarding.start.title": "Lo logrates!",
"onboarding.steps.follow_people.body": "El buto de Mastodon es segir a djente interesante.",
"onboarding.steps.follow_people.title": "Personaliza tu linya prinsipala",
+ "onboarding.steps.publish_status.body": "Puedes introdusirte al mundo con teksto, fotos, videos o anketas {emoji}",
"onboarding.steps.publish_status.title": "Eskrive tu primera publikasyon",
+ "onboarding.steps.setup_profile.body": "Kompleta tu profil para aumentar tus enteraksyones.",
"onboarding.steps.setup_profile.title": "Personaliza tu profil",
"onboarding.steps.share_profile.body": "Informe a tus amigos komo toparte en Mastodon",
"onboarding.steps.share_profile.title": "Partaja tu profil de Mastodon",
+ "password_confirmation.exceeds_maxlength": "La konfirmasyon de kod es demaziado lunga",
"password_confirmation.mismatching": "Los dos kodes son desferentes",
"picture_in_picture.restore": "Restora",
"poll.closed": "Serrado",
@@ -514,14 +507,7 @@
"poll_button.add_poll": "Adjusta anketa",
"poll_button.remove_poll": "Kita anketa",
"privacy.change": "Troka privasita de publikasyon",
- "privacy.direct.long": "Vizivle solo para utilizadores enmentados",
- "privacy.direct.short": "Solo personas enmentadas",
- "privacy.private.long": "Vizivle solo para suivantes",
- "privacy.private.short": "Solo suivantes",
- "privacy.public.long": "Vizivle para todos",
"privacy.public.short": "Publiko",
- "privacy.unlisted.long": "Vizivle para todos, ama eskluido de las fonksiones de diskuvrimyento",
- "privacy.unlisted.short": "No listado",
"privacy_policy.last_updated": "Ultima aktualizasyon: {date}",
"privacy_policy.title": "Politika de privasita",
"recommended": "Rekomendado",
@@ -703,10 +689,8 @@
"upload_error.poll": "No se permite kargar dosyas kon anketas.",
"upload_form.audio_description": "Deskrive para personas sodras o kon problemes auditivos",
"upload_form.description": "Deskrive para personas siegas o kon problemes vizuales",
- "upload_form.description_missing": "No adjustates deskripsion",
"upload_form.edit": "Edita",
"upload_form.thumbnail": "Troka minyatura",
- "upload_form.undo": "Efasa",
"upload_form.video_description": "Deskrive para personas sodras, kon problemes auditivos, siegas o kon problemes vizuales",
"upload_modal.analyzing_picture": "Analizando imaje…",
"upload_modal.apply": "Aplika",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index ec0d30363..14fa09e97 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,27 @@
"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 +103,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 +115,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ę",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "Kas tavo mintyse?",
"compose_form.poll.add_option": "Pridėti pasirinkimą",
"compose_form.poll.duration": "Apklausos trukmė",
+ "compose_form.poll.multiple": "Keli pasirinkimai",
"compose_form.poll.option_placeholder": "{number} pasirinkimas",
"compose_form.poll.remove_option": "Pašalinti šį pasirinkimą",
+ "compose_form.poll.single": "Pasirinkti vieną",
"compose_form.poll.switch_to_multiple": "Keisti apklausą, kad būtų galima pasirinkti kelis pasirinkimus",
"compose_form.poll.switch_to_single": "Pakeisti apklausą, kad būtų galima pasirinkti vieną variantą",
+ "compose_form.poll.type": "Stilius",
"compose_form.publish": "Skelbti",
"compose_form.publish_form": "Naujas įrašas",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Išsaugoti pakeitimus",
- "compose_form.sensitive.hide": "{count, plural, one {Žymėti mediją kaip jautrią} few {Žymėti medijas kaip jautrias} many {Žymėti medijo kaip jautrio} other {Žymėti medijų kaip jautrių}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medija pažymėta kaip jautri} few {Medijos pažymėtos kaip jautrios} many {Medijo pažymėta kaip jautrio} other {Medijų pažymėtų kaip jautrių}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medija nepažymėta kaip jautri} few {Medijos nepažymėtos kaip jautrios} many {Medijo nepažymėta kaip jautrio} other {Medijų nepažymėtų kaip jautrių}}",
+ "compose_form.reply": "Atsakyti",
+ "compose_form.save_changes": "Atnaujinti",
"compose_form.spoiler.marked": "Pašalinti turinio įspėjimą",
"compose_form.spoiler.unmarked": "Pridėti turinio įspėjimą",
- "compose_form.spoiler_placeholder": "Rašyk savo įspėjimą čia",
+ "compose_form.spoiler_placeholder": "Turinio įspėjimas (pasirinktinis)",
"confirmation_modal.cancel": "Atšaukti",
"confirmations.block.block_and_report": "Blokuoti ir pranešti",
"confirmations.block.confirm": "Blokuoti",
@@ -342,6 +341,7 @@
"keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
"keyboard_shortcuts.up": "to move up in the list",
"lightbox.close": "Uždaryti",
+ "lists.new.create": "Pridėti sąrašą",
"loading_indicator.label": "Kraunama…",
"media_gallery.toggle_visible": "{number, plural, one {Slėpti vaizdą} few {Slėpti vaizdus} many {Slėpti vaizdo} other {Slėpti vaizdų}}",
"moved_to_account_banner.text": "Tavo paskyra {disabledAccount} šiuo metu yra išjungta, nes persikėlei į {movedToAccount}.",
@@ -356,7 +356,6 @@
"navigation_bar.direct": "Privatūs paminėjimai",
"navigation_bar.discover": "Atrasti",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "Redaguoti profilį",
"navigation_bar.explore": "Naršyti",
"navigation_bar.favourites": "Mėgstamiausi",
"navigation_bar.filters": "Nutylėti žodžiai",
@@ -466,14 +465,15 @@
"poll_button.add_poll": "Pridėti apklausą",
"poll_button.remove_poll": "Šalinti apklausą",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "Visiems matomas",
+ "privacy.direct.long": "Visus, paminėtus įraše",
+ "privacy.direct.short": "Konkretūs žmonės",
+ "privacy.private.long": "Tik sekėjams",
+ "privacy.private.short": "Sekėjai",
+ "privacy.public.long": "Bet kas iš Mastodon ir ne Mastodon",
"privacy.public.short": "Viešas",
- "privacy.unlisted.long": "Matomas visiems, bet atsisakyta atradimo funkcijų",
- "privacy.unlisted.short": "Neįtrauktas į sąrašą",
+ "privacy.unlisted.additional": "Tai veikia lygiai taip pat, kaip ir vieša, tik įrašas nebus rodomas tiesioginiuose srautuose, saitažodžiose, naršyme ar Mastodon paieškoje, net jei esi įtraukęs (-usi) visą paskyrą.",
+ "privacy.unlisted.long": "Mažiau algoritminių fanfarų",
+ "privacy.unlisted.short": "Tyliai vieša",
"privacy_policy.last_updated": "Paskutinį kartą atnaujinta {date}",
"privacy_policy.title": "Privatumo politika",
"recommended": "Rekomenduojama",
@@ -485,7 +485,9 @@
"relative_time.minutes": "{number} min.",
"relative_time.seconds": "{number} sek.",
"relative_time.today": "šiandien",
+ "reply_indicator.attachments": "{count, plural, one {# priedas} few {# priedai} many {# priedo} other {# priedų}}",
"reply_indicator.cancel": "Atšaukti",
+ "reply_indicator.poll": "Apklausa",
"report.block": "Blokuoti",
"report.categories.legal": "Legalus",
"report.categories.other": "Kita",
@@ -579,9 +581,7 @@
"units.short.thousand": "{count} tūkst.",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
- "upload_form.description_missing": "Nėra pridėto aprašymo",
"upload_form.edit": "Redaguoti",
- "upload_form.undo": "Ištrinti",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.choose_image": "Pasirinkti vaizdą",
"upload_modal.description_placeholder": "Greita rudoji lapė peršoka tinginį šunį",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index c06a1d936..b4426b4c4 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -86,7 +86,6 @@
"announcement.announcement": "Paziņojums",
"attachments_list.unprocessed": "(neapstrādāti)",
"audio.hide": "Slēpt audio",
- "autosuggest_hashtag.per_week": "{count} nedēļā",
"boost_modal.combo": "Nospied {combo}, lai nākamreiz šo izlaistu",
"bundle_column_error.copy_stacktrace": "Kopēt kļūdu ziņojumu",
"bundle_column_error.error.body": "Pieprasīto lapu nevarēja atveidot. Tas varētu būt saistīts ar kļūdu mūsu kodā, vai tā ir pārlūkprogrammas saderības problēma.",
@@ -143,22 +142,12 @@
"compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var tev piesekot un redzēt tikai sekotājiem paredzētos ziņojumus.",
"compose_form.lock_disclaimer.lock": "slēgts",
"compose_form.placeholder": "Kas tev padomā?",
- "compose_form.poll.add_option": "Pievienot izvēli",
"compose_form.poll.duration": "Aptaujas ilgums",
- "compose_form.poll.option_placeholder": "Izvēle Nr. {number}",
- "compose_form.poll.remove_option": "Noņemt šo izvēli",
"compose_form.poll.switch_to_multiple": "Mainīt aptaujas veidu, lai atļautu vairākas izvēles",
"compose_form.poll.switch_to_single": "Mainīt aptaujas veidu, lai atļautu vienu izvēli",
- "compose_form.publish": "Publicēt",
"compose_form.publish_form": "Jauns ieraksts",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Saglabāt izmaiņas",
- "compose_form.sensitive.hide": "{count, plural, one {Atzīmēt multividi kā sensitīvu} other {Atzīmēt multivides kā sensitīvas}}",
- "compose_form.sensitive.marked": "{count, plural, one {Multivide ir atzīmēta kā sensitīva} other {Multivides ir atzīmētas kā sensitīvas}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Multivide nav atzīmēta kā sensitīva} other {Multivides nav atzīmētas kā sensitīvas}}",
"compose_form.spoiler.marked": "Noņemt satura brīdinājumu",
"compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu",
- "compose_form.spoiler_placeholder": "Ieraksti savu brīdinājumu šeit",
"confirmation_modal.cancel": "Atcelt",
"confirmations.block.block_and_report": "Bloķēt un ziņot",
"confirmations.block.confirm": "Bloķēt",
@@ -403,7 +392,6 @@
"navigation_bar.direct": "Privāti pieminēti",
"navigation_bar.discover": "Atklāt",
"navigation_bar.domain_blocks": "Bloķētie domēni",
- "navigation_bar.edit_profile": "Rediģēt profilu",
"navigation_bar.explore": "Pārlūkot",
"navigation_bar.favourites": "Izlase",
"navigation_bar.filters": "Apklusinātie vārdi",
@@ -510,14 +498,7 @@
"poll_button.add_poll": "Pievienot aptauju",
"poll_button.remove_poll": "Noņemt aptauju",
"privacy.change": "Mainīt ieraksta privātumu",
- "privacy.direct.long": "Redzama tikai pieminētajiem lietotājiem",
- "privacy.direct.short": "Tikai minētie cilvēki",
- "privacy.private.long": "Redzama tikai sekotājiem",
- "privacy.private.short": "Tikai sekotājiem",
- "privacy.public.long": "Redzams visiem",
"privacy.public.short": "Publiska",
- "privacy.unlisted.long": "Redzams visiem, bet izslēgts no satura atklāšanas funkcijām",
- "privacy.unlisted.short": "Neiekļautie",
"privacy_policy.last_updated": "Pēdējo reizi atjaunināta {date}",
"privacy_policy.title": "Privātuma politika",
"refresh": "Atsvaidzināt",
@@ -697,10 +678,8 @@
"upload_error.poll": "Datņu augšupielādes aptaujās nav atļautas.",
"upload_form.audio_description": "Pievieno aprakstu cilvēkiem ar dzirdes zudumu",
"upload_form.description": "Pievieno aprakstu vājredzīgajiem",
- "upload_form.description_missing": "Apraksts nav pievienots",
"upload_form.edit": "Rediģēt",
"upload_form.thumbnail": "Nomainīt sīktēlu",
- "upload_form.undo": "Dzēst",
"upload_form.video_description": "Pievieno aprakstu cilvēkiem ar dzirdes vai redzes traucējumiem",
"upload_modal.analyzing_picture": "Analizē attēlu…",
"upload_modal.apply": "Pielietot",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index bdef3f4a5..f7080842b 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -48,7 +48,6 @@
"alert.rate_limited.message": "Обидете се повторно после {retry_time, time, medium}.",
"alert.unexpected.message": "Неочекувана грешка.",
"alert.unexpected.title": "Упс!",
- "autosuggest_hashtag.per_week": "{count} неделно",
"boost_modal.combo": "Кликни {combo} за да го прескокниш ова нареден пат",
"bundle_column_error.retry": "Обидете се повторно",
"bundle_modal_error.close": "Затвори",
@@ -76,14 +75,8 @@
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer.lock": "заклучен",
"compose_form.placeholder": "Што имате на ум?",
- "compose_form.poll.add_option": "Додај избор",
"compose_form.poll.duration": "Времетрање на анкета",
- "compose_form.poll.option_placeholder": "Избери {number}",
- "compose_form.poll.remove_option": "Избриши избор",
"compose_form.publish_form": "Publish",
- "compose_form.sensitive.hide": "Обележи медиа како сензитивна",
- "compose_form.sensitive.marked": "Медиата е обележана како сензитивна",
- "compose_form.sensitive.unmarked": "Медиата не е обележана како сензитивна",
"compose_form.spoiler.marked": "Текстот е сокриен зад предупредување",
"compose_form.spoiler.unmarked": "Текстот не е сокриен",
"confirmation_modal.cancel": "Откажи",
@@ -182,7 +175,6 @@
"keyboard_shortcuts.up": "to move up in the list",
"navigation_bar.compose": "Compose new toot",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "Уреди профил",
"navigation_bar.filters": "Замолќени зборови",
"navigation_bar.follow_requests": "Следи покани",
"navigation_bar.follows_and_followers": "Следења и следбеници",
@@ -229,12 +221,7 @@
"poll_button.add_poll": "Додадете нова анкета",
"poll_button.remove_poll": "Избришете анкета",
"privacy.change": "Штеловај статус на приватност",
- "privacy.direct.long": "Објави само на спомнати корисници",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Објави само на следбеници",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "Јавно",
- "privacy.unlisted.short": "Необјавено",
"refresh": "Освежи",
"regeneration_indicator.label": "Вчитување…",
"regeneration_indicator.sublabel": "Вашиот новости се подготвуваат!",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 11636646b..0059dd333 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -60,7 +60,6 @@
"announcement.announcement": "അറിയിപ്പ്",
"attachments_list.unprocessed": "(പ്രോസസ്സ് ചെയ്യാത്തത്)",
"audio.hide": "ശബ്ദം ഒഴിവാക്കുക",
- "autosuggest_hashtag.per_week": "ആഴ്ച തോറും {count}",
"boost_modal.combo": "അടുത്ത തവണ ഇത് ഒഴിവാക്കുവാൻ {combo} ഞെക്കാവുന്നതാണ്",
"bundle_column_error.network.title": "നെറ്റ്വർക്ക് പിശക്",
"bundle_column_error.retry": "വീണ്ടും ശ്രമിക്കുക",
@@ -102,17 +101,12 @@
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer.lock": "ലോക്കുചെയ്തു",
"compose_form.placeholder": "നിങ്ങളുടെ മനസ്സിൽ എന്താണ്?",
- "compose_form.poll.add_option": "ഒരു ചോയ്സ് ചേർക്കുക",
"compose_form.poll.duration": "തിരഞ്ഞെടുപ്പിന്റെ സമയദൈർഖ്യം",
- "compose_form.poll.option_placeholder": "ചോയ്സ് {number}",
- "compose_form.poll.remove_option": "ഈ ഡിവൈസ് മാറ്റുക",
"compose_form.poll.switch_to_multiple": "വോട്ടെടുപ്പിൽ ഒന്നിലധികം ചോയ്സുകൾ ഉൾപ്പെടുതുക",
"compose_form.poll.switch_to_single": "വോട്ടെടുപ്പിൽ ഒരൊറ്റ ചോയ്സ് മാത്രം ആക്കുക",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{പ്രസിദ്ധീകരിക്കുക}!",
"compose_form.spoiler.marked": "എഴുത്ത് മുന്നറിയിപ്പിനാൽ മറച്ചിരിക്കുന്നു",
"compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല",
- "compose_form.spoiler_placeholder": "നിങ്ങളുടെ മുന്നറിയിപ്പ് ഇവിടെ എഴുതുക",
"confirmation_modal.cancel": "റദ്ദാക്കുക",
"confirmations.block.block_and_report": "തടയുകയും റിപ്പോർട്ടും ചെയ്യുക",
"confirmations.block.confirm": "തടയുക",
@@ -244,7 +238,6 @@
"navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക",
"navigation_bar.discover": "കണ്ടെത്തുക",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
"navigation_bar.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ",
"navigation_bar.lists": "ലിസ്റ്റുകൾ",
"navigation_bar.logout": "ലോഗൗട്ട്",
@@ -302,10 +295,6 @@
"poll_button.add_poll": "ഒരു പോൾ ചേർക്കുക",
"poll_button.remove_poll": "പോൾ നീക്കംചെയ്യുക",
"privacy.change": "ടൂട്ട് സ്വകാര്യത ക്രമീകരിക്കുക",
- "privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "എല്ലാവര്ക്കും",
"refresh": "പുതുക്കുക",
"regeneration_indicator.label": "ലഭ്യമാക്കുന്നു…",
@@ -372,7 +361,6 @@
"upload_form.description": "കാഴ്ചശക്തി ഇല്ലാത്തവർക്ക് വേണ്ടി വിവരണം നൽകൂ",
"upload_form.edit": "തിരുത്തുക",
"upload_form.thumbnail": "ലഘുചിത്രം മാറ്റുക",
- "upload_form.undo": "ഇല്ലാതാക്കുക",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.analyzing_picture": "ചിത്രം വിശകലനം ചെയ്യുന്നു…",
"upload_modal.apply": "പ്രയോഗിക്കുക",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 7f5b7d652..20231f0bb 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -73,7 +73,6 @@
"alert.unexpected.message": "एक अनपेक्षित त्रुटी आली.",
"alert.unexpected.title": "अरेरे!",
"announcement.announcement": "घोषणा",
- "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताह",
"bundle_column_error.retry": "पुन्हा प्रयत्न करा",
"bundle_modal_error.close": "बंद करा",
"bundle_modal_error.message": "हा घटक लोड करतांना काहीतरी चुकले आहे.",
@@ -99,9 +98,6 @@
"compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.placeholder": "आपल्या मनात काय आहे?",
- "compose_form.poll.add_option": "नवीन पर्याय",
- "compose_form.poll.option_placeholder": "निवड {number}",
- "compose_form.poll.remove_option": "हा पर्याय काढा",
"compose_form.publish_form": "Publish",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
@@ -228,10 +224,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 50a48db1e..8c1ff6337 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -86,7 +86,6 @@
"announcement.announcement": "Pengumuman",
"attachments_list.unprocessed": "(belum diproses)",
"audio.hide": "Sembunyikan audio",
- "autosuggest_hashtag.per_week": "{count} seminggu",
"boost_modal.combo": "Anda boleh tekan {combo} untuk melangkauinya pada waktu lain",
"bundle_column_error.copy_stacktrace": "Salin laporan ralat",
"bundle_column_error.error.body": "Halaman yang diminta gagal dipaparkan. Ini mungkin disebabkan oleh pepijat dalam kod kami, atau masalah keserasian pelayar.",
@@ -143,22 +142,12 @@
"compose_form.lock_disclaimer": "Akaun anda tidak {locked}. Sesiapa pun boleh mengikuti anda untuk melihat hantaran pengikut-sahaja anda.",
"compose_form.lock_disclaimer.lock": "dikunci",
"compose_form.placeholder": "Apakah yang sedang anda fikirkan?",
- "compose_form.poll.add_option": "Tambah pilihan",
"compose_form.poll.duration": "Tempoh undian",
- "compose_form.poll.option_placeholder": "Pilihan {number}",
- "compose_form.poll.remove_option": "Buang pilihan ini",
"compose_form.poll.switch_to_multiple": "Ubah kepada membenarkan aneka undian",
"compose_form.poll.switch_to_single": "Ubah kepada undian pilihan tunggal",
- "compose_form.publish": "Terbit",
"compose_form.publish_form": "Terbit",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Simpan perubahan",
- "compose_form.sensitive.hide": "{count, plural, one {Tandakan media sbg sensitif} other {Tandakan media sbg sensitif}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media telah ditanda sbg sensitif} other {Media telah ditanda sbg sensitif}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media tidak ditanda sbg sensitif} other {Media tidak ditanda sbg sensitif}}",
"compose_form.spoiler.marked": "Buang amaran kandungan",
"compose_form.spoiler.unmarked": "Tambah amaran kandungan",
- "compose_form.spoiler_placeholder": "Tulis amaran anda di sini",
"confirmation_modal.cancel": "Batal",
"confirmations.block.block_and_report": "Sekat & Lapor",
"confirmations.block.confirm": "Sekat",
@@ -399,7 +388,6 @@
"navigation_bar.direct": "Sebutan peribadi",
"navigation_bar.discover": "Teroka",
"navigation_bar.domain_blocks": "Domain disekat",
- "navigation_bar.edit_profile": "Sunting profil",
"navigation_bar.explore": "Teroka",
"navigation_bar.favourites": "Kegemaran",
"navigation_bar.filters": "Perkataan yang dibisukan",
@@ -506,14 +494,7 @@
"poll_button.add_poll": "Tambah undian",
"poll_button.remove_poll": "Buang undian",
"privacy.change": "Ubah privasi hantaran",
- "privacy.direct.long": "Hanya boleh dilihat oleh pengguna disebut",
- "privacy.direct.short": "Orang yang disebut sahaja",
- "privacy.private.long": "Hanya boleh dilihat oleh pengikut",
- "privacy.private.short": "Pengikut sahaja",
- "privacy.public.long": "Kelihatan untuk semua",
"privacy.public.short": "Awam",
- "privacy.unlisted.long": "Terpapar untuk semua, tetapi menarik diri daripada ciri penemuan",
- "privacy.unlisted.short": "Tidak tersenarai",
"privacy_policy.last_updated": "Dikemaskini {date}",
"privacy_policy.title": "Dasar Privasi",
"refresh": "Muat semula",
@@ -693,10 +674,8 @@
"upload_error.poll": "Tidak boleh memuat naik fail bersama undian.",
"upload_form.audio_description": "Jelaskan untuk orang yang ada masalah pendengaran",
"upload_form.description": "Jelaskan untuk orang yang ada masalah penglihatan",
- "upload_form.description_missing": "Tiada keterangan ditambah",
"upload_form.edit": "Sunting",
"upload_form.thumbnail": "Ubah gambar kecil",
- "upload_form.undo": "Padam",
"upload_form.video_description": "Jelaskan untuk orang yang ada masalah pendengaran atau penglihatan",
"upload_modal.analyzing_picture": "Menganalisis gambar…",
"upload_modal.apply": "Guna",
diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json
index 3ca03b616..396a72ac4 100644
--- a/app/javascript/mastodon/locales/my.json
+++ b/app/javascript/mastodon/locales/my.json
@@ -87,7 +87,6 @@
"announcement.announcement": "ကြေငြာချက်",
"attachments_list.unprocessed": "(မလုပ်ဆောင်ရသေး)",
"audio.hide": "အသံပိတ်မည်",
- "autosuggest_hashtag.per_week": "တစ်ပတ်လျှင် {count}\n",
"boost_modal.combo": "ဤအရာကို နောက်တစ်ကြိမ်ကျော်ရန် {combo} ကိုနှိပ်နိုင်သည်။",
"bundle_column_error.copy_stacktrace": "စာကူးရာတွင်ပြဿနာရှိသည်",
"bundle_column_error.error.body": "ဤစာမျက်နှာကို ဖော်ပြရာတွင် ပြဿနာရှိနေသည်",
@@ -144,22 +143,12 @@
"compose_form.lock_disclaimer": "သင့်အကောင့်ကို {သော့ခတ်မထားပါ}။ သင့်နောက်လိုက်-သီးသန့်ပို့စ်များကို ကြည့်ရှုရန် မည်သူမဆို သင့်အား လိုက်ကြည့်နိုင်ပါသည်။",
"compose_form.lock_disclaimer.lock": "သော့ခတ်ထားမယ်",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.poll.add_option": "ရွေးချယ်မှုထပ်မံပေါင်းထည့်ပါ",
"compose_form.poll.duration": "စစ်တမ်းကြာချိန်",
- "compose_form.poll.option_placeholder": "ရွေးချယ်မှု {number}\n",
- "compose_form.poll.remove_option": "ဤရွေးချယ်မှုကို ဖယ်ထုတ်ပါ",
"compose_form.poll.switch_to_multiple": "စစ်တမ်းတွင်တစ်ခုထပ်ပိုသောဆန္ဒပြုချက်လက်ခံမည်",
"compose_form.poll.switch_to_single": "စစ်တမ်းတွင် တစ်ခုကိုသာရွေးချယ်ခွင့်ပြုမည်",
- "compose_form.publish": "ပို့စ်တင်မည်",
"compose_form.publish_form": "ပို့စ်တင်မည်",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "ပြောင်းလဲမှုများကို သိမ်းဆည်းပါ",
- "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
- "compose_form.spoiler_placeholder": "သတိပေးစာကိုဤနေရာတွင်ရေးပါ",
"confirmation_modal.cancel": "ပယ်ဖျက်မည်",
"confirmations.block.block_and_report": "ဘလော့ပြီး တိုင်ကြားမည်",
"confirmations.block.confirm": "ဘလော့မည်",
@@ -405,7 +394,6 @@
"navigation_bar.direct": "သီးသန့်ဖော်ပြချက်များ",
"navigation_bar.discover": "ရှာဖွေပါ",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "ကိုယ်ရေးမှတ်တမ်းပြင်ဆင်မည်",
"navigation_bar.explore": "စူးစမ်းရန်",
"navigation_bar.favourites": "Favorites",
"navigation_bar.filters": "စကားလုံးများ ပိတ်ထားပါ",
@@ -519,14 +507,7 @@
"poll_button.add_poll": "စစ်တမ်းကောက်မည်",
"poll_button.remove_poll": "စစ်တမ်းပယ်ဖျက်မည်",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "မန်းရှင်းခေါ်သူသီးသန့်",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "ဖော်လိုးလုပ်သူသီးသန့်",
- "privacy.private.short": "စောင့်ကြည့်သူများသာ",
- "privacy.public.long": "အားလုံး မြင်နိုင်သည်",
"privacy.public.short": "အများကိုပြမည်",
- "privacy.unlisted.long": "အားလုံးမြင်နိုင်သော်လည်း ရှာဖွေမှုများမှ ဖယ်ထုတ်ထားသည်",
- "privacy.unlisted.short": "စာရင်းမသွင်းထားပါ",
"privacy_policy.last_updated": "နောက်ဆုံး ပြင်ဆင်ခဲ့သည့်ရက်စွဲ {date}",
"privacy_policy.title": "ကိုယ်ရေးအချက်အလက်မူဝါဒ",
"recommended": "အကြံပြုသည်",
@@ -708,10 +689,8 @@
"upload_error.poll": "စစ်တမ်းနှင့်အတူဖိုင်များတင်ခွင့်မပြုပါ",
"upload_form.audio_description": "အကြားအာရုံချို့ယွင်းသော ခက်ခဲသောသူများအတွက် ဖော်ပြထားသည်",
"upload_form.description": "အမြင်အာရုံချို့ယွင်းသော ခက်ခဲသောသူများအတွက် ဖော်ပြထားသည်",
- "upload_form.description_missing": "ဖော်ပြချက် မထည့်ပါ",
"upload_form.edit": "ပြင်ရန်",
"upload_form.thumbnail": "ပုံသေးကို ပြောင်းပါ",
- "upload_form.undo": "ဖျက်ရန်",
"upload_form.video_description": "အမြင်အာရုံနှင့်အကြားအာရုံ ချို့ယွင်းသော ခက်ခဲသောသူများအတွက် ဖော်ပြထားသည်",
"upload_modal.analyzing_picture": "ပုံအား ပိုင်းခြားစိတ်ဖြာနေသည်...",
"upload_modal.apply": "သုံးပါ",
diff --git a/app/javascript/mastodon/locales/ne.json b/app/javascript/mastodon/locales/ne.json
index 229d4f471..86e24a15f 100644
--- a/app/javascript/mastodon/locales/ne.json
+++ b/app/javascript/mastodon/locales/ne.json
@@ -69,12 +69,5 @@
"compose.language.change": "भाषा परिवर्तन गर्नुहोस्",
"compose.language.search": "भाषाहरू खोज्नुहोस्...",
"compose_form.direct_message_warning_learn_more": "थप जान्नुहोस्",
- "compose_form.poll.add_option": "विकल्प थप्नुहोस्",
- "compose_form.poll.remove_option": "यो विकल्प हटाउनुहोस्",
- "compose_form.publish_form": "नयाँ पोस्ट",
- "compose_form.save_changes": "परिवर्तनहरू सेभ गर्नुहोस",
- "compose_form.sensitive.hide": "{count, plural, one {संवेदनशील मिडियाको रूपमा चिन्ह लगाउनुहोस्} other {संवेदनशील मिडियाहरूको रूपमा चिन्ह लगाउनुहोस्}}",
- "compose_form.sensitive.marked": "{count, plural, one {मिडियालाई संवेदनशील रूपमा चिन्ह लगाइएको छ} other {मिडियाहरूलाई संवेदनशील रूपमा चिन्ह लगाइएको छ}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {मिडियालाई संवेदनशील रूपमा चिन्ह लगाइएको छैन} other {मिडियाहरूलाई संवेदनशील रूपमा चिन्ह लगाइएको छैन}}",
- "compose_form.spoiler_placeholder": "यहाँ आफ्नो चेतावनी लेख्नुहोस्"
+ "compose_form.publish_form": "नयाँ पोस्ट"
}
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 86617d4a5..e38f8fd0b 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Mededeling",
"attachments_list.unprocessed": "(niet verwerkt)",
"audio.hide": "Audio verbergen",
- "autosuggest_hashtag.per_week": "{count} per week",
"boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan",
"bundle_column_error.copy_stacktrace": "Foutrapportage kopiëren",
"bundle_column_error.error.body": "De opgevraagde pagina kon niet worden weergegeven. Dit kan het gevolg zijn van een fout in onze broncode, of van een compatibiliteitsprobleem met je webbrowser.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de berichten zien die je alleen aan jouw volgers hebt gericht.",
"compose_form.lock_disclaimer.lock": "vergrendeld",
"compose_form.placeholder": "Wat wil je kwijt?",
- "compose_form.poll.add_option": "Keuze toevoegen",
+ "compose_form.poll.add_option": "Optie toevoegen",
"compose_form.poll.duration": "Duur van de peiling",
- "compose_form.poll.option_placeholder": "Keuze {number}",
- "compose_form.poll.remove_option": "Deze keuze verwijderen",
+ "compose_form.poll.multiple": "Meerkeuze",
+ "compose_form.poll.option_placeholder": "Optie {number}",
+ "compose_form.poll.remove_option": "Deze optie verwijderen",
+ "compose_form.poll.single": "Kies een",
"compose_form.poll.switch_to_multiple": "Peiling wijzigen om meerdere keuzes toe te staan",
"compose_form.poll.switch_to_single": "Peiling wijzigen om een enkele keuze toe te staan",
- "compose_form.publish": "Toot",
+ "compose_form.poll.type": "Stijl",
+ "compose_form.publish": "Plaatsen",
"compose_form.publish_form": "Nieuw bericht",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Wijzigingen opslaan",
- "compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is als gevoelig gemarkeerd} other {Media is als gevoelig gemarkeerd}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media is niet als gevoelig gemarkeerd} other {Media is niet als gevoelig gemarkeerd}}",
+ "compose_form.reply": "Reageren",
+ "compose_form.save_changes": "Bijwerken",
"compose_form.spoiler.marked": "Inhoudswaarschuwing verwijderen",
"compose_form.spoiler.unmarked": "Inhoudswaarschuwing toevoegen",
- "compose_form.spoiler_placeholder": "Waarschuwingstekst",
+ "compose_form.spoiler_placeholder": "Waarschuwing inhoud (optioneel)",
"confirmation_modal.cancel": "Annuleren",
"confirmations.block.block_and_report": "Blokkeren en rapporteren",
"confirmations.block.confirm": "Blokkeren",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Privéberichten",
"navigation_bar.discover": "Ontdekken",
"navigation_bar.domain_blocks": "Geblokkeerde domeinen",
- "navigation_bar.edit_profile": "Profiel bewerken",
"navigation_bar.explore": "Verkennen",
"navigation_bar.favourites": "Favorieten",
"navigation_bar.filters": "Filters",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Peiling toevoegen",
"poll_button.remove_poll": "Peiling verwijderen",
"privacy.change": "Zichtbaarheid van bericht aanpassen",
- "privacy.direct.long": "Alleen aan vermelde gebruikers tonen",
- "privacy.direct.short": "Privébericht",
- "privacy.private.long": "Alleen aan volgers tonen",
- "privacy.private.short": "Alleen volgers",
- "privacy.public.long": "Voor iedereen zichtbaar",
+ "privacy.direct.long": "Iedereen genoemd in de post",
+ "privacy.direct.short": "Specifieke mensen",
+ "privacy.private.long": "Alleen jouw volgers",
+ "privacy.private.short": "Volgers",
+ "privacy.public.long": "Iedereen op Mastodon en daarbuiten",
"privacy.public.short": "Openbaar",
- "privacy.unlisted.long": "Voor iedereen zichtbaar, maar niet onder trends, hashtags en op openbare tijdlijnen",
- "privacy.unlisted.short": "Minder openbaar",
+ "privacy.unlisted.additional": "Dit is vergelijkbaar met publiek, behalve dat de post niet zal verschijnen in live feeds of hashtags, verkennen of Mastodon zoeken, zelfs als je gekozen hebt voor account-breed.",
+ "privacy.unlisted.long": "Minder algoritmische fanfare",
+ "privacy.unlisted.short": "Stil publiek",
"privacy_policy.last_updated": "Laatst bijgewerkt op {date}",
"privacy_policy.title": "Privacybeleid",
"recommended": "Aanbevolen",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "vandaag",
+ "reply_indicator.attachments": "{count, plural, one {# bijlage} other {# bijlagen}}",
"reply_indicator.cancel": "Annuleren",
+ "reply_indicator.poll": "Peiling",
"report.block": "Blokkeren",
"report.block_explanation": "Je kunt diens berichten niet zien. Je kunt door diegene niet gevolgd worden en jouw berichten zijn onzichtbaar. Diegene kan zien dat die door jou is geblokkeerd.",
"report.categories.legal": "Juridisch",
@@ -715,10 +716,8 @@
"upload_error.poll": "Het uploaden van bestanden is bij peilingen niet toegestaan.",
"upload_form.audio_description": "Omschrijf dit voor dove of slechthorende mensen",
"upload_form.description": "Omschrijf dit voor blinde of slechtziende mensen",
- "upload_form.description_missing": "Geen omschrijving toegevoegd",
"upload_form.edit": "Bewerken",
"upload_form.thumbnail": "Miniatuurafbeelding wijzigen",
- "upload_form.undo": "Verwijderen",
"upload_form.video_description": "Omschrijf dit voor dove, slechthorende, blinde of slechtziende mensen",
"upload_modal.analyzing_picture": "Afbeelding analyseren…",
"upload_modal.apply": "Toepassen",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index ec2ff8214..9bb4f5919 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Kunngjering",
"attachments_list.unprocessed": "(ubehandla)",
"audio.hide": "Gøym lyd",
- "autosuggest_hashtag.per_week": "{count} per veke",
"boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong",
"bundle_column_error.copy_stacktrace": "Kopier feilrapport",
"bundle_column_error.error.body": "Den etterspurde sida kan ikke hentast fram. Det kan skuldast ein feil i koden vår eller eit kompatibilitetsproblem.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Kontoen din er ikkje {locked}. Kven som helst kan fylgja deg for å sjå innlegga dine.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Kva har du på hjarta?",
- "compose_form.poll.add_option": "Legg til eit val",
+ "compose_form.poll.add_option": "Legg til alternativ",
"compose_form.poll.duration": "Varigheit for rundspørjing",
- "compose_form.poll.option_placeholder": "Val {number}",
- "compose_form.poll.remove_option": "Fjern dette valet",
+ "compose_form.poll.multiple": "Flervalg",
+ "compose_form.poll.option_placeholder": "Valg {number}",
+ "compose_form.poll.remove_option": "Fjern dette valget",
+ "compose_form.poll.single": "Velg en",
"compose_form.poll.switch_to_multiple": "Endre rundspørjinga til å tillate fleire val",
"compose_form.poll.switch_to_single": "Endre rundspørjinga til å tillate berre eitt val",
- "compose_form.publish": "Legg ut",
+ "compose_form.poll.type": "Stil",
+ "compose_form.publish": "Publiser",
"compose_form.publish_form": "Legg ut",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Lagre endringar",
- "compose_form.sensitive.hide": "{count, plural, one {Marker mediet som ømtolig} other {Marker media som ømtolige}}",
- "compose_form.sensitive.marked": "{count, plural, one {Mediet er markert som ømtolig} other {Media er markerte som ømtolige}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Mediet er ikkje markert som ømtolig} other {Media er ikkje markerte som ømtolige}}",
+ "compose_form.reply": "Svar",
+ "compose_form.save_changes": "Oppdater",
"compose_form.spoiler.marked": "Fjern innhaldsåtvaring",
"compose_form.spoiler.unmarked": "Legg til innhaldsåtvaring",
- "compose_form.spoiler_placeholder": "Skriv åtvaringa di her",
+ "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)",
"confirmation_modal.cancel": "Avbryt",
"confirmations.block.block_and_report": "Blokker & rapporter",
"confirmations.block.confirm": "Blokker",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Private omtaler",
"navigation_bar.discover": "Oppdag",
"navigation_bar.domain_blocks": "Skjulte domene",
- "navigation_bar.edit_profile": "Rediger profil",
"navigation_bar.explore": "Utforsk",
"navigation_bar.favourites": "Favorittar",
"navigation_bar.filters": "Målbundne ord",
@@ -525,14 +523,14 @@
"poll_button.add_poll": "Lag ei rundspørjing",
"poll_button.remove_poll": "Fjern rundspørjing",
"privacy.change": "Endre personvernet på innlegg",
- "privacy.direct.long": "Synleg kun for omtala brukarar",
- "privacy.direct.short": "Kun nemnde personar",
- "privacy.private.long": "Kun synleg for fylgjarar",
- "privacy.private.short": "Kun fylgjarar",
- "privacy.public.long": "Synleg for alle",
+ "privacy.direct.long": "Alle nevnt i innlegget",
+ "privacy.direct.short": "Spesifikke folk",
+ "privacy.private.long": "Bare følgerne dine",
+ "privacy.private.short": "Følgere",
+ "privacy.public.long": "Alle på og utenfor Mastodon",
"privacy.public.short": "Offentleg",
- "privacy.unlisted.long": "Synleg for alle, men blir ikkje vist i oppdagsfunksjonar",
- "privacy.unlisted.short": "Uoppført",
+ "privacy.unlisted.long": "Færre algoritmiske fanfarer",
+ "privacy.unlisted.short": "Stille offentlig",
"privacy_policy.last_updated": "Sist oppdatert {date}",
"privacy_policy.title": "Personvernsreglar",
"recommended": "Anbefalt",
@@ -550,7 +548,9 @@
"relative_time.minutes": "{number}min",
"relative_time.seconds": "{number}sek",
"relative_time.today": "i dag",
+ "reply_indicator.attachments": "{count, plural, one {# vedlegg} other {# vedlegg}}",
"reply_indicator.cancel": "Avbryt",
+ "reply_indicator.poll": "Avstemming",
"report.block": "Blokker",
"report.block_explanation": "Du vil ikkje kunne sjå innlegga deira. Dei vil ikkje kunne sjå innlegga dine eller fylgje deg. Dei kan sjå at dei er blokkert.",
"report.categories.legal": "Juridisk",
@@ -714,10 +714,8 @@
"upload_error.poll": "Filopplasting er ikkje lov for rundspørjingar.",
"upload_form.audio_description": "Skildre for dei med nedsett høyrsel",
"upload_form.description": "Skildre for blinde og svaksynte",
- "upload_form.description_missing": "Inga skildring er lagt til",
"upload_form.edit": "Rediger",
"upload_form.thumbnail": "Bytt miniatyrbilete",
- "upload_form.undo": "Slett",
"upload_form.video_description": "Skildre for dei med nedsett høyrsel eller redusert syn",
"upload_modal.analyzing_picture": "Analyserer bilete…",
"upload_modal.apply": "Bruk",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 50da3bb2b..8da9853be 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Kunngjøring",
"attachments_list.unprocessed": "(ubehandlet)",
"audio.hide": "Skjul lyd",
- "autosuggest_hashtag.per_week": "{count} per uke",
"boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
"bundle_column_error.copy_stacktrace": "Kopier feilrapport",
"bundle_column_error.error.body": "Den forespurte siden kan ikke gjengis. Den kan skyldes en feil i vår kode eller et kompatibilitetsproblem med nettleseren.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Hva har du på hjertet?",
- "compose_form.poll.add_option": "Legg til et valg",
+ "compose_form.poll.add_option": "Legg til alternativ",
"compose_form.poll.duration": "Avstemningens varighet",
+ "compose_form.poll.multiple": "Flervalg",
"compose_form.poll.option_placeholder": "Valg {number}",
"compose_form.poll.remove_option": "Fjern dette valget",
+ "compose_form.poll.single": "Velg en",
"compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg",
"compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
+ "compose_form.poll.type": "Stil",
"compose_form.publish": "Publiser",
"compose_form.publish_form": "Publiser",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Lagre endringer",
- "compose_form.sensitive.hide": "{count, plural,one {Merk media som følsomt} other {Merk medier som følsomme}}",
- "compose_form.sensitive.marked": "{count, plural,one {Mediet er merket som følsomt}other {Mediene er merket som følsomme}}",
- "compose_form.sensitive.unmarked": "{count, plural,one {Mediet er ikke merket som følsomt}other {Mediene er ikke merket som følsomme}}",
+ "compose_form.reply": "Svar",
+ "compose_form.save_changes": "Oppdater",
"compose_form.spoiler.marked": "Fjern innholdsvarsel",
"compose_form.spoiler.unmarked": "Legg til innholdsvarsel",
- "compose_form.spoiler_placeholder": "Skriv advarselen din her",
+ "compose_form.spoiler_placeholder": "Innholdsadvarsel (valgfritt)",
"confirmation_modal.cancel": "Avbryt",
"confirmations.block.block_and_report": "Blokker og rapporter",
"confirmations.block.confirm": "Blokkèr",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Private omtaler",
"navigation_bar.discover": "Oppdag",
"navigation_bar.domain_blocks": "Skjulte domener",
- "navigation_bar.edit_profile": "Rediger profil",
"navigation_bar.explore": "Utforsk",
"navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Stilnede ord",
@@ -525,14 +523,14 @@
"poll_button.add_poll": "Legg til en avstemning",
"poll_button.remove_poll": "Fjern avstemningen",
"privacy.change": "Juster synlighet",
- "privacy.direct.long": "Post kun til nevnte brukere",
- "privacy.direct.short": "Kun nevnte personer",
- "privacy.private.long": "Post kun til følgere",
- "privacy.private.short": "Kun følgere",
- "privacy.public.long": "Synlig for alle",
+ "privacy.direct.long": "Alle nevnt i innlegget",
+ "privacy.direct.short": "Spesifikke folk",
+ "privacy.private.long": "Bare følgerne dine",
+ "privacy.private.short": "Følgere",
+ "privacy.public.long": "Alle på og utenfor Mastodon",
"privacy.public.short": "Offentlig",
- "privacy.unlisted.long": "Synlig for alle, men vises ikke i oppdagsfunksjoner",
- "privacy.unlisted.short": "Uoppført",
+ "privacy.unlisted.long": "Færre algoritmiske fanfarer",
+ "privacy.unlisted.short": "Stille offentlig",
"privacy_policy.last_updated": "Sist oppdatert {date}",
"privacy_policy.title": "Personvernregler",
"recommended": "Anbefalt",
@@ -550,7 +548,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "i dag",
+ "reply_indicator.attachments": "{count, plural, one {# vedlegg} other {# vedlegg}}",
"reply_indicator.cancel": "Avbryt",
+ "reply_indicator.poll": "Avstemming",
"report.block": "Blokker",
"report.block_explanation": "Du kommer ikke til å se innleggene deres. De vil ikke kunne se innleggene dine eller følge deg. De vil kunne se at de er blokkert.",
"report.categories.legal": "Juridisk",
@@ -714,10 +714,8 @@
"upload_error.poll": "Filopplasting er ikke tillatt for avstemninger.",
"upload_form.audio_description": "Beskriv det for folk med hørselstap",
"upload_form.description": "Beskriv for synshemmede",
- "upload_form.description_missing": "Ingen beskrivelse lagt til",
"upload_form.edit": "Rediger",
"upload_form.thumbnail": "Endre miniatyrbilde",
- "upload_form.undo": "Angre",
"upload_form.video_description": "Beskriv det for folk med hørselstap eller synshemminger",
"upload_modal.analyzing_picture": "Analyserer bildet …",
"upload_modal.apply": "Bruk",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 833bfe6ac..8660a3bc0 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -18,6 +18,7 @@
"account.blocked": "Blocat",
"account.browse_more_on_origin_server": "Navigar sul perfil original",
"account.cancel_follow_request": "Retirar la demanda d’abonament",
+ "account.copy": "Copiar lo ligam del perfil",
"account.direct": "Mencionar @{name} en privat",
"account.disable_notifications": "Quitar de m’avisar quand @{name} publica quicòm",
"account.domain_blocked": "Domeni amagat",
@@ -28,6 +29,7 @@
"account.featured_tags.last_status_never": "Cap de publicacion",
"account.featured_tags.title": "Etiquetas en avant de {name}",
"account.follow": "Sègre",
+ "account.follow_back": "Sègre en retorn",
"account.followers": "Seguidors",
"account.followers.empty": "Degun sèc pas aqueste utilizaire pel moment.",
"account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
@@ -48,6 +50,7 @@
"account.mute_notifications_short": "Amudir las notificacions",
"account.mute_short": "Amudir",
"account.muted": "Mes en silenci",
+ "account.mutual": "Mutual",
"account.no_bio": "Cap de descripcion pas fornida.",
"account.open_original_page": "Dobrir la pagina d’origina",
"account.posts": "Tuts",
@@ -77,7 +80,6 @@
"announcement.announcement": "Anóncia",
"attachments_list.unprocessed": "(pas tractat)",
"audio.hide": "Amagar àudio",
- "autosuggest_hashtag.per_week": "{count} per setmana",
"boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven",
"bundle_column_error.copy_stacktrace": "Copiar senhalament d’avaria",
"bundle_column_error.error.title": "Oh non !",
@@ -128,22 +130,12 @@
"compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo mond pòt vos sègre e veire los estatuts reservats als seguidors.",
"compose_form.lock_disclaimer.lock": "clavat",
"compose_form.placeholder": "A de qué pensatz ?",
- "compose_form.poll.add_option": "Ajustar una causida",
"compose_form.poll.duration": "Durada del sondatge",
- "compose_form.poll.option_placeholder": "Opcion {number}",
- "compose_form.poll.remove_option": "Levar aquesta opcion",
"compose_form.poll.switch_to_multiple": "Cambiar lo sondatge per permetre de causidas multiplas",
"compose_form.poll.switch_to_single": "Cambiar lo sondatge per permetre una sola causida",
- "compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "{publish} !",
- "compose_form.save_changes": "Salvar los cambiaments",
- "compose_form.sensitive.hide": "Marcar coma sensible",
- "compose_form.sensitive.marked": "Lo mèdia es marcat coma sensible",
- "compose_form.sensitive.unmarked": "Lo mèdia es pas marcat coma sensible",
"compose_form.spoiler.marked": "Lo tèxte es rescondut jos l’avertiment",
"compose_form.spoiler.unmarked": "Lo tèxte es pas rescondut",
- "compose_form.spoiler_placeholder": "Escrivètz l’avertiment aquí",
"confirmation_modal.cancel": "Anullar",
"confirmations.block.block_and_report": "Blocar e senhalar",
"confirmations.block.confirm": "Blocar",
@@ -172,6 +164,7 @@
"conversation.mark_as_read": "Marcar coma legida",
"conversation.open": "Veire la conversacion",
"conversation.with": "Amb {names}",
+ "copy_icon_button.copied": "Copiat al quichapapièr",
"copypaste.copied": "Copiat",
"copypaste.copy_to_clipboard": "Copiar al quichapapièr",
"directory.federated": "Del fediverse conegut",
@@ -294,6 +287,8 @@
"keyboard_shortcuts.direct": "to open direct messages column",
"keyboard_shortcuts.down": "far davalar dins la lista",
"keyboard_shortcuts.enter": "dobrir los estatuts",
+ "keyboard_shortcuts.favourite": "Marcar coma favorit",
+ "keyboard_shortcuts.favourites": "Dobrir la lista dels favorits",
"keyboard_shortcuts.federated": "dobrir lo flux public global",
"keyboard_shortcuts.heading": "Acorchis clavièr",
"keyboard_shortcuts.home": "dobrir lo flux public local",
@@ -339,6 +334,7 @@
"lists.search": "Cercar demest lo mond que seguètz",
"lists.subheading": "Vòstras listas",
"load_pending": "{count, plural, one {# nòu element} other {# nòu elements}}",
+ "loading_indicator.label": "Cargament…",
"media_gallery.toggle_visible": "Modificar la visibilitat",
"mute_modal.duration": "Durada",
"mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?",
@@ -352,7 +348,6 @@
"navigation_bar.direct": "Mencions privadas",
"navigation_bar.discover": "Trobar",
"navigation_bar.domain_blocks": "Domenis resconduts",
- "navigation_bar.edit_profile": "Modificar lo perfil",
"navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favorits",
"navigation_bar.filters": "Mots ignorats",
@@ -371,6 +366,7 @@
"not_signed_in_indicator.not_signed_in": "Devètz vos connectar per accedir a aquesta ressorsa.",
"notification.admin.report": "{name} senhalèt {target}",
"notification.admin.sign_up": "{name} se marquèt",
+ "notification.favourite": "{name} a mes vòstre estatut en favorit",
"notification.follow": "{name} vos sèc",
"notification.follow_request": "{name} a demandat a vos sègre",
"notification.mention": "{name} vos a mencionat",
@@ -423,6 +419,8 @@
"onboarding.compose.template": "Adiu #Mastodon !",
"onboarding.follows.lead": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!",
"onboarding.follows.title": "Popular on Mastodon",
+ "onboarding.profile.display_name": "Nom d’afichatge",
+ "onboarding.profile.note": "Biografia",
"onboarding.share.title": "Partejar vòstre perfil",
"onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:",
"onboarding.start.skip": "Want to skip right ahead?",
@@ -447,14 +445,7 @@
"poll_button.add_poll": "Ajustar un sondatge",
"poll_button.remove_poll": "Levar lo sondatge",
"privacy.change": "Ajustar la confidencialitat del messatge",
- "privacy.direct.long": "Mostrar pas qu’a las personas mencionadas",
- "privacy.direct.short": "Sonque per las personas mencionadas",
- "privacy.private.long": "Mostrar pas qu’a vòstres seguidors",
- "privacy.private.short": "Sonque pels seguidors",
- "privacy.public.long": "Visiblas per totes",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Visible per totes mas desactivat per las foncionalitats de descobèrta",
- "privacy.unlisted.short": "Pas-listat",
"privacy_policy.last_updated": "Darrièra actualizacion {date}",
"privacy_policy.title": "Politica de confidencialitat",
"refresh": "Actualizar",
@@ -504,6 +495,7 @@
"report_notification.categories.spam": "Messatge indesirable",
"report_notification.categories.violation": "Violacion de las règlas",
"report_notification.open": "Dobrir lo senhalament",
+ "search.no_recent_searches": "Cap de recèrcas recentas",
"search.placeholder": "Recercar",
"search.search_or_paste": "Recercar o picar una URL",
"search_popout.language_code": "Còdi ISO de lenga",
@@ -536,6 +528,7 @@
"status.copy": "Copiar lo ligam de l’estatut",
"status.delete": "Escafar",
"status.detailed_status": "Vista detalhada de la convèrsa",
+ "status.direct": "Mencionar @{name} en privat",
"status.direct_indicator": "Mencion privada",
"status.edit": "Modificar",
"status.edited": "Modificat {date}",
@@ -609,10 +602,8 @@
"upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.",
"upload_form.audio_description": "Descriure per las personas amb pèrdas auditivas",
"upload_form.description": "Descripcion pels mal vesents",
- "upload_form.description_missing": "Cap de descripcion pas aponduda",
"upload_form.edit": "Modificar",
"upload_form.thumbnail": "Cambiar la vinheta",
- "upload_form.undo": "Suprimir",
"upload_form.video_description": "Descriure per las personas amb pèrdas auditivas o mal vesent",
"upload_modal.analyzing_picture": "Analisi de l’imatge…",
"upload_modal.apply": "Aplicar",
@@ -626,6 +617,7 @@
"upload_modal.preview_label": "Apercebut ({ratio})",
"upload_progress.label": "Mandadís…",
"upload_progress.processing": "Tractament…",
+ "username.taken": "Aqueste nom d’utilizaire es pres. Ensajatz-ne un autre",
"video.close": "Tampar la vidèo",
"video.download": "Telecargar lo fichièr",
"video.exit_fullscreen": "Sortir plen ecran",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index 132b695cd..de085cf98 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -67,9 +67,7 @@
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer.lock": "ਲਾਕ ਹੈ",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.publish": "ਪ੍ਰਕਾਸ਼ਨ ਕਰੋ",
"compose_form.publish_form": "Publish",
- "compose_form.save_changes": "ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ",
"compose_form.spoiler.marked": "ਸਮੱਗਰੀ ਚੇਤਾਵਨੀ ਨੂੰ ਹਟਾਓ",
"compose_form.spoiler.unmarked": "ਸਮੱਗਰੀ ਬਾਰੇ ਚੇਤਾਵਨੀ ਜੋੜੋ",
"confirmation_modal.cancel": "ਰੱਦ ਕਰੋ",
@@ -188,7 +186,6 @@
"navigation_bar.direct": "ਨਿੱਜੀ ਜ਼ਿਕਰ",
"navigation_bar.discover": "ਖੋਜ",
"navigation_bar.domain_blocks": "ਪਾਬੰਦੀ ਲਾਏ ਡੋਮੇਨ",
- "navigation_bar.edit_profile": "ਪਰੋਫਾਈਲ ਨੂੰ ਸੋਧੋ",
"navigation_bar.explore": "ਪੜਚੋਲ ਕਰੋ",
"navigation_bar.favourites": "ਮਨਪਸੰਦ",
"navigation_bar.follow_requests": "ਫ਼ਾਲੋ ਦੀਆਂ ਬੇਨਤੀਆਂ",
@@ -238,8 +235,6 @@
"poll.refresh": "ਤਾਜ਼ਾ ਕਰੋ",
"poll.vote": "ਵੋਟ ਪਾਓ",
"privacy.change": "ਪੋਸਟ ਦੀ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਦਲੋ",
- "privacy.direct.short": "ਸਿੱਧਾ ਲੋਕਾਂ ਦਾ ਜ਼ਿਕਰ ਕਰੋ",
- "privacy.private.short": "ਸਿਰਫ਼ ਫ਼ਾਲੋਅਰ",
"privacy.public.short": "ਜਨਤਕ",
"privacy_policy.title": "ਪਰਦੇਦਾਰੀ ਨੀਤੀ",
"refresh": "ਤਾਜ਼ਾ ਕਰੋ",
@@ -327,7 +322,6 @@
"upload_form.audio_description": "ਬੋਲ਼ੇ ਜਾਂ ਸੁਣਨ ਵਿੱਚ ਮੁਸ਼ਕਿਲ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵੇ",
"upload_form.description": "ਅੰਨ੍ਹੇ ਜਾਂ ਦੇਖਣ ਲਈ ਮੁਸ਼ਕਲ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵੇ",
"upload_form.edit": "ਸੋਧ",
- "upload_form.undo": "ਹਟਾਓ",
"upload_form.video_description": "ਬੋਲ਼ੇ, ਸੁਣਨ ਵਿੱਚ ਮੁਸ਼ਕਿਲ, ਅੰਨ੍ਹੇ ਜਾਂ ਘੱਟ ਨਿਗ੍ਹਾ ਵਾਲੇ ਲੋਕਾਂ ਲਈ ਵੇਰਵਾ",
"upload_modal.apply": "ਲਾਗੂ ਕਰੋ",
"upload_modal.applying": "ਲਾਗੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 9a3710da7..2eaeeaab5 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -42,7 +42,7 @@
"account.go_to_profile": "Przejdź do profilu",
"account.hide_reblogs": "Ukryj podbicia od @{name}",
"account.in_memoriam": "Ku pamięci.",
- "account.joined_short": "Dołączony",
+ "account.joined_short": "Dołączył(a)",
"account.languages": "Zmień subskrybowane języki",
"account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}",
"account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go obserwować.",
@@ -89,7 +89,6 @@
"announcement.announcement": "Ogłoszenie",
"attachments_list.unprocessed": "(nieprzetworzone)",
"audio.hide": "Ukryj dźwięk",
- "autosuggest_hashtag.per_week": "{count} co tydzień",
"boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
"bundle_column_error.copy_stacktrace": "Skopiuj raport o błędzie",
"bundle_column_error.error.body": "Nie można zrenderować żądanej strony. Może to być spowodowane błędem w naszym kodzie lub problemami z kompatybilnością przeglądarki.",
@@ -148,20 +147,19 @@
"compose_form.placeholder": "Co chodzi ci po głowie?",
"compose_form.poll.add_option": "Dodaj opcję",
"compose_form.poll.duration": "Czas trwania głosowania",
+ "compose_form.poll.multiple": "Wielokrotny wybór",
"compose_form.poll.option_placeholder": "Opcja {number}",
"compose_form.poll.remove_option": "Usuń tę opcję",
+ "compose_form.poll.single": "Wybierz jedną",
"compose_form.poll.switch_to_multiple": "Pozwól na wybranie wielu opcji",
"compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji",
+ "compose_form.poll.type": "Styl",
"compose_form.publish": "Opublikuj",
"compose_form.publish_form": "Opublikuj",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Zapisz zmiany",
- "compose_form.sensitive.hide": "{count, plural, one {Oznacz treść multimedialną jako wrażliwą} other {Oznacz treści multimedialne jako wrażliwe}}",
- "compose_form.sensitive.marked": "{count, plural, one {Treść multimedialna jest oznaczona jako wrażliwa} other {Treści multimedialne są oznaczone jako wrażliwe}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Treść multimedialna nie jest oznaczona jako wrażliwa} other {Treści multimedialne nie są oznaczone jako wrażliwe}}",
+ "compose_form.reply": "Odpowiedz",
+ "compose_form.save_changes": "Aktualizuj",
"compose_form.spoiler.marked": "Usuń ostrzeżenie o treści",
"compose_form.spoiler.unmarked": "Dodaj ostrzeżenie o treści",
- "compose_form.spoiler_placeholder": "Wpisz ostrzeżenie tutaj",
"confirmation_modal.cancel": "Anuluj",
"confirmations.block.block_and_report": "Zablokuj i zgłoś",
"confirmations.block.confirm": "Zablokuj",
@@ -408,7 +406,6 @@
"navigation_bar.direct": "Prywatne wzmianki",
"navigation_bar.discover": "Odkrywaj",
"navigation_bar.domain_blocks": "Ukryte domeny",
- "navigation_bar.edit_profile": "Edytuj profil",
"navigation_bar.explore": "Odkrywaj",
"navigation_bar.favourites": "Ulubione",
"navigation_bar.filters": "Wyciszone słowa",
@@ -492,7 +489,7 @@
"onboarding.profile.save_and_continue": "Zapisz i kontynuuj",
"onboarding.profile.title": "Ustawienia profilu",
"onboarding.profile.upload_avatar": "Dodaj zdjęcie profilowe",
- "onboarding.profile.upload_header": "Dodaj zdjęcie nagłówkowe",
+ "onboarding.profile.upload_header": "Dodaj banner profilu",
"onboarding.share.lead": "Daj znać ludziom, jak mogą cię znaleźć na Mastodonie!",
"onboarding.share.message": "Jestem {username} na #Mastodon! Śledź mnie tutaj {url}",
"onboarding.share.next_steps": "Możliwe dalsze kroki:",
@@ -526,14 +523,11 @@
"poll_button.add_poll": "Dodaj głosowanie",
"poll_button.remove_poll": "Usuń głosowanie",
"privacy.change": "Dostosuj widoczność wpisów",
- "privacy.direct.long": "Widoczny tylko dla wspomnianych",
- "privacy.direct.short": "Tylko wspomniane osoby",
- "privacy.private.long": "Widoczny tylko dla osób, które Cię obserwują",
- "privacy.private.short": "Tylko obserwujący",
- "privacy.public.long": "Widoczne dla każdego",
+ "privacy.direct.short": "Konkretni ludzie",
+ "privacy.private.long": "Tylko ci, którzy cię obserwują",
+ "privacy.private.short": "Obserwujący",
+ "privacy.public.long": "Ktokolwiek na i poza Mastodonem",
"privacy.public.short": "Publiczny",
- "privacy.unlisted.long": "Widoczne dla każdego, z wyłączeniem funkcji odkrywania",
- "privacy.unlisted.short": "Niewidoczny",
"privacy_policy.last_updated": "Data ostatniej aktualizacji: {date}",
"privacy_policy.title": "Polityka prywatności",
"recommended": "Zalecane",
@@ -715,10 +709,8 @@
"upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.",
"upload_form.audio_description": "Opisz dla osób niesłyszących i niedosłyszących",
"upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
- "upload_form.description_missing": "Nie dodano opisu",
"upload_form.edit": "Edytuj",
"upload_form.thumbnail": "Zmień miniaturę",
- "upload_form.undo": "Usuń",
"upload_form.video_description": "Opisz dla osób niesłyszących, niedosłyszących, niewidomych i niedowidzących",
"upload_modal.analyzing_picture": "Analizowanie obrazu…",
"upload_modal.apply": "Zastosuj",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 482cc8ee7..bb009239d 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -32,6 +32,7 @@
"account.featured_tags.last_status_never": "Sem publicações",
"account.featured_tags.title": "Hashtags em destaque de {name}",
"account.follow": "Seguir",
+ "account.follow_back": "Seguir de volta",
"account.followers": "Seguidores",
"account.followers.empty": "Nada aqui.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
@@ -52,6 +53,7 @@
"account.mute_notifications_short": "Silenciar notificações",
"account.mute_short": "Silenciar",
"account.muted": "Silenciado",
+ "account.mutual": "Mútuo",
"account.no_bio": "Nenhuma descrição fornecida.",
"account.open_original_page": "Abrir a página original",
"account.posts": "Toots",
@@ -87,7 +89,6 @@
"announcement.announcement": "Comunicados",
"attachments_list.unprocessed": "(não processado)",
"audio.hide": "Ocultar áudio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Pressione {combo} para pular isso na próxima vez",
"bundle_column_error.copy_stacktrace": "Copiar relatório do erro",
"bundle_column_error.error.body": "A página solicitada não pôde ser renderizada. Pode ser devido a um erro no nosso código, ou um problema de compatibilidade do seu navegador.",
@@ -146,20 +147,20 @@
"compose_form.placeholder": "No que você está pensando?",
"compose_form.poll.add_option": "Adicionar opção",
"compose_form.poll.duration": "Duração da enquete",
+ "compose_form.poll.multiple": "Múltipla escolha",
"compose_form.poll.option_placeholder": "Opção {number}",
- "compose_form.poll.remove_option": "Remover opção",
+ "compose_form.poll.remove_option": "Remover esta opção",
+ "compose_form.poll.single": "Escolha uma",
"compose_form.poll.switch_to_multiple": "Permitir múltiplas escolhas",
"compose_form.poll.switch_to_single": "Opção única",
- "compose_form.publish": "Publicar",
+ "compose_form.poll.type": "Estilo",
+ "compose_form.publish": "Publicação",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Salvar alterações",
- "compose_form.sensitive.hide": "{count, plural, one {Marcar mídia como sensível} other {Marcar mídias como sensível}}",
- "compose_form.sensitive.marked": "{count, plural, one {Mídia marcada como sensível} other {Mídias marcadas como sensível}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Mídia não está marcada como sensível} other {Mídias não estão marcadas como sensível}}",
+ "compose_form.reply": "Resposta",
+ "compose_form.save_changes": "Atualização",
"compose_form.spoiler.marked": "Com Aviso de Conteúdo",
"compose_form.spoiler.unmarked": "Sem Aviso de Conteúdo",
- "compose_form.spoiler_placeholder": "Aviso de Conteúdo aqui",
+ "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear e denunciar",
"confirmations.block.confirm": "Bloquear",
@@ -406,7 +407,6 @@
"navigation_bar.direct": "Menções privadas",
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Domínios bloqueados",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palavras filtradas",
@@ -524,14 +524,12 @@
"poll_button.add_poll": "Adicionar enquete",
"poll_button.remove_poll": "Remover enquete",
"privacy.change": "Alterar privacidade do toot",
- "privacy.direct.long": "Postar só para usuários mencionados",
- "privacy.direct.short": "Apenas pessoas mencionadas",
- "privacy.private.long": "Postar só para seguidores",
- "privacy.private.short": "Apenas seguidores",
- "privacy.public.long": "Visível para todos",
+ "privacy.direct.long": "Todos mencionados na publicação",
+ "privacy.direct.short": "Pessoas específicas",
+ "privacy.private.long": "Apenas seus seguidores",
+ "privacy.private.short": "Seguidores",
+ "privacy.public.long": "Qualquer um dentro ou fora do Mastodon",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visível para todos, mas desativou os recursos de descoberta",
- "privacy.unlisted.short": "Não-listado",
"privacy_policy.last_updated": "Atualizado {date}",
"privacy_policy.title": "Política de privacidade",
"recommended": "Recomendado",
@@ -550,6 +548,7 @@
"relative_time.seconds": "{number}s",
"relative_time.today": "hoje",
"reply_indicator.cancel": "Cancelar",
+ "reply_indicator.poll": "Enquete",
"report.block": "Bloquear",
"report.block_explanation": "Você não verá suas publicações. Ele não poderá ver suas publicações ou segui-lo, e será capaz de perceber que está bloqueado.",
"report.categories.legal": "Jurídico",
@@ -713,10 +712,8 @@
"upload_error.poll": "Mídias não podem ser anexadas em toots com enquetes.",
"upload_form.audio_description": "Descrever para deficientes auditivos",
"upload_form.description": "Descrever para deficientes visuais",
- "upload_form.description_missing": "Sem descrição",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Alterar miniatura",
- "upload_form.undo": "Excluir",
"upload_form.video_description": "Descrever para deficientes auditivos ou visuais",
"upload_modal.analyzing_picture": "Analisando imagem…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index a6d0ffee9..22bb1bbfd 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Anúncio",
"attachments_list.unprocessed": "(não processado)",
"audio.hide": "Ocultar áudio",
- "autosuggest_hashtag.per_week": "{count} por semana",
"boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
"bundle_column_error.copy_stacktrace": "Copiar relatório de erros",
"bundle_column_error.error.body": "A página solicitada não pôde ser sintetizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "A sua conta não é {locked}. Qualquer pessoa pode segui-lo e ver as publicações direcionadas apenas a seguidores.",
"compose_form.lock_disclaimer.lock": "fechada",
"compose_form.placeholder": "Em que está a pensar?",
- "compose_form.poll.add_option": "Adicionar uma opção",
+ "compose_form.poll.add_option": "Adicionar opção",
"compose_form.poll.duration": "Duração do inquérito",
+ "compose_form.poll.multiple": "Escolha múltipla",
"compose_form.poll.option_placeholder": "Opção {number}",
"compose_form.poll.remove_option": "Eliminar esta opção",
+ "compose_form.poll.single": "Escolha uma",
"compose_form.poll.switch_to_multiple": "Alterar o inquérito para permitir várias respostas",
"compose_form.poll.switch_to_single": "Alterar o inquérito para permitir uma única resposta",
+ "compose_form.poll.type": "Estilo",
"compose_form.publish": "Publicar",
"compose_form.publish_form": "Publicar",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Guardar alterações",
- "compose_form.sensitive.hide": "Marcar media como sensível",
- "compose_form.sensitive.marked": "Media marcada como sensível",
- "compose_form.sensitive.unmarked": "Media não está marcada como sensível",
+ "compose_form.reply": "Responder",
+ "compose_form.save_changes": "Atualizar",
"compose_form.spoiler.marked": "Texto escondido atrás de aviso",
"compose_form.spoiler.unmarked": "Juntar um aviso de conteúdo",
- "compose_form.spoiler_placeholder": "Escreva o seu aviso aqui",
+ "compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)",
"confirmation_modal.cancel": "Cancelar",
"confirmations.block.block_and_report": "Bloquear e Denunciar",
"confirmations.block.confirm": "Bloquear",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Menções privadas",
"navigation_bar.discover": "Descobrir",
"navigation_bar.domain_blocks": "Domínios escondidos",
- "navigation_bar.edit_profile": "Editar perfil",
"navigation_bar.explore": "Explorar",
"navigation_bar.favourites": "Favoritos",
"navigation_bar.filters": "Palavras silenciadas",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Adicionar votação",
"poll_button.remove_poll": "Remover sondagem",
"privacy.change": "Ajustar a privacidade da publicação",
- "privacy.direct.long": "Apenas para utilizadores mencionados",
- "privacy.direct.short": "Apenas pessoas mencionadas",
- "privacy.private.long": "Apenas para os seguidores",
- "privacy.private.short": "Apenas seguidores",
- "privacy.public.long": "Visível para todos",
+ "privacy.direct.long": "Todos os mencionados na publicação",
+ "privacy.direct.short": "Pessoas específicas",
+ "privacy.private.long": "Apenas os seus seguidores",
+ "privacy.private.short": "Seguidores",
+ "privacy.public.long": "Qualquer pessoa no Mastodon ou não",
"privacy.public.short": "Público",
- "privacy.unlisted.long": "Visível para todos, mas não incluir em funcionalidades de divulgação",
- "privacy.unlisted.short": "Não listar",
+ "privacy.unlisted.additional": "Isto comporta-se exatamente como público, exceto que a publicação não aparecerá em feeds nem em etiquetas, explorar ou pesquisa Mastodon, mesmo que tenha optado por isso na sua conta.",
+ "privacy.unlisted.long": "Menos fanfarras algorítmicas",
+ "privacy.unlisted.short": "Público silencioso",
"privacy_policy.last_updated": "Última atualização em {date}",
"privacy_policy.title": "Política de privacidade",
"recommended": "Recomendado",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "hoje",
+ "reply_indicator.attachments": "{count, plural, one {# anexo} other {# anexos}}",
"reply_indicator.cancel": "Cancelar",
+ "reply_indicator.poll": "Sondagem",
"report.block": "Bloquear",
"report.block_explanation": "Não verá as publicações deles. Eles não serão capazes de ver suas publicações ou de o seguir. Eles vão conseguir saber que estão bloqueados.",
"report.categories.legal": "Legal",
@@ -715,10 +716,8 @@
"upload_error.poll": "O carregamento de ficheiros não é permitido em sondagens.",
"upload_form.audio_description": "Descreva para pessoas com diminuição da acuidade auditiva",
"upload_form.description": "Descreva para pessoas com diminuição da acuidade visual",
- "upload_form.description_missing": "Nenhuma descrição adicionada",
"upload_form.edit": "Editar",
"upload_form.thumbnail": "Alterar miniatura",
- "upload_form.undo": "Eliminar",
"upload_form.video_description": "Descreva para pessoas com diminuição da acuidade auditiva ou visual",
"upload_modal.analyzing_picture": "A analizar imagem…",
"upload_modal.apply": "Aplicar",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 88dbfa4b8..e6d881a98 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -76,7 +76,6 @@
"announcement.announcement": "Anunț",
"attachments_list.unprocessed": "(neprocesate)",
"audio.hide": "Ascunde audio",
- "autosuggest_hashtag.per_week": "{count} pe săptămână",
"boost_modal.combo": "Poți apăsa {combo} pentru a sări peste asta data viitoare",
"bundle_column_error.copy_stacktrace": "Copiază raportul de eroare",
"bundle_column_error.error.body": "Pagina solicitată nu a putut fi randată. Ar putea fi cauzată de o eroare în codul nostru sau de o problemă de compatibilitate cu browser-ul.",
@@ -131,22 +130,12 @@
"compose_form.lock_disclaimer": "Contul tău nu este {locked}. Oricine se poate abona la tine pentru a îți vedea postările numai pentru abonați.",
"compose_form.lock_disclaimer.lock": "privat",
"compose_form.placeholder": "La ce te gândești?",
- "compose_form.poll.add_option": "Adaugă o opțiune",
"compose_form.poll.duration": "Durata sondajului",
- "compose_form.poll.option_placeholder": "Opțiunea {number}",
- "compose_form.poll.remove_option": "Elimină acestă opțiune",
"compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni",
"compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune",
- "compose_form.publish": "Publică",
"compose_form.publish_form": "Publică",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Salvează modificările",
- "compose_form.sensitive.hide": "{count, plural, one {Marchează conținutul media ca fiind sensibil} few {Marchează conținuturile media ca fiind sensibile} other {Marchează conținuturile media ca fiind sensibile}}",
- "compose_form.sensitive.marked": "{count, plural, one {Conținutul media este marcat ca fiind sensibil} other {Conținuturile media sunt marcate ca fiind sensibile}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Conținutul media nu este marcat ca fiind sensibil} other {Conținuturile media nu sunt marcate ca fiind sensibile}}",
"compose_form.spoiler.marked": "Elimină avertismentul privind conținutul",
"compose_form.spoiler.unmarked": "Adaugă un avertisment privind conținutul",
- "compose_form.spoiler_placeholder": "Scrie avertismentul aici",
"confirmation_modal.cancel": "Anulează",
"confirmations.block.block_and_report": "Blochează și raportează",
"confirmations.block.confirm": "Blochează",
@@ -365,7 +354,6 @@
"navigation_bar.compose": "Compune o nouă postare",
"navigation_bar.discover": "Descoperă",
"navigation_bar.domain_blocks": "Domenii blocate",
- "navigation_bar.edit_profile": "Modifică profilul",
"navigation_bar.explore": "Explorează",
"navigation_bar.filters": "Cuvinte ignorate",
"navigation_bar.follow_requests": "Cereri de abonare",
@@ -461,14 +449,7 @@
"poll_button.add_poll": "Adaugă un sondaj",
"poll_button.remove_poll": "Elimină sondajul",
"privacy.change": "Modifică confidențialitatea postării",
- "privacy.direct.long": "Vizibil doar pentru utilizatorii menționați",
- "privacy.direct.short": "Doar persoane menționate",
- "privacy.private.long": "Vizibil doar pentru abonați",
- "privacy.private.short": "Doar abonați",
- "privacy.public.long": "Vizibil pentru toți",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Vizibil pentru toți dar fără funcții de descoperire",
- "privacy.unlisted.short": "Nelistat",
"privacy_policy.last_updated": "Ultima actualizare în data de {date}",
"privacy_policy.title": "Politică de confidențialitate",
"refresh": "Reîncarcă",
@@ -641,10 +622,8 @@
"upload_error.poll": "Încărcarea fișierului nu este permisă cu sondaje.",
"upload_form.audio_description": "Descrie pentru persoanele cu deficiență a auzului",
"upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere",
- "upload_form.description_missing": "Nicio descriere adăugată",
"upload_form.edit": "Modifică",
"upload_form.thumbnail": "Schimbă miniatura",
- "upload_form.undo": "Șterge",
"upload_form.video_description": "Adaugă o descriere pentru persoanele cu deficiențe vizuale sau auditive",
"upload_modal.analyzing_picture": "Se analizează imaginea…",
"upload_modal.apply": "Aplică",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index a8ff90cc0..eefa9c729 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Объявление",
"attachments_list.unprocessed": "(не обработан)",
"audio.hide": "Скрыть аудио",
- "autosuggest_hashtag.per_week": "{count} / неделю",
"boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз",
"bundle_column_error.copy_stacktrace": "Скопировать отчет об ошибке",
"bundle_column_error.error.body": "Запрошенная страница не может быть отображена. Это может быть вызвано ошибкой в нашем коде или проблемой совместимости браузера.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
"compose_form.lock_disclaimer.lock": "не закрыта",
"compose_form.placeholder": "О чём думаете?",
- "compose_form.poll.add_option": "Добавить вариант",
"compose_form.poll.duration": "Продолжительность опроса",
- "compose_form.poll.option_placeholder": "Вариант {number}",
- "compose_form.poll.remove_option": "Убрать этот вариант",
"compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов",
"compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
- "compose_form.publish": "Опубликовать",
"compose_form.publish_form": "Опубликовать",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Сохранить",
- "compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}",
- "compose_form.sensitive.marked": "Медиа{count, plural, =1 {файл отмечен} other {файлы отмечены}} как «деликатного характера»",
- "compose_form.sensitive.unmarked": "Медиа{count, plural, =1 {файл не отмечен} other {файлы не отмечены}} как «деликатного характера»",
"compose_form.spoiler.marked": "Текст скрыт за предупреждением",
"compose_form.spoiler.unmarked": "Текст не скрыт",
- "compose_form.spoiler_placeholder": "Текст предупреждения",
"confirmation_modal.cancel": "Отмена",
"confirmations.block.block_and_report": "Заблокировать и пожаловаться",
"confirmations.block.confirm": "Заблокировать",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Личные упоминания",
"navigation_bar.discover": "Изучайте",
"navigation_bar.domain_blocks": "Скрытые домены",
- "navigation_bar.edit_profile": "Изменить профиль",
"navigation_bar.explore": "Обзор",
"navigation_bar.favourites": "Избранные",
"navigation_bar.filters": "Игнорируемые слова",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Добавить опрос",
"poll_button.remove_poll": "Удалить опрос",
"privacy.change": "Изменить видимость поста",
- "privacy.direct.long": "Показать только упомянутым",
- "privacy.direct.short": "Только упомянутые",
- "privacy.private.long": "Показать только подписчикам",
- "privacy.private.short": "Для подписчиков",
- "privacy.public.long": "Виден всем",
"privacy.public.short": "Публичный",
- "privacy.unlisted.long": "Виден всем, но не через функции обзора",
- "privacy.unlisted.short": "Скрытый",
"privacy_policy.last_updated": "Последнее обновление {date}",
"privacy_policy.title": "Политика конфиденциальности",
"recommended": "Рекомендуется",
@@ -715,10 +696,8 @@
"upload_error.poll": "К опросам нельзя прикреплять файлы.",
"upload_form.audio_description": "Опишите аудиофайл для людей с нарушением слуха",
"upload_form.description": "Добавьте описание для людей с нарушениями зрения:",
- "upload_form.description_missing": "Описание не добавлено",
"upload_form.edit": "Изменить",
"upload_form.thumbnail": "Изменить обложку",
- "upload_form.undo": "Отменить",
"upload_form.video_description": "Опишите видео для людей с нарушением слуха или зрения",
"upload_modal.analyzing_picture": "Обработка изображения…",
"upload_modal.apply": "Применить",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index 051ec5d6f..469930c3e 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -77,7 +77,6 @@
"announcement.announcement": "उद्घोषणा",
"attachments_list.unprocessed": "(अप्रकृतम्)",
"audio.hide": "ध्वनिं प्रच्छादय",
- "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताहे",
"boost_modal.combo": "{combo} अत्र स्प्रष्टुं शक्यते, त्यक्तुमेतमन्यस्मिन् समये",
"bundle_column_error.copy_stacktrace": "त्रुट्यावेदनं प्रतिलिपिङ्कुरु",
"bundle_column_error.error.body": "अनुरोधितं पृष्ठं प्रतिपादयितुं न शक्यते। अस्माकं कोडि दोषस्य कारणेन, अथवा ब्राउजर् संगततायास्समस्यायाः कारणेन भवितुमर्हति।",
@@ -129,22 +128,12 @@
"compose_form.lock_disclaimer": "तव लेखा न प्रवेष्टुमशक्या {locked} । कोऽप्यनुसर्ता ते केवलमनुसर्तृृणां कृते स्थितानि पत्राणि द्रष्टुं शक्नोति ।",
"compose_form.lock_disclaimer.lock": "अवरुद्धः",
"compose_form.placeholder": "मनसि ते किमस्ति?",
- "compose_form.poll.add_option": "मतमपरं युज्यताम्",
"compose_form.poll.duration": "मतदान-समयावधिः",
- "compose_form.poll.option_placeholder": "मतम् {number}",
- "compose_form.poll.remove_option": "मतमेतन्नश्यताम्",
"compose_form.poll.switch_to_multiple": "मतदानं परिवर्तयित्वा बहुवैकल्पिकमतदानं क्रियताम्",
"compose_form.poll.switch_to_single": "मतदानं परिवर्तयित्वा निर्विकल्पमतदानं क्रियताम्",
- "compose_form.publish": "प्रकाशीकुरु",
"compose_form.publish_form": "प्रकाशीकुरु",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "परिवर्तनानि रक्ष",
- "compose_form.sensitive.hide": "संवेदनशीलसामग्रीत्यङ्यताम्",
- "compose_form.sensitive.marked": "संवेदनशीलसामग्रीत्यङ्कितम्",
- "compose_form.sensitive.unmarked": "संवेदनशीलसामग्रीति नाङ्कितम्",
"compose_form.spoiler.marked": "प्रच्छान्नाक्षरं विद्यते",
"compose_form.spoiler.unmarked": "अप्रच्छन्नाक्षरं विद्यते",
- "compose_form.spoiler_placeholder": "प्रत्यादेशस्ते लिख्यताम्",
"confirmation_modal.cancel": "नश्यताम्",
"confirmations.block.block_and_report": "अवरुध्य आविद्यताम्",
"confirmations.block.confirm": "निषेधः",
@@ -357,7 +346,6 @@
"navigation_bar.direct": "गोपनीयरूपेण उल्लिखितानि",
"navigation_bar.discover": "आविष्कुरु",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "प्रोफैलं सम्पाद्यताम्",
"navigation_bar.explore": "अन्विच्छ",
"navigation_bar.filters": "मूकीकृतानि पदानि",
"navigation_bar.follow_requests": "अनुसरणानुरोधाः",
@@ -453,14 +441,7 @@
"poll_button.add_poll": "निर्वाचनं योजय",
"poll_button.remove_poll": "निर्वाचनं मार्जय",
"privacy.change": "पत्रस्य गोपनीयतां परिवर्तय",
- "privacy.direct.long": "केवलमुल्लिखितोभोक्तृभ्यो दृश्यते",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "केवलं येऽनुसरन्ति त्वां तेभ्यो दृश्यते",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "सर्वेभ्यो दृश्यते",
"privacy.public.short": "सार्वजनिकम्",
- "privacy.unlisted.long": "सर्वेभ्यो दृश्यते किन्तु आविष्कारविशेषताभ्योऽन्तरभूतं नास्ति",
- "privacy.unlisted.short": "असूचीकृतम्",
"privacy_policy.last_updated": "अन्तिमवारं परिवर्तितम् {date}",
"privacy_policy.title": "गोपनीयतानीतिः",
"refresh": "नवीकुरु",
@@ -572,7 +553,6 @@
"trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
- "upload_form.undo": "मार्जय",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_progress.label": "Uploading…"
}
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 89e951f77..90b663aea 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -60,7 +60,6 @@
"alert.unexpected.title": "Oh!",
"announcement.announcement": "Annùntziu",
"audio.hide": "Cua s'àudio",
- "autosuggest_hashtag.per_week": "{count} a sa chida",
"boost_modal.combo": "Podes incarcare {combo} pro brincare custu sa borta chi benit",
"bundle_column_error.error.title": "Oh, no!",
"bundle_column_error.network.title": "Faddina de connessione",
@@ -100,22 +99,12 @@
"compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.",
"compose_form.lock_disclaimer.lock": "blocadu",
"compose_form.placeholder": "A ite ses pensende?",
- "compose_form.poll.add_option": "Agiunghe unu sèberu",
"compose_form.poll.duration": "Longària de su sondàgiu",
- "compose_form.poll.option_placeholder": "Optzione {number}",
- "compose_form.poll.remove_option": "Boga custa optzione",
"compose_form.poll.switch_to_multiple": "Muda su sondàgiu pro permìtere multi-optziones",
"compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti",
- "compose_form.publish": "Pùblica",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Sarva is modìficas",
- "compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}",
- "compose_form.sensitive.marked": "{count, plural, one {Elementu multimediale marcadu comente a sensìbile} other {Elementos multimediales marcados comente a sensìbiles}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Elementu multimediale non marcadu comente a sensìbile} other {Elementos multimediales non marcados comente a sensìbiles}}",
"compose_form.spoiler.marked": "Boga avisu de cuntenutu",
"compose_form.spoiler.unmarked": "Agiunghe avisu de cuntenutu",
- "compose_form.spoiler_placeholder": "Iscrie s'avisu tuo inoghe",
"confirmation_modal.cancel": "Annulla",
"confirmations.block.block_and_report": "Bloca e signala",
"confirmations.block.confirm": "Bloca",
@@ -287,7 +276,6 @@
"navigation_bar.compose": "Cumpone una publicatzione noa",
"navigation_bar.discover": "Iscoberi",
"navigation_bar.domain_blocks": "Domìnios blocados",
- "navigation_bar.edit_profile": "Modìfica profilu",
"navigation_bar.filters": "Faeddos a sa muda",
"navigation_bar.follow_requests": "Rechestas de sighidura",
"navigation_bar.follows_and_followers": "Gente chi sighis e sighiduras",
@@ -364,12 +352,7 @@
"poll_button.add_poll": "Agiunghe unu sondàgiu",
"poll_button.remove_poll": "Cantzella su sondàgiu",
"privacy.change": "Modìfica s'istadu de riservadesa",
- "privacy.direct.long": "Visìbile isceti pro is persones mentovadas",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Visìbile isceti pro chie ti sighit",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "Pùblicu",
- "privacy.unlisted.short": "Esclùidu de sa lista",
"recommended": "Cussigiadu",
"refresh": "Atualiza",
"regeneration_indicator.label": "Carrighende…",
@@ -473,7 +456,6 @@
"upload_form.description": "Descritzione pro persones cun problemas visuales",
"upload_form.edit": "Modìfica",
"upload_form.thumbnail": "Càmbia sa miniadura",
- "upload_form.undo": "Cantzella",
"upload_form.video_description": "Descritzione pro persones cun pèrdida auditiva o problemas visuales",
"upload_modal.analyzing_picture": "Analizende immàgine…",
"upload_modal.apply": "Àplica",
diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json
index 0378cd292..b7563022a 100644
--- a/app/javascript/mastodon/locales/sco.json
+++ b/app/javascript/mastodon/locales/sco.json
@@ -74,7 +74,6 @@
"announcement.announcement": "Annooncement",
"attachments_list.unprocessed": "(No processed)",
"audio.hide": "Stow audio",
- "autosuggest_hashtag.per_week": "{count} a week",
"boost_modal.combo": "Ye kin chap {combo} tae dingie this neist tim",
"bundle_column_error.copy_stacktrace": "Copy error report",
"bundle_column_error.error.body": "The requestit page cuidnae be rennert. Hit cuid be doon tae a bug in wir code, or a brooser compatability issue.",
@@ -125,22 +124,12 @@
"compose_form.lock_disclaimer": "Yer accoont isnae {locked}. Awbody kin follae ye for tae luik at yer follaer-ainly posts.",
"compose_form.lock_disclaimer.lock": "lockit",
"compose_form.placeholder": "Whit's on yer mind?",
- "compose_form.poll.add_option": "Pit in a chyce",
"compose_form.poll.duration": "Poll lenth",
- "compose_form.poll.option_placeholder": "Chyce {number}",
- "compose_form.poll.remove_option": "Tak oot this chyce",
"compose_form.poll.switch_to_multiple": "Chynge poll tae alloo multiple chyces",
"compose_form.poll.switch_to_single": "Chynge poll tae alloo fir a single chyce",
- "compose_form.publish": "Publish",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Save chynges",
- "compose_form.sensitive.hide": "{count, plural, one {Mairk media as sensitive} other {Mairk media as sensitive}}",
- "compose_form.sensitive.marked": "{count, plural, one {Media is mairkit as sensitive} other {Media is mairkit as sensitive}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media isnae mairkit as sensitive} other {Media isnae mairkit as sensitive}}",
"compose_form.spoiler.marked": "Tak aff the content warnin",
"compose_form.spoiler.unmarked": "Pit on a content warnin",
- "compose_form.spoiler_placeholder": "Scrieve yer warnin in here",
"confirmation_modal.cancel": "Stap",
"confirmations.block.block_and_report": "Dingie & Clype",
"confirmations.block.confirm": "Dingie",
@@ -341,7 +330,6 @@
"navigation_bar.compose": "Scrieve new post",
"navigation_bar.discover": "Fin",
"navigation_bar.domain_blocks": "Dingied domains",
- "navigation_bar.edit_profile": "Edit profile",
"navigation_bar.explore": "Splore",
"navigation_bar.filters": "Wheesht wirds",
"navigation_bar.follow_requests": "Follae requests",
@@ -425,14 +413,7 @@
"poll_button.add_poll": "Dae a poll",
"poll_button.remove_poll": "Tak doon poll",
"privacy.change": "Chynge post privacy",
- "privacy.direct.long": "Ainly menshied uisers kin see this",
- "privacy.direct.short": "Menshied fowk ainly",
- "privacy.private.long": "Ainly follaers kin see this",
- "privacy.private.short": "Ainly follaers",
- "privacy.public.long": "Awbody kin see this",
"privacy.public.short": "Public",
- "privacy.unlisted.long": "Aw kin see this, but optit-oot o discovery features",
- "privacy.unlisted.short": "No listit",
"privacy_policy.last_updated": "Last updatit {date}",
"privacy_policy.title": "Privacy Policy",
"refresh": "Refresh",
@@ -583,10 +564,8 @@
"upload_error.poll": "File upload isnae allooed wi polls.",
"upload_form.audio_description": "Describe fir fowk wi hearin loss",
"upload_form.description": "Describe fir thaim wi visual impairments",
- "upload_form.description_missing": "Nae description addit",
"upload_form.edit": "Edit",
"upload_form.thumbnail": "Chynge thoomnail",
- "upload_form.undo": "Delete",
"upload_form.video_description": "Describe fir fowk wi hearin loss or wi visual impairment",
"upload_modal.analyzing_picture": "Analyzin picture…",
"upload_modal.apply": "Apply",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index c2d2a41cc..1b2eb1763 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -53,7 +53,6 @@
"alert.unexpected.title": "අපොයි!",
"announcement.announcement": "නිවේදනය",
"audio.hide": "හඬපටය සඟවන්න",
- "autosuggest_hashtag.per_week": "සතියකට {count}",
"boost_modal.combo": "ඊළඟ වතාවේ මෙය මඟ හැරීමට {combo} එබීමට හැකිය",
"bundle_column_error.copy_stacktrace": "දෝෂ වාර්තාවේ පිටපතක්",
"bundle_column_error.error.title": "අපොයි!",
@@ -102,19 +101,12 @@
"compose_form.encryption_warning": "මාස්ටඩන් වෙත පළ කරන දෑ අන්ත සංකේතනයෙන් ආරක්ෂා නොවේ. මාස්ටඩන් හරහා කිසිදු සංවේදී තොරතුරක් බෙදා නොගන්න.",
"compose_form.lock_disclaimer.lock": "අගුළු දමා ඇත",
"compose_form.placeholder": "ඔබගේ සිතුවිලි මොනවාද?",
- "compose_form.poll.add_option": "තේරීමක් යොදන්න",
"compose_form.poll.duration": "මත විමසීමේ කාලය",
- "compose_form.poll.option_placeholder": "තේරීම {number}",
- "compose_form.poll.remove_option": "මෙම ඉවත් කරන්න",
"compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට මත විමසුම වෙනස් කරන්න",
"compose_form.poll.switch_to_single": "තනි තේරීමකට මත විමසුම වෙනස් කරන්න",
- "compose_form.publish": "ප්රකාශනය",
"compose_form.publish_form": "නව ලිපිය",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "වෙනස්කම් සුරකින්න",
"compose_form.spoiler.marked": "අන්තර්ගත අවවාදය ඉවත් කරන්න",
"compose_form.spoiler.unmarked": "අන්තර්ගත අවවාදයක් එක් කරන්න",
- "compose_form.spoiler_placeholder": "අවවාදය මෙහි ලියන්න",
"confirmation_modal.cancel": "අවලංගු",
"confirmations.block.block_and_report": "අවහිර කර වාර්තා කරන්න",
"confirmations.block.confirm": "අවහිර",
@@ -269,7 +261,6 @@
"navigation_bar.compose": "නව ලිපියක් ලියන්න",
"navigation_bar.direct": "පෞද්ගලික සැඳහුම්",
"navigation_bar.domain_blocks": "අවහිර කළ වසම්",
- "navigation_bar.edit_profile": "පැතිකඩ සංස්කරණය",
"navigation_bar.explore": "ගවේශනය",
"navigation_bar.favourites": "ප්රියතමයන්",
"navigation_bar.filters": "නිහඬ කළ වචන",
@@ -335,11 +326,6 @@
"poll_button.add_poll": "මත විමසුමක් අරඹන්න",
"poll_button.remove_poll": "මත විමසුම ඉවතලන්න",
"privacy.change": "ලිපියේ රහස්යතාව සංශෝධනය",
- "privacy.direct.long": "සඳහන් කළ අයට දිස්වෙයි",
- "privacy.direct.short": "සඳහන් කළ අයට පමණි",
- "privacy.private.long": "අනුගාමිකයින්ට දිස්වේ",
- "privacy.private.short": "අනුගාමිකයින් පමණි",
- "privacy.public.long": "සැමට දිස්වෙයි",
"privacy.public.short": "ප්රසිද්ධ",
"privacy_policy.title": "රහස්යතා ප්රතිපත්තිය",
"refresh": "නැවුම් කරන්න",
@@ -481,10 +467,8 @@
"upload_error.poll": "මත විමසුම් සමඟ ගොනු යෙදීමට ඉඩ නොදේ.",
"upload_form.audio_description": "නොඇසෙන අය සඳහා විස්තර කරන්න",
"upload_form.description": "දෘශ්යාබාධිතයන් සඳහා විස්තර කරන්න",
- "upload_form.description_missing": "සවිස්තරයක් නැත",
"upload_form.edit": "සංස්කරණය",
"upload_form.thumbnail": "සිඟිති රුව වෙනස් කරන්න",
- "upload_form.undo": "මකන්න",
"upload_form.video_description": "ශ්රවණාබාධ හෝ දෘශ්යාබාධිත පුද්ගලයන් සඳහා විස්තර කරන්න",
"upload_modal.analyzing_picture": "පින්තූරය විශ්ලේෂණය කරමින්…",
"upload_modal.apply": "යොදන්න",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 3e41a2035..5b1203aee 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Oznámenie",
"attachments_list.unprocessed": "(nespracované)",
"audio.hide": "Skry zvuk",
- "autosuggest_hashtag.per_week": "{count} týždenne",
"boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie",
"bundle_column_error.copy_stacktrace": "Kopírovať chybovú hlášku",
"bundle_column_error.error.body": "Požadovanú stránku nebolo možné vykresliť. Môže to byť spôsobené chybou v našom kóde alebo problémom s kompatibilitou prehliadača.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Tvoj účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.",
"compose_form.lock_disclaimer.lock": "zamknutý",
"compose_form.placeholder": "Čo máš na mysli?",
- "compose_form.poll.add_option": "Pridaj voľbu",
"compose_form.poll.duration": "Trvanie ankety",
- "compose_form.poll.option_placeholder": "Voľba {number}",
- "compose_form.poll.remove_option": "Odstráň túto voľbu",
"compose_form.poll.switch_to_multiple": "Zmeň anketu pre povolenie viacerých možností",
"compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou",
- "compose_form.publish": "Zverejni",
"compose_form.publish_form": "Zverejniť",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Ulož zmeny",
- "compose_form.sensitive.hide": "Označ médiá ako chúlostivé",
- "compose_form.sensitive.marked": "Médiálny obsah je označený ako chúlostivý",
- "compose_form.sensitive.unmarked": "Médiálny obsah nieje označený ako chúlostivý",
"compose_form.spoiler.marked": "Text je ukrytý za varovaním",
"compose_form.spoiler.unmarked": "Text nieje ukrytý",
- "compose_form.spoiler_placeholder": "Sem napíš tvoje varovanie",
"confirmation_modal.cancel": "Zruš",
"confirmations.block.block_and_report": "Zablokuj a nahlás",
"confirmations.block.confirm": "Blokuj",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Súkromné spomenutia",
"navigation_bar.discover": "Objavuj",
"navigation_bar.domain_blocks": "Skryté domény",
- "navigation_bar.edit_profile": "Uprav profil",
"navigation_bar.explore": "Objavuj",
"navigation_bar.favourites": "Obľúbené",
"navigation_bar.filters": "Filtrované slová",
@@ -525,14 +513,7 @@
"poll_button.add_poll": "Pridaj anketu",
"poll_button.remove_poll": "Odstráň anketu",
"privacy.change": "Uprav súkromie príspevku",
- "privacy.direct.long": "Pošli iba spomenutým užívateľom",
- "privacy.direct.short": "Iba spomenutým ľudom",
- "privacy.private.long": "Pošli iba následovateľom",
- "privacy.private.short": "Iba pre sledujúcich",
- "privacy.public.long": "Viditeľné pre všetkých",
"privacy.public.short": "Verejné",
- "privacy.unlisted.long": "Viditeľné pre všetkých, ale odmietnuté funkcie zisťovania",
- "privacy.unlisted.short": "Verejne, ale nezobraziť v osi",
"privacy_policy.last_updated": "Posledná úprava {date}",
"privacy_policy.title": "Zásady súkromia",
"recommended": "Odporúčané",
@@ -714,10 +695,8 @@
"upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.",
"upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu",
"upload_form.description": "Opis pre slabo vidiacich",
- "upload_form.description_missing": "Nepridaný žiadny popis",
"upload_form.edit": "Uprav",
"upload_form.thumbnail": "Zmeniť miniatúru",
- "upload_form.undo": "Vymaž",
"upload_form.video_description": "Popíš, pre ľudí so stratou sluchu, alebo očným znevýhodnením",
"upload_modal.analyzing_picture": "Analyzujem obrázok…",
"upload_modal.apply": "Použi",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index b3998b911..559b05db7 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Obvestilo",
"attachments_list.unprocessed": "(neobdelano)",
"audio.hide": "Skrij zvok",
- "autosuggest_hashtag.per_week": "{count} na teden",
"boost_modal.combo": "Če želite preskočiti to, lahko pritisnete {combo}",
"bundle_column_error.copy_stacktrace": "Kopiraj poročilo o napaki",
"bundle_column_error.error.body": "Zahtevane strani ni mogoče upodobiti. Vzrok težave je morda hrošč v naši kodi ali pa nezdružljivost z brskalnikom.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Vaš račun ni {locked}. Vsakdo vam lahko sledi in si ogleda objave, ki so namenjene samo sledilcem.",
"compose_form.lock_disclaimer.lock": "zaklenjen",
"compose_form.placeholder": "O čem razmišljate?",
- "compose_form.poll.add_option": "Dodaj izbiro",
"compose_form.poll.duration": "Trajanje ankete",
- "compose_form.poll.option_placeholder": "Izbira {number}",
- "compose_form.poll.remove_option": "Odstrani to izbiro",
"compose_form.poll.switch_to_multiple": "Spremenite anketo, da omogočite več izbir",
"compose_form.poll.switch_to_single": "Spremenite anketo, da omogočite eno izbiro",
- "compose_form.publish": "Objavi",
"compose_form.publish_form": "Objavi",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Shrani spremembe",
- "compose_form.sensitive.hide": "{count, plural,one {Označi medij kot občutljiv} two {Označi medija kot občutljiva} other {Označi medije kot občutljive}}",
- "compose_form.sensitive.marked": "{count, plural,one {Medij je označen kot občutljiv} two {Medija sta označena kot občutljiva} other {Mediji so označeni kot občutljivi}}",
- "compose_form.sensitive.unmarked": "{count, plural,one {Medij ni označen kot občutljiv} two {Medija nista označena kot občutljiva} other {Mediji niso označeni kot občutljivi}}",
"compose_form.spoiler.marked": "Odstrani opozorilo o vsebini",
"compose_form.spoiler.unmarked": "Dodaj opozorilo o vsebini",
- "compose_form.spoiler_placeholder": "Tukaj napišite opozorilo",
"confirmation_modal.cancel": "Prekliči",
"confirmations.block.block_and_report": "Blokiraj in prijavi",
"confirmations.block.confirm": "Blokiraj",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Zasebne omembe",
"navigation_bar.discover": "Odkrijte",
"navigation_bar.domain_blocks": "Blokirane domene",
- "navigation_bar.edit_profile": "Uredi profil",
"navigation_bar.explore": "Razišči",
"navigation_bar.favourites": "Priljubljeni",
"navigation_bar.filters": "Utišane besede",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Dodaj anketo",
"poll_button.remove_poll": "Odstrani anketo",
"privacy.change": "Spremeni zasebnost objave",
- "privacy.direct.long": "Objavi samo omenjenim uporabnikom",
- "privacy.direct.short": "Samo omenjeni",
- "privacy.private.long": "Vidno samo sledilcem",
- "privacy.private.short": "Samo sledilci",
- "privacy.public.long": "Vidno vsem",
"privacy.public.short": "Javno",
- "privacy.unlisted.long": "Vidno za vse, vendar izključeno iz funkcionalnosti odkrivanja",
- "privacy.unlisted.short": "Ni prikazano",
"privacy_policy.last_updated": "Zadnja posodobitev {date}",
"privacy_policy.title": "Pravilnik o zasebnosti",
"recommended": "Priporočeno",
@@ -715,10 +696,8 @@
"upload_error.poll": "Prenos datoteke z anketami ni dovoljen.",
"upload_form.audio_description": "Opiši za osebe z okvaro sluha",
"upload_form.description": "Opišite za slabovidne",
- "upload_form.description_missing": "Noben opis ni dodan",
"upload_form.edit": "Uredi",
"upload_form.thumbnail": "Spremeni sličico",
- "upload_form.undo": "Izbriši",
"upload_form.video_description": "Opišite za osebe z okvaro sluha in/ali vida",
"upload_modal.analyzing_picture": "Analiziranje slike …",
"upload_modal.apply": "Uveljavi",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 48eac1487..bfc674248 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -32,6 +32,7 @@
"account.featured_tags.last_status_never": "Pa postime",
"account.featured_tags.title": "Hashtagë të zgjedhur të {name}",
"account.follow": "Ndiqeni",
+ "account.follow_back": "Ndiqe gjithashtu",
"account.followers": "Ndjekës",
"account.followers.empty": "Këtë përdorues ende s’e ndjek kush.",
"account.followers_counter": "{count, plural, one {{counter} Ndjekës} other {{counter} Ndjekës}}",
@@ -52,6 +53,7 @@
"account.mute_notifications_short": "Mos shfaq njoftime",
"account.mute_short": "Mos i shfaq",
"account.muted": "Heshtuar",
+ "account.mutual": "Reciproke",
"account.no_bio": "S’u dha përshkrim.",
"account.open_original_page": "Hap faqen origjinale",
"account.posts": "Mesazhe",
@@ -87,7 +89,6 @@
"announcement.announcement": "Lajmërim",
"attachments_list.unprocessed": "(e papërpunuar)",
"audio.hide": "Fshihe audion",
- "autosuggest_hashtag.per_week": "{count} për javë",
"boost_modal.combo": "Që kjo të anashkalohet herës tjetër, mund të shtypni {combo}",
"bundle_column_error.copy_stacktrace": "Kopjo raportim gabimi",
"bundle_column_error.error.body": "Faqja e kërkuar s’u vizatua dot. Kjo mund të vijë nga një e metë në kodin tonë, ose nga një problem përputhshmërie i shfletuesit.",
@@ -144,22 +145,22 @@
"compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.",
"compose_form.lock_disclaimer.lock": "e kyçur",
"compose_form.placeholder": "Ç’bluani në mendje?",
- "compose_form.poll.add_option": "Shtoni një zgjedhje",
+ "compose_form.poll.add_option": "Shtoni mundësi",
"compose_form.poll.duration": "Kohëzgjatje pyetësori",
- "compose_form.poll.option_placeholder": "Zgjedhja {number}",
- "compose_form.poll.remove_option": "Hiqe këtë zgjedhje",
+ "compose_form.poll.multiple": "Shumë zgjedhje",
+ "compose_form.poll.option_placeholder": "Mundësia {number}",
+ "compose_form.poll.remove_option": "Hiqe këtë mundësi",
+ "compose_form.poll.single": "Zgjidhni një",
"compose_form.poll.switch_to_multiple": "Ndrysho votimin për të lejuar shumë zgjedhje",
"compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje",
- "compose_form.publish": "Botoje",
+ "compose_form.poll.type": "Stil",
+ "compose_form.publish": "Postim",
"compose_form.publish_form": "Publikoje",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Ruaji ndryshimet",
- "compose_form.sensitive.hide": "{count, plural, one {Vëri shenjë medias si rezervat} other {Vëru shenjë mediave si rezervat}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medias i është vënë shenjë rezervat} other {Mediave u është vënë shenjë si rezervat}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Media s’ka shenjë si rezervat} other {Mediat s’kanë shenja si rezervat}}",
+ "compose_form.reply": "Përgjigjuni",
+ "compose_form.save_changes": "Përditësoje",
"compose_form.spoiler.marked": "Hiq sinjalizim lënde",
"compose_form.spoiler.unmarked": "Shtoni sinjalizim lënde",
- "compose_form.spoiler_placeholder": "Shkruani këtu sinjalizimin tuaj",
+ "compose_form.spoiler_placeholder": "Sinjalizim lënde (opsional)",
"confirmation_modal.cancel": "Anuloje",
"confirmations.block.block_and_report": "Bllokojeni & Raportojeni",
"confirmations.block.confirm": "Bllokoje",
@@ -406,7 +407,6 @@
"navigation_bar.direct": "Përmendje private",
"navigation_bar.discover": "Zbuloni",
"navigation_bar.domain_blocks": "Përkatësi të bllokuara",
- "navigation_bar.edit_profile": "Përpunoni profilin",
"navigation_bar.explore": "Eksploroni",
"navigation_bar.favourites": "Të parapëlqyer",
"navigation_bar.filters": "Fjalë të heshtuara",
@@ -524,14 +524,15 @@
"poll_button.add_poll": "Shtoni një pyetësor",
"poll_button.remove_poll": "Hiqe pyetësorin",
"privacy.change": "Rregulloni privatësi mesazhesh",
- "privacy.direct.long": "I dukshëm vetëm për përdorues të përmendur",
- "privacy.direct.short": "Vetëm për personat e përmendur",
- "privacy.private.long": "I dukshëm vetëm për ndjekës",
- "privacy.private.short": "Vetëm ndjekës",
- "privacy.public.long": "I dukshëm për të tërë",
+ "privacy.direct.long": "Gjithkënd i përmendur te postimi",
+ "privacy.direct.short": "Persona të veçantë",
+ "privacy.private.long": "Vetëm ndjekësit tuaj",
+ "privacy.private.short": "Ndjekës",
+ "privacy.public.long": "Cilido që hyn e del në Mastodon",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "I dukshëm për të tërë, por lënë jashtë nga veçoritë e zbulimit",
- "privacy.unlisted.short": "Jo në lista",
+ "privacy.unlisted.additional": "Ky sillet saktësisht si publik, vetëm se postimi s’do të shfaqet në prurje të drejtpërdrejta, ose në hashtag-ë, te eksploroni, apo kërkim në Mastodon, edhe kur keni zgjedhur të jetë për tërë llogarinë.",
+ "privacy.unlisted.long": "Më pak fanfara algoritmike",
+ "privacy.unlisted.short": "Publik i qetë",
"privacy_policy.last_updated": "Përditësuar së fundi më {date}",
"privacy_policy.title": "Rregulla Privatësie",
"recommended": "E rekomanduar",
@@ -549,7 +550,9 @@
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"relative_time.today": "sot",
+ "reply_indicator.attachments": "{count, plural, one {# bashkëngjitje} other {# bashkëngjitje}}",
"reply_indicator.cancel": "Anuloje",
+ "reply_indicator.poll": "Pyetësor",
"report.block": "Bllokoje",
"report.block_explanation": "S’do të shihni postime prej tyre. S’do të jenë në gjendje të shohin postimet tuaja, apo t’ju ndjekin. Do të jenë në gjendje të shohin se janë bllokuar.",
"report.categories.legal": "Ligjore",
@@ -713,10 +716,8 @@
"upload_error.poll": "Me pyetësorët s’lejohet ngarkim kartelash.",
"upload_form.audio_description": "Përshkruajeni për persona me dëgjim të kufizuar",
"upload_form.description": "Përshkruajeni për persona me probleme shikimi",
- "upload_form.description_missing": "S’u shtua përshkrim",
"upload_form.edit": "Përpunoni",
"upload_form.thumbnail": "Ndryshoni miniaturën",
- "upload_form.undo": "Fshije",
"upload_form.video_description": "Përshkruajeni për persona me dëgjim të kufizuar ose probleme shikimi",
"upload_modal.analyzing_picture": "Po analizohet fotoja…",
"upload_modal.apply": "Aplikoje",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 77c262e95..b0348748a 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Najava",
"attachments_list.unprocessed": "(neobrađeno)",
"audio.hide": "Sakrij audio",
- "autosuggest_hashtag.per_week": "{count} nedeljno",
"boost_modal.combo": "Možete pritisnuti {combo} da preskočite ovo sledeći put",
"bundle_column_error.copy_stacktrace": "Kopiraj izveštaj o grešci",
"bundle_column_error.error.body": "Nije moguće prikazati traženu stranicu. Razlog može biti greška u našem kodu ili problem sa kompatibilnošću pretraživača.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Vaš nalog nije {locked}. Svako može da vas prati i da vidi vaše objave namenjene samo za vaše pratioce.",
"compose_form.lock_disclaimer.lock": "zaključan",
"compose_form.placeholder": "O čemu razmišljate?",
- "compose_form.poll.add_option": "Dodajte izbor",
"compose_form.poll.duration": "Trajanje ankete",
- "compose_form.poll.option_placeholder": "Izbor {number}",
- "compose_form.poll.remove_option": "Ukloni ovaj izbor",
"compose_form.poll.switch_to_multiple": "Promenite anketu da biste omogućili više izbora",
"compose_form.poll.switch_to_single": "Promenite anketu da biste omogućili jedan izbor",
- "compose_form.publish": "Objavi",
"compose_form.publish_form": "Objavi",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Sačuvaj promene",
- "compose_form.sensitive.hide": "{count, plural, one {Označi multimediju kao osetljivu} few {Označi multimediju kao osetljivu} other {Označi multimediju kao osetljivu}}",
- "compose_form.sensitive.marked": "{count, plural, one {Multimedija je označena kao osetljiva} few {Multimedija je označena kao osetljiva} other {Multimedija je označena kao osetljiva}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Multimedija nije označena kao osetljiva} few {Multimedija nije označena kao osetljiva} other {Multimedija nije označena kao osetljiva}}",
"compose_form.spoiler.marked": "Ukloni upozorenje o sadržaju",
"compose_form.spoiler.unmarked": "Dodaj upozorenje o sadržaju",
- "compose_form.spoiler_placeholder": "Ovde napišite upozorenje",
"confirmation_modal.cancel": "Otkaži",
"confirmations.block.block_and_report": "Blokiraj i prijavi",
"confirmations.block.confirm": "Blokiraj",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Privatna pominjanja",
"navigation_bar.discover": "Otkrij",
"navigation_bar.domain_blocks": "Blokirani domeni",
- "navigation_bar.edit_profile": "Uredi profil",
"navigation_bar.explore": "Istraži",
"navigation_bar.favourites": "Omiljeno",
"navigation_bar.filters": "Ignorisane reči",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Dodaj anketu",
"poll_button.remove_poll": "Ukloni anketu",
"privacy.change": "Promeni privatnost objave",
- "privacy.direct.long": "Vidljivo samo pomenutim korisnicima",
- "privacy.direct.short": "Samo pomenute osobe",
- "privacy.private.long": "Vidljivo samo pratiocima",
- "privacy.private.short": "Samo pratioci",
- "privacy.public.long": "Vidljivo za sve",
"privacy.public.short": "Javno",
- "privacy.unlisted.long": "Vidljivo svima, ali isključeno iz funkcija otkrivanja",
- "privacy.unlisted.short": "Neizlistano",
"privacy_policy.last_updated": "Poslednje ažuriranje {date}",
"privacy_policy.title": "Politika privatnosti",
"recommended": "Preporučeno",
@@ -715,10 +696,8 @@
"upload_error.poll": "Otpremanje datoteka nije dozvoljeno kod anketa.",
"upload_form.audio_description": "Dodajte opis za osobe sa oštećenim sluhom",
"upload_form.description": "Dodajte opis za osobe sa oštećenim vidom",
- "upload_form.description_missing": "Nema dodatog opisa",
"upload_form.edit": "Uredi",
"upload_form.thumbnail": "Promeni sličicu",
- "upload_form.undo": "Izbriši",
"upload_form.video_description": "Opišite za osobe sa oštećenim sluhom ili vidom",
"upload_modal.analyzing_picture": "Analiziranje slike…",
"upload_modal.apply": "Primeni",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 85e7567bf..4e4956e1a 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Најава",
"attachments_list.unprocessed": "(необрађено)",
"audio.hide": "Сакриј аудио",
- "autosuggest_hashtag.per_week": "{count} недељно",
"boost_modal.combo": "Можете притиснути {combo} да прескочите ово следећи пут",
"bundle_column_error.copy_stacktrace": "Копирај извештај о грешци",
"bundle_column_error.error.body": "Није могуће приказати тражену страницу. Разлог може бити грешка у нашем коду или проблем са компатибилношћу претраживача.",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "Ваш налог није {locked}. Свако може да Вас запрати и да види објаве намењене само Вашим пратиоцима.",
"compose_form.lock_disclaimer.lock": "закључан",
"compose_form.placeholder": "О чему размишљате?",
- "compose_form.poll.add_option": "Додајте избор",
+ "compose_form.poll.add_option": "Додај опцију",
"compose_form.poll.duration": "Трајање анкете",
- "compose_form.poll.option_placeholder": "Избор {number}",
- "compose_form.poll.remove_option": "Уклони овај избор",
+ "compose_form.poll.multiple": "Вишеструки избор",
+ "compose_form.poll.option_placeholder": "Опција {number}",
+ "compose_form.poll.remove_option": "Уклони ову опцију",
+ "compose_form.poll.single": "Одаберите једно",
"compose_form.poll.switch_to_multiple": "Промените анкету да бисте омогућили више избора",
"compose_form.poll.switch_to_single": "Промените анкету да бисте омогућили један избор",
+ "compose_form.poll.type": "Стил",
"compose_form.publish": "Објави",
"compose_form.publish_form": "Нова објава",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Сачувај промене",
- "compose_form.sensitive.hide": "{count, plural, one {Означи мултимедију као осетљиву} few {Означи мултимедију као осетљиву} other {Означи мултимедију као осетљиву}}",
- "compose_form.sensitive.marked": "{count, plural, one {Мултимедија је означена као осетљива} few {Мултимедија је означена као осетљива} other {Мултимедија је означена као осетљива}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Мултимедија није означена као осетљива} few {Мултимедија није означена као осетљива} other {Мултимедија није означена као осетљива}}",
+ "compose_form.reply": "Одговори",
+ "compose_form.save_changes": "Ажурирај",
"compose_form.spoiler.marked": "Уклони упозорење о садржају",
"compose_form.spoiler.unmarked": "Додај упозорење о садржају",
- "compose_form.spoiler_placeholder": "Овде напишите упозорење",
+ "compose_form.spoiler_placeholder": "Упозорење о садржају (опционо)",
"confirmation_modal.cancel": "Откажи",
"confirmations.block.block_and_report": "Блокирај и пријави",
"confirmations.block.confirm": "Блокирај",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "Приватна помињања",
"navigation_bar.discover": "Откриј",
"navigation_bar.domain_blocks": "Блокирани домени",
- "navigation_bar.edit_profile": "Уреди профил",
"navigation_bar.explore": "Истражи",
"navigation_bar.favourites": "Омиљено",
"navigation_bar.filters": "Игнорисане речи",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "Додај анкету",
"poll_button.remove_poll": "Уклони анкету",
"privacy.change": "Промени приватност објаве",
- "privacy.direct.long": "Видљиво само поменутим корисницима",
- "privacy.direct.short": "Само поменуте особе",
- "privacy.private.long": "Видљиво само пратиоцима",
- "privacy.private.short": "Само пратиоци",
- "privacy.public.long": "Видљиво за све",
+ "privacy.direct.long": "Сви поменути у објави",
+ "privacy.direct.short": "Одређени људи",
+ "privacy.private.long": "Само ваши пратиоци",
+ "privacy.private.short": "Пратиоци",
+ "privacy.public.long": "Било ко на Mastodon-у и ван њега",
"privacy.public.short": "Јавно",
- "privacy.unlisted.long": "Видљиво свима, али искључено из функција откривања",
- "privacy.unlisted.short": "Неизлистано",
+ "privacy.unlisted.additional": "Ово се понаша потпуно као јавно, осим што се објава неће појављивати у изворима уживо или хеш ознакама, истраживањима или претрази Mastodon-а, чак и ако сте укључени у целом налогу.",
+ "privacy.unlisted.long": "Мање алгоритамских фанфара",
+ "privacy.unlisted.short": "Тиха јавност",
"privacy_policy.last_updated": "Последње ажурирање {date}",
"privacy_policy.title": "Политика приватности",
"recommended": "Препоручено",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number} мин.",
"relative_time.seconds": "{number} сек.",
"relative_time.today": "данас",
+ "reply_indicator.attachments": "{count, plural, one {# прилог} few {# прилога} other {# прилога}}",
"reply_indicator.cancel": "Откажи",
+ "reply_indicator.poll": "Анкета",
"report.block": "Блокирај",
"report.block_explanation": "Нећете видети објаве корисника. Ни он неће видети Ваше објаве нити ће моћи да Вас прати. Такође ће моћи да сазна да је блокиран.",
"report.categories.legal": "Правни",
@@ -715,10 +716,8 @@
"upload_error.poll": "Отпремање датотека није дозвољено код анкета.",
"upload_form.audio_description": "Додајте опис за особе са оштећеним слухом",
"upload_form.description": "Додајте опис за особе са оштећеним видом",
- "upload_form.description_missing": "Нема додатог описа",
"upload_form.edit": "Уреди",
"upload_form.thumbnail": "Промени сличицу",
- "upload_form.undo": "Избриши",
"upload_form.video_description": "Опишите за особе са оштећеним слухом или видом",
"upload_modal.analyzing_picture": "Анализирање слике…",
"upload_modal.apply": "Примени",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index d3ca776bd..d6e6555b5 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Meddelande",
"attachments_list.unprocessed": "(obehandlad)",
"audio.hide": "Dölj audio",
- "autosuggest_hashtag.per_week": "{count} per vecka",
"boost_modal.combo": "Du kan trycka på {combo} för att hoppa över detta nästa gång",
"bundle_column_error.copy_stacktrace": "Kopiera felrapport",
"bundle_column_error.error.body": "Den begärda sidan kunde inte visas. Det kan bero på ett fel i vår kod eller ett problem med webbläsarens kompatibilitet.",
@@ -146,22 +145,18 @@
"compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.",
"compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Vad tänker du på?",
- "compose_form.poll.add_option": "Lägg till ett val",
+ "compose_form.poll.add_option": "Lägg till alternativ",
"compose_form.poll.duration": "Varaktighet för omröstning",
- "compose_form.poll.option_placeholder": "Val {number}",
- "compose_form.poll.remove_option": "Ta bort detta val",
+ "compose_form.poll.option_placeholder": "Alternativ {number}",
"compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val",
"compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val",
- "compose_form.publish": "Publicera",
+ "compose_form.poll.type": "Stil",
"compose_form.publish_form": "Publicera",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Spara ändringar",
- "compose_form.sensitive.hide": "Markera media som känsligt",
- "compose_form.sensitive.marked": "Media har markerats som känsligt",
- "compose_form.sensitive.unmarked": "Media är inte markerat som känsligt",
+ "compose_form.reply": "Svara",
+ "compose_form.save_changes": "Uppdatera",
"compose_form.spoiler.marked": "Texten är dold bakom en varning",
"compose_form.spoiler.unmarked": "Texten är inte dold",
- "compose_form.spoiler_placeholder": "Skriv din varning här",
+ "compose_form.spoiler_placeholder": "Innehållsvarning (valfritt)",
"confirmation_modal.cancel": "Avbryt",
"confirmations.block.block_and_report": "Blockera & rapportera",
"confirmations.block.confirm": "Blockera",
@@ -408,7 +403,6 @@
"navigation_bar.direct": "Privata nämningar",
"navigation_bar.discover": "Upptäck",
"navigation_bar.domain_blocks": "Dolda domäner",
- "navigation_bar.edit_profile": "Redigera profil",
"navigation_bar.explore": "Utforska",
"navigation_bar.favourites": "Favoriter",
"navigation_bar.filters": "Tystade ord",
@@ -524,14 +518,10 @@
"poll_button.add_poll": "Lägg till en omröstning",
"poll_button.remove_poll": "Ta bort omröstning",
"privacy.change": "Ändra inläggsintegritet",
- "privacy.direct.long": "Skicka endast till nämnda användare",
- "privacy.direct.short": "Endast omnämnda personer",
- "privacy.private.long": "Endast synligt för följare",
- "privacy.private.short": "Endast följare",
- "privacy.public.long": "Synlig för alla",
+ "privacy.private.long": "Endast dina följare",
+ "privacy.private.short": "Följare",
+ "privacy.public.long": "Alla på och utanför Mastodon",
"privacy.public.short": "Publik",
- "privacy.unlisted.long": "Synlig för alla, men visas inte i upptäcksfunktioner",
- "privacy.unlisted.short": "Olistad",
"privacy_policy.last_updated": "Senast uppdaterad {date}",
"privacy_policy.title": "Integritetspolicy",
"recommended": "Rekommenderas",
@@ -550,6 +540,7 @@
"relative_time.seconds": "{number}sek",
"relative_time.today": "idag",
"reply_indicator.cancel": "Ångra",
+ "reply_indicator.poll": "Omröstning",
"report.block": "Blockera",
"report.block_explanation": "Du kommer inte se hens inlägg. Hen kommer inte kunna se dina inlägg eller följa dig. Hen kommer kunna se att hen är blockerad.",
"report.categories.legal": "Juridisk",
@@ -713,10 +704,8 @@
"upload_error.poll": "Filuppladdning tillåts inte med omröstningar.",
"upload_form.audio_description": "Beskriv för personer med hörselnedsättning",
"upload_form.description": "Beskriv för synskadade",
- "upload_form.description_missing": "Beskrivning saknas",
"upload_form.edit": "Redigera",
"upload_form.thumbnail": "Ändra miniatyr",
- "upload_form.undo": "Radera",
"upload_form.video_description": "Beskriv för personer med hörsel- eller synnedsättning",
"upload_modal.analyzing_picture": "Analyserar bild…",
"upload_modal.apply": "Verkställ",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index abbdf9b7d..42164f656 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -93,8 +93,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 5290e13ff..6210c3d0b 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -66,7 +66,6 @@
"announcement.announcement": "அறிவிப்பு",
"attachments_list.unprocessed": "(செயலாக்கப்படாதது)",
"audio.hide": "ஆடியோவை மறை",
- "autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}",
"boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்",
"bundle_column_error.error.title": "அடடே!",
"bundle_column_error.network.body": "இந்தப் பக்கத்தைத் திறக்கும்பொழுது ஒரு பிழை ஏற்பட்டுவிட்டது. இது உங்கள் இணைய தொடர்பில் அல்லது இப்பத்தின் வழங்க்கியில் ஏற்பட்டுள்ள ஒரு தற்காலிக பிரச்சணையாக இருக்கலாம்.",
@@ -120,22 +119,12 @@
"compose_form.lock_disclaimer": "உங்கள் கணக்கு {locked} செய்யப்படவில்லை. உங்கள் பதிவுகளை யார் வேண்டுமானாலும் பின்தொடர்ந்து காணலாம்.",
"compose_form.lock_disclaimer.lock": "பூட்டப்பட்டது",
"compose_form.placeholder": "உங்கள் மனதில் என்ன இருக்கிறது?",
- "compose_form.poll.add_option": "தேர்வை சேர்",
"compose_form.poll.duration": "கருத்துக்கணிப்பின் கால அளவு",
- "compose_form.poll.option_placeholder": "தேர்வு எண் {number}",
- "compose_form.poll.remove_option": "இந்தத் தேர்வை அகற்று",
"compose_form.poll.switch_to_multiple": "பல தேர்வுகளை அனுமதிக்குமாறு மாற்று",
"compose_form.poll.switch_to_single": "ஒரே ஒரு தேர்வை மட்டும் அனுமதிக்குமாறு மாற்று",
- "compose_form.publish": "வெளியிடு",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "மாற்றங்களை சேமி",
- "compose_form.sensitive.hide": "அனைவருக்கும் ஏற்றப் படம் இல்லை எனக் குறியிடு",
- "compose_form.sensitive.marked": "இப்படம் அனைவருக்கும் ஏற்றதல்ல எனக் குறியிடப்பட்டுள்ளது",
- "compose_form.sensitive.unmarked": "இப்படம் அனைவருக்கும் ஏற்றதல்ல எனக் குறியிடப்படவில்லை",
"compose_form.spoiler.marked": "எச்சரிக்கையின் பின்னால் பதிவு மறைக்கப்பட்டுள்ளது",
"compose_form.spoiler.unmarked": "பதிவு மறைக்கப்படவில்லை",
- "compose_form.spoiler_placeholder": "உங்கள் எச்சரிக்கையை இங்கு எழுதவும்",
"confirmation_modal.cancel": "ரத்து",
"confirmations.block.block_and_report": "தடுத்துப் புகாரளி",
"confirmations.block.confirm": "தடு",
@@ -283,7 +272,6 @@
"navigation_bar.compose": "புதியவற்றை எழுதுக toot",
"navigation_bar.discover": "கண்டு பிடி",
"navigation_bar.domain_blocks": "மறைந்த களங்கள்",
- "navigation_bar.edit_profile": "சுயவிவரத்தைத் திருத்தவும்",
"navigation_bar.filters": "முடக்கப்பட்ட வார்த்தைகள்",
"navigation_bar.follow_requests": "கோரிக்கைகளை பின்பற்றவும்",
"navigation_bar.follows_and_followers": "பின்பற்றல்கள் மற்றும் பின்பற்றுபவர்கள்",
@@ -344,12 +332,7 @@
"poll_button.add_poll": "வாக்கெடுப்பைச் சேர்க்கவும்",
"poll_button.remove_poll": "வாக்கெடுப்பை அகற்று",
"privacy.change": "நிலை தனியுரிமை",
- "privacy.direct.long": "குறிப்பிடப்பட்ட பயனர்களுக்கு மட்டுமே இடுகையிடவும்",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "பின்தொடர்பவர்களுக்கு மட்டுமே இடுகை",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "பொது",
- "privacy.unlisted.short": "பட்டியலிடப்படாத",
"refresh": "புதுப்பி",
"regeneration_indicator.label": "சுமையேற்றம்…",
"regeneration_indicator.sublabel": "உங்கள் வீட்டு ஊட்டம் தயார் செய்யப்படுகிறது!",
@@ -432,7 +415,6 @@
"upload_form.description": "பார்வையற்ற விவரிக்கவும்",
"upload_form.edit": "தொகு",
"upload_form.thumbnail": "சிறுபடத்தை மாற்ற",
- "upload_form.undo": "நீக்கு",
"upload_form.video_description": "செவித்திறன் மற்றும் பார்வைக் குறைபாடு உள்ளவர்களுக்காக விளக்குக",
"upload_modal.analyzing_picture": "படம் ஆராயப்படுகிறது…",
"upload_modal.apply": "உபயோகி",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 7c1956d95..b1a242c75 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -79,8 +79,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 3c231871f..24a67247c 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -64,16 +64,10 @@
"compose_form.lock_disclaimer": "మీ ఖాతా {locked} చేయబడలేదు. ఎవరైనా మిమ్మల్ని అనుసరించి మీ అనుచరులకు-మాత్రమే పోస్ట్లను వీక్షించవచ్చు.",
"compose_form.lock_disclaimer.lock": "బిగించబడినది",
"compose_form.placeholder": "మీ మనస్సులో ఏముంది?",
- "compose_form.poll.add_option": "ఒక ఎంపికను చేర్చండి",
"compose_form.poll.duration": "ఎన్నిక వ్యవధి",
- "compose_form.poll.option_placeholder": "ఎంపిక {number}",
- "compose_form.poll.remove_option": "ఈ ఎంపికను తొలగించు",
"compose_form.publish_form": "Publish",
- "compose_form.sensitive.marked": "మీడియా సున్నితమైనదిగా గుర్తించబడింది",
- "compose_form.sensitive.unmarked": "మీడియా సున్నితమైనదిగా గుర్తించబడలేదు",
"compose_form.spoiler.marked": "హెచ్చరిక వెనుక పాఠ్యం దాచబడింది",
"compose_form.spoiler.unmarked": "పాఠ్యం దాచబడలేదు",
- "compose_form.spoiler_placeholder": "ఇక్కడ మీ హెచ్చరికను రాయండి",
"confirmation_modal.cancel": "రద్దు చెయ్యి",
"confirmations.block.confirm": "బ్లాక్ చేయి",
"confirmations.block.message": "మీరు ఖచ్చితంగా {name}ని బ్లాక్ చేయాలనుకుంటున్నారా?",
@@ -186,7 +180,6 @@
"navigation_bar.compose": "కొత్త టూట్ను రాయండి",
"navigation_bar.discover": "కనుగొను",
"navigation_bar.domain_blocks": "దాచిన డొమైన్లు",
- "navigation_bar.edit_profile": "ప్రొఫైల్ని సవరించండి",
"navigation_bar.filters": "మ్యూట్ చేయబడిన పదాలు",
"navigation_bar.follow_requests": "అనుసరించడానికి అభ్యర్ధనలు",
"navigation_bar.lists": "జాబితాలు",
@@ -240,12 +233,7 @@
"poll_button.add_poll": "ఒక ఎన్నికను చేర్చు",
"poll_button.remove_poll": "ఎన్నికను తొలగించు",
"privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి",
- "privacy.direct.long": "పేర్కొన్న వినియోగదారులకు మాత్రమే పోస్ట్ చేయి",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "అనుచరులకు మాత్రమే పోస్ట్ చేయి",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "ప్రజా",
- "privacy.unlisted.short": "జాబితా చేయబడనిది",
"regeneration_indicator.label": "లోడ్ అవుతోంది…",
"regeneration_indicator.sublabel": "మీ హోమ్ ఫీడ్ సిద్ధమవుతోంది!",
"relative_time.just_now": "ఇప్పుడు",
@@ -308,7 +296,6 @@
"upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి",
- "upload_form.undo": "తొలగించు",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_progress.label": "అప్లోడ్ అవుతోంది...",
"video.close": "వీడియోని మూసివేయి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index b108e581a..4437afa78 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -89,7 +89,6 @@
"announcement.announcement": "ประกาศ",
"attachments_list.unprocessed": "(ยังไม่ได้ประมวลผล)",
"audio.hide": "ซ่อนเสียง",
- "autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์",
"boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป",
"bundle_column_error.copy_stacktrace": "คัดลอกรายงานข้อผิดพลาด",
"bundle_column_error.error.body": "ไม่สามารถแสดงผลหน้าที่ขอ ข้อผิดพลาดอาจเป็นเพราะข้อบกพร่องในโค้ดของเรา หรือปัญหาความเข้ากันได้ของเบราว์เซอร์",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "บัญชีของคุณไม่ได้ {locked} ใครก็ตามสามารถติดตามคุณเพื่อดูโพสต์สำหรับผู้ติดตามเท่านั้นของคุณ",
"compose_form.lock_disclaimer.lock": "ล็อคอยู่",
"compose_form.placeholder": "คุณกำลังคิดอะไรอยู่?",
- "compose_form.poll.add_option": "เพิ่มตัวเลือก",
"compose_form.poll.duration": "ระยะเวลาการสำรวจความคิดเห็น",
- "compose_form.poll.option_placeholder": "ตัวเลือก {number}",
- "compose_form.poll.remove_option": "เอาตัวเลือกนี้ออก",
"compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก",
"compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
- "compose_form.publish": "เผยแพร่",
"compose_form.publish_form": "โพสต์ใหม่",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "บันทึกการเปลี่ยนแปลง",
- "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
- "compose_form.sensitive.marked": "{count, plural, other {มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
- "compose_form.sensitive.unmarked": "{count, plural, other {ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
"compose_form.spoiler.marked": "เอาคำเตือนเนื้อหาออก",
"compose_form.spoiler.unmarked": "เพิ่มคำเตือนเนื้อหา",
- "compose_form.spoiler_placeholder": "เขียนคำเตือนของคุณที่นี่",
"confirmation_modal.cancel": "ยกเลิก",
"confirmations.block.block_and_report": "ปิดกั้นแล้วรายงาน",
"confirmations.block.confirm": "ปิดกั้น",
@@ -314,7 +303,7 @@
"home.explore_prompt.body": "ฟีดหน้าแรกของคุณจะมีการผสมผสานของโพสต์จากแฮชแท็กที่คุณได้เลือกติดตาม, ผู้คนที่คุณได้เลือกติดตาม และโพสต์ที่เขาดัน หากนั่นรู้สึกเงียบเกินไป คุณอาจต้องการ:",
"home.explore_prompt.title": "นี่คือฐานหน้าแรกของคุณภายใน Mastodon",
"home.hide_announcements": "ซ่อนประกาศ",
- "home.pending_critical_update.body": "โปรดอัปเดตเซิร์ฟเวอร์ Mastodon ของคุณโดยเร็วที่สุดเท่าที่จะทำได้!",
+ "home.pending_critical_update.body": "โปรดอัปเดตเซิร์ฟเวอร์ Mastodon ของคุณโดยเร็วที่สุดเท่าที่จะเป็นไปได้!",
"home.pending_critical_update.link": "ดูการอัปเดต",
"home.pending_critical_update.title": "มีการอัปเดตความปลอดภัยสำคัญพร้อมใช้งาน!",
"home.show_announcements": "แสดงประกาศ",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "การกล่าวถึงแบบส่วนตัว",
"navigation_bar.discover": "ค้นพบ",
"navigation_bar.domain_blocks": "โดเมนที่ปิดกั้นอยู่",
- "navigation_bar.edit_profile": "แก้ไขโปรไฟล์",
"navigation_bar.explore": "สำรวจ",
"navigation_bar.favourites": "รายการโปรด",
"navigation_bar.filters": "คำที่ซ่อนอยู่",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "เพิ่มการสำรวจความคิดเห็น",
"poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก",
"privacy.change": "เปลี่ยนความเป็นส่วนตัวของโพสต์",
- "privacy.direct.long": "ปรากฏแก่ผู้ใช้ที่กล่าวถึงเท่านั้น",
- "privacy.direct.short": "ผู้คนที่กล่าวถึงเท่านั้น",
- "privacy.private.long": "ปรากฏแก่ผู้ติดตามเท่านั้น",
- "privacy.private.short": "ผู้ติดตามเท่านั้น",
- "privacy.public.long": "ปรากฏแก่ทั้งหมด",
"privacy.public.short": "สาธารณะ",
- "privacy.unlisted.long": "ปรากฏแก่ทั้งหมด แต่เลือกไม่รับคุณลักษณะการค้นพบ",
- "privacy.unlisted.short": "ไม่อยู่ในรายการ",
"privacy_policy.last_updated": "อัปเดตล่าสุดเมื่อ {date}",
"privacy_policy.title": "นโยบายความเป็นส่วนตัว",
"recommended": "แนะนำ",
@@ -715,10 +696,8 @@
"upload_error.poll": "ไม่อนุญาตการอัปโหลดไฟล์โดยมีการสำรวจความคิดเห็น",
"upload_form.audio_description": "อธิบายสำหรับผู้ที่สูญเสียการได้ยิน",
"upload_form.description": "อธิบายสำหรับผู้คนที่พิการทางการมองเห็นหรือมีสายตาเลือนราง",
- "upload_form.description_missing": "ไม่ได้เพิ่มคำอธิบาย",
"upload_form.edit": "แก้ไข",
"upload_form.thumbnail": "เปลี่ยนภาพขนาดย่อ",
- "upload_form.undo": "ลบ",
"upload_form.video_description": "อธิบายสำหรับผู้คนที่พิการทางการได้ยิน ได้ยินไม่ชัด พิการทางการมองเห็น หรือมีสายตาเลือนราง",
"upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…",
"upload_modal.apply": "นำไปใช้",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index e85db817b..6811c158d 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Duyuru",
"attachments_list.unprocessed": "(işlenmemiş)",
"audio.hide": "Sesi gizle",
- "autosuggest_hashtag.per_week": "Haftada {count}",
"boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsin",
"bundle_column_error.copy_stacktrace": "Hata raporunu kopyala",
"bundle_column_error.error.body": "İstenen sayfa gösterilemiyor. Bu durum kodumuzdaki bir hatadan veya tarayıcı uyum sorunundan kaynaklanıyor olabilir.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Hesabın {locked} değil. Yalnızca takipçilere özel gönderilerini görüntülemek için herkes seni takip edebilir.",
"compose_form.lock_disclaimer.lock": "kilitli",
"compose_form.placeholder": "Aklında ne var?",
- "compose_form.poll.add_option": "Bir seçenek ekleyin",
"compose_form.poll.duration": "Anket süresi",
- "compose_form.poll.option_placeholder": "{number}.seçenek",
- "compose_form.poll.remove_option": "Bu seçeneği kaldır",
"compose_form.poll.switch_to_multiple": "Birden çok seçeneğe izin vermek için anketi değiştir",
"compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir",
- "compose_form.publish": "Gönder",
"compose_form.publish_form": "Gönder",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Değişiklikleri kaydet",
- "compose_form.sensitive.hide": "{count, plural, one {Medyayı hassas olarak işaretle} other {Medyayı hassas olarak işaretle}}",
- "compose_form.sensitive.marked": "{count, plural, one {Medya hassas olarak işaretlendi} other {Medya hassas olarak işaretlendi}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Medya hassas olarak işaretlenmemiş} other {Medya hassas olarak işaretlenmemiş}}",
"compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir",
"compose_form.spoiler.unmarked": "Metin gizli değil",
- "compose_form.spoiler_placeholder": "Uyarınızı buraya yazın",
"confirmation_modal.cancel": "İptal",
"confirmations.block.block_and_report": "Engelle ve Bildir",
"confirmations.block.confirm": "Engelle",
@@ -408,7 +397,6 @@
"navigation_bar.direct": "Özel değinmeler",
"navigation_bar.discover": "Keşfet",
"navigation_bar.domain_blocks": "Engellenen alan adları",
- "navigation_bar.edit_profile": "Profili düzenle",
"navigation_bar.explore": "Keşfet",
"navigation_bar.favourites": "Favorilerin",
"navigation_bar.filters": "Sessize alınmış kelimeler",
@@ -526,14 +514,7 @@
"poll_button.add_poll": "Bir anket ekleyin",
"poll_button.remove_poll": "Anketi kaldır",
"privacy.change": "Gönderi gizliliğini değiştir",
- "privacy.direct.long": "Sadece bahsedilen kullanıcılar için görünür",
- "privacy.direct.short": "Sadece bahsedilen kişiler",
- "privacy.private.long": "Sadece takipçiler için görünür",
- "privacy.private.short": "Sadece takipçiler",
- "privacy.public.long": "Herkese açık",
"privacy.public.short": "Herkese açık",
- "privacy.unlisted.long": "Keşfet harici herkese açık",
- "privacy.unlisted.short": "Listelenmemiş",
"privacy_policy.last_updated": "Son güncelleme {date}",
"privacy_policy.title": "Gizlilik Politikası",
"recommended": "Önerilen",
@@ -715,10 +696,8 @@
"upload_error.poll": "Anketlerde dosya yüklemesine izin verilmez.",
"upload_form.audio_description": "İşitme kaybı olan kişiler için yazı ekleyiniz",
"upload_form.description": "Görme engelliler için açıklama",
- "upload_form.description_missing": "Açıklama eklenmedi",
"upload_form.edit": "Düzenle",
"upload_form.thumbnail": "Küçük resmi değiştir",
- "upload_form.undo": "Sil",
"upload_form.video_description": "İşitme kaybı veya görme engeli olan kişiler için açıklama ekleyiniz",
"upload_modal.analyzing_picture": "Resim analiz ediliyor…",
"upload_modal.apply": "Uygula",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index 47fe60bd2..17de9884e 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -76,7 +76,6 @@
"announcement.announcement": "Игълан",
"attachments_list.unprocessed": "(чимал)",
"audio.hide": "Аудионы яшерү",
- "autosuggest_hashtag.per_week": "{count} атнага",
"boost_modal.combo": "Сез баса аласыз {combo} киләсе тапкыр моны сагыну өчен",
"bundle_column_error.copy_stacktrace": "Күчереп алу хата турында Отчет",
"bundle_column_error.error.body": "Соралган бит күрсәтелә алмый. Бу безнең кодтагы хата яки браузерга туры килү проблемасы аркасында булырга мөмкин.",
@@ -128,22 +127,12 @@
"compose_form.lock_disclaimer": "Сезнең хисап түгел {locked}. Апуәрбер теләгән кеше сезнең язма өчен иярә ала.",
"compose_form.lock_disclaimer.lock": "бикле",
"compose_form.placeholder": "What is on your mind?",
- "compose_form.poll.add_option": "Сайлау өстәгез",
"compose_form.poll.duration": "Сораштыру озынлыгы",
- "compose_form.poll.option_placeholder": "Сайлау {number}",
- "compose_form.poll.remove_option": "бетерү",
"compose_form.poll.switch_to_multiple": "Берничә вариантны чишү өчен сораштыруны Үзгәртегез",
"compose_form.poll.switch_to_single": "Бердәнбер сайлау өчен сораштыруны Үзгәртегез",
- "compose_form.publish": "Бастыру",
"compose_form.publish_form": "Бастыру",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Үзгәрешләрне саклау",
- "compose_form.sensitive.hide": "{count, plural, one {Медианы сизгер итеп билгеләгез} other {Медианы сизгер итеп билгеләгез}}",
- "compose_form.sensitive.marked": "{count, plural, one {Ташучы сизгер дип язылган} other {Ташучы сизгер дип язылган}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Медиа сизгер буларак билгеле түгел} other {Медиа сизгер буларак билгеле түгел}}",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
- "compose_form.spoiler_placeholder": "Кисәтүегезне монда языгыз",
"confirmation_modal.cancel": "Баш тарту",
"confirmations.block.block_and_report": "Блоклау һәм шикаять итү",
"confirmations.block.confirm": "Блоклау",
@@ -322,7 +311,6 @@
"navigation_bar.compose": "Compose new toot",
"navigation_bar.direct": "Хосусый искә алулар",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "Профильны үзгәртү",
"navigation_bar.explore": "Күзәтү",
"navigation_bar.lists": "Исемлекләр",
"navigation_bar.logout": "Чыгу",
@@ -376,9 +364,6 @@
"poll_button.add_poll": "Сораштыруны өстәү",
"poll_button.remove_poll": "Сораштыруны бетерү",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
- "privacy.public.long": "Һәркемгә ачык",
"privacy.public.short": "Һәркемгә ачык",
"privacy_policy.last_updated": "Соңгы яңарту {date}",
"privacy_policy.title": "Хосусыйлык Сәясәте",
@@ -478,9 +463,7 @@
"units.short.thousand": "{count}М",
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
- "upload_form.description_missing": "Тасвирлама өстәлмәде",
"upload_form.edit": "Үзгәртү",
- "upload_form.undo": "Бетерү",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.analyzing_picture": "Рәсемгә анализ ясау…",
"upload_modal.apply": "Куллан",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index 6bb5ba0eb..9dc3b5c1f 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -76,8 +76,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 5ec0da599..38e5f9cfb 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Оголошення",
"attachments_list.unprocessed": "(не оброблено)",
"audio.hide": "Сховати аудіо",
- "autosuggest_hashtag.per_week": "{count} на тиждень",
"boost_modal.combo": "Ви можете натиснути {combo}, щоби пропустити це наступного разу",
"bundle_column_error.copy_stacktrace": "Копіювати звіт про помилку",
"bundle_column_error.error.body": "Неможливо показати запитану сторінку. Це може бути спричинено помилкою у нашому коді, або через проблему сумісності з браузером.",
@@ -146,22 +145,13 @@
"compose_form.lock_disclaimer": "Ваш обліковий запис не {locked}. Будь-який користувач може підписатися на вас та переглядати ваші дописи для підписників.",
"compose_form.lock_disclaimer.lock": "приватний",
"compose_form.placeholder": "Що у вас на думці?",
- "compose_form.poll.add_option": "Додати варіант",
+ "compose_form.poll.add_option": "Додати опцію",
"compose_form.poll.duration": "Тривалість опитування",
- "compose_form.poll.option_placeholder": "Варіант {number}",
- "compose_form.poll.remove_option": "Видалити цей варіант",
"compose_form.poll.switch_to_multiple": "Дозволити вибір декількох відповідей",
"compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
- "compose_form.publish": "Опублікувати",
"compose_form.publish_form": "Новий допис",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Зберегти зміни",
- "compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}",
- "compose_form.sensitive.marked": "{count, plural, one {Медіа позначене делікатним} other {Медіа позначені делікатними}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Медіа не позначене делікатним} other {Медіа не позначені делікатними}}",
"compose_form.spoiler.marked": "Прибрати попередження про вміст",
"compose_form.spoiler.unmarked": "Додати попередження про вміст",
- "compose_form.spoiler_placeholder": "Напишіть своє попередження тут",
"confirmation_modal.cancel": "Скасувати",
"confirmations.block.block_and_report": "Заблокувати та поскаржитися",
"confirmations.block.confirm": "Заблокувати",
@@ -408,7 +398,6 @@
"navigation_bar.direct": "Особисті згадки",
"navigation_bar.discover": "Дослідити",
"navigation_bar.domain_blocks": "Заблоковані домени",
- "navigation_bar.edit_profile": "Редагувати профіль",
"navigation_bar.explore": "Огляд",
"navigation_bar.favourites": "Уподобане",
"navigation_bar.filters": "Приховані слова",
@@ -526,14 +515,7 @@
"poll_button.add_poll": "Додати опитування",
"poll_button.remove_poll": "Видалити опитування",
"privacy.change": "Змінити видимість допису",
- "privacy.direct.long": "Показати тільки згаданим користувачам",
- "privacy.direct.short": "Лише згадані люди",
- "privacy.private.long": "Показати тільки підписникам",
- "privacy.private.short": "Тільки для підписників",
- "privacy.public.long": "Видимий для всіх",
"privacy.public.short": "Публічно",
- "privacy.unlisted.long": "Видимий для всіх, але не через можливості виявлення",
- "privacy.unlisted.short": "Прихований",
"privacy_policy.last_updated": "Оновлено {date}",
"privacy_policy.title": "Політика приватності",
"recommended": "Рекомендовано",
@@ -715,10 +697,8 @@
"upload_error.poll": "Не можна завантажувати файли до опитувань.",
"upload_form.audio_description": "Опишіть для людей із вадами слуху",
"upload_form.description": "Опишіть для людей з вадами зору",
- "upload_form.description_missing": "Немає опису",
"upload_form.edit": "Змінити",
"upload_form.thumbnail": "Змінити мініатюру",
- "upload_form.undo": "Видалити",
"upload_form.video_description": "Опишіть для людей із вадами слуху або зору",
"upload_modal.analyzing_picture": "Аналізуємо зображення…",
"upload_modal.apply": "Застосувати",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index 563b2dedf..fee2cc3a9 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -72,7 +72,6 @@
"alert.unexpected.message": "ایک غیر متوقع سہو ہوا ہے.",
"alert.unexpected.title": "ا رے!",
"announcement.announcement": "اعلان",
- "autosuggest_hashtag.per_week": "{count} فی ہفتہ",
"boost_modal.combo": "آئیندہ یہ نہ دیکھنے کیلئے آپ {combo} دبا سکتے ہیں",
"bundle_column_error.error.title": "اوف، نہیں!",
"bundle_column_error.network.title": "نیٹ ورک کی خرابی",
@@ -115,22 +114,12 @@
"compose_form.lock_disclaimer": "آپ کا اکاؤنٹ {locked} نہیں ہے. کوئی بھی آپ کے مخصوص برائے پیروکار ٹوٹ دیکھنے کی خاطر آپ کی پیروی کر سکتا ہے.",
"compose_form.lock_disclaimer.lock": "مقفل",
"compose_form.placeholder": "آپ کیا سوچ رہے ہیں؟",
- "compose_form.poll.add_option": "انتخاب شامل کریں",
"compose_form.poll.duration": "مدتِ رائے",
- "compose_form.poll.option_placeholder": "انتخاب {number}",
- "compose_form.poll.remove_option": "یہ انتخاب ہٹا دیں",
"compose_form.poll.switch_to_multiple": "متعدد انتخاب کی اجازت دینے کے لیے پول تبدیل کریں",
"compose_form.poll.switch_to_single": "کسی ایک انتخاب کے لیے پول تبدیل کریں",
- "compose_form.publish": "اشاعت کردہ",
"compose_form.publish_form": "اشاعت کریں",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "تبدیلیاں محفوظ کریں",
- "compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں",
- "compose_form.sensitive.marked": "وسائل حساس نشاندہ ہے",
- "compose_form.sensitive.unmarked": "{count, plural, one {میڈیا کو حساس کے طور پر نشان زد نہیں کیا گیا ہے} other {میڈیا کو حساس کے طور پر نشان زد نہیں کیا گیا ہے}}",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
- "compose_form.spoiler_placeholder": "اپنی وارننگ یہاں لکھیں",
"confirmation_modal.cancel": "منسوخ",
"confirmations.block.block_and_report": "شکایت کریں اور بلاک کریں",
"confirmations.block.confirm": "بلاک",
@@ -242,7 +231,6 @@
"navigation_bar.compose": "Compose new toot",
"navigation_bar.discover": "دریافت کریں",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "پروفائل میں ترمیم کریں",
"navigation_bar.filters": "خاموش کردہ الفاظ",
"navigation_bar.follow_requests": "پیروی کی درخواستیں",
"navigation_bar.follows_and_followers": "پیروی کردہ اور پیروکار",
@@ -281,10 +269,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.long": "Post to mentioned users only",
- "privacy.direct.short": "Direct",
- "privacy.private.long": "Post to followers only",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/uz.json b/app/javascript/mastodon/locales/uz.json
index 8eeee42a5..8f231c8c7 100644
--- a/app/javascript/mastodon/locales/uz.json
+++ b/app/javascript/mastodon/locales/uz.json
@@ -75,7 +75,6 @@
"announcement.announcement": "E'lonlar",
"attachments_list.unprocessed": "(qayta ishlanmagan)",
"audio.hide": "Audioni yashirish",
- "autosuggest_hashtag.per_week": "{count} haftasiga",
"boost_modal.combo": "Keyingi safar buni oʻtkazib yuborish uchun {combo} tugmasini bosishingiz mumkin",
"bundle_column_error.copy_stacktrace": "Xato hisobotini nusxalash",
"bundle_column_error.error.body": "Soʻralgan sahifani koʻrsatib boʻlmadi. Buning sababi bizning kodimizdagi xato yoki brauzer mosligi muammosi bo'lishi mumkin.",
@@ -126,22 +125,12 @@
"compose_form.lock_disclaimer": "Hisobingiz {locked}. Faqat obunachilarga moʻljallangan postlaringizni koʻrish uchun har kim sizni kuzatishi mumkin.",
"compose_form.lock_disclaimer.lock": "yopilgan",
"compose_form.placeholder": "Xalolizda nima?",
- "compose_form.poll.add_option": "Tanlov qo'shing",
"compose_form.poll.duration": "So‘rov muddati",
- "compose_form.poll.option_placeholder": "Tanlov {number}",
- "compose_form.poll.remove_option": "Olib tashlash",
"compose_form.poll.switch_to_multiple": "Bir nechta tanlovga ruxsat berish uchun so'rovnomani o'zgartirish",
"compose_form.poll.switch_to_single": "Yagona tanlovga ruxsat berish uchun so‘rovnomani o‘zgartirish",
- "compose_form.publish": "Nashr qilish",
"compose_form.publish_form": "Nashr qilish",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "O‘zgarishlarni saqlash",
- "compose_form.sensitive.hide": "{count, plural, one {Mediani sezgir deb belgilang} other {Medialarni sezgir deb belgilang}}",
- "compose_form.sensitive.marked": "{count, plural, one {Mediani sezgir deb belgilang} other {Medialarni sezgir deb belgilang}}",
- "compose_form.sensitive.unmarked": "{count, plural, one {Mediani sezgir deb belgilang} other {Medialarni sezgir deb belgilang}}",
"compose_form.spoiler.marked": "Kontent ogohlantirishini olib tashlang",
"compose_form.spoiler.unmarked": "Kontent haqida ogohlantirish qo'shing",
- "compose_form.spoiler_placeholder": "Sharhingizni bu erga yozing",
"confirmation_modal.cancel": "Bekor qilish",
"confirmations.block.block_and_report": "Bloklash va hisobot berish",
"confirmations.block.confirm": "Bloklash",
@@ -336,7 +325,6 @@
"navigation_bar.compose": "Yangi post yozing",
"navigation_bar.discover": "Kashf qilish",
"navigation_bar.domain_blocks": "Bloklangan domenlar",
- "navigation_bar.edit_profile": "Profilni tahrirlash",
"navigation_bar.explore": "O‘rganish",
"navigation_bar.filters": "E'tiborga olinmagan so'zlar",
"navigation_bar.followed_tags": "Kuzatilgan hashtaglar",
@@ -368,8 +356,6 @@
"onboarding.steps.share_profile.body": "Let your friends know how to find you on Mastodon!",
"onboarding.steps.share_profile.title": "Share your profile",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"report.placeholder": "Type or paste additional comments",
"report.submit": "Submit report",
"report.target": "Report {target}",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 03c650265..73a11b957 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -89,7 +89,6 @@
"announcement.announcement": "Có gì mới?",
"attachments_list.unprocessed": "(chưa xử lí)",
"audio.hide": "Ẩn âm thanh",
- "autosuggest_hashtag.per_week": "{count} mỗi tuần",
"boost_modal.combo": "Nhấn {combo} để bỏ qua bước này",
"bundle_column_error.copy_stacktrace": "Sao chép báo lỗi",
"bundle_column_error.error.body": "Không thể hiện trang này. Đây có thể là một lỗi trong mã lập trình của chúng tôi, hoặc là vấn đề tương thích của trình duyệt.",
@@ -146,22 +145,12 @@
"compose_form.lock_disclaimer": "Tài khoản của bạn không {locked}. Bất cứ ai cũng có thể theo dõi và xem tút riêng tư của bạn.",
"compose_form.lock_disclaimer.lock": "khóa",
"compose_form.placeholder": "Bạn đang nghĩ gì?",
- "compose_form.poll.add_option": "Thêm lựa chọn",
"compose_form.poll.duration": "Hết hạn vào",
- "compose_form.poll.option_placeholder": "Lựa chọn {number}",
- "compose_form.poll.remove_option": "Xóa lựa chọn này",
"compose_form.poll.switch_to_multiple": "Có thể chọn nhiều lựa chọn",
"compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn",
- "compose_form.publish": "Đăng",
"compose_form.publish_form": "Đăng",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "Lưu thay đổi",
- "compose_form.sensitive.hide": "{count, plural, other {Đánh dấu nội dung nhạy cảm}}",
- "compose_form.sensitive.marked": "{count, plural, other {Nội dung này nhạy cảm}}",
- "compose_form.sensitive.unmarked": "{count, plural, other {Nội dung này bình thường}}",
"compose_form.spoiler.marked": "Hủy nội dung ẩn",
"compose_form.spoiler.unmarked": "Tạo nội dung ẩn",
- "compose_form.spoiler_placeholder": "Lời dẫn cho nội dung ẩn",
"confirmation_modal.cancel": "Hủy bỏ",
"confirmations.block.block_and_report": "Chặn & Báo cáo",
"confirmations.block.confirm": "Chặn",
@@ -240,7 +229,7 @@
"empty_column.follow_requests": "Bạn chưa có yêu cầu theo dõi nào.",
"empty_column.followed_tags": "Bạn chưa theo dõi hashtag nào. Khi bạn theo dõi, chúng sẽ hiện lên ở đây.",
"empty_column.hashtag": "Chưa có tút nào dùng hashtag này.",
- "empty_column.home": "Trang chính của bạn đang trống! Hãy theo dõi nhiều người hơn để lấp đầy.",
+ "empty_column.home": "Trang chủ của bạn đang trống! Hãy theo dõi nhiều người hơn để lấp đầy.",
"empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
"empty_column.lists": "Bạn chưa tạo danh sách nào.",
"empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.",
@@ -336,38 +325,38 @@
"intervals.full.days": "{number, plural, other {# ngày}}",
"intervals.full.hours": "{number, plural, other {# giờ}}",
"intervals.full.minutes": "{number, plural, other {# phút}}",
- "keyboard_shortcuts.back": "trở lại",
+ "keyboard_shortcuts.back": "quay lại",
"keyboard_shortcuts.blocked": "mở danh sách người đã chặn",
"keyboard_shortcuts.boost": "đăng lại",
- "keyboard_shortcuts.column": "mở các mục",
+ "keyboard_shortcuts.column": "mở các cột",
"keyboard_shortcuts.compose": "mở khung soạn tút",
"keyboard_shortcuts.description": "Mô tả",
- "keyboard_shortcuts.direct": "mở mục nhắn riêng",
+ "keyboard_shortcuts.direct": "mở nhắn riêng",
"keyboard_shortcuts.down": "di chuyển xuống dưới danh sách",
- "keyboard_shortcuts.enter": "viết tút mới",
+ "keyboard_shortcuts.enter": "mở tút",
"keyboard_shortcuts.favourite": "thích tút",
"keyboard_shortcuts.favourites": "mở lượt thích",
"keyboard_shortcuts.federated": "mở mạng liên hợp",
"keyboard_shortcuts.heading": "Danh sách phím tắt",
- "keyboard_shortcuts.home": "mở trang chính",
+ "keyboard_shortcuts.home": "mở trang chủ",
"keyboard_shortcuts.hotkey": "Phím tắt",
"keyboard_shortcuts.legend": "hiện bảng hướng dẫn này",
"keyboard_shortcuts.local": "mở máy chủ của bạn",
"keyboard_shortcuts.mention": "nhắc đến ai đó",
"keyboard_shortcuts.muted": "mở danh sách người đã ẩn",
"keyboard_shortcuts.my_profile": "mở hồ sơ của bạn",
- "keyboard_shortcuts.notifications": "mở mục thông báo",
+ "keyboard_shortcuts.notifications": "mở thông báo",
"keyboard_shortcuts.open_media": "mở ảnh hoặc video",
- "keyboard_shortcuts.pinned": "mở danh sách tút ghim",
- "keyboard_shortcuts.profile": "mở hồ sơ của người viết tút",
+ "keyboard_shortcuts.pinned": "Open pinned posts list",
+ "keyboard_shortcuts.profile": "mở trang của người đăng tút",
"keyboard_shortcuts.reply": "trả lời",
"keyboard_shortcuts.requests": "mở danh sách yêu cầu theo dõi",
"keyboard_shortcuts.search": "mở tìm kiếm",
"keyboard_shortcuts.spoilers": "hiện/ẩn nội dung nhạy cảm",
- "keyboard_shortcuts.start": "mở mục \"Dành cho người mới\"",
- "keyboard_shortcuts.toggle_hidden": "ẩn/hiện văn bản bên dưới spoil",
+ "keyboard_shortcuts.start": "mở \"Dành cho người mới\"",
+ "keyboard_shortcuts.toggle_hidden": "ẩn/hiện nội dung ẩn",
"keyboard_shortcuts.toggle_sensitivity": "ẩn/hiện ảnh hoặc video",
- "keyboard_shortcuts.toot": "viết tút mới",
+ "keyboard_shortcuts.toot": "soạn tút mới",
"keyboard_shortcuts.unfocus": "đưa con trỏ ra khỏi ô soạn thảo hoặc ô tìm kiếm",
"keyboard_shortcuts.up": "di chuyển lên trên danh sách",
"lightbox.close": "Đóng",
@@ -404,11 +393,10 @@
"navigation_bar.blocks": "Người đã chặn",
"navigation_bar.bookmarks": "Đã lưu",
"navigation_bar.community_timeline": "Cộng đồng",
- "navigation_bar.compose": "Viết tút mới",
+ "navigation_bar.compose": "Soạn tút mới",
"navigation_bar.direct": "Nhắn riêng",
"navigation_bar.discover": "Khám phá",
"navigation_bar.domain_blocks": "Máy chủ đã ẩn",
- "navigation_bar.edit_profile": "Sửa hồ sơ",
"navigation_bar.explore": "Xu hướng",
"navigation_bar.favourites": "Lượt thích",
"navigation_bar.filters": "Bộ lọc từ ngữ",
@@ -436,7 +424,7 @@
"notification.poll": "Cuộc bình chọn đã kết thúc",
"notification.reblog": "{name} đăng lại tút của bạn",
"notification.status": "{name} đăng tút mới",
- "notification.update": "{name} đã viết lại một tút",
+ "notification.update": "{name} đã sửa tút",
"notifications.clear": "Xóa hết thông báo",
"notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?",
"notifications.column_settings.admin.report": "Báo cáo mới:",
@@ -477,7 +465,7 @@
"onboarding.action.back": "Quay lại",
"onboarding.actions.back": "Quay lại",
"onboarding.actions.go_to_explore": "Xem những gì đang thịnh hành",
- "onboarding.actions.go_to_home": "Đến trang chính",
+ "onboarding.actions.go_to_home": "Đến trang chủ",
"onboarding.compose.template": "Xin chào #Mastodon!",
"onboarding.follows.empty": "Không có kết quả có thể được hiển thị lúc này. Bạn có thể thử sử dụng tính năng tìm kiếm hoặc duyệt qua trang khám phá để tìm những người theo dõi hoặc thử lại sau.",
"onboarding.follows.lead": "Bạn quản lý bảng tin của riêng bạn. Bạn càng theo dõi nhiều người, nó sẽ càng sôi động và thú vị. Để bắt đầu, đây là vài gợi ý:",
@@ -501,7 +489,7 @@
"onboarding.start.skip": "Muốn bỏ qua luôn?",
"onboarding.start.title": "Xong rồi bạn!",
"onboarding.steps.follow_people.body": "Theo dõi những người thú vị trên Mastodon.",
- "onboarding.steps.follow_people.title": "Cá nhân hóa trang chính",
+ "onboarding.steps.follow_people.title": "Cá nhân hóa trang chủ",
"onboarding.steps.publish_status.body": "Chào cộng đồng bằng lời nói, ảnh hoặc video {emoji}",
"onboarding.steps.publish_status.title": "Đăng tút đầu tiên",
"onboarding.steps.setup_profile.body": "Tạo sự tương tác bằng một hồ sơ hoàn chỉnh.",
@@ -526,20 +514,13 @@
"poll_button.add_poll": "Tạo bình chọn",
"poll_button.remove_poll": "Hủy cuộc bình chọn",
"privacy.change": "Chọn kiểu tút",
- "privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
- "privacy.direct.short": "Nhắn riêng",
- "privacy.private.long": "Dành riêng cho người theo dõi",
- "privacy.private.short": "Chỉ người theo dõi",
- "privacy.public.long": "Hiển thị với mọi người",
"privacy.public.short": "Công khai",
- "privacy.unlisted.long": "Công khai nhưng ẩn trên bảng tin",
- "privacy.unlisted.short": "Hạn chế",
"privacy_policy.last_updated": "Cập nhật lần cuối {date}",
"privacy_policy.title": "Chính sách bảo mật",
"recommended": "Đề xuất",
"refresh": "Làm mới",
"regeneration_indicator.label": "Đang tải…",
- "regeneration_indicator.sublabel": "Trang chính của bạn đang được cập nhật!",
+ "regeneration_indicator.sublabel": "Trang chủ của bạn đang được cập nhật!",
"relative_time.days": "{number} ngày",
"relative_time.full.days": "{number, plural, other {# ngày}}",
"relative_time.full.hours": "{number, plural, other {# giờ}}",
@@ -591,7 +572,7 @@
"report.thanks.title": "Không muốn xem thứ này?",
"report.thanks.title_actionable": "Cảm ơn đã báo cáo, chúng tôi sẽ xem xét kỹ.",
"report.unfollow": "Bỏ theo dõi @{name}",
- "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trên trang chính nữa, hãy bỏ theo dõi.",
+ "report.unfollow_explanation": "Bạn đang theo dõi người này. Để không thấy tút của họ trên trang chủ nữa, hãy bỏ theo dõi.",
"report_notification.attached_statuses": "{count, plural, other {{count} tút}} đính kèm",
"report_notification.categories.legal": "Pháp lý",
"report_notification.categories.other": "Khác",
@@ -692,7 +673,7 @@
"subscribed_languages.lead": "Chỉ các tút đăng bằng các ngôn ngữ đã chọn mới được xuất hiện trên bảng tin của bạn. Không chọn gì cả để đọc tút đăng bằng mọi ngôn ngữ.",
"subscribed_languages.save": "Lưu thay đổi",
"subscribed_languages.target": "Đổi ngôn ngữ mong muốn cho {target}",
- "tabs_bar.home": "Trang chính",
+ "tabs_bar.home": "Trang chủ",
"tabs_bar.notifications": "Thông báo",
"time_remaining.days": "{number, plural, other {# ngày}}",
"time_remaining.hours": "{number, plural, other {# giờ}}",
@@ -715,10 +696,8 @@
"upload_error.poll": "Không cho phép đính kèm tập tin.",
"upload_form.audio_description": "Mô tả cho người mất thính giác",
"upload_form.description": "Mô tả cho người khiếm thị",
- "upload_form.description_missing": "Chưa thêm mô tả",
"upload_form.edit": "Biên tập",
"upload_form.thumbnail": "Đổi ảnh thumbnail",
- "upload_form.undo": "Xóa bỏ",
"upload_form.video_description": "Mô tả cho người mất thị lực hoặc không thể nghe",
"upload_modal.analyzing_picture": "Phân tích hình ảnh",
"upload_modal.apply": "Áp dụng",
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index 008a9636d..a585838cd 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -22,7 +22,6 @@
"account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
"account.unfollow": "ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ",
"account_note.placeholder": "Click to add a note",
- "autosuggest_hashtag.per_week": "{count} ⵙ ⵉⵎⴰⵍⴰⵙⵙ",
"bundle_column_error.retry": "ⴰⵍⵙ ⴰⵔⵎ",
"bundle_modal_error.close": "ⵔⴳⵍ",
"bundle_modal_error.retry": "ⴰⵍⵙ ⴰⵔⵎ",
@@ -44,9 +43,7 @@
"compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
"compose_form.lock_disclaimer.lock": "ⵉⵜⵜⵓⵔⴳⵍ",
"compose_form.placeholder": "ⵎⴰⵢⴷ ⵉⵍⵍⴰⵏ ⴳ ⵉⵅⴼ ⵏⵏⴽ?",
- "compose_form.poll.option_placeholder": "ⴰⵙⵜⵜⴰⵢ {number}",
"compose_form.publish_form": "Publish",
- "compose_form.publish_loud": "{publish}!",
"compose_form.spoiler.marked": "Text is hidden behind warning",
"compose_form.spoiler.unmarked": "Text is not hidden",
"confirmation_modal.cancel": "ⵙⵔ",
@@ -129,7 +126,6 @@
"media_gallery.toggle_visible": "ⴼⴼⵔ {number, plural, one {ⵜⴰⵡⵍⴰⴼⵜ} other {ⵜⵉⵡⵍⴰⴼⵉⵏ}}",
"navigation_bar.compose": "Compose new toot",
"navigation_bar.domain_blocks": "Hidden domains",
- "navigation_bar.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
"navigation_bar.follow_requests": "ⵜⵓⵜⵔⴰⵡⵉⵏ ⵏ ⵓⴹⴼⴰⵕ",
"navigation_bar.lists": "ⵜⵉⵍⴳⴰⵎⵉⵏ",
"navigation_bar.logout": "ⴼⴼⵖ",
@@ -161,8 +157,6 @@
"poll_button.add_poll": "ⵔⵏⵓ ⵢⴰⵏ ⵢⵉⴷⵣ",
"poll_button.remove_poll": "ⵙⵙⵉⵜⵢ ⵉⴷⵣ",
"privacy.change": "Adjust status privacy",
- "privacy.direct.short": "Direct",
- "privacy.private.short": "Followers-only",
"privacy.public.short": "ⵜⴰⴳⴷⵓⴷⴰⵏⵜ",
"regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…",
"relative_time.days": "{number}ⴰⵙ",
@@ -211,7 +205,6 @@
"upload_form.audio_description": "Describe for people with hearing loss",
"upload_form.description": "Describe for the visually impaired",
"upload_form.edit": "ⵙⵏⴼⵍ",
- "upload_form.undo": "ⴽⴽⵙ",
"upload_form.video_description": "Describe for people with hearing loss or visual impairment",
"upload_modal.choose_image": "ⴷⵖⵔ ⵜⴰⵡⵍⴰⴼⵜ",
"upload_progress.label": "Uploading…",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 575e0c7ae..9b55e51b1 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -53,7 +53,7 @@
"account.mute_notifications_short": "关闭通知",
"account.mute_short": "隐藏",
"account.muted": "已隐藏",
- "account.mutual": "互相关注",
+ "account.mutual": "互粉好友",
"account.no_bio": "未提供描述。",
"account.open_original_page": "打开原始页面",
"account.posts": "嘟文",
@@ -89,7 +89,6 @@
"announcement.announcement": "公告",
"attachments_list.unprocessed": "(未处理)",
"audio.hide": "隐藏音频",
- "autosuggest_hashtag.per_week": "每星期 {count} 条",
"boost_modal.combo": "下次按住 {combo} 即可跳过此提示",
"bundle_column_error.copy_stacktrace": "复制错误报告",
"bundle_column_error.error.body": "请求的页面无法渲染,可能是代码出现错误或浏览器存在兼容性问题。",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "想写什么?",
"compose_form.poll.add_option": "添加选项",
"compose_form.poll.duration": "投票期限",
+ "compose_form.poll.multiple": "多选",
"compose_form.poll.option_placeholder": "选项 {number}",
- "compose_form.poll.remove_option": "移除此选项",
+ "compose_form.poll.remove_option": "删除此选项",
+ "compose_form.poll.single": "单选",
"compose_form.poll.switch_to_multiple": "将投票改为多选",
"compose_form.poll.switch_to_single": "将投票改为单选",
+ "compose_form.poll.type": "样式",
"compose_form.publish": "发布",
"compose_form.publish_form": "发布",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "保存更改",
- "compose_form.sensitive.hide": "标记媒体为敏感内容",
- "compose_form.sensitive.marked": "媒体已被标记为敏感内容",
- "compose_form.sensitive.unmarked": "媒体未被标记为敏感内容",
+ "compose_form.reply": "回复",
+ "compose_form.save_changes": "更新",
"compose_form.spoiler.marked": "移除内容警告",
"compose_form.spoiler.unmarked": "添加内容警告",
- "compose_form.spoiler_placeholder": "写下你的警告",
+ "compose_form.spoiler_placeholder": "内容警告 (可选)",
"confirmation_modal.cancel": "取消",
"confirmations.block.block_and_report": "屏蔽与举报",
"confirmations.block.confirm": "屏蔽",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "私下提及",
"navigation_bar.discover": "发现",
"navigation_bar.domain_blocks": "已屏蔽的域名",
- "navigation_bar.edit_profile": "修改个人资料",
"navigation_bar.explore": "探索",
"navigation_bar.favourites": "喜欢",
"navigation_bar.filters": "忽略的关键词",
@@ -446,7 +444,7 @@
"notifications.column_settings.filter_bar.advanced": "显示所有类别",
"notifications.column_settings.filter_bar.category": "快速过滤栏",
"notifications.column_settings.filter_bar.show_bar": "显示过滤栏",
- "notifications.column_settings.follow": "新关注者:",
+ "notifications.column_settings.follow": "新粉丝:",
"notifications.column_settings.follow_request": "新关注请求:",
"notifications.column_settings.mention": "提及:",
"notifications.column_settings.poll": "投票结果:",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "发起投票",
"poll_button.remove_poll": "移除投票",
"privacy.change": "设置嘟文的可见范围",
- "privacy.direct.long": "只有被提及的用户能看到",
- "privacy.direct.short": "仅提到的人",
- "privacy.private.long": "仅对关注者可见",
- "privacy.private.short": "仅关注者可见",
- "privacy.public.long": "所有人可见",
+ "privacy.direct.long": "帖子中提到的每个人",
+ "privacy.direct.short": "具体的人",
+ "privacy.private.long": "仅限您的关注者",
+ "privacy.private.short": "关注者",
+ "privacy.public.long": "所有Mastodon内外的人",
"privacy.public.short": "公开",
- "privacy.unlisted.long": "所有人可见,但不在探索功能出现",
- "privacy.unlisted.short": "不公开",
+ "privacy.unlisted.additional": "该模式的行为与“公开”完全相同,只是帖子不会出现在实时动态、话题标签、探索或 Mastodon 搜索中,即使你已在账户级设置中选择加入。",
+ "privacy.unlisted.long": "减少算法影响",
+ "privacy.unlisted.short": "悄悄公开",
"privacy_policy.last_updated": "最近更新于 {date}",
"privacy_policy.title": "隐私政策",
"recommended": "推荐",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number} 分钟前",
"relative_time.seconds": "{number} 秒前",
"relative_time.today": "今天",
+ "reply_indicator.attachments": "{count, plural, other {# 个附件}}",
"reply_indicator.cancel": "取消",
+ "reply_indicator.poll": "投票",
"report.block": "屏蔽",
"report.block_explanation": "你将无法看到他们的嘟文。他们也将无法看到你的嘟文或关注你。他们将能够判断出他们被屏蔽了。",
"report.categories.legal": "法律义务",
@@ -700,7 +701,7 @@
"time_remaining.moments": "即将结束",
"time_remaining.seconds": "剩余 {number, plural, one {# 秒} other {# 秒}}",
"timeline_hint.remote_resource_not_displayed": "不会显示来自其它服务器的{resource}",
- "timeline_hint.resources.followers": "关注者",
+ "timeline_hint.resources.followers": "粉丝",
"timeline_hint.resources.follows": "关注",
"timeline_hint.resources.statuses": "更早的嘟文",
"trends.counter_by_accounts": "过去 {days, plural, other {{days} 天}}有{count, plural, other { {counter} 人}}讨论",
@@ -715,10 +716,8 @@
"upload_error.poll": "投票中不允许上传文件。",
"upload_form.audio_description": "为听障人士添加文字描述",
"upload_form.description": "为视觉障碍人士添加文字说明",
- "upload_form.description_missing": "未添加描述",
"upload_form.edit": "编辑",
"upload_form.thumbnail": "更改缩略图",
- "upload_form.undo": "删除",
"upload_form.video_description": "为听障人士和视障人士添加文字描述",
"upload_modal.analyzing_picture": "分析图片…",
"upload_modal.apply": "应用",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index cd0845b6e..5890c4df4 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -89,7 +89,6 @@
"announcement.announcement": "公告",
"attachments_list.unprocessed": "(未處理)",
"audio.hide": "隱藏音訊",
- "autosuggest_hashtag.per_week": "每週 {count} 次",
"boost_modal.combo": "你下次可以按 {combo} 來跳過",
"bundle_column_error.copy_stacktrace": "複製錯誤報告",
"bundle_column_error.error.body": "無法提供請求的頁面。這可能是因為代碼出現錯誤或瀏覽器出現兼容問題。",
@@ -146,22 +145,22 @@
"compose_form.lock_disclaimer": "你的用戶狀態沒有{locked},任何人都能立即關注你,然後看到「只有關注者能看」的文章。",
"compose_form.lock_disclaimer.lock": "鎖定",
"compose_form.placeholder": "你在想甚麼?",
- "compose_form.poll.add_option": "新增選擇",
+ "compose_form.poll.add_option": "新增選項",
"compose_form.poll.duration": "投票期限",
- "compose_form.poll.option_placeholder": "第 {number} 個選擇",
- "compose_form.poll.remove_option": "移除此選擇",
+ "compose_form.poll.multiple": "多選",
+ "compose_form.poll.option_placeholder": "選項 {number}",
+ "compose_form.poll.remove_option": "移除此選項",
+ "compose_form.poll.single": "選擇一個",
"compose_form.poll.switch_to_multiple": "變更投票為允許多個選項",
"compose_form.poll.switch_to_single": "變更投票為限定單一選項",
+ "compose_form.poll.type": "風格",
"compose_form.publish": "發佈",
"compose_form.publish_form": "發佈",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "儲存變更",
- "compose_form.sensitive.hide": "標記媒體為敏感內容",
- "compose_form.sensitive.marked": "媒體被標示為敏感",
- "compose_form.sensitive.unmarked": "媒體沒有被標示為敏感",
+ "compose_form.reply": "回覆",
+ "compose_form.save_changes": "更新",
"compose_form.spoiler.marked": "文字被警告隱藏",
"compose_form.spoiler.unmarked": "文字沒有被隱藏",
- "compose_form.spoiler_placeholder": "敏感警告訊息",
+ "compose_form.spoiler_placeholder": "內容警告 (選用)",
"confirmation_modal.cancel": "取消",
"confirmations.block.block_and_report": "封鎖並檢舉",
"confirmations.block.confirm": "封鎖",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "私人提及",
"navigation_bar.discover": "探索",
"navigation_bar.domain_blocks": "封鎖的服務站",
- "navigation_bar.edit_profile": "修改個人資料",
"navigation_bar.explore": "探索",
"navigation_bar.favourites": "最愛",
"navigation_bar.filters": "靜音詞彙",
@@ -526,14 +524,15 @@
"poll_button.add_poll": "建立投票",
"poll_button.remove_poll": "移除投票",
"privacy.change": "調整私隱設定",
- "privacy.direct.long": "只有提及的使用者能看到",
- "privacy.direct.short": "僅限提及的人",
- "privacy.private.long": "只有你的關注者能看到",
- "privacy.private.short": "僅限追隨者",
- "privacy.public.long": "對所有人可見",
+ "privacy.direct.long": "帖文提及的人",
+ "privacy.direct.short": "特定的人",
+ "privacy.private.long": "只有你的追蹤者",
+ "privacy.private.short": "追蹤者",
+ "privacy.public.long": "Mastodon 內外的任何人",
"privacy.public.short": "公共",
- "privacy.unlisted.long": "對所有人可見,但不包括探索功能",
- "privacy.unlisted.short": "公開",
+ "privacy.unlisted.additional": "這與公開完全相同,但是你的帖文不會顯示在即時動態、標籤、探索和 Mastodon 的搜尋結果中,即使你的帳戶啟用了相關設定也好。",
+ "privacy.unlisted.long": "較少用演算法宣傳",
+ "privacy.unlisted.short": "半公開",
"privacy_policy.last_updated": "最後更新 {date}",
"privacy_policy.title": "私隱政策",
"recommended": "推薦",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number}分鐘前",
"relative_time.seconds": "{number}秒前",
"relative_time.today": "今天",
+ "reply_indicator.attachments": "{count, plural, one {# 附件} other {# 附件}}",
"reply_indicator.cancel": "取消",
+ "reply_indicator.poll": "投票",
"report.block": "封鎖",
"report.block_explanation": "你將不會看到他們的帖文。他們將無法看到你的帖文或追隨你。他們將發現自己被封鎖了。",
"report.categories.legal": "法律",
@@ -715,10 +716,8 @@
"upload_error.poll": "不允許在投票上傳檔案。",
"upload_form.audio_description": "簡單描述內容給聽障人士",
"upload_form.description": "為視覺障礙人士添加文字說明",
- "upload_form.description_missing": "沒有加入描述",
"upload_form.edit": "編輯",
"upload_form.thumbnail": "更改預覽圖",
- "upload_form.undo": "刪除",
"upload_form.video_description": "簡單描述給聽障或視障人士",
"upload_modal.analyzing_picture": "正在分析圖片…",
"upload_modal.apply": "套用",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 998393695..c365e67e0 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -48,7 +48,7 @@
"account.locked_info": "此帳號的隱私狀態設定為鎖定。該擁有者會手動審核能跟隨此帳號的人。",
"account.media": "媒體",
"account.mention": "提及 @{name}",
- "account.moved_to": "{name} 現在的新帳號為:",
+ "account.moved_to": "{name} 目前的新帳號為:",
"account.mute": "靜音 @{name}",
"account.mute_notifications_short": "靜音推播通知",
"account.mute_short": "靜音",
@@ -59,7 +59,7 @@
"account.posts": "嘟文",
"account.posts_with_replies": "嘟文與回覆",
"account.report": "檢舉 @{name}",
- "account.requested": "正在等待核准。按一下以取消跟隨請求",
+ "account.requested": "正在等候審核。按一下以取消跟隨請求",
"account.requested_follow": "{name} 要求跟隨您",
"account.share": "分享 @{name} 的個人檔案",
"account.show_reblogs": "顯示來自 @{name} 的嘟文",
@@ -84,12 +84,11 @@
"admin.impact_report.title": "影響總結",
"alert.rate_limited.message": "請於 {retry_time, time, medium} 後重試。",
"alert.rate_limited.title": "已限速",
- "alert.unexpected.message": "發生了非預期的錯誤。",
+ "alert.unexpected.message": "發生非預期的錯誤。",
"alert.unexpected.title": "哎呀!",
"announcement.announcement": "公告",
"attachments_list.unprocessed": "(未經處理)",
"audio.hide": "隱藏音訊",
- "autosuggest_hashtag.per_week": "{count} / 週",
"boost_modal.combo": "下次您可以按 {combo} 跳過",
"bundle_column_error.copy_stacktrace": "複製錯誤報告",
"bundle_column_error.error.body": "無法繪製請求的頁面。這可能是因為我們程式碼中的臭蟲或是瀏覽器的相容問題。",
@@ -148,20 +147,20 @@
"compose_form.placeholder": "正在想些什麼嗎?",
"compose_form.poll.add_option": "新增選項",
"compose_form.poll.duration": "投票期限",
- "compose_form.poll.option_placeholder": "第 {number} 個選項",
+ "compose_form.poll.multiple": "多選",
+ "compose_form.poll.option_placeholder": "選項 {number}",
"compose_form.poll.remove_option": "移除此選項",
+ "compose_form.poll.single": "選擇一個",
"compose_form.poll.switch_to_multiple": "變更投票為允許多個選項",
"compose_form.poll.switch_to_single": "變更投票為允許單一選項",
- "compose_form.publish": "嘟出去",
+ "compose_form.poll.type": "投票方式",
+ "compose_form.publish": "發嘟",
"compose_form.publish_form": "嘟出去",
- "compose_form.publish_loud": "{publish}!",
- "compose_form.save_changes": "儲存變更",
- "compose_form.sensitive.hide": "{count, plural, other {將媒體標記為敏感內容}}",
- "compose_form.sensitive.marked": "此媒體被標記為敏感內容",
- "compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容",
+ "compose_form.reply": "回覆",
+ "compose_form.save_changes": "更新",
"compose_form.spoiler.marked": "移除內容警告",
"compose_form.spoiler.unmarked": "新增內容警告",
- "compose_form.spoiler_placeholder": "請於此處填寫內容警告訊息",
+ "compose_form.spoiler_placeholder": "內容警告 (可選的)",
"confirmation_modal.cancel": "取消",
"confirmations.block.block_and_report": "封鎖並檢舉",
"confirmations.block.confirm": "封鎖",
@@ -241,7 +240,7 @@
"empty_column.followed_tags": "您還沒有跟隨任何主題標籤。當您跟隨主題標籤時,它們將於此顯示。",
"empty_column.hashtag": "這個主題標籤下什麼也沒有。",
"empty_column.home": "您的首頁時間軸是空的!跟隨更多人來將它填滿吧!",
- "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出了新的嘟文時,它們將顯示於此。",
+ "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出新的嘟文時,它們將顯示於此。",
"empty_column.lists": "您還沒有建立任何列表。當您建立列表時,它將於此顯示。",
"empty_column.mutes": "您尚未靜音任何使用者。",
"empty_column.notifications": "您還沒有收到任何通知,當您與別人開始互動時,它將於此顯示。",
@@ -303,8 +302,8 @@
"hashtag.counter_by_accounts": "{count, plural, one {{counter} 名} other {{counter} 名}}參與者",
"hashtag.counter_by_uses": "{count, plural, one {{counter} 則} other {{counter} 則}}嘟文",
"hashtag.counter_by_uses_today": "本日有 {count, plural, one {{counter} 則} other {{counter} 則}}嘟文",
- "hashtag.follow": "追蹤主題標籤",
- "hashtag.unfollow": "取消追蹤主題標籤",
+ "hashtag.follow": "跟隨主題標籤",
+ "hashtag.unfollow": "取消跟隨主題標籤",
"hashtags.and_other": "…及其他 {count, plural, other {# 個}}",
"home.actions.go_to_explore": "看看發生什麼新鮮事",
"home.actions.go_to_suggestions": "尋找一些人來跟隨",
@@ -408,7 +407,6 @@
"navigation_bar.direct": "私訊",
"navigation_bar.discover": "探索",
"navigation_bar.domain_blocks": "已封鎖網域",
- "navigation_bar.edit_profile": "編輯個人檔案",
"navigation_bar.explore": "探索",
"navigation_bar.favourites": "最愛",
"navigation_bar.filters": "已靜音的關鍵字",
@@ -526,13 +524,14 @@
"poll_button.add_poll": "建立投票",
"poll_button.remove_poll": "移除投票",
"privacy.change": "調整嘟文隱私狀態",
- "privacy.direct.long": "只有被提及的使用者能看到",
- "privacy.direct.short": "僅限提及者",
- "privacy.private.long": "只有跟隨您的使用者能看到",
- "privacy.private.short": "僅限跟隨者",
- "privacy.public.long": "對所有人可見",
+ "privacy.direct.long": "此嘟文提及之所有人",
+ "privacy.direct.short": "指定使用者",
+ "privacy.private.long": "只有跟隨您的人能看到",
+ "privacy.private.short": "跟隨者",
+ "privacy.public.long": "所有人 (無論在 Mastodon 上與否)",
"privacy.public.short": "公開",
- "privacy.unlisted.long": "對所有人可見,但選擇退出探索功能",
+ "privacy.unlisted.additional": "此與公開嘟文完全相同,但嘟文不會出現於即時內容或主題標籤、探索、及 Mastodon 搜尋中,即使您在帳戶設定中選擇加入。",
+ "privacy.unlisted.long": "悄然無聲",
"privacy.unlisted.short": "不公開",
"privacy_policy.last_updated": "最後更新:{date}",
"privacy_policy.title": "隱私權政策",
@@ -551,7 +550,9 @@
"relative_time.minutes": "{number} 分鐘前",
"relative_time.seconds": "{number} 秒",
"relative_time.today": "今天",
+ "reply_indicator.attachments": "{count, plural, other {# 個附加檔案}}",
"reply_indicator.cancel": "取消",
+ "reply_indicator.poll": "投票",
"report.block": "封鎖",
"report.block_explanation": "您將不再看到他們的嘟文。他們將無法看到您的嘟文或是跟隨您。他們會發現他們已被封鎖。",
"report.categories.legal": "合法性",
@@ -715,10 +716,8 @@
"upload_error.poll": "不允許於投票時上傳檔案。",
"upload_form.audio_description": "為聽障人士增加文字說明",
"upload_form.description": "為視障人士增加文字說明",
- "upload_form.description_missing": "沒有任何描述",
"upload_form.edit": "編輯",
"upload_form.thumbnail": "更改預覽圖",
- "upload_form.undo": "刪除",
"upload_form.video_description": "為聽障或視障人士增加文字說明",
"upload_modal.analyzing_picture": "正在分析圖片…",
"upload_modal.apply": "套用",
diff --git a/app/javascript/mastodon/reducers/accounts.ts b/app/javascript/mastodon/reducers/accounts.ts
index f7270eb60..5a9cc7220 100644
--- a/app/javascript/mastodon/reducers/accounts.ts
+++ b/app/javascript/mastodon/reducers/accounts.ts
@@ -1,7 +1,6 @@
+import type { Reducer } from '@reduxjs/toolkit';
import { Map as ImmutableMap } from 'immutable';
-import type { Reducer } from 'redux';
-
import {
followAccountSuccess,
unfollowAccountSuccess,
@@ -60,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/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index 6b8df0fc0..7540bf81a 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -7,7 +7,6 @@ import {
COMPOSE_REPLY,
COMPOSE_REPLY_CANCEL,
COMPOSE_QUOTE,
- COMPOSE_QUOTE_CANCEL,
COMPOSE_DIRECT,
COMPOSE_MENTION,
COMPOSE_SUBMIT_REQUEST,
@@ -42,9 +41,7 @@ import {
COMPOSE_RESET,
COMPOSE_POLL_ADD,
COMPOSE_POLL_REMOVE,
- COMPOSE_POLL_OPTION_ADD,
COMPOSE_POLL_OPTION_CHANGE,
- COMPOSE_POLL_OPTION_REMOVE,
COMPOSE_POLL_SETTINGS_CHANGE,
INIT_MEDIA_EDIT_MODAL,
COMPOSE_CHANGE_MEDIA_DESCRIPTION,
@@ -299,6 +296,18 @@ const updateSuggestionTags = (state, token) => {
});
};
+const updatePoll = (state, index, value) => state.updateIn(['poll', 'options'], options => {
+ const tmp = options.set(index, value).filterNot(x => x.trim().length === 0);
+
+ if (tmp.size === 0) {
+ return tmp.push('').push('');
+ } else if (tmp.size < 4) {
+ return tmp.push('');
+ }
+
+ return tmp;
+});
+
export default function compose(state = initialState, action) {
switch(action.type) {
case STORE_HYDRATE:
@@ -387,7 +396,6 @@ export default function compose(state = initialState, action) {
case COMPOSE_UPLOAD_CHANGE_REQUEST:
return state.set('is_changing_upload', true);
case COMPOSE_REPLY_CANCEL:
- case COMPOSE_QUOTE_CANCEL:
case COMPOSE_RESET:
case COMPOSE_SUBMIT_SUCCESS:
return clearAll(state);
@@ -520,6 +528,8 @@ export default function compose(state = initialState, action) {
map.set('id', action.status.get('id'));
map.set('text', action.text);
map.set('in_reply_to', action.status.get('in_reply_to_id'));
+ map.set('quote_from', action.status.getIn(['quote', 'id']));
+ map.set('quote_from_url', action.status.getIn(['quote', 'url']));
map.set('privacy', action.status.get('visibility'));
map.set('media_attachments', action.status.get('media_attachments'));
map.set('focusDate', new Date());
@@ -548,12 +558,8 @@ export default function compose(state = initialState, action) {
return state.set('poll', initialPoll);
case COMPOSE_POLL_REMOVE:
return state.set('poll', null);
- case COMPOSE_POLL_OPTION_ADD:
- return state.updateIn(['poll', 'options'], options => options.push(action.title));
case COMPOSE_POLL_OPTION_CHANGE:
- return state.setIn(['poll', 'options', action.index], action.title);
- case COMPOSE_POLL_OPTION_REMOVE:
- return state.updateIn(['poll', 'options'], options => options.delete(action.index));
+ return updatePoll(state, action.index, action.title);
case COMPOSE_POLL_SETTINGS_CHANGE:
return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple));
case COMPOSE_LANGUAGE_CHANGE:
diff --git a/app/javascript/mastodon/reducers/modal.ts b/app/javascript/mastodon/reducers/modal.ts
index 73a2afb91..368f26542 100644
--- a/app/javascript/mastodon/reducers/modal.ts
+++ b/app/javascript/mastodon/reducers/modal.ts
@@ -1,6 +1,5 @@
-import { Record as ImmutableRecord, Stack } from 'immutable';
-
import type { Reducer } from '@reduxjs/toolkit';
+import { Record as ImmutableRecord, Stack } from 'immutable';
import { COMPOSE_UPLOAD_CHANGE_SUCCESS } from '../actions/compose';
import type { ModalType } from '../actions/modal';
diff --git a/app/javascript/mastodon/reducers/relationships.ts b/app/javascript/mastodon/reducers/relationships.ts
index 2ba61839c..dcca11b20 100644
--- a/app/javascript/mastodon/reducers/relationships.ts
+++ b/app/javascript/mastodon/reducers/relationships.ts
@@ -1,7 +1,6 @@
-import { Map as ImmutableMap } from 'immutable';
-
import { isFulfilled } from '@reduxjs/toolkit';
-import type { Reducer } from 'redux';
+import type { Reducer } from '@reduxjs/toolkit';
+import { Map as ImmutableMap } from 'immutable';
import type { ApiRelationshipJSON } from 'mastodon/api_types/relationships';
import type { Account } from 'mastodon/models/account';
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index a605ecbb8..0e353e0d1 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -104,7 +104,7 @@ const initialState = ImmutableMap({
dismissed_banners: ImmutableMap({
'public_timeline': false,
'community_timeline': false,
- 'home.explore_prompt': false,
+ 'home/follow-suggestions': false,
'explore/links': false,
'explore/statuses': false,
'explore/tags': false,
diff --git a/app/javascript/mastodon/reducers/suggestions.js b/app/javascript/mastodon/reducers/suggestions.js
index 0f224ff4b..5b9d983de 100644
--- a/app/javascript/mastodon/reducers/suggestions.js
+++ b/app/javascript/mastodon/reducers/suggestions.js
@@ -28,12 +28,12 @@ export default function suggestionsReducer(state = initialState, action) {
case SUGGESTIONS_FETCH_FAIL:
return state.set('isLoading', false);
case SUGGESTIONS_DISMISS:
- return state.update('items', list => list.filterNot(x => x.account === action.id));
+ return state.update('items', list => list.filterNot(x => x.get('account') === action.id));
case blockAccountSuccess.type:
case muteAccountSuccess.type:
- return state.update('items', list => list.filterNot(x => x.account === action.payload.relationship.id));
+ return state.update('items', list => list.filterNot(x => x.get('account') === action.payload.relationship.id));
case blockDomainSuccess.type:
- return state.update('items', list => list.filterNot(x => action.payload.accounts.includes(x.account)));
+ return state.update('items', list => list.filterNot(x => action.payload.accounts.includes(x.get('account'))));
default:
return state;
}
diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js
index 43dedd6e6..4c9ab98a8 100644
--- a/app/javascript/mastodon/reducers/timelines.js
+++ b/app/javascript/mastodon/reducers/timelines.js
@@ -17,6 +17,9 @@ import {
TIMELINE_DISCONNECT,
TIMELINE_LOAD_PENDING,
TIMELINE_MARK_AS_PARTIAL,
+ TIMELINE_INSERT,
+ TIMELINE_GAP,
+ TIMELINE_SUGGESTIONS,
} from '../actions/timelines';
import { compareId } from '../compare_id';
@@ -32,6 +35,8 @@ const initialTimeline = ImmutableMap({
items: ImmutableList(),
});
+const isPlaceholder = value => value === TIMELINE_GAP || value === TIMELINE_SUGGESTIONS;
+
const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, isLoadingRecent, usePendingItems) => {
// This method is pretty tricky because:
// - existing items in the timeline might be out of order
@@ -63,20 +68,20 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is
// First, find the furthest (if properly sorted, oldest) item in the timeline that is
// newer than the oldest fetched one, as it's most likely that it delimits the gap.
// Start the gap *after* that item.
- const lastIndex = oldIds.findLastIndex(id => id !== null && compareId(id, newIds.last()) >= 0) + 1;
+ const lastIndex = oldIds.findLastIndex(id => !isPlaceholder(id) && compareId(id, newIds.last()) >= 0) + 1;
// Then, try to find the furthest (if properly sorted, oldest) item in the timeline that
// is newer than the most recent fetched one, as it delimits a section comprised of only
// items older or within `newIds` (or that were deleted from the server, so should be removed
// anyway).
// Stop the gap *after* that item.
- const firstIndex = oldIds.take(lastIndex).findLastIndex(id => id !== null && compareId(id, newIds.first()) > 0) + 1;
+ const firstIndex = oldIds.take(lastIndex).findLastIndex(id => !isPlaceholder(id) && compareId(id, newIds.first()) > 0) + 1;
let insertedIds = ImmutableOrderedSet(newIds).withMutations(insertedIds => {
// It is possible, though unlikely, that the slice we are replacing contains items older
// than the elements we got from the API. Get them and add them back at the back of the
// slice.
- const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => id !== null && compareId(id, newIds.last()) < 0);
+ const olderIds = oldIds.slice(firstIndex, lastIndex).filter(id => !isPlaceholder(id) && compareId(id, newIds.last()) < 0);
insertedIds.union(olderIds);
// Make sure we aren't inserting duplicates
@@ -84,8 +89,8 @@ const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, is
}).toList();
// Finally, insert a gap marker if the data is marked as partial by the server
- if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== null)) {
- insertedIds = insertedIds.unshift(null);
+ if (isPartial && (firstIndex === 0 || oldIds.get(firstIndex - 1) !== TIMELINE_GAP)) {
+ insertedIds = insertedIds.unshift(TIMELINE_GAP);
}
return oldIds.take(firstIndex).concat(
@@ -178,7 +183,7 @@ const reconnectTimeline = (state, usePendingItems) => {
}
return state.withMutations(mMap => {
- mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items);
+ mMap.update(usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items);
mMap.set('online', true);
});
};
@@ -213,7 +218,7 @@ export default function timelines(state = initialState, action) {
return state.update(
action.timeline,
initialTimeline,
- map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items),
+ map => map.set('online', false).update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(TIMELINE_GAP) : items),
);
case TIMELINE_MARK_AS_PARTIAL:
return state.update(
@@ -221,6 +226,18 @@ export default function timelines(state = initialState, action) {
initialTimeline,
map => map.set('isPartial', true).set('items', ImmutableList()).set('pendingItems', ImmutableList()).set('unread', 0),
);
+ case TIMELINE_INSERT:
+ return state.update(
+ action.timeline,
+ initialTimeline,
+ map => map.update('items', ImmutableList(), list => {
+ if (!list.includes(action.key)) {
+ return list.insert(action.index, action.key);
+ }
+
+ return list;
+ })
+ );
default:
return state;
}
diff --git a/app/javascript/mastodon/selectors/accounts.ts b/app/javascript/mastodon/selectors/accounts.ts
index 66193136c..cee3a87bc 100644
--- a/app/javascript/mastodon/selectors/accounts.ts
+++ b/app/javascript/mastodon/selectors/accounts.ts
@@ -1,5 +1,5 @@
+import { createSelector } from '@reduxjs/toolkit';
import { Record as ImmutableRecord } from 'immutable';
-import { createSelector } from 'reselect';
import { accountDefaultValues } from 'mastodon/models/account';
import type { Account, AccountShape } from 'mastodon/models/account';
diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js
index 6b8d0fd13..81aae4fa1 100644
--- a/app/javascript/mastodon/selectors/index.js
+++ b/app/javascript/mastodon/selectors/index.js
@@ -1,5 +1,5 @@
+import { createSelector } from '@reduxjs/toolkit';
import { List as ImmutableList, Map as ImmutableMap } from 'immutable';
-import { createSelector } from 'reselect';
import { toServerSideType } from 'mastodon/utils/filters';
diff --git a/app/javascript/mastodon/store/middlewares/errors.ts b/app/javascript/mastodon/store/middlewares/errors.ts
index 9f28f5ff5..e11aa7817 100644
--- a/app/javascript/mastodon/store/middlewares/errors.ts
+++ b/app/javascript/mastodon/store/middlewares/errors.ts
@@ -1,20 +1,34 @@
-import type { AnyAction, Middleware } from 'redux';
+import { isAction } from '@reduxjs/toolkit';
+import type { Action, Middleware } from '@reduxjs/toolkit';
import type { RootState } from '..';
import { showAlertForError } from '../../actions/alerts';
const defaultFailSuffix = 'FAIL';
+const isFailedAction = new RegExp(`${defaultFailSuffix}$`, 'g');
-export const errorsMiddleware: Middleware =
+interface ActionWithMaybeAlertParams extends Action {
+ skipAlert?: boolean;
+ skipNotFound?: boolean;
+ error?: unknown;
+}
+
+function isActionWithmaybeAlertParams(
+ action: unknown,
+): action is ActionWithMaybeAlertParams {
+ return isAction(action);
+}
+
+export const errorsMiddleware: Middleware, RootState> =
({ dispatch }) =>
(next) =>
- (action: AnyAction & { skipAlert?: boolean; skipNotFound?: boolean }) => {
- if (action.type && !action.skipAlert) {
- const isFail = new RegExp(`${defaultFailSuffix}$`, 'g');
-
- if (typeof action.type === 'string' && action.type.match(isFail)) {
- dispatch(showAlertForError(action.error, action.skipNotFound));
- }
+ (action) => {
+ if (
+ isActionWithmaybeAlertParams(action) &&
+ !action.skipAlert &&
+ action.type.match(isFailedAction)
+ ) {
+ dispatch(showAlertForError(action.error, action.skipNotFound));
}
return next(action);
diff --git a/app/javascript/mastodon/store/middlewares/loading_bar.ts b/app/javascript/mastodon/store/middlewares/loading_bar.ts
index 83056ee49..d259be899 100644
--- a/app/javascript/mastodon/store/middlewares/loading_bar.ts
+++ b/app/javascript/mastodon/store/middlewares/loading_bar.ts
@@ -3,9 +3,11 @@ import {
isPending as isThunkActionPending,
isFulfilled as isThunkActionFulfilled,
isRejected as isThunkActionRejected,
+ isAction,
} from '@reduxjs/toolkit';
+import type { Middleware, UnknownAction } from '@reduxjs/toolkit';
+
import { showLoading, hideLoading } from 'react-redux-loading-bar';
-import type { AnyAction, Middleware } from 'redux';
import type { RootState } from '..';
@@ -19,14 +21,28 @@ const defaultTypeSuffixes: Config['promiseTypeSuffixes'] = [
'REJECTED',
];
+interface ActionWithSkipLoading extends UnknownAction {
+ skipLoading: boolean;
+}
+
+function isActionWithSkipLoading(
+ action: unknown,
+): action is ActionWithSkipLoading {
+ return (
+ isAction(action) &&
+ 'skipLoading' in action &&
+ typeof action.skipLoading === 'boolean'
+ );
+}
+
export const loadingBarMiddleware = (
config: Config = {},
-): Middleware => {
+): Middleware<{ skipLoading?: boolean }, RootState> => {
const promiseTypeSuffixes = config.promiseTypeSuffixes ?? defaultTypeSuffixes;
return ({ dispatch }) =>
(next) =>
- (action: AnyAction) => {
+ (action) => {
let isPending = false;
let isFulfilled = false;
let isRejected = false;
@@ -39,7 +55,7 @@ export const loadingBarMiddleware = (
else if (isThunkActionFulfilled(action)) isFulfilled = true;
else if (isThunkActionRejected(action)) isRejected = true;
} else if (
- action.type &&
+ isActionWithSkipLoading(action) &&
!action.skipLoading &&
typeof action.type === 'string'
) {
diff --git a/app/javascript/mastodon/store/middlewares/sounds.ts b/app/javascript/mastodon/store/middlewares/sounds.ts
index 09ade7d75..51839f427 100644
--- a/app/javascript/mastodon/store/middlewares/sounds.ts
+++ b/app/javascript/mastodon/store/middlewares/sounds.ts
@@ -1,4 +1,5 @@
-import type { Middleware, AnyAction } from 'redux';
+import { isAction } from '@reduxjs/toolkit';
+import type { Middleware, UnknownAction } from '@reduxjs/toolkit';
import ready from 'mastodon/ready';
import { assetHost } from 'mastodon/utils/config';
@@ -10,6 +11,21 @@ interface AudioSource {
type: string;
}
+interface ActionWithMetaSound extends UnknownAction {
+ meta: { sound: string };
+}
+
+function isActionWithMetaSound(action: unknown): action is ActionWithMetaSound {
+ return (
+ isAction(action) &&
+ 'meta' in action &&
+ typeof action.meta === 'object' &&
+ !!action.meta &&
+ 'sound' in action.meta &&
+ typeof action.meta.sound === 'string'
+ );
+}
+
const createAudio = (sources: AudioSource[]) => {
const audio = new Audio();
sources.forEach(({ type, src }) => {
@@ -34,7 +50,10 @@ const play = (audio: HTMLAudioElement) => {
void audio.play();
};
-export const soundsMiddleware = (): Middleware => {
+export const soundsMiddleware = (): Middleware<
+ Record,
+ RootState
+> => {
const soundCache: Record = {};
void ready(() => {
@@ -50,15 +69,15 @@ export const soundsMiddleware = (): Middleware => {
]);
});
- return () =>
- (next) =>
- (action: AnyAction & { meta?: { sound?: string } }) => {
- const sound = action.meta?.sound;
+ return () => (next) => (action) => {
+ if (isActionWithMetaSound(action)) {
+ const sound = action.meta.sound;
if (sound && Object.hasOwn(soundCache, sound)) {
play(soundCache[sound]);
}
+ }
- return next(action);
- };
+ return next(action);
+ };
};
diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts
index f1e71385a..4859b8265 100644
--- a/app/javascript/mastodon/store/typed_functions.ts
+++ b/app/javascript/mastodon/store/typed_functions.ts
@@ -1,12 +1,11 @@
-import type { TypedUseSelectorHook } from 'react-redux';
-import { useDispatch, useSelector } from 'react-redux';
-
import { createAsyncThunk } from '@reduxjs/toolkit';
+// eslint-disable-next-line @typescript-eslint/no-restricted-imports
+import { useDispatch, useSelector } from 'react-redux';
import type { AppDispatch, RootState } from './store';
-export const useAppDispatch: () => AppDispatch = useDispatch;
-export const useAppSelector: TypedUseSelectorHook = useSelector;
+export const useAppDispatch = useDispatch.withTypes();
+export const useAppSelector = useSelector.withTypes();
export const createAppAsyncThunk = createAsyncThunk.withTypes<{
state: RootState;
diff --git a/app/javascript/material-icons/400-24px/account_circle-fill.svg b/app/javascript/material-icons/400-24px/account_circle-fill.svg
new file mode 100644
index 000000000..1bf9d57a3
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/account_circle-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/account_circle.svg b/app/javascript/material-icons/400-24px/account_circle.svg
new file mode 100644
index 000000000..ce59194be
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/account_circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/add-fill.svg b/app/javascript/material-icons/400-24px/add-fill.svg
new file mode 100644
index 000000000..f8bc9309c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/add-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/add.svg b/app/javascript/material-icons/400-24px/add.svg
new file mode 100644
index 000000000..f8bc9309c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/add_photo_alternate-fill.svg b/app/javascript/material-icons/400-24px/add_photo_alternate-fill.svg
new file mode 100644
index 000000000..deb3f8e0d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/add_photo_alternate-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/add_photo_alternate.svg b/app/javascript/material-icons/400-24px/add_photo_alternate.svg
new file mode 100644
index 000000000..0ae8ad841
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/add_photo_alternate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/alternate_email-fill.svg b/app/javascript/material-icons/400-24px/alternate_email-fill.svg
new file mode 100644
index 000000000..7648cf975
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/alternate_email-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/alternate_email.svg b/app/javascript/material-icons/400-24px/alternate_email.svg
new file mode 100644
index 000000000..7648cf975
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/alternate_email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_back-fill.svg b/app/javascript/material-icons/400-24px/arrow_back-fill.svg
new file mode 100644
index 000000000..cba0c8b2a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_back-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_back.svg b/app/javascript/material-icons/400-24px/arrow_back.svg
new file mode 100644
index 000000000..cba0c8b2a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_back.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_drop_down-fill.svg b/app/javascript/material-icons/400-24px/arrow_drop_down-fill.svg
new file mode 100644
index 000000000..48c72546d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_drop_down-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_drop_down.svg b/app/javascript/material-icons/400-24px/arrow_drop_down.svg
new file mode 100644
index 000000000..48c72546d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_drop_down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_right_alt-fill.svg b/app/javascript/material-icons/400-24px/arrow_right_alt-fill.svg
new file mode 100644
index 000000000..4bf73bb6d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_right_alt-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/arrow_right_alt.svg b/app/javascript/material-icons/400-24px/arrow_right_alt.svg
new file mode 100644
index 000000000..4bf73bb6d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/arrow_right_alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/bar_chart_4_bars-fill.svg b/app/javascript/material-icons/400-24px/bar_chart_4_bars-fill.svg
new file mode 100644
index 000000000..63215a3e0
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/bar_chart_4_bars-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/bar_chart_4_bars.svg b/app/javascript/material-icons/400-24px/bar_chart_4_bars.svg
new file mode 100644
index 000000000..63215a3e0
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/bar_chart_4_bars.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/block-fill.svg b/app/javascript/material-icons/400-24px/block-fill.svg
new file mode 100644
index 000000000..20e9889ae
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/block-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/block.svg b/app/javascript/material-icons/400-24px/block.svg
new file mode 100644
index 000000000..20e9889ae
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/block.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/bookmark-fill.svg b/app/javascript/material-icons/400-24px/bookmark-fill.svg
new file mode 100644
index 000000000..3a7b4d2e8
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/bookmark-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/bookmark.svg b/app/javascript/material-icons/400-24px/bookmark.svg
new file mode 100644
index 000000000..a8226a6d8
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/bookmark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/bookmarks-fill.svg b/app/javascript/material-icons/400-24px/bookmarks-fill.svg
new file mode 100644
index 000000000..f5231f925
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/bookmarks-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/bookmarks.svg b/app/javascript/material-icons/400-24px/bookmarks.svg
new file mode 100644
index 000000000..67dffd685
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/bookmarks.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/campaign-fill.svg b/app/javascript/material-icons/400-24px/campaign-fill.svg
new file mode 100644
index 000000000..3df7275bf
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/campaign-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/campaign.svg b/app/javascript/material-icons/400-24px/campaign.svg
new file mode 100644
index 000000000..a6d893fed
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/campaign.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/cancel-fill.svg b/app/javascript/material-icons/400-24px/cancel-fill.svg
new file mode 100644
index 000000000..f7d476f25
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/cancel-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/cancel.svg b/app/javascript/material-icons/400-24px/cancel.svg
new file mode 100644
index 000000000..8504fbfda
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/cancel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/cancel_presentation-fill.svg b/app/javascript/material-icons/400-24px/cancel_presentation-fill.svg
new file mode 100644
index 000000000..8e8e6a1ee
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/cancel_presentation-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/cancel_presentation.svg b/app/javascript/material-icons/400-24px/cancel_presentation.svg
new file mode 100644
index 000000000..c0da419cd
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/cancel_presentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/check-fill.svg b/app/javascript/material-icons/400-24px/check-fill.svg
new file mode 100644
index 000000000..1655d12bf
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/check-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/check.svg b/app/javascript/material-icons/400-24px/check.svg
new file mode 100644
index 000000000..1655d12bf
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/check.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/check_box_outline_blank-fill.svg b/app/javascript/material-icons/400-24px/check_box_outline_blank-fill.svg
new file mode 100644
index 000000000..3f7df315a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/check_box_outline_blank-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/check_box_outline_blank.svg b/app/javascript/material-icons/400-24px/check_box_outline_blank.svg
new file mode 100644
index 000000000..3f7df315a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/check_box_outline_blank.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/chevron_left-fill.svg b/app/javascript/material-icons/400-24px/chevron_left-fill.svg
new file mode 100644
index 000000000..53783746a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/chevron_left-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/chevron_left.svg b/app/javascript/material-icons/400-24px/chevron_left.svg
new file mode 100644
index 000000000..53783746a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/chevron_left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/chevron_right-fill.svg b/app/javascript/material-icons/400-24px/chevron_right-fill.svg
new file mode 100644
index 000000000..410046736
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/chevron_right-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/chevron_right.svg b/app/javascript/material-icons/400-24px/chevron_right.svg
new file mode 100644
index 000000000..410046736
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/chevron_right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/close-fill.svg b/app/javascript/material-icons/400-24px/close-fill.svg
new file mode 100644
index 000000000..5a60c58e7
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/close-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/close.svg b/app/javascript/material-icons/400-24px/close.svg
new file mode 100644
index 000000000..5a60c58e7
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/content_copy-fill.svg b/app/javascript/material-icons/400-24px/content_copy-fill.svg
new file mode 100644
index 000000000..dabf09450
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/content_copy-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/content_copy.svg b/app/javascript/material-icons/400-24px/content_copy.svg
new file mode 100644
index 000000000..d875c8449
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/content_copy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/delete-fill.svg b/app/javascript/material-icons/400-24px/delete-fill.svg
new file mode 100644
index 000000000..59d1abb8b
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/delete-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/delete.svg b/app/javascript/material-icons/400-24px/delete.svg
new file mode 100644
index 000000000..560d174b9
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/delete.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/delete_forever-fill.svg b/app/javascript/material-icons/400-24px/delete_forever-fill.svg
new file mode 100644
index 000000000..40fe4497f
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/delete_forever-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/delete_forever.svg b/app/javascript/material-icons/400-24px/delete_forever.svg
new file mode 100644
index 000000000..763f517d1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/delete_forever.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/description-fill.svg b/app/javascript/material-icons/400-24px/description-fill.svg
new file mode 100644
index 000000000..07998b29d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/description-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/description.svg b/app/javascript/material-icons/400-24px/description.svg
new file mode 100644
index 000000000..309a4f5b3
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/description.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/done-fill.svg b/app/javascript/material-icons/400-24px/done-fill.svg
new file mode 100644
index 000000000..1655d12bf
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/done-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/done.svg b/app/javascript/material-icons/400-24px/done.svg
new file mode 100644
index 000000000..1655d12bf
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/done.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/done_all-fill.svg b/app/javascript/material-icons/400-24px/done_all-fill.svg
new file mode 100644
index 000000000..8f05228c4
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/done_all-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/done_all.svg b/app/javascript/material-icons/400-24px/done_all.svg
new file mode 100644
index 000000000..8f05228c4
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/done_all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/download-fill.svg b/app/javascript/material-icons/400-24px/download-fill.svg
new file mode 100644
index 000000000..6a171ea82
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/download-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/download.svg b/app/javascript/material-icons/400-24px/download.svg
new file mode 100644
index 000000000..6a171ea82
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/edit-fill.svg b/app/javascript/material-icons/400-24px/edit-fill.svg
new file mode 100644
index 000000000..278e79978
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/edit-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/edit.svg b/app/javascript/material-icons/400-24px/edit.svg
new file mode 100644
index 000000000..cb81b1130
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/edit_note-fill.svg b/app/javascript/material-icons/400-24px/edit_note-fill.svg
new file mode 100644
index 000000000..b18db1df8
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/edit_note-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/edit_note.svg b/app/javascript/material-icons/400-24px/edit_note.svg
new file mode 100644
index 000000000..cf7e98405
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/edit_note.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/expand_more-fill.svg b/app/javascript/material-icons/400-24px/expand_more-fill.svg
new file mode 100644
index 000000000..0c8f27359
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/expand_more-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/expand_more.svg b/app/javascript/material-icons/400-24px/expand_more.svg
new file mode 100644
index 000000000..0c8f27359
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/expand_more.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/find_in_page-fill.svg b/app/javascript/material-icons/400-24px/find_in_page-fill.svg
new file mode 100644
index 000000000..146f838a2
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/find_in_page-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/find_in_page.svg b/app/javascript/material-icons/400-24px/find_in_page.svg
new file mode 100644
index 000000000..f21c2786c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/find_in_page.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/flag-fill.svg b/app/javascript/material-icons/400-24px/flag-fill.svg
new file mode 100644
index 000000000..e44a94d90
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/flag-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/flag.svg b/app/javascript/material-icons/400-24px/flag.svg
new file mode 100644
index 000000000..cb4c810e0
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/flag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/format_quote-fill.svg b/app/javascript/material-icons/400-24px/format_quote-fill.svg
new file mode 100644
index 000000000..f4afa3ed1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/format_quote-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/format_quote.svg b/app/javascript/material-icons/400-24px/format_quote.svg
new file mode 100644
index 000000000..c354385ea
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/format_quote.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/fullscreen-fill.svg b/app/javascript/material-icons/400-24px/fullscreen-fill.svg
new file mode 100644
index 000000000..940c878a7
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/fullscreen-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/fullscreen.svg b/app/javascript/material-icons/400-24px/fullscreen.svg
new file mode 100644
index 000000000..940c878a7
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/fullscreen_exit-fill.svg b/app/javascript/material-icons/400-24px/fullscreen_exit-fill.svg
new file mode 100644
index 000000000..d9d45a6c6
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/fullscreen_exit-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/fullscreen_exit.svg b/app/javascript/material-icons/400-24px/fullscreen_exit.svg
new file mode 100644
index 000000000..d9d45a6c6
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/fullscreen_exit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/group-fill.svg b/app/javascript/material-icons/400-24px/group-fill.svg
new file mode 100644
index 000000000..c0d6cef5c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/group-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/group.svg b/app/javascript/material-icons/400-24px/group.svg
new file mode 100644
index 000000000..dbc2c937e
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/group.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/home-fill.svg b/app/javascript/material-icons/400-24px/home-fill.svg
new file mode 100644
index 000000000..e25441638
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/home-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/home.svg b/app/javascript/material-icons/400-24px/home.svg
new file mode 100644
index 000000000..d700ddea7
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/home.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/info-fill.svg b/app/javascript/material-icons/400-24px/info-fill.svg
new file mode 100644
index 000000000..0232e17ad
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/info-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/info.svg b/app/javascript/material-icons/400-24px/info.svg
new file mode 100644
index 000000000..05606f4e5
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/insert_chart-fill.svg b/app/javascript/material-icons/400-24px/insert_chart-fill.svg
new file mode 100644
index 000000000..12d137ca8
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/insert_chart-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/insert_chart.svg b/app/javascript/material-icons/400-24px/insert_chart.svg
new file mode 100644
index 000000000..4f2a10be5
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/insert_chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/link-fill.svg b/app/javascript/material-icons/400-24px/link-fill.svg
new file mode 100644
index 000000000..319a0681c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/link-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/link.svg b/app/javascript/material-icons/400-24px/link.svg
new file mode 100644
index 000000000..319a0681c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/list_alt-fill.svg b/app/javascript/material-icons/400-24px/list_alt-fill.svg
new file mode 100644
index 000000000..6aa8b5082
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/list_alt-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/list_alt.svg b/app/javascript/material-icons/400-24px/list_alt.svg
new file mode 100644
index 000000000..cca8ab195
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/list_alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/lock-fill.svg b/app/javascript/material-icons/400-24px/lock-fill.svg
new file mode 100644
index 000000000..0815d7841
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/lock-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/lock.svg b/app/javascript/material-icons/400-24px/lock.svg
new file mode 100644
index 000000000..20b9e3984
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/lock_open-fill.svg b/app/javascript/material-icons/400-24px/lock_open-fill.svg
new file mode 100644
index 000000000..60309dce5
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/lock_open-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/lock_open.svg b/app/javascript/material-icons/400-24px/lock_open.svg
new file mode 100644
index 000000000..824c70b7c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/lock_open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/logout-fill.svg b/app/javascript/material-icons/400-24px/logout-fill.svg
new file mode 100644
index 000000000..488145350
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/logout-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/logout.svg b/app/javascript/material-icons/400-24px/logout.svg
new file mode 100644
index 000000000..488145350
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/logout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/menu-fill.svg b/app/javascript/material-icons/400-24px/menu-fill.svg
new file mode 100644
index 000000000..2f427e91c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/menu-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/menu.svg b/app/javascript/material-icons/400-24px/menu.svg
new file mode 100644
index 000000000..2f427e91c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/mood-fill.svg b/app/javascript/material-icons/400-24px/mood-fill.svg
new file mode 100644
index 000000000..9480d0fb9
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/mood-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/mood.svg b/app/javascript/material-icons/400-24px/mood.svg
new file mode 100644
index 000000000..46cafa768
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/mood.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/more_horiz-fill.svg b/app/javascript/material-icons/400-24px/more_horiz-fill.svg
new file mode 100644
index 000000000..e77715489
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/more_horiz-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/more_horiz.svg b/app/javascript/material-icons/400-24px/more_horiz.svg
new file mode 100644
index 000000000..e77715489
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/more_horiz.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/music_note-fill.svg b/app/javascript/material-icons/400-24px/music_note-fill.svg
new file mode 100644
index 000000000..b10ad1921
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/music_note-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/music_note.svg b/app/javascript/material-icons/400-24px/music_note.svg
new file mode 100644
index 000000000..b10ad1921
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/music_note.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/navigate_before-fill.svg b/app/javascript/material-icons/400-24px/navigate_before-fill.svg
new file mode 100644
index 000000000..53783746a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/navigate_before-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/navigate_before.svg b/app/javascript/material-icons/400-24px/navigate_before.svg
new file mode 100644
index 000000000..53783746a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/navigate_before.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/navigate_next-fill.svg b/app/javascript/material-icons/400-24px/navigate_next-fill.svg
new file mode 100644
index 000000000..410046736
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/navigate_next-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/navigate_next.svg b/app/javascript/material-icons/400-24px/navigate_next.svg
new file mode 100644
index 000000000..410046736
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/navigate_next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/notifications-fill.svg b/app/javascript/material-icons/400-24px/notifications-fill.svg
new file mode 100644
index 000000000..0730efefc
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/notifications-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/notifications.svg b/app/javascript/material-icons/400-24px/notifications.svg
new file mode 100644
index 000000000..dbfe0e040
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/notifications.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/notifications_active-fill.svg b/app/javascript/material-icons/400-24px/notifications_active-fill.svg
new file mode 100644
index 000000000..856a0ed8a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/notifications_active-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/notifications_active.svg b/app/javascript/material-icons/400-24px/notifications_active.svg
new file mode 100644
index 000000000..1389a10e0
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/notifications_active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/open_in_new-fill.svg b/app/javascript/material-icons/400-24px/open_in_new-fill.svg
new file mode 100644
index 000000000..42895ffd1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/open_in_new-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/open_in_new.svg b/app/javascript/material-icons/400-24px/open_in_new.svg
new file mode 100644
index 000000000..42895ffd1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/open_in_new.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/pause-fill.svg b/app/javascript/material-icons/400-24px/pause-fill.svg
new file mode 100644
index 000000000..fc9a8074d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/pause-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/pause.svg b/app/javascript/material-icons/400-24px/pause.svg
new file mode 100644
index 000000000..95bc792fc
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/pause.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/person-fill.svg b/app/javascript/material-icons/400-24px/person-fill.svg
new file mode 100644
index 000000000..73ef1efc1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/person-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/person.svg b/app/javascript/material-icons/400-24px/person.svg
new file mode 100644
index 000000000..a3f6b246c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/person.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/person_add-fill.svg b/app/javascript/material-icons/400-24px/person_add-fill.svg
new file mode 100644
index 000000000..3fa7f6528
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/person_add-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/person_add.svg b/app/javascript/material-icons/400-24px/person_add.svg
new file mode 100644
index 000000000..39b592bf0
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/person_add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/photo_library-fill.svg b/app/javascript/material-icons/400-24px/photo_library-fill.svg
new file mode 100644
index 000000000..e68aec832
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/photo_library-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/photo_library.svg b/app/javascript/material-icons/400-24px/photo_library.svg
new file mode 100644
index 000000000..3b22224b8
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/photo_library.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/play_arrow-fill.svg b/app/javascript/material-icons/400-24px/play_arrow-fill.svg
new file mode 100644
index 000000000..6465b9022
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/play_arrow-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/play_arrow.svg b/app/javascript/material-icons/400-24px/play_arrow.svg
new file mode 100644
index 000000000..52f0fcc9c
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/play_arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/public-fill.svg b/app/javascript/material-icons/400-24px/public-fill.svg
new file mode 100644
index 000000000..1e9e79de4
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/public-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/public.svg b/app/javascript/material-icons/400-24px/public.svg
new file mode 100644
index 000000000..1e9e79de4
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/public.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/push_pin-fill.svg b/app/javascript/material-icons/400-24px/push_pin-fill.svg
new file mode 100644
index 000000000..6095ba77e
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/push_pin-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/push_pin.svg b/app/javascript/material-icons/400-24px/push_pin.svg
new file mode 100644
index 000000000..e1abd900a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/push_pin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/quiet_time-fill.svg b/app/javascript/material-icons/400-24px/quiet_time-fill.svg
new file mode 100644
index 000000000..aed5740db
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/quiet_time-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/quiet_time.svg b/app/javascript/material-icons/400-24px/quiet_time.svg
new file mode 100644
index 000000000..552da6658
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/quiet_time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/rectangle-fill.svg b/app/javascript/material-icons/400-24px/rectangle-fill.svg
new file mode 100644
index 000000000..64b038f26
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/rectangle-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/rectangle.svg b/app/javascript/material-icons/400-24px/rectangle.svg
new file mode 100644
index 000000000..ada92f2cf
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/rectangle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/refresh-fill.svg b/app/javascript/material-icons/400-24px/refresh-fill.svg
new file mode 100644
index 000000000..a7a6bc801
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/refresh-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/refresh.svg b/app/javascript/material-icons/400-24px/refresh.svg
new file mode 100644
index 000000000..a7a6bc801
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/refresh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/repeat-fill.svg b/app/javascript/material-icons/400-24px/repeat-fill.svg
new file mode 100644
index 000000000..c1b09d802
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/repeat-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/repeat.svg b/app/javascript/material-icons/400-24px/repeat.svg
new file mode 100644
index 000000000..c1b09d802
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/repeat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/reply-fill.svg b/app/javascript/material-icons/400-24px/reply-fill.svg
new file mode 100644
index 000000000..eb661f282
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/reply-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/reply.svg b/app/javascript/material-icons/400-24px/reply.svg
new file mode 100644
index 000000000..eb661f282
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/reply.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/reply_all-fill.svg b/app/javascript/material-icons/400-24px/reply_all-fill.svg
new file mode 100644
index 000000000..74c9573ea
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/reply_all-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/reply_all.svg b/app/javascript/material-icons/400-24px/reply_all.svg
new file mode 100644
index 000000000..74c9573ea
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/reply_all.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/search-fill.svg b/app/javascript/material-icons/400-24px/search-fill.svg
new file mode 100644
index 000000000..ef0d0521e
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/search-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/search.svg b/app/javascript/material-icons/400-24px/search.svg
new file mode 100644
index 000000000..ef0d0521e
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/settings-fill.svg b/app/javascript/material-icons/400-24px/settings-fill.svg
new file mode 100644
index 000000000..f13347950
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/settings-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/settings.svg b/app/javascript/material-icons/400-24px/settings.svg
new file mode 100644
index 000000000..817c782f0
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/share-fill.svg b/app/javascript/material-icons/400-24px/share-fill.svg
new file mode 100644
index 000000000..5a6b0d0a8
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/share-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/share.svg b/app/javascript/material-icons/400-24px/share.svg
new file mode 100644
index 000000000..6876cd42d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/share.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/smart_toy-fill.svg b/app/javascript/material-icons/400-24px/smart_toy-fill.svg
new file mode 100644
index 000000000..df417f5ff
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/smart_toy-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/smart_toy.svg b/app/javascript/material-icons/400-24px/smart_toy.svg
new file mode 100644
index 000000000..b84efc73b
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/smart_toy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/star-fill.svg b/app/javascript/material-icons/400-24px/star-fill.svg
new file mode 100644
index 000000000..cb2231e63
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/star-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/star.svg b/app/javascript/material-icons/400-24px/star.svg
new file mode 100644
index 000000000..1736e085d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/tag-fill.svg b/app/javascript/material-icons/400-24px/tag-fill.svg
new file mode 100644
index 000000000..ce76d537b
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/tag-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/tag.svg b/app/javascript/material-icons/400-24px/tag.svg
new file mode 100644
index 000000000..ce76d537b
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/tag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/translate-fill.svg b/app/javascript/material-icons/400-24px/translate-fill.svg
new file mode 100644
index 000000000..ecaaf37f1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/translate-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/translate.svg b/app/javascript/material-icons/400-24px/translate.svg
new file mode 100644
index 000000000..ecaaf37f1
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/translate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/tune-fill.svg b/app/javascript/material-icons/400-24px/tune-fill.svg
new file mode 100644
index 000000000..887f8bd49
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/tune-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/tune.svg b/app/javascript/material-icons/400-24px/tune.svg
new file mode 100644
index 000000000..887f8bd49
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/tune.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/upload_file-fill.svg b/app/javascript/material-icons/400-24px/upload_file-fill.svg
new file mode 100644
index 000000000..639d77af3
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/upload_file-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/upload_file.svg b/app/javascript/material-icons/400-24px/upload_file.svg
new file mode 100644
index 000000000..40ce5b65e
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/upload_file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/visibility-fill.svg b/app/javascript/material-icons/400-24px/visibility-fill.svg
new file mode 100644
index 000000000..44b5f4c60
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/visibility-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/visibility.svg b/app/javascript/material-icons/400-24px/visibility.svg
new file mode 100644
index 000000000..8fe45d09a
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/visibility.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/visibility_off-fill.svg b/app/javascript/material-icons/400-24px/visibility_off-fill.svg
new file mode 100644
index 000000000..e21fbd88d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/visibility_off-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/visibility_off.svg b/app/javascript/material-icons/400-24px/visibility_off.svg
new file mode 100644
index 000000000..d98cf8d94
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/visibility_off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/volume_off-fill.svg b/app/javascript/material-icons/400-24px/volume_off-fill.svg
new file mode 100644
index 000000000..b3d12d4d9
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/volume_off-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/volume_off.svg b/app/javascript/material-icons/400-24px/volume_off.svg
new file mode 100644
index 000000000..a0acf6374
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/volume_off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/volume_up-fill.svg b/app/javascript/material-icons/400-24px/volume_up-fill.svg
new file mode 100644
index 000000000..dd5771215
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/volume_up-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/volume_up.svg b/app/javascript/material-icons/400-24px/volume_up.svg
new file mode 100644
index 000000000..fd9006a6d
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/volume_up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/warning-fill.svg b/app/javascript/material-icons/400-24px/warning-fill.svg
new file mode 100644
index 000000000..c3727d3f5
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/warning-fill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/400-24px/warning.svg b/app/javascript/material-icons/400-24px/warning.svg
new file mode 100644
index 000000000..238299e60
--- /dev/null
+++ b/app/javascript/material-icons/400-24px/warning.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/javascript/material-icons/LICENSE b/app/javascript/material-icons/LICENSE
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/app/javascript/material-icons/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/app/javascript/material-icons/README.md b/app/javascript/material-icons/README.md
new file mode 100644
index 000000000..1479cb225
--- /dev/null
+++ b/app/javascript/material-icons/README.md
@@ -0,0 +1 @@
+Files in this directory are Material Symbols icons fetched using the `icons:download` task.
diff --git a/app/javascript/packs/inert.js b/app/javascript/packs/inert.js
new file mode 100644
index 000000000..7c04a97fa
--- /dev/null
+++ b/app/javascript/packs/inert.js
@@ -0,0 +1,4 @@
+/* Placeholder file to have `inert.scss` compiled by Webpack
+ This is used by the `wicg-inert` polyfill */
+
+import '../styles/inert.scss';
diff --git a/app/javascript/packs/share.jsx b/app/javascript/packs/share.jsx
index 0f3b84549..7b5723091 100644
--- a/app/javascript/packs/share.jsx
+++ b/app/javascript/packs/share.jsx
@@ -13,10 +13,12 @@ function loaded() {
if (mountNode) {
const attr = mountNode.getAttribute('data-props');
- if(!attr) return;
+
+ if (!attr) return;
const props = JSON.parse(attr);
const root = createRoot(mountNode);
+
root.render();
}
}
diff --git a/app/javascript/styles/contrast/diff.scss b/app/javascript/styles/contrast/diff.scss
index 1c2386f02..ae607f484 100644
--- a/app/javascript/styles/contrast/diff.scss
+++ b/app/javascript/styles/contrast/diff.scss
@@ -1,20 +1,7 @@
-.compose-form {
- .compose-form__modifiers {
- .compose-form__upload {
- &-description {
- input {
- &::placeholder {
- opacity: 1;
- }
- }
- }
- }
- }
-}
-
.status__content a,
-.link-footer a,
.reply-indicator__content a,
+.edit-indicator__content a,
+.link-footer a,
.status__content__read-more-button,
.status__content__translate-button {
text-decoration: underline;
@@ -42,7 +29,9 @@
}
}
-.status__content a {
+.status__content a,
+.reply-indicator__content a,
+.edit-indicator__content a {
color: $highlight-text-color;
}
@@ -50,24 +39,10 @@
color: $darker-text-color;
}
-.compose-form__poll-wrapper .button.button-secondary,
-.compose-form .autosuggest-textarea__textarea::placeholder,
-.compose-form .spoiler-input__input::placeholder,
-.report-dialog-modal__textarea::placeholder,
-.language-dropdown__dropdown__results__item__common-name,
-.compose-form .icon-button {
+.report-dialog-modal__textarea::placeholder {
color: $inverted-text-color;
}
-.text-icon-button.active {
- color: $ui-highlight-color;
-}
-
-.language-dropdown__dropdown__results__item.active {
- background: $ui-highlight-color;
- font-weight: 500;
-}
-
.link-button:disabled {
cursor: not-allowed;
diff --git a/app/javascript/styles/fonts/inter.scss b/app/javascript/styles/fonts/inter.scss
new file mode 100644
index 000000000..bb4899b70
--- /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/public/inert.css b/app/javascript/styles/inert.scss
similarity index 78%
rename from public/inert.css
rename to app/javascript/styles/inert.scss
index 54e10616d..a60045d7b 100644
--- a/public/inert.css
+++ b/app/javascript/styles/inert.scss
@@ -1,3 +1,5 @@
+/* This is needed for the wicg-inert polyfill */
+
[inert] {
pointer-events: none;
cursor: default;
diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss
index 92d00cae8..a2cbb494b 100644
--- a/app/javascript/styles/mailer.scss
+++ b/app/javascript/styles/mailer.scss
@@ -1,574 +1,620 @@
-@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%;
-}
-
-.email-body {
- td,
- div,
- a,
- span {
- line-height: inherit;
- }
-}
-
-a {
- &,
- &:visited,
- span {
- text-decoration: none;
- color: $ui-highlight-color;
- }
-
- #outlook & {
- padding: 0;
- }
-}
-
-img {
- outline: none;
- border: 0;
- text-decoration: none;
- -ms-interpolation-mode: bicubic;
- clear: both;
- line-height: 100%;
-}
-
-table {
- border-spacing: 0;
- mso-table-lspace: 0;
- mso-table-rspace: 0;
-}
-
-td {
- vertical-align: top;
-}
-
-.auto-dir {
- p {
- unicode-bidi: plaintext;
- }
-
- a {
- unicode-bidi: isolate;
- }
-}
-
-.email-table,
-.content-section,
-.column,
-.column-cell {
- width: 100%;
- min-width: 100%;
-}
-
-.email-body {
- font-size: 0 !important;
- line-height: 100%;
- text-align: center;
- padding-left: 16px;
- padding-right: 16px;
-}
-
-.email-start {
- padding-top: 32px;
-}
-
-.email-end {
- padding-bottom: 32px;
-}
-
-.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;
-}
-
-.content-cell {
- 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-container {
- max-width: 632px;
- margin: 0 auto;
- text-align: center;
-}
-
-.email-row {
- display: block;
- max-width: 600px !important;
- margin: 0 auto;
- text-align: center;
- clear: both;
-}
-
-.col-0 {
- max-width: 50px;
-}
-
-.col-1 {
- max-width: 100px;
-}
-
-.col-2 {
- max-width: 200px;
-}
-
-.col-3 {
- max-width: 300px;
-}
-
-.col-4 {
- max-width: 400px;
-}
-
-.col-5 {
- max-width: 500px;
-}
-
-.col-6 {
- max-width: 600px;
-}
-
-.column-cell,
-.column-cell td,
-p {
- font-family: Helvetica, Arial, sans-serif;
-
- @media only screen {
- font-family: $font-sans-serif, sans-serif !important;
- }
-}
-
-.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;
- }
-
- &.lead {
- font-size: 19px;
- line-height: 27px;
- }
+ -webkit-text-size-adjust: none;
+ text-size-adjust: none;
}
+p,
h1,
h2,
h3,
h4,
h5,
h6 {
- color: $ui-secondary-color;
- margin-left: 0;
- margin-right: 0;
- margin-top: 20px;
- margin-bottom: 8px;
+ margin: 0;
+ background-color: transparent;
padding: 0;
- font-weight: 500;
+ border: none;
+ font-family: Inter, 'Lucida Grande', sans-serif;
}
-h1 {
- font-size: 26px;
- line-height: 36px;
+img {
+ max-width: 100%;
+ height: auto;
+ border: none;
+ text-indent: 0;
+ vertical-align: middle;
+ color: inherit;
+ font-family: inherit;
}
-h2 {
- font-size: 23px;
- line-height: 30px;
+table {
+ border: none;
}
-h3 {
- font-size: 19px;
- line-height: 25px;
+table + p {
+ margin-top: 16px;
}
-h5 {
- font-size: 16px;
- line-height: 21px;
- font-weight: 700;
- color: lighten($ui-base-color, 34%);
+.email {
+ min-width: 280px;
+ font-family: Inter, 'Lucida Grande', sans-serif;
+ word-break: break-word;
+ color: #17063b;
+ background-color: #f3f2f5;
}
-.input-cell {
- h5 {
- margin-top: 4px;
- }
-}
-
-.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;
- }
-}
-
-.content-cell,
-.blank-cell {
+.email-container {
+ max-width: 740px;
+ margin: 0 auto;
width: 100%;
- font-size: 0;
- text-align: center;
- vertical-align: top;
- padding-left: 16px;
- padding-right: 16px;
}
-.content-cell {
- background-color: darken($ui-base-color, 4%);
-
- &.darker {
- background-color: darken($ui-base-color, 8%);
- }
+// Outer email card
+.email-card-table {
+ border-collapse: collapse;
+ width: 100%;
}
-.hero {
- background-color: $ui-base-color;
- padding-top: 20px;
+.email-card-td {
+ overflow: hidden;
+ box-shadow: 0 4px 16px 0 rgba(23, 6, 59, 4%);
+ background-color: #fff;
}
-.hero-with-button {
- padding-bottom: 16px;
-
- h1 {
- margin-bottom: 4px;
- }
-
- p.lead {
- margin-bottom: 32px;
- }
+// Inner email card
+.email-inner-card-table {
+ border-collapse: separate;
+ width: 100%;
+ border-radius: 12px;
}
-.header {
- border-radius: 5px 5px 0 0;
- background-color: darken($ui-base-color, 8%);
-
- .column-cell {
- text-align: center;
- padding-top: 20px;
- padding-bottom: 8px;
- }
+.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;
}
-.content-start {
- padding-top: 32px;
+.email-inner-card-td {
+ padding: 24px;
}
-.content-end {
- border-radius: 0 0 5px 5px;
- padding-top: 16px;
+// Account
+.email-account-banner-table {
+ background-color: #f3f2f5;
+ border-top-left-radius: 12px;
+ border-top-right-radius: 12px;
}
-.footer {
- .column-cell,
- p {
- color: lighten($ui-base-color, 34%);
- }
+.email-account-banner-td {
+ border-top-left-radius: 12px;
+ border-top-right-radius: 12px;
+ height: 140px;
+ vertical-align: bottom;
+ background-position: center !important;
+ background-size: cover !important;
+}
- p {
- margin-bottom: 0;
- font-size: 13px;
+.email-account-banner-inner-td {
+ padding: 24px 24px 0;
+ mso-padding-alt: 24px;
+}
- &.small {
- margin-bottom: 0;
- }
- }
+.email-account-banner-overlap-div {
+ max-height: 42px;
+}
- a {
- color: lighten($ui-base-color, 34%);
- text-decoration: underline;
- }
+.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 {
- opacity: 0.3;
- }
-}
-
-.logo {
- position: relative;
- left: -4px;
-}
-
-.button {
- display: table;
- margin-left: auto;
- margin-right: auto;
-
- 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;
- }
-
- a {
- padding: 10px 22px !important;
- line-height: 26px !important;
- font-weight: 500 !important;
- }
- }
-
- &.button-small {
- td {
- border-radius: 4px;
- font-size: 14px;
- padding: 8px 16px;
-
- a {
- padding: 5px 16px !important;
- line-height: 26px !important;
- }
- }
- }
-}
-
-.button-default {
- background-color: darken($ui-base-color, 8%);
-}
-
-.button-primary {
- background-color: darken($ui-highlight-color, 3%);
-}
-
-.text-center {
- text-align: center;
-}
-
-.text-right {
- text-align: right;
-}
-
-.padded {
- padding-left: 16px;
- padding-right: 16px;
-}
-
-.padded-bottom {
- padding-bottom: 32px;
-}
-
-.margin-bottom {
- margin-bottom: 20px;
-}
-
-.hero-icon {
- width: 64px;
-
- td {
- text-align: center;
- vertical-align: middle;
- line-height: 100%;
- mso-line-height-rule: exactly;
- padding: 16px;
- border-radius: 80px;
- background: $success-green;
- }
-
- &.warning-icon td {
- background: $gold-star;
- }
-
- &.alert-icon td {
- background: $error-red;
- }
-
- img {
- max-width: 32px;
- width: 32px;
- height: 32px;
display: block;
- line-height: 100%;
+ max-width: 100%;
+ border: none;
+ border-radius: 6px;
}
}
-.hr {
- width: 100%;
+.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 {
- 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%);
+ padding-right: 16px;
+ font-size: 14px;
+ line-height: 20px;
+ color: #746a89;
+ }
+
+ b {
+ font-weight: 600;
+ color: #17063b;
+ }
+
+ span {
+ white-space: nowrap;
}
}
-.status {
- padding-bottom: 32px;
-
- &--highlighted {
- border: 1px solid lighten($ui-base-color, 8%);
- border-radius: 4px;
- padding-bottom: 16px;
- margin-bottom: 16px;
- }
-
- .status-header {
- td {
- font-size: 14px;
- padding-bottom: 15px;
- }
-
- bdi {
- color: $white;
- font-size: 16px;
- display: block;
- font-weight: 500;
- }
-
- td:first-child {
- padding-right: 10px;
- }
-
- img {
- width: 48px;
- height: 48px;
- border-radius: 4px;
- }
- }
+// Utility classes
+.email-w-full {
+ width: 100%;
+}
+.email-prose {
p {
- font-size: 19px;
- margin-bottom: 20px;
+ color: #17063b;
+ font-size: 14px;
+ line-height: 20px;
- &.status-footer {
- color: lighten($ui-base-color, 26%);
- font-size: 14px;
- margin-bottom: 0;
+ &:not(:last-child) {
+ margin-bottom: 16px;
+ }
- a {
- color: lighten($ui-base-color, 26%);
+ a:not([class]) {
+ color: #6364ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #563acc !important;
}
}
}
}
-.border-top {
- border-top: 1px solid lighten($ui-base-color, 8%);
+.email-padding-24 {
+ padding: 24px;
}
-ul {
- padding-left: 15px;
- margin-top: 0;
- margin-bottom: 0;
+.email-padding-top-24 {
+ padding-top: 24px;
+}
+
+.email-padding-top-16 {
padding-top: 16px;
-
- li {
- margin-bottom: 16px;
- color: lighten($ui-base-color, 26%);
-
- span {
- color: $ui-primary-color;
- }
- }
}
-ul.rules-list {
+.email-padding-top-0 {
padding-top: 0;
}
-@media only screen and (device-width >= 768px) and (device-width <= 1024px) and (orientation: landscape) {
- body {
- min-height: 1024px !important;
+.email-border-top {
+ border-top: 1px solid #dfdee3;
+}
+
+.email-border-bottom {
+ border-bottom: 1px solid #dfdee3;
+}
+
+// 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;
+}
+
+.email-header-logo-table {
+ width: auto;
+ margin: 0;
+}
+
+.email-header-logo-td {
+ padding: 16px 0;
+ font-size: 0;
+
+ img {
+ color: #fff;
+ font-size: 16px;
+ font-weight: bold;
+ max-height: 40px;
}
}
-@media (width <= 697px) {
- .email-container,
- .col-1,
- .col-2,
- .col-3,
- .col-4,
- .col-5,
- .col-6 {
- width: 100% !important;
- max-width: none !important;
- }
+.email-header-logo-a {
+ display: inline-block;
- .email-start {
- padding-top: 16px !important;
- }
-
- .email-end {
- padding-bottom: 16px !important;
- }
-
- .padded {
- padding-left: 0 !important;
- padding-right: 0 !important;
+ img {
+ display: inline-block;
+ color: #fff;
+ }
+}
+
+.email-header-logo-div {
+ max-height: 0;
+}
+
+.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;
+}
+
+.email-header-logo-span {
+ display: block;
+ text-align: right;
+}
+
+.email-header-heading-td {
+ padding: 16px 0;
+}
+
+.email-header-heading-img-td {
+ width: 56px;
+ text-align: left;
+ vertical-align: top;
+
+ img {
+ width: 56px;
+ height: 56px;
+ border-radius: 12px;
+ }
+}
+
+.email-header-heading-txt-td {
+ vertical-align: middle;
+ padding-left: 16px;
+ padding-right: 16px;
+
+ h1 {
+ margin-bottom: 5px;
+ color: #fff;
+ font-size: 24px;
+ line-height: 28px;
+ font-weight: 600;
+ }
+
+ p {
+ color: #a399a5;
+ font-size: 18px;
+ line-height: 21.6px;
+ font-weight: 500;
+ }
+
+ &:only-child {
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+
+// 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;
+}
+
+.email-header-after-inside-div {
+ height: 30px;
+ background-color: #1b001f;
+}
+
+// Body content
+.email-body-td {
+ background-image: url('../images/mailer-new/common/header-bg-end.png');
+ background-position: left top;
+ background-repeat: no-repeat;
+}
+
+.email-body-padding-td {
+ padding: 0 32px 32px;
+ mso-padding-alt: 32px;
+}
+
+.email-body-padding-td {
+ & > p {
+ font-size: 14px;
+ line-height: 20px;
+ color: #17063b;
+
+ a {
+ color: #6364ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #563acc !important;
+ }
+ }
+ }
+}
+
+// Footer
+.email-footer-td {
+ padding: 28px 32px 32px;
+ text-align: center;
+}
+
+.email-footer-logo-a {
+ display: inline-block;
+}
+
+.email-footer-p {
+ color: #9b94ab;
+ text-align: center;
+ font-size: 12px;
+ line-height: 20px;
+
+ a {
+ color: #9b94ab;
+ text-decoration: underline;
+ }
+
+ &:first-child {
+ margin-bottom: 12px;
+ }
+}
+
+// Button
+.email-btn-table {
+ margin: 0;
+ max-width: 100%;
+ border-collapse: separate;
+ border-radius: 8px;
+ background-color: #6364ff;
+}
+
+.email-btn-td {
+ height: 40px;
+ text-align: center;
+ mso-padding-alt: 0 35px;
+}
+
+.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;
+}
+
+// Status
+.email-status-header-img {
+ vertical-align: top;
+ width: 48px;
+
+ img {
+ width: 48px;
+ height: 48px;
+ border-radius: 8px;
+ overflow: hidden;
+ }
+}
+
+.email-status-header-text {
+ padding-left: 16px;
+ padding-right: 16px;
+ vertical-align: middle;
+}
+
+.email-status-header-name {
+ font-size: 16px;
+ font-weight: 600;
+ line-height: 24px;
+ color: #17063b;
+}
+
+.email-status-header-handle {
+ font-size: 14px;
+ line-height: 20px;
+ color: #746a89;
+}
+
+.email-status-content {
+ padding-top: 24px;
+}
+
+.email-status-spoiler {
+ color: #746a89;
+ font-style: italic;
+ margin-bottom: 8px;
+}
+
+.email-status-prose {
+ p {
+ font-size: 14px;
+ line-height: 20px;
+ color: #17063b;
+ }
+
+ 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 {
+ border-radius: 8px;
+ }
+
+ a {
+ color: #6364ff;
+ text-decoration: none;
+
+ &:hover {
+ color: #563acc !important;
+ }
+ }
+}
+
+.email-status-footer {
+ margin-top: 16px;
+ font-size: 12px;
+ line-height: 16px;
+ color: #746a89;
+
+ a {
+ color: #746a89;
+ }
+
+ a:hover {
+ color: #746a89 !important;
+ text-decoration: underline !important;
+ }
+}
+
+// Purple frame for emphasis
+.email-frame-table {
+ background-color: #efefff;
+ border-radius: 8px;
+}
+
+.email-frame-td {
+ padding: 16px;
+}
+
+.email-frame-wrapper-td {
+ padding-bottom: 16px;
+}
+
+.email-frame-td > p {
+ text-align: center;
+ font-size: 16px;
+ line-height: 24px;
+}
+
+// Checklist item
+.email-checklist-wrapper-td {
+ padding: 4px 0;
+}
+
+.email-checklist-table {
+ border-radius: 12px;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #efefff;
+ background-color: #fff;
+}
+
+.email-checklist-td {
+ padding: 16px;
+}
+
+.email-checklist-icons-td {
+ width: 84px;
+ vertical-align: top;
+}
+
+.email-checklist-icons-checkbox-td {
+ width: 20px;
+ vertical-align: middle;
+
+ img {
+ max-width: 100%;
+ width: 20px;
+ }
+}
+
+.email-checklist-icons-step-td {
+ width: 64px;
+ text-align: center;
+ vertical-align: middle;
+
+ img {
+ max-width: 100%;
+ width: 40px;
+ }
+}
+
+.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;
+ }
+}
+
+// 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-desktop-rounded-16px {
+ border-radius: 16px !important;
+ }
+
+ .email-header-td {
+ border-radius: 16px 16px 0 0 !important;
+ }
+
+ .email-desktop-flex {
+ display: flex;
}
}
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 3a27c974a..520e91e28 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -145,10 +145,6 @@ html {
}
}
-.compose-form__autosuggest-wrapper,
-.poll__option input[type='text'],
-.compose-form .spoiler-input__input,
-.compose-form__poll-wrapper select,
.search__input,
.setting-text,
.report-dialog-modal__textarea,
@@ -172,28 +168,11 @@ html {
border-bottom: 0;
}
-.compose-form__poll-wrapper select {
- background: $simple-background-color
- url("data:image/svg+xml;utf8,")
- no-repeat right 8px center / auto 16px;
-}
-
-.compose-form__poll-wrapper,
-.compose-form__poll-wrapper .poll__footer {
- border-top-color: lighten($ui-base-color, 8%);
-}
-
.notification__filter-bar {
border: 1px solid lighten($ui-base-color, 8%);
border-top: 0;
}
-.compose-form .compose-form__buttons-wrapper {
- background: $ui-base-color;
- border: 1px solid lighten($ui-base-color, 8%);
- border-top: 0;
-}
-
.drawer__header,
.drawer__inner {
background: $white;
@@ -206,52 +185,6 @@ html {
no-repeat bottom / 100% auto;
}
-// Change the colors used in compose-form
-.compose-form {
- .compose-form__modifiers {
- .compose-form__upload__actions .icon-button,
- .compose-form__upload__warning .icon-button {
- color: lighten($white, 7%);
-
- &:active,
- &:focus,
- &:hover {
- color: $white;
- }
- }
- }
-
- .compose-form__buttons-wrapper {
- background: darken($ui-base-color, 6%);
- }
-
- .autosuggest-textarea__suggestions {
- background: darken($ui-base-color, 6%);
- }
-
- .autosuggest-textarea__suggestions__item {
- &:hover,
- &:focus,
- &:active,
- &.selected {
- background: lighten($ui-base-color, 4%);
- }
- }
-}
-
-.emoji-mart-bar {
- border-color: lighten($ui-base-color, 4%);
-
- &:first-child {
- background: darken($ui-base-color, 6%);
- }
-}
-
-.emoji-mart-search input {
- background: rgba($ui-base-color, 0.3);
- border-color: $ui-base-color;
-}
-
.upload-progress__backdrop {
background: $ui-base-color;
}
@@ -283,46 +216,11 @@ html {
background: $ui-base-color;
}
-.privacy-dropdown.active .privacy-dropdown__value.active .icon-button {
- color: $white;
-}
-
.account-gallery__item a {
background-color: $ui-base-color;
}
-// Change the colors used in the dropdown menu
-.dropdown-menu {
- background: $white;
-
- &__arrow::before {
- background-color: $white;
- }
-
- &__item {
- color: $darker-text-color;
-
- &--dangerous {
- color: $error-value-color;
- }
-
- a,
- button {
- background: $white;
- }
- }
-}
-
// Change the text colors on inverted background
-.privacy-dropdown__option.active,
-.privacy-dropdown__option:hover,
-.privacy-dropdown__option.active .privacy-dropdown__option__content,
-.privacy-dropdown__option.active .privacy-dropdown__option__content strong,
-.privacy-dropdown__option:hover .privacy-dropdown__option__content,
-.privacy-dropdown__option:hover .privacy-dropdown__option__content strong,
-.dropdown-menu__item:not(.dropdown-menu__item--dangerous) a:active,
-.dropdown-menu__item:not(.dropdown-menu__item--dangerous) a:focus,
-.dropdown-menu__item:not(.dropdown-menu__item--dangerous) a:hover,
.actions-modal ul li:not(:empty) a.active,
.actions-modal ul li:not(:empty) a.active button,
.actions-modal ul li:not(:empty) a:active,
@@ -331,7 +229,6 @@ html {
.actions-modal ul li:not(:empty) a:focus button,
.actions-modal ul li:not(:empty) a:hover,
.actions-modal ul li:not(:empty) a:hover button,
-.language-dropdown__dropdown__results__item.active,
.admin-wrapper .sidebar ul .simple-navigation-active-leaf a,
.simple_form .block-button,
.simple_form .button,
@@ -339,19 +236,6 @@ html {
color: $white;
}
-.language-dropdown__dropdown__results__item
- .language-dropdown__dropdown__results__item__common-name {
- color: lighten($ui-base-color, 8%);
-}
-
-.language-dropdown__dropdown__results__item.active
- .language-dropdown__dropdown__results__item__common-name {
- color: darken($ui-base-color, 12%);
-}
-
-.dropdown-menu__separator,
-.dropdown-menu__item.edited-timestamp__history__item,
-.dropdown-menu__container__header,
.compare-history-modal .report-modal__target,
.report-dialog-modal .poll__option.dialog-option {
border-bottom-color: lighten($ui-base-color, 4%);
@@ -385,10 +269,7 @@ html {
.reactions-bar__item:hover,
.reactions-bar__item:focus,
-.reactions-bar__item:active,
-.language-dropdown__dropdown__results__item:hover,
-.language-dropdown__dropdown__results__item:focus,
-.language-dropdown__dropdown__results__item:active {
+.reactions-bar__item:active {
background-color: $ui-base-color;
}
@@ -631,11 +512,6 @@ html {
}
}
-.reply-indicator {
- background: transparent;
- border: 1px solid lighten($ui-base-color, 8%);
-}
-
.status__content,
.reply-indicator__content {
a {
@@ -675,3 +551,43 @@ html {
background-color: rgba($ui-highlight-color, 0.15);
}
}
+
+.compose-form__actions .icon-button.active,
+.dropdown-button.active,
+.privacy-dropdown__option.active,
+.privacy-dropdown__option:focus,
+.language-dropdown__dropdown__results__item:focus,
+.language-dropdown__dropdown__results__item.active,
+.privacy-dropdown__option:focus .privacy-dropdown__option__content,
+.privacy-dropdown__option:focus .privacy-dropdown__option__content strong,
+.privacy-dropdown__option.active .privacy-dropdown__option__content,
+.privacy-dropdown__option.active .privacy-dropdown__option__content strong,
+.language-dropdown__dropdown__results__item:focus
+ .language-dropdown__dropdown__results__item__common-name,
+.language-dropdown__dropdown__results__item.active
+ .language-dropdown__dropdown__results__item__common-name {
+ color: $white;
+}
+
+.compose-form .spoiler-input__input {
+ color: lighten($ui-highlight-color, 8%);
+}
+
+.compose-form .autosuggest-textarea__textarea,
+.compose-form__highlightable,
+.poll__option input[type='text'] {
+ background: darken($ui-base-color, 10%);
+}
+
+.inline-follow-suggestions {
+ background-color: rgba($ui-highlight-color, 0.1);
+ border-bottom-color: rgba($ui-highlight-color, 0.3);
+}
+
+.inline-follow-suggestions__body__scrollable__card {
+ background: $white;
+}
+
+.inline-follow-suggestions__body__scroll-button__icon {
+ color: $white;
+}
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index ac8a83121..3cf5561ca 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -5,7 +5,7 @@ $white: #ffffff;
$classic-base-color: #282c37;
$classic-primary-color: #9baec8;
$classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #858afa;
+$classic-highlight-color: #6364ff;
$blurple-600: #563acc; // Iris
$blurple-500: #6364ff; // Brand purple
@@ -34,7 +34,7 @@ $ui-button-tertiary-border-color: $blurple-500 !default;
$primary-text-color: $black !default;
$darker-text-color: $classic-base-color !default;
-$highlight-text-color: darken($ui-highlight-color, 8%) !default;
+$highlight-text-color: $ui-highlight-color !default;
$dark-text-color: #444b5d;
$action-button-color: #606984;
@@ -55,3 +55,8 @@ $account-background-color: $white !default;
}
$emojis-requiring-inversion: 'chains';
+
+.theme-mastodon-light {
+ --dropdown-border-color: #d9e1e8;
+ --dropdown-background-color: #fff;
+}
diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss
index dcfab6bd0..d7f8586dd 100644
--- a/app/javascript/styles/mastodon/_mixins.scss
+++ b/app/javascript/styles/mastodon/_mixins.scss
@@ -15,13 +15,14 @@
outline: 0;
box-sizing: border-box;
width: 100%;
- border: 0;
box-shadow: none;
font-family: inherit;
background: $ui-base-color;
color: $darker-text-color;
border-radius: 4px;
- font-size: 14px;
+ border: 1px solid lighten($ui-base-color, 8%);
+ font-size: 17px;
+ line-height: normal;
margin: 0;
}
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index a65f35e7b..3f538d08d 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -1314,6 +1314,9 @@ a.sparkline {
&__label {
padding: 15px;
+ display: flex;
+ gap: 8px;
+ align-items: center;
}
&__rules {
@@ -1324,6 +1327,9 @@ a.sparkline {
&__rule {
cursor: pointer;
padding: 15px;
+ display: flex;
+ gap: 8px;
+ align-items: center;
}
}
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 6714b2426..28dad81da 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -8,7 +8,7 @@
body {
font-family: $font-sans-serif, sans-serif;
- background: darken($ui-base-color, 7%);
+ background: darken($ui-base-color, 8%);
font-size: 13px;
line-height: 18px;
font-weight: 400;
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 3bb324592..4e24c54a4 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -187,8 +187,8 @@
.icon {
flex: 0 0 auto;
- width: 20px;
- height: 20px;
+ width: 24px;
+ height: 24px;
aspect-ratio: 1;
path {
@@ -200,7 +200,7 @@
display: inline-flex;
color: $action-button-color;
border: 0;
- padding: 2px;
+ padding: 0;
border-radius: 4px;
background: transparent;
cursor: pointer;
@@ -368,46 +368,155 @@ body > [data-popper-placement] {
}
}
-.compose-form {
- padding: 15px;
+.autosuggest-textarea {
+ &__textarea {
+ background: transparent;
+ min-height: 100px;
+ padding-bottom: 0;
+ resize: none;
+ scrollbar-color: initial;
- &__sensitive-button {
- padding: 10px;
- padding-top: 0;
- font-size: 14px;
- font-weight: 500;
-
- &.active {
- color: $highlight-text-color;
- }
-
- input[type='checkbox'] {
- appearance: none;
- display: inline-block;
- position: relative;
- border: 1px solid $ui-primary-color;
- box-sizing: border-box;
- width: 18px;
- height: 18px;
- flex: 0 0 auto;
- margin-inline-end: 10px;
- top: -1px;
- border-radius: 4px;
- vertical-align: middle;
- cursor: inherit;
-
- &:checked {
- border-color: $highlight-text-color;
- background: $highlight-text-color
- url("data:image/svg+xml;utf8,")
- center center no-repeat;
- }
+ &::-webkit-scrollbar {
+ all: unset;
}
}
- .compose-form__warning {
+ &__suggestions {
+ box-shadow: var(--dropdown-shadow);
+ background: $ui-base-color;
+ border: 1px solid lighten($ui-base-color, 14%);
+ border-radius: 0 0 4px 4px;
+ color: $secondary-text-color;
+ font-size: 14px;
+ padding: 0;
+
+ &__item {
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ height: 48px;
+ cursor: pointer;
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.25px;
+ color: $secondary-text-color;
+
+ &:last-child {
+ border-radius: 0 0 4px 4px;
+ }
+
+ &:hover,
+ &:focus,
+ &:active,
+ &.selected {
+ background: $ui-highlight-color;
+ color: $primary-text-color;
+
+ .autosuggest-account .display-name__account {
+ color: inherit;
+ }
+ }
+ }
+ }
+}
+
+.autosuggest-account,
+.autosuggest-emoji,
+.autosuggest-hashtag {
+ flex: 1 0 0;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ gap: 12px;
+ padding: 8px 12px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.autosuggest-account {
+ .display-name {
+ font-weight: 400;
+ display: flex;
+ flex-direction: column;
+ flex: 1 0 0;
+ }
+
+ .display-name__account {
+ display: block;
+ line-height: 16px;
+ font-size: 12px;
+ color: $dark-text-color;
+ }
+}
+
+.autosuggest-hashtag {
+ justify-content: space-between;
+
+ &__name {
+ flex: 1 1 auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ &__uses {
+ flex: 0 0 auto;
+ text-align: end;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+}
+
+.autosuggest-emoji {
+ &__name {
+ flex: 1 0 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+}
+
+.autosuggest-account .account__avatar,
+.autosuggest-emoji img {
+ display: block;
+ width: 24px;
+ height: 24px;
+ flex: 0 0 auto;
+}
+
+.compose-form {
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+
+ .layout-multiple-columns &,
+ .column & {
+ padding: 15px;
+ }
+
+ &__highlightable {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ flex: 0 1 auto;
+ border-radius: 4px;
+ border: 1px solid lighten($ui-base-color, 8%);
+ transition: border-color 300ms linear;
+ min-height: 0;
+ position: relative;
+ background: $ui-base-color;
+ overflow-y: auto;
+
+ &.active {
+ transition: none;
+ border-color: $ui-highlight-color;
+ }
+ }
+
+ &__warning {
color: $inverted-text-color;
- margin-bottom: 10px;
background: $ui-primary-color;
box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);
padding: 8px 10px;
@@ -439,32 +548,27 @@ body > [data-popper-placement] {
}
}
- .emoji-picker-dropdown {
- position: absolute;
- top: 0;
- inset-inline-end: 0;
- }
-
- .compose-form__autosuggest-wrapper {
- position: relative;
- }
-
- .autosuggest-textarea,
- .autosuggest-input,
.spoiler-input {
- position: relative;
- width: 100%;
- }
+ display: flex;
+ align-items: stretch;
- .spoiler-input {
- height: 0;
- transform-origin: bottom;
- opacity: 0;
+ &__border {
+ background: url('../images/warning-stripes.svg') repeat-y;
+ width: 5px;
+ flex: 0 0 auto;
- &.spoiler-input--visible {
- height: 36px;
- margin-bottom: 11px;
- opacity: 1;
+ &:first-child {
+ border-start-start-radius: 4px;
+ }
+
+ &:last-child {
+ border-start-end-radius: 4px;
+ }
+ }
+
+ .autosuggest-input {
+ flex: 1 1 auto;
+ border-bottom: 1px solid lighten($ui-base-color, 8%);
}
}
@@ -474,269 +578,303 @@ body > [data-popper-placement] {
box-sizing: border-box;
width: 100%;
margin: 0;
- color: $inverted-text-color;
- background: $simple-background-color;
- padding: 10px;
+ color: $secondary-text-color;
+ background: $ui-base-color;
font-family: inherit;
font-size: 14px;
- resize: vertical;
+ padding: 12px;
+ line-height: normal;
border: 0;
outline: 0;
- &::placeholder {
- color: $dark-text-color;
- }
-
&:focus {
outline: 0;
}
-
- @media screen and (width <= 600px) {
- font-size: 16px;
- }
}
.spoiler-input__input {
- border-radius: 4px;
+ padding: 12px 12px - 5px;
+ background: mix($ui-base-color, $ui-highlight-color, 85%);
+ color: $highlight-text-color;
}
- .autosuggest-textarea__textarea {
- min-height: 100px;
- border-radius: 4px 4px 0 0;
- padding-bottom: 0;
- padding-right: 10px + 22px; // Cannot use inline-end because of dir=auto
- resize: none;
- scrollbar-color: initial;
-
- &::-webkit-scrollbar {
- all: unset;
- }
-
- @media screen and (width <= 600px) {
- height: 100px !important; // Prevent auto-resize textarea
- resize: vertical;
- }
- }
-
- .autosuggest-textarea__suggestions-wrapper {
- position: relative;
- height: 0;
- }
-
- .autosuggest-textarea__suggestions {
- box-sizing: border-box;
- display: none;
- position: absolute;
- top: 100%;
- width: 100%;
- z-index: 99;
- box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
- background: $ui-secondary-color;
- border-radius: 0 0 4px 4px;
- color: $inverted-text-color;
- font-size: 14px;
- padding: 6px;
-
- &.autosuggest-textarea__suggestions--visible {
- display: block;
- }
- }
-
- .autosuggest-textarea__suggestions__item {
- padding: 10px;
- cursor: pointer;
- border-radius: 4px;
-
- &:hover,
- &:focus,
- &:active,
- &.selected {
- background: darken($ui-secondary-color, 10%);
- }
- }
-
- .autosuggest-account,
- .autosuggest-emoji,
- .autosuggest-hashtag {
+ &__dropdowns {
display: flex;
- flex-direction: row;
align-items: center;
- justify-content: flex-start;
- line-height: 18px;
- font-size: 14px;
- }
+ gap: 8px;
- .autosuggest-hashtag {
- justify-content: space-between;
-
- &__name {
- flex: 1 1 auto;
+ & > div {
overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- strong {
- font-weight: 500;
- }
-
- &__uses {
- flex: 0 0 auto;
- text-align: end;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- }
-
- .autosuggest-account-icon,
- .autosuggest-emoji img {
- display: block;
- margin-inline-end: 8px;
- width: 16px;
- height: 16px;
- }
-
- .autosuggest-account .display-name__account {
- color: $lighter-text-color;
- }
-
- .compose-form__modifiers {
- color: $inverted-text-color;
- font-family: inherit;
- font-size: 14px;
- background: $simple-background-color;
-
- .compose-form__upload-wrapper {
- overflow: hidden;
- }
-
- .compose-form__uploads-wrapper {
display: flex;
- flex-direction: row;
- padding: 5px;
- flex-wrap: wrap;
+ }
+ }
+
+ &__uploads {
+ display: flex;
+ gap: 8px;
+ padding: 0 12px;
+ flex-wrap: wrap;
+ align-self: stretch;
+ align-items: flex-start;
+ align-content: flex-start;
+ justify-content: center;
+ }
+
+ &__upload {
+ flex: 1 1 0;
+ min-width: calc(50% - 8px);
+
+ &__actions {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding: 8px;
}
- .compose-form__upload {
- flex: 1 1 0;
- min-width: 40%;
- margin: 5px;
-
- &__actions {
- background: linear-gradient(
- 180deg,
- rgba($base-shadow-color, 0.8) 0,
- rgba($base-shadow-color, 0.35) 80%,
- transparent
- );
- display: flex;
- align-items: flex-start;
- justify-content: space-between;
- }
-
- .icon-button {
- flex: 0 1 auto;
- color: $secondary-text-color;
- font-size: 14px;
- font-weight: 500;
- padding: 10px;
- font-family: inherit;
-
- .icon {
- width: 15px;
- height: 15px;
- }
-
- &:hover,
- &:focus,
- &:active {
- color: lighten($secondary-text-color, 7%);
- }
- }
-
- &__warning {
- position: absolute;
- z-index: 2;
- bottom: 0;
- inset-inline-start: 0;
- inset-inline-end: 0;
- box-sizing: border-box;
- background: linear-gradient(
- 0deg,
- rgba($base-shadow-color, 0.8) 0,
- rgba($base-shadow-color, 0.35) 80%,
- transparent
- );
- }
+ &__preview {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ border-radius: 6px;
+ z-index: -1;
+ top: 0;
+ inset-inline-start: 0;
}
- .compose-form__upload-thumbnail {
- border-radius: 4px;
- background-color: $base-shadow-color;
+ &__thumbnail {
+ width: 100%;
+ height: 144px;
+ border-radius: 6px;
background-position: center;
background-size: cover;
background-repeat: no-repeat;
- height: 140px;
- width: 100%;
overflow: hidden;
}
+
+ .icon-button {
+ flex: 0 0 auto;
+ color: $white;
+ background: rgba(0, 0, 0, 75%);
+ border-radius: 6px;
+ font-size: 12px;
+ line-height: 16px;
+ font-weight: 500;
+ padding: 4px 8px;
+ font-family: inherit;
+
+ .icon {
+ width: 15px;
+ height: 15px;
+ }
+ }
+
+ .icon-button.compose-form__upload__delete {
+ padding: 3px;
+ border-radius: 50%;
+
+ .icon {
+ width: 18px;
+ height: 18px;
+ }
+ }
+
+ &__warning {
+ position: absolute;
+ z-index: 2;
+ bottom: 0;
+ inset-inline-start: 0;
+ inset-inline-end: 0;
+ padding: 8px;
+
+ .icon-button.active {
+ color: #ffbe2e;
+ background: rgba(0, 0, 0, 75%);
+ }
+ }
}
- .compose-form__buttons-wrapper {
- padding: 10px;
- background: darken($simple-background-color, 8%);
- border-radius: 0 0 4px 4px;
+ &__footer {
display: flex;
- justify-content: space-between;
- flex: 0 0 auto;
+ flex-direction: column;
+ gap: 12px;
+ padding: 12px;
+ padding-top: 0;
+ }
- .compose-form__buttons {
+ &__submit {
+ display: flex;
+ align-items: center;
+ flex: 1 1 auto;
+ max-width: 100%;
+ overflow: hidden;
+ }
+
+ &__buttons {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ flex: 1 1 auto;
+
+ & > div {
display: flex;
- gap: 2px;
-
- .icon-button {
- height: 100%;
- }
-
- .compose-form__upload-button-icon {
- line-height: 27px;
- }
-
- .compose-form__sensitive-button {
- display: none;
-
- &.compose-form__sensitive-button--visible {
- display: block;
- }
-
- .compose-form__sensitive-button__icon {
- line-height: 27px;
- }
- }
}
- .icon-button,
- .text-icon-button {
- box-sizing: content-box;
- padding: 0 3px;
+ .icon-button {
+ padding: 3px;
}
- .character-counter__wrapper {
- align-self: center;
- margin-inline-end: 4px;
+ .icon-button .icon {
+ width: 18px;
+ height: 18px;
}
}
- .compose-form__publish {
+ &__actions {
display: flex;
- justify-content: flex-end;
- min-width: 0;
+ align-items: center;
flex: 0 0 auto;
+ gap: 12px;
+ flex-wrap: wrap;
- .compose-form__publish-button-wrapper {
- padding-top: 15px;
+ .button {
+ display: block; // Otherwise text-ellipsis doesn't work
+ font-size: 14px;
+ line-height: normal;
+ font-weight: 700;
+ flex: 1 1 auto;
+ padding: 5px 12px;
+ border-radius: 4px;
}
+
+ .icon-button {
+ box-sizing: content-box;
+ color: $highlight-text-color;
+
+ &:hover,
+ &:focus,
+ &:active {
+ color: $highlight-text-color;
+ }
+
+ &.disabled {
+ color: $highlight-text-color;
+ opacity: 0.5;
+ }
+
+ &.active {
+ background: $ui-highlight-color;
+ color: $primary-text-color;
+ }
+ }
+ }
+
+ &__poll {
+ display: flex;
+ flex-direction: column;
+ align-self: stretch;
+ gap: 8px;
+
+ .poll__option {
+ padding: 0 12px;
+ gap: 8px;
+
+ &.empty:not(:focus-within) {
+ opacity: 0.5;
+ }
+ }
+
+ .poll__input {
+ width: 17px;
+ height: 17px;
+ border-color: $darker-text-color;
+ }
+
+ &__footer {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding-inline-start: 37px;
+ padding-inline-end: 40px;
+
+ &__sep {
+ width: 1px;
+ height: 22px;
+ background: lighten($ui-base-color, 8%);
+ flex: 0 0 auto;
+ }
+ }
+
+ &__select {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ flex: 1 1 auto;
+ min-width: 0;
+
+ &__label {
+ flex: 0 0 auto;
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 16px;
+ letter-spacing: 0.5px;
+ color: $darker-text-color;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
+
+ &__value {
+ flex: 0 0 auto;
+ appearance: none;
+ background: transparent;
+ border: none;
+ padding: 0;
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 20px;
+ letter-spacing: 0.1px;
+ color: $highlight-text-color;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
+ }
+ }
+}
+
+.dropdown-button {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: transparent;
+ color: $highlight-text-color;
+ border-radius: 6px;
+ border: 1px solid $highlight-text-color;
+ padding: 4px 8px;
+ font-size: 13px;
+ line-height: normal;
+ font-weight: 400;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+
+ .icon {
+ width: 15px;
+ height: 15px;
+ flex: 0 0 auto;
+ }
+
+ &__label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ flex: 1 1 auto;
+ }
+
+ &.active {
+ background: $ui-highlight-color;
+ border-color: $ui-highlight-color;
+ color: $primary-text-color;
}
}
@@ -744,11 +882,14 @@ body > [data-popper-placement] {
cursor: default;
font-family: $font-sans-serif, sans-serif;
font-size: 14px;
- font-weight: 600;
- color: $lighter-text-color;
+ font-weight: 400;
+ line-height: normal;
+ color: $darker-text-color;
+ flex: 1 0 auto;
+ text-align: end;
&.character-counter--over {
- color: $warning-red;
+ color: $error-red;
}
}
@@ -794,45 +935,6 @@ body > [data-popper-placement] {
}
}
-.reply-indicator {
- border-radius: 4px;
- margin-bottom: 10px;
- background: $ui-primary-color;
- padding: 10px;
- min-height: 23px;
- overflow-y: auto;
- flex: 0 2 auto;
-
- &.quote-indicator {
- background: $success-green;
- }
-}
-
-.reply-indicator__header {
- margin-bottom: 5px;
- overflow: hidden;
-}
-
-.reply-indicator__cancel {
- float: right;
- line-height: 24px;
-}
-
-.reply-indicator__display-name {
- color: $inverted-text-color;
- display: block;
- max-width: 100%;
- line-height: 24px;
- overflow: hidden;
- padding-inline-end: 25px;
- text-decoration: none;
-}
-
-.reply-indicator__display-avatar {
- float: left;
- margin-inline-end: 5px;
-}
-
.status__content--with-action {
cursor: pointer;
}
@@ -842,14 +944,15 @@ body > [data-popper-placement] {
}
.status__content,
+.edit-indicator__content,
.reply-indicator__content {
position: relative;
- font-size: 15px;
- line-height: 22px;
word-wrap: break-word;
font-weight: 400;
overflow: hidden;
text-overflow: ellipsis;
+ font-size: 15px;
+ line-height: 22px;
padding-top: 2px;
color: $primary-text-color;
@@ -934,6 +1037,178 @@ body > [data-popper-placement] {
}
}
+.reply-indicator {
+ display: grid;
+ grid-template-columns: 46px minmax(0, 1fr);
+ grid-template-rows: 46px max-content;
+ gap: 0 10px;
+
+ &.quote-indicator {
+ background: $success-green;
+ }
+
+ .detailed-status__display-name {
+ margin-bottom: 4px;
+ }
+
+ .detailed-status__display-avatar {
+ grid-column-start: 1;
+ grid-row-start: 1;
+ grid-row-end: span 1;
+ }
+
+ &__main {
+ grid-column-start: 2;
+ grid-row-start: 1;
+ grid-row-end: span 2;
+ }
+
+ .display-name {
+ font-size: 14px;
+ line-height: 16px;
+
+ &__account {
+ display: none;
+ }
+ }
+
+ &__line {
+ grid-column-start: 1;
+ grid-row-start: 2;
+ grid-row-end: span 1;
+ position: relative;
+
+ &::before {
+ display: block;
+ content: '';
+ position: absolute;
+ inset-inline-start: 50%;
+ top: 4px;
+ transform: translateX(-50%);
+ background: lighten($ui-base-color, 8%);
+ width: 2px;
+ height: calc(100% + 32px - 8px); // Account for gap to next element
+ }
+ }
+
+ &__content {
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.25px;
+ display: -webkit-box;
+ -webkit-line-clamp: 4;
+ -webkit-box-orient: vertical;
+ padding: 0;
+ max-height: 4 * 20px;
+ overflow: hidden;
+ color: $darker-text-color;
+ }
+
+ &__attachments {
+ margin-top: 4px;
+ color: $darker-text-color;
+ font-size: 12px;
+ line-height: 16px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .icon {
+ width: 18px;
+ height: 18px;
+ }
+ }
+}
+
+.edit-indicator {
+ border-radius: 4px 4px 0 0;
+ background: lighten($ui-base-color, 4%);
+ padding: 12px;
+ overflow-y: auto;
+ flex: 0 0 auto;
+ border-bottom: 0.5px solid lighten($ui-base-color, 8%);
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: $darker-text-color;
+ font-size: 12px;
+ line-height: 16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ &__cancel {
+ display: flex;
+
+ .icon {
+ width: 18px;
+ height: 18px;
+ }
+ }
+
+ &__display-name {
+ display: flex;
+ gap: 4px;
+
+ a {
+ color: inherit;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
+ }
+ }
+
+ &__content {
+ color: $secondary-text-color;
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.25px;
+ padding-top: 0 !important;
+ display: -webkit-box;
+ -webkit-line-clamp: 4;
+ -webkit-box-orient: vertical;
+ max-height: 4 * 20px;
+ overflow: hidden;
+
+ a {
+ color: $highlight-text-color;
+ }
+ }
+
+ &__attachments {
+ color: $darker-text-color;
+ font-size: 12px;
+ line-height: 16px;
+ opacity: 0.75;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ .icon {
+ width: 18px;
+ height: 18px;
+ }
+ }
+}
+
+.edit-indicator__content,
+.reply-indicator__content {
+ .emojione {
+ width: 18px;
+ height: 18px;
+ margin: -3px 0 0;
+ }
+}
+
.announcements__item__content {
word-wrap: break-word;
overflow-y: auto;
@@ -1285,7 +1560,8 @@ body > [data-popper-placement] {
color: $dark-text-color;
}
-.status__info .status__display-name {
+.status__info .status__display-name,
+.edit-indicator .status__display-name {
max-width: 100%;
display: flex;
font-size: 15px;
@@ -1461,8 +1737,7 @@ body > [data-popper-placement] {
.icon {
width: 15px;
height: 15px;
- position: relative;
- top: 0.145em;
+ vertical-align: middle;
}
}
@@ -1522,15 +1797,6 @@ body > [data-popper-placement] {
line-height: 18px;
}
-.reply-indicator__content {
- color: $inverted-text-color;
- font-size: 14px;
-
- a {
- color: $lighter-text-color;
- }
-}
-
.domain {
padding: 10px;
border-bottom: 1px solid lighten($ui-base-color, 8%);
@@ -1741,7 +2007,6 @@ a .account__avatar {
}
.status__display-name,
-.reply-indicator__display-name,
.detailed-status__display-name,
a.account__display-name {
&:hover .display-name strong {
@@ -1999,57 +2264,45 @@ a.account__display-name {
}
.navigation-bar {
- padding: 15px;
display: flex;
align-items: center;
flex-shrink: 0;
cursor: default;
gap: 10px;
- color: $darker-text-color;
- strong {
- color: $secondary-text-color;
+ .column > & {
+ padding: 15px;
}
- a {
- color: inherit;
- text-decoration: none;
- }
+ .account {
+ border-bottom: 0;
+ padding: 0;
+ flex: 1 1 auto;
+ min-width: 0;
- .navigation-bar__actions {
- position: relative;
+ &__display-name {
+ font-size: 16px;
+ line-height: 24px;
+ letter-spacing: 0.15px;
+ font-weight: 500;
- .compose__action-bar .icon-button {
- pointer-events: auto;
- transform: scale(1, 1) translate(0, 0);
- opacity: 1;
-
- .icon {
- width: 24px;
- height: 24px;
+ .display-name__account {
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.1px;
}
}
}
-}
-.navigation-bar__profile {
- display: flex;
- flex-direction: column;
- flex: 1 1 auto;
- line-height: 20px;
-}
+ .icon-button {
+ padding: 8px;
+ color: $secondary-text-color;
+ }
-.navigation-bar__profile-account {
- display: inline;
- font-weight: 500;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.navigation-bar__profile-edit {
- display: inline;
- color: inherit;
- text-decoration: none;
+ .icon-button .icon {
+ width: 24px;
+ height: 24px;
+ }
}
.dropdown-animation {
@@ -2227,6 +2480,7 @@ a.account__display-name {
&__panels {
display: flex;
justify-content: center;
+ gap: 16px;
width: 100%;
height: 100%;
min-height: 100vh;
@@ -2259,7 +2513,6 @@ a.account__display-name {
flex-direction: column;
@media screen and (min-width: $no-gap-breakpoint) {
- padding: 0 10px;
max-width: 600px;
}
}
@@ -2385,7 +2638,7 @@ $ui-header-height: 55px;
.drawer__tab {
display: flex;
flex: 1 1 auto;
- padding: 15px 5px 13px;
+ padding: 13px 3px 11px;
color: $darker-text-color;
text-decoration: none;
text-align: center;
@@ -2509,6 +2762,7 @@ $ui-header-height: 55px;
.columns-area__panels {
min-height: calc(100vh - $ui-header-height);
+ gap: 0;
}
.columns-area__panels__pane--navigational {
@@ -2908,21 +3162,6 @@ $ui-header-height: 55px;
}
}
-.compose-form__highlightable {
- display: flex;
- flex-direction: column;
- flex: 0 1 auto;
- border-radius: 4px;
- transition: box-shadow 300ms linear;
- min-height: 0;
- position: relative;
-
- &.active {
- transition: none;
- box-shadow: 0 0 0 6px rgba(lighten($highlight-text-color, 8%), 0.7);
- }
-}
-
.compose-panel {
width: 285px;
margin-top: 10px;
@@ -2951,32 +3190,9 @@ $ui-header-height: 55px;
}
}
- .navigation-bar {
- flex: 0 1 48px;
- }
-
.compose-form {
- flex: 1;
- display: flex;
- flex-direction: column;
- min-height: 310px;
- padding-bottom: 71px;
- margin-bottom: -71px;
- }
-
- .compose-form__autosuggest-wrapper {
- overflow-y: auto;
- background-color: $white;
- border-radius: 4px 4px 0 0;
- flex: 0 1 auto;
- }
-
- .autosuggest-textarea__textarea {
- overflow-y: hidden;
- }
-
- .compose-form__upload-thumbnail {
- height: 80px;
+ flex: 1 1 auto;
+ min-height: 0;
}
}
@@ -2996,6 +3212,10 @@ $ui-header-height: 55px;
height: 30px;
width: auto;
}
+
+ &__logo {
+ margin-bottom: 12px;
+ }
}
.navigation-panel,
@@ -3027,7 +3247,7 @@ $ui-header-height: 55px;
position: absolute;
top: 0;
inset-inline-start: 0;
- background: $ui-base-color;
+ background: darken($ui-base-color, 4%);
box-sizing: border-box;
padding: 0;
display: flex;
@@ -3043,7 +3263,7 @@ $ui-header-height: 55px;
}
.drawer__inner__mastodon {
- background: $ui-base-color
+ background: darken($ui-base-color, 4%)
url('data:image/svg+xml;utf8,')
no-repeat bottom / 100% auto;
flex: 1;
@@ -3065,24 +3285,20 @@ $ui-header-height: 55px;
}
}
-.pseudo-drawer {
- background: lighten($ui-base-color, 13%);
- font-size: 13px;
- text-align: start;
-}
-
.drawer__header {
flex: 0 0 auto;
font-size: 16px;
- background: $ui-base-color;
+ background: darken($ui-base-color, 4%);
margin-bottom: 10px;
display: flex;
flex-direction: row;
border-radius: 4px;
overflow: hidden;
- a:hover {
- background: lighten($ui-base-color, 3%);
+ a:hover,
+ a:focus,
+ a:active {
+ background: $ui-base-color;
}
}
@@ -3268,7 +3484,7 @@ $ui-header-height: 55px;
align-items: center;
gap: 5px;
font-size: 16px;
- padding: 15px;
+ padding: 13px;
text-decoration: none;
overflow: hidden;
white-space: nowrap;
@@ -3292,7 +3508,7 @@ $ui-header-height: 55px;
&--transparent {
background: transparent;
- color: $ui-secondary-color;
+ color: $secondary-text-color;
&:hover,
&:focus,
@@ -3867,7 +4083,7 @@ a.status-card {
gap: 5px;
margin: 0;
border: 0;
- padding: 15px;
+ padding: 13px;
padding-inline-end: 0;
color: inherit;
background: transparent;
@@ -4597,10 +4813,7 @@ a.status-card {
}
.emoji-picker-dropdown__menu {
- background: $simple-background-color;
position: relative;
- box-shadow: var(--dropdown-shadow);
- border-radius: 4px;
margin-top: 5px;
z-index: 2;
@@ -4623,11 +4836,12 @@ a.status-card {
.emoji-picker-dropdown__modifiers__menu {
position: absolute;
z-index: 4;
- top: -4px;
- inset-inline-start: -8px;
- background: $simple-background-color;
+ top: -5px;
+ inset-inline-start: -9px;
+ background: var(--dropdown-background-color);
+ border: 1px solid var(--dropdown-border-color);
border-radius: 4px;
- box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
+ box-shadow: var(--dropdown-shadow);
overflow: hidden;
button {
@@ -4640,7 +4854,7 @@ a.status-card {
&:hover,
&:focus,
&:active {
- background: rgba($ui-secondary-color, 0.4);
+ background: var(--dropdown-border-color);
}
}
@@ -4709,15 +4923,17 @@ a.status-card {
}
.upload-progress {
- padding: 10px;
- color: $lighter-text-color;
+ color: $darker-text-color;
overflow: hidden;
display: flex;
- gap: 10px;
+ gap: 8px;
+ align-items: center;
+ padding: 0 12px;
.icon {
width: 24px;
height: 24px;
+ color: $ui-highlight-color;
}
span {
@@ -4736,7 +4952,7 @@ a.status-card {
width: 100%;
height: 6px;
border-radius: 6px;
- background: darken($simple-background-color, 8%);
+ background: darken($ui-base-color, 8%);
position: relative;
margin-top: 5px;
}
@@ -4790,12 +5006,16 @@ a.status-card {
filter: none;
}
-.privacy-dropdown__dropdown {
- background: $simple-background-color;
+.privacy-dropdown__dropdown,
+.language-dropdown__dropdown {
box-shadow: var(--dropdown-shadow);
+ background: var(--dropdown-background-color);
+ border: 1px solid var(--dropdown-border-color);
+ padding: 4px;
border-radius: 4px;
overflow: hidden;
z-index: 2;
+ width: 300px;
&.top {
transform-origin: 50% 100%;
@@ -4816,28 +5036,41 @@ a.status-card {
}
.privacy-dropdown__option {
- color: $inverted-text-color;
- padding: 10px;
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.25px;
+ padding: 8px 12px;
cursor: pointer;
display: flex;
+ align-items: center;
+ gap: 12px;
+ border-radius: 4px;
+ color: $primary-text-color;
&:hover,
+ &:active {
+ background: var(--dropdown-border-color);
+ }
+
+ &:focus,
&.active {
background: $ui-highlight-color;
color: $primary-text-color;
outline: 0;
- .privacy-dropdown__option__content {
+ .privacy-dropdown__option__content,
+ .privacy-dropdown__option__content strong,
+ .privacy-dropdown__option__additional {
color: $primary-text-color;
-
- strong {
- color: $primary-text-color;
- }
}
}
- &.active:hover {
- background: lighten($ui-highlight-color, 4%);
+ &__additional {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $darker-text-color;
+ cursor: help;
}
}
@@ -4845,17 +5078,16 @@ a.status-card {
display: flex;
align-items: center;
justify-content: center;
- margin-inline-end: 10px;
}
.privacy-dropdown__option__content {
flex: 1 1 auto;
- color: $lighter-text-color;
+ color: $darker-text-color;
strong {
+ color: $primary-text-color;
font-weight: 500;
display: block;
- color: $inverted-text-color;
@each $lang in $cjk-langs {
&:lang(#{$lang}) {
@@ -4867,64 +5099,78 @@ a.status-card {
.language-dropdown {
&__dropdown {
- background: $simple-background-color;
- box-shadow: var(--dropdown-shadow);
- border-radius: 4px;
- overflow: hidden;
- z-index: 2;
-
- &.top {
- transform-origin: 50% 100%;
- }
-
- &.bottom {
- transform-origin: 50% 0;
- }
+ padding: 0;
.emoji-mart-search {
- padding-inline-end: 10px;
+ padding: 10px;
+ background: var(--dropdown-background-color);
+
+ input {
+ padding: 8px 12px;
+ background: $ui-base-color;
+ border: 1px solid lighten($ui-base-color, 8%);
+ color: $darker-text-color;
+
+ @media screen and (width <= 600px) {
+ font-size: 16px;
+ line-height: 24px;
+ letter-spacing: 0.5px;
+ }
+ }
}
.emoji-mart-search-icon {
- inset-inline-end: 10px + 5px;
+ inset-inline-end: 15px;
+ opacity: 1;
+ color: $darker-text-color;
+
+ .icon {
+ width: 18px;
+ height: 18px;
+ }
+
+ &:disabled {
+ opacity: 0.38;
+ }
}
.emoji-mart-scroll {
padding: 0 10px 10px;
+ background: var(--dropdown-background-color);
}
&__results {
&__item {
cursor: pointer;
- color: $inverted-text-color;
+ color: $primary-text-color;
+ font-size: 14px;
+ line-height: 20px;
+ letter-spacing: 0.25px;
font-weight: 500;
- padding: 10px;
+ padding: 8px 12px;
border-radius: 4px;
- display: flex;
- gap: 6px;
- align-items: center;
-
- &:focus,
- &:active,
- &:hover {
- background: $ui-secondary-color;
- }
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
&__common-name {
color: $darker-text-color;
+ font-weight: 400;
}
+ &:active,
+ &:hover {
+ background: var(--dropdown-border-color);
+ }
+
+ &:focus,
&.active {
background: $ui-highlight-color;
color: $primary-text-color;
outline: 0;
.language-dropdown__dropdown__results__item__common-name {
- color: $secondary-text-color;
- }
-
- &:hover {
- background: lighten($ui-highlight-color, 4%);
+ color: $primary-text-color;
}
}
}
@@ -4933,9 +5179,13 @@ a.status-card {
}
.search {
- margin-bottom: 10px;
+ margin-bottom: 32px;
position: relative;
+ .layout-multiple-columns & {
+ margin-bottom: 10px;
+ }
+
&__popout {
box-sizing: border-box;
display: none;
@@ -4944,6 +5194,7 @@ a.status-card {
margin-top: -2px;
width: 100%;
background: $ui-base-color;
+ border: 1px solid lighten($ui-base-color, 8%);
border-radius: 0 0 4px 4px;
box-shadow: var(--dropdown-shadow);
z-index: 99;
@@ -4952,7 +5203,7 @@ a.status-card {
h4 {
text-transform: uppercase;
- color: $dark-text-color;
+ color: $darker-text-color;
font-weight: 500;
padding: 0 10px;
margin-bottom: 10px;
@@ -4960,6 +5211,7 @@ a.status-card {
.icon-button {
padding: 0;
+ color: $darker-text-color;
}
.icon {
@@ -4975,7 +5227,7 @@ a.status-card {
}
&__message {
- color: $dark-text-color;
+ color: $darker-text-color;
padding: 0 10px;
}
@@ -5031,6 +5283,10 @@ a.status-card {
}
&.active {
+ .search__input {
+ border-radius: 4px 4px 0 0;
+ }
+
.search__popout {
display: block;
}
@@ -5041,14 +5297,9 @@ a.status-card {
@include search-input;
display: block;
- padding: 15px;
- padding-inline-end: 30px;
- line-height: 18px;
- font-size: 16px;
-
- &::placeholder {
- color: lighten($darker-text-color, 4%);
- }
+ padding: 12px 16px;
+ padding-inline-start: 16px + 15px + 8px;
+ line-height: normal;
&::-moz-focus-inner {
border: 0;
@@ -5059,10 +5310,6 @@ a.status-card {
&:active {
outline: 0 !important;
}
-
- &:focus {
- background: lighten($ui-base-color, 4%);
- }
}
.search__icon {
@@ -5077,21 +5324,21 @@ a.status-card {
.icon {
position: absolute;
- top: 13px;
- inset-inline-end: 10px;
+ top: 12px + 2px;
+ inset-inline-start: 16px - 2px;
display: inline-block;
opacity: 0;
transition: all 100ms linear;
transition-property: transform, opacity;
- width: 24px;
- height: 24px;
- color: $secondary-text-color;
+ width: 20px;
+ height: 20px;
+ color: $darker-text-color;
cursor: default;
pointer-events: none;
&.active {
pointer-events: auto;
- opacity: 0.3;
+ opacity: 1;
}
}
@@ -5106,16 +5353,10 @@ a.status-card {
.icon-times-circle {
transform: rotate(0deg);
- color: $action-button-color;
cursor: pointer;
&.active {
transform: rotate(90deg);
- opacity: 1;
- }
-
- &:hover {
- color: lighten($action-button-color, 7%);
}
}
}
@@ -5607,6 +5848,10 @@ a.status-card {
padding-inline-end: 10px;
}
+ .icon {
+ vertical-align: middle;
+ }
+
.button {
flex: 0 0 auto;
}
@@ -5718,6 +5963,11 @@ a.status-card {
}
}
+ .dialog-option {
+ align-items: center;
+ gap: 12px;
+ }
+
.dialog-option .poll__input {
border-color: $inverted-text-color;
color: $ui-secondary-color;
@@ -5726,8 +5976,8 @@ a.status-card {
justify-content: center;
svg {
- width: 8px;
- height: auto;
+ width: 15px;
+ height: 15px;
}
&:active,
@@ -6157,6 +6407,7 @@ a.status-card {
gap: 2px;
}
+.media-gallery__alt__label,
.media-gallery__gifv__label {
display: flex;
align-items: center;
@@ -6233,6 +6484,7 @@ a.status-card {
.icon {
color: $dark-text-color;
+ vertical-align: middle;
}
}
}
@@ -6923,90 +7175,6 @@ noscript {
}
}
-@media screen and (width <= 630px) and (height <= 400px) {
- $duration: 400ms;
- $delay: 100ms;
-
- .search {
- will-change: margin-top;
- transition: margin-top $duration $delay;
- }
-
- .navigation-bar {
- will-change: padding-bottom;
- transition: padding-bottom $duration $delay;
- }
-
- .navigation-bar {
- & > a:first-child {
- will-change: margin-top, margin-inline-start, margin-inline-end, width;
- transition:
- margin-top $duration $delay,
- margin-inline-start $duration ($duration + $delay),
- margin-inline-end $duration ($duration + $delay);
- }
-
- & > .navigation-bar__profile-edit {
- will-change: margin-top;
- transition: margin-top $duration $delay;
- }
-
- .navigation-bar__actions {
- & > .icon-button.close {
- will-change: opacity transform;
- transition:
- opacity $duration * 0.5 $delay,
- transform $duration $delay;
- }
-
- & > .compose__action-bar .icon-button {
- will-change: opacity transform;
- transition:
- opacity $duration * 0.5 $delay + $duration * 0.5,
- transform $duration $delay;
- }
- }
- }
-
- .is-composing {
- .search {
- margin-top: -50px;
- }
-
- .navigation-bar {
- padding-bottom: 0;
-
- & > a:first-child {
- margin: -100px 10px 0 -50px;
- }
-
- .navigation-bar__profile {
- padding-top: 2px;
- }
-
- .navigation-bar__profile-edit {
- position: absolute;
- margin-top: -60px;
- }
-
- .navigation-bar__actions {
- .icon-button.close {
- pointer-events: auto;
- opacity: 1;
- transform: scale(1, 1) translate(0, 0);
- bottom: 5px;
- }
-
- .compose__action-bar .icon-button {
- pointer-events: none;
- opacity: 0;
- transform: scale(0, 1) translate(100%, 0);
- }
- }
- }
- }
-}
-
.embed-modal {
width: auto;
max-width: 80vw;
@@ -7478,6 +7646,13 @@ noscript {
span {
user-select: all;
}
+
+ .icon-lock {
+ height: 16px;
+ width: 16px;
+ position: relative;
+ top: 3px;
+ }
}
}
}
@@ -8961,11 +9136,14 @@ noscript {
.link-footer {
flex: 0 0 auto;
- padding: 10px;
padding-top: 20px;
z-index: 1;
font-size: 13px;
+ .column & {
+ padding: 15px;
+ }
+
p {
color: $dark-text-color;
margin-bottom: 20px;
@@ -9345,3 +9523,199 @@ noscript {
padding: 0;
}
}
+
+.inline-follow-suggestions {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 16px 0;
+ border-bottom: 1px solid mix($ui-base-color, $ui-highlight-color, 75%);
+ background: mix($ui-base-color, $ui-highlight-color, 95%);
+
+ &__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 16px;
+
+ h3 {
+ font-size: 15px;
+ line-height: 22px;
+ font-weight: 500;
+ }
+
+ &__actions {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ }
+
+ .link-button {
+ font-size: 13px;
+ font-weight: 500;
+ }
+ }
+
+ &__body {
+ position: relative;
+
+ &__scroll-button {
+ position: absolute;
+ height: 100%;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ top: 0;
+ color: $primary-text-color;
+
+ &.left {
+ left: 0;
+ }
+
+ &.right {
+ right: 0;
+ }
+
+ &__icon {
+ border-radius: 50%;
+ background: $ui-highlight-color;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ aspect-ratio: 1;
+ padding: 8px;
+
+ .icon {
+ width: 24px;
+ height: 24px;
+ }
+ }
+
+ &:hover,
+ &:focus,
+ &:active {
+ .inline-follow-suggestions__body__scroll-button__icon {
+ background: lighten($ui-highlight-color, 4%);
+ }
+ }
+ }
+
+ &__scrollable {
+ display: flex;
+ flex-wrap: nowrap;
+ gap: 16px;
+ padding: 16px;
+ padding-bottom: 0;
+ scroll-snap-type: x mandatory;
+ scroll-padding: 16px;
+ scroll-behavior: smooth;
+ overflow-x: hidden;
+
+ &__card {
+ background: darken($ui-base-color, 4%);
+ border: 1px solid lighten($ui-base-color, 8%);
+ border-radius: 4px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ align-items: center;
+ padding: 12px;
+ scroll-snap-align: start;
+ flex: 0 0 auto;
+ width: 200px;
+ box-sizing: border-box;
+ position: relative;
+
+ a {
+ text-decoration: none;
+ }
+
+ & > .icon-button {
+ position: absolute;
+ inset-inline-end: 8px;
+ top: 8px;
+ }
+
+ &__avatar {
+ height: 48px;
+ display: flex;
+
+ a {
+ display: flex;
+ text-decoration: none;
+ }
+ }
+
+ .account__avatar {
+ flex-shrink: 0;
+ align-self: flex-end;
+ border: 1px solid lighten($ui-base-color, 8%);
+ background-color: $ui-base-color;
+ }
+
+ &__text-stack {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ align-items: center;
+ max-width: 100%;
+
+ a {
+ max-width: 100%;
+ }
+
+ &__source {
+ display: inline-flex;
+ align-items: center;
+ color: $dark-text-color;
+ gap: 4px;
+ overflow: hidden;
+ white-space: nowrap;
+
+ > span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .icon {
+ width: 16px;
+ height: 16px;
+ }
+ }
+ }
+
+ .display-name {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ align-items: center;
+
+ & > * {
+ max-width: 100%;
+ }
+
+ &__html {
+ font-size: 15px;
+ font-weight: 500;
+ color: $secondary-text-color;
+ }
+
+ &__account {
+ font-size: 14px;
+ color: $darker-text-color;
+ }
+ }
+
+ .verified-badge {
+ font-size: 14px;
+ max-width: 100%;
+ }
+
+ .button {
+ display: block;
+ width: 100%;
+ }
+ }
+ }
+ }
+}
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index 3d646da23..8a472d75b 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -40,13 +40,12 @@
.compose-form {
width: 400px;
margin: 0 auto;
- padding: 20px 0;
- margin-top: 40px;
+ padding: 10px 0;
+ padding-bottom: 20px;
box-sizing: border-box;
@media screen and (width <= 400px) {
width: 100%;
- margin-top: 0;
padding: 20px;
}
}
@@ -56,13 +55,15 @@
width: 400px;
margin: 0 auto;
display: flex;
- font-size: 13px;
- line-height: 18px;
+ align-items: center;
+ gap: 10px;
+ font-size: 14px;
+ line-height: 20px;
box-sizing: border-box;
padding: 20px 0;
margin-top: 40px;
margin-bottom: 10px;
- border-bottom: 1px solid $ui-base-color;
+ border-bottom: 1px solid lighten($ui-base-color, 8%);
@media screen and (width <= 440px) {
width: 100%;
@@ -71,9 +72,9 @@
}
.avatar {
- width: 40px;
- height: 40px;
- margin-inline-end: 10px;
+ width: 48px;
+ height: 48px;
+ flex: 0 0 auto;
img {
width: 100%;
@@ -87,13 +88,14 @@
.name {
flex: 1 1 auto;
color: $secondary-text-color;
- width: calc(100% - 90px);
.username {
display: block;
- font-weight: 500;
+ font-size: 16px;
+ line-height: 24px;
text-overflow: ellipsis;
overflow: hidden;
+ color: $primary-text-color;
}
}
@@ -101,6 +103,62 @@
display: block;
font-size: 32px;
line-height: 40px;
- margin-inline-start: 10px;
+ flex: 0 0 auto;
+ }
+}
+
+.redirect {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100vh;
+ font-size: 14px;
+ line-height: 18px;
+
+ &__logo {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 30px;
+
+ img {
+ height: 48px;
+ }
+ }
+
+ &__message {
+ text-align: center;
+
+ h1 {
+ font-size: 17px;
+ line-height: 22px;
+ font-weight: 700;
+ margin-bottom: 30px;
+ }
+
+ p {
+ margin-bottom: 30px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ a {
+ color: $highlight-text-color;
+ font-weight: 500;
+ text-decoration: none;
+
+ &:hover,
+ &:focus,
+ &:active {
+ text-decoration: underline;
+ }
+ }
+ }
+
+ &__link {
+ margin-top: 15px;
}
}
diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss
index c7247c3a5..fec0c10dd 100644
--- a/app/javascript/styles/mastodon/emoji_picker.scss
+++ b/app/javascript/styles/mastodon/emoji_picker.scss
@@ -1,7 +1,6 @@
.emoji-mart {
font-size: 13px;
display: inline-block;
- color: $inverted-text-color;
&,
* {
@@ -15,13 +14,13 @@
}
.emoji-mart-bar {
- border: 0 solid darken($ui-secondary-color, 8%);
+ border: 0 solid var(--dropdown-border-color);
&:first-child {
border-bottom-width: 1px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
- background: $ui-secondary-color;
+ background: var(--dropdown-border-color);
}
&:last-child {
@@ -36,7 +35,6 @@
display: flex;
justify-content: space-between;
padding: 0 6px;
- color: $lighter-text-color;
line-height: 0;
}
@@ -50,9 +48,10 @@
cursor: pointer;
background: transparent;
border: 0;
+ color: $darker-text-color;
&:hover {
- color: darken($lighter-text-color, 4%);
+ color: lighten($darker-text-color, 4%);
}
}
@@ -60,7 +59,7 @@
color: $highlight-text-color;
&:hover {
- color: darken($highlight-text-color, 4%);
+ color: lighten($highlight-text-color, 4%);
}
.emoji-mart-anchor-bar {
@@ -95,7 +94,7 @@
height: 270px;
max-height: 35vh;
padding: 0 6px 6px;
- background: $simple-background-color;
+ background: var(--dropdown-background-color);
will-change: transform;
&::-webkit-scrollbar-track:hover,
@@ -107,7 +106,7 @@
.emoji-mart-search {
padding: 10px;
padding-inline-end: 45px;
- background: $simple-background-color;
+ background: var(--dropdown-background-color);
position: relative;
input {
@@ -118,9 +117,9 @@
font-family: inherit;
display: block;
width: 100%;
- background: rgba($ui-secondary-color, 0.3);
- color: $inverted-text-color;
- border: 1px solid $ui-secondary-color;
+ background: $ui-base-color;
+ color: $darker-text-color;
+ border: 1px solid lighten($ui-base-color, 8%);
border-radius: 4px;
&::-moz-focus-inner {
@@ -155,11 +154,10 @@
&:disabled {
cursor: default;
pointer-events: none;
- opacity: 0.3;
}
svg {
- fill: $action-button-color;
+ fill: $darker-text-color;
}
}
@@ -180,7 +178,7 @@
inset-inline-start: 0;
width: 100%;
height: 100%;
- background-color: rgba($ui-secondary-color, 0.7);
+ background-color: var(--dropdown-border-color);
border-radius: 100%;
}
}
@@ -197,7 +195,7 @@
width: 100%;
font-weight: 500;
padding: 5px 6px;
- background: $simple-background-color;
+ background: var(--dropdown-background-color);
}
}
@@ -241,7 +239,7 @@
.emoji-mart-no-results {
font-size: 14px;
- color: $light-text-color;
+ color: $dark-text-color;
text-align: center;
padding: 5px 6px;
padding-top: 70px;
diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss
index 0b7220b21..60e7d6224 100644
--- a/app/javascript/styles/mastodon/modal.scss
+++ b/app/javascript/styles/mastodon/modal.scss
@@ -1,5 +1,5 @@
.modal-layout {
- background: $ui-base-color
+ background: darken($ui-base-color, 4%)
url('data:image/svg+xml;utf8,')
repeat-x bottom fixed;
display: flex;
diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss
index 8a26e611c..939fca336 100644
--- a/app/javascript/styles/mastodon/polls.scss
+++ b/app/javascript/styles/mastodon/polls.scss
@@ -52,6 +52,8 @@
&__option {
position: relative;
display: flex;
+ align-items: flex-start;
+ gap: 8px;
padding: 6px 0;
line-height: 18px;
cursor: default;
@@ -78,16 +80,22 @@
box-sizing: border-box;
width: 100%;
font-size: 14px;
- color: $inverted-text-color;
+ color: $secondary-text-color;
outline: 0;
font-family: inherit;
- background: $simple-background-color;
- border: 1px solid darken($simple-background-color, 14%);
+ background: $ui-base-color;
+ border: 1px solid $darker-text-color;
border-radius: 4px;
- padding: 6px 10px;
+ padding: 8px 12px;
&:focus {
- border-color: $highlight-text-color;
+ border-color: $ui-highlight-color;
+ }
+
+ @media screen and (width <= 600px) {
+ font-size: 16px;
+ line-height: 24px;
+ letter-spacing: 0.5px;
}
}
@@ -96,26 +104,20 @@
}
&.editable {
- display: flex;
align-items: center;
overflow: visible;
}
}
&__input {
- display: inline-block;
+ display: block;
position: relative;
border: 1px solid $ui-primary-color;
box-sizing: border-box;
- width: 18px;
- height: 18px;
- margin-inline-end: 10px;
- top: -1px;
+ width: 17px;
+ height: 17px;
border-radius: 50%;
- vertical-align: middle;
- margin-top: auto;
- margin-bottom: auto;
- flex: 0 0 18px;
+ flex: 0 0 auto;
&.checkbox {
border-radius: 4px;
@@ -159,6 +161,15 @@
}
}
+ &__option.editable &__input {
+ &:active,
+ &:focus,
+ &:hover {
+ border-color: $ui-primary-color;
+ border-width: 1px;
+ }
+ }
+
&__number {
display: inline-block;
width: 45px;
@@ -209,90 +220,6 @@
}
}
-.compose-form__poll-wrapper {
- border-top: 1px solid darken($simple-background-color, 8%);
-
- ul {
- padding: 10px;
- }
-
- .poll__input {
- &:active,
- &:focus,
- &:hover {
- border-color: $ui-button-focus-background-color;
- }
- }
-
- .poll__footer {
- border-top: 1px solid darken($simple-background-color, 8%);
- padding: 10px;
- display: flex;
- align-items: center;
-
- button,
- select {
- flex: 1 1 50%;
-
- &:focus {
- border-color: $highlight-text-color;
- }
- }
- }
-
- .button.button-secondary {
- font-size: 14px;
- font-weight: 400;
- padding: 6px 10px;
- height: auto;
- line-height: inherit;
- color: $action-button-color;
- border-color: $action-button-color;
- margin-inline-end: 5px;
-
- &:hover,
- &:focus,
- &.active {
- border-color: $action-button-color;
- background-color: $action-button-color;
- color: $ui-button-color;
- }
- }
-
- li {
- display: flex;
- align-items: center;
-
- .poll__option {
- flex: 0 0 auto;
- width: calc(100% - (23px + 6px));
- margin-inline-end: 6px;
- }
- }
-
- select {
- appearance: none;
- box-sizing: border-box;
- font-size: 14px;
- color: $inverted-text-color;
- display: inline-block;
- width: auto;
- outline: 0;
- font-family: inherit;
- background: $simple-background-color
- url("data:image/svg+xml;utf8,")
- no-repeat right 8px center / auto 16px;
- border: 1px solid darken($simple-background-color, 14%);
- border-radius: 4px;
- padding: 6px 10px;
- padding-inline-end: 30px;
- }
-
- .icon-button.disabled {
- color: darken($simple-background-color, 14%);
- }
-}
-
.muted .poll {
color: $dark-text-color;
diff --git a/app/javascript/svg-icons/repeat_active.svg b/app/javascript/svg-icons/repeat_active.svg
new file mode 100644
index 000000000..a5bbb8fc4
--- /dev/null
+++ b/app/javascript/svg-icons/repeat_active.svg
@@ -0,0 +1,4 @@
+
diff --git a/app/javascript/svg-icons/repeat_disabled.svg b/app/javascript/svg-icons/repeat_disabled.svg
old mode 100755
new mode 100644
diff --git a/app/javascript/svg-icons/repeat_private.svg b/app/javascript/svg-icons/repeat_private.svg
old mode 100755
new mode 100644
diff --git a/app/javascript/svg-icons/repeat_private_active.svg b/app/javascript/svg-icons/repeat_private_active.svg
new file mode 100644
index 000000000..cf2a05c84
--- /dev/null
+++ b/app/javascript/svg-icons/repeat_private_active.svg
@@ -0,0 +1,6 @@
+
diff --git a/app/javascript/types/image.d.ts b/app/javascript/types/image.d.ts
index 07d192955..8a08eca9f 100644
--- a/app/javascript/types/image.d.ts
+++ b/app/javascript/types/image.d.ts
@@ -20,16 +20,20 @@ declare module '*.png' {
}
declare module '*.svg' {
+ const path: string;
+ export default path;
+}
+
+declare module '*.svg?react' {
import type React from 'react';
interface SVGPropsWithTitle extends React.SVGProps {
title?: string;
}
- export const ReactComponent: React.FC;
+ const ReactComponent: React.FC;
- const path: string;
- export default path;
+ export default ReactComponent;
}
declare module '*.webp' {
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 51384ef98..322f3e27a 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -154,7 +154,7 @@ class ActivityPub::Activity
if object_uri.start_with?('http')
return if ActivityPub::TagManager.instance.local_uri?(object_uri)
- ActivityPub::FetchRemoteStatusService.new.call(object_uri, id: true, on_behalf_of: @account.followers.local.first, request_id: @options[:request_id])
+ ActivityPub::FetchRemoteStatusService.new.call(object_uri, on_behalf_of: @account.followers.local.first, request_id: @options[:request_id])
elsif @object['url'].present?
::FetchRemoteStatusService.new.call(@object['url'], request_id: @options[:request_id])
end
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 40ad39801..b22e6fa3e 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -109,7 +109,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end
def process_status_params
- @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url)
+ @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url, object: @object)
attachment_ids = process_attachments.take(4).map(&:id)
@@ -285,6 +285,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id)
rescue Seahorse::Client::NetworkingError => e
Rails.logger.warn "Error storing media attachment: #{e}"
+ RedownloadMediaWorker.perform_async(media_attachment.id)
end
end
@@ -321,7 +322,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
already_voted = true
with_redis_lock("vote:#{replied_to_status.poll_id}:#{@account.id}") do
- already_voted = poll.votes.where(account: @account).exists?
+ already_voted = poll.votes.exists?(account: @account)
poll.votes.create!(account: @account, choice: poll.options.index(@object['name']), uri: object_uri)
end
@@ -407,7 +408,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
return false if local_usernames.empty?
- Account.local.where(username: local_usernames).exists?
+ Account.local.exists?(username: local_usernames)
end
def tombstone_exists?
diff --git a/app/lib/activitypub/linked_data_signature.rb b/app/lib/activitypub/linked_data_signature.rb
index faea63e8f..9459fdd8b 100644
--- a/app/lib/activitypub/linked_data_signature.rb
+++ b/app/lib/activitypub/linked_data_signature.rb
@@ -19,7 +19,7 @@ class ActivityPub::LinkedDataSignature
return unless type == 'RsaSignature2017'
creator = ActivityPub::TagManager.instance.uri_to_actor(creator_uri)
- creator = ActivityPub::FetchRemoteKeyService.new.call(creator_uri, id: false) if creator&.public_key.blank?
+ creator = ActivityPub::FetchRemoteKeyService.new.call(creator_uri) if creator&.public_key.blank?
return if creator.nil?
diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb
index 45f5fc5bf..cfc2b8788 100644
--- a/app/lib/activitypub/parser/status_parser.rb
+++ b/app/lib/activitypub/parser/status_parser.rb
@@ -4,12 +4,13 @@ class ActivityPub::Parser::StatusParser
include JsonLdHelper
# @param [Hash] json
- # @param [Hash] magic_values
- # @option magic_values [String] :followers_collection
- def initialize(json, magic_values = {})
- @json = json
- @object = json['object'] || json
- @magic_values = magic_values
+ # @param [Hash] options
+ # @option options [String] :followers_collection
+ # @option options [Hash] :object
+ def initialize(json, **options)
+ @json = json
+ @object = options[:object] || json['object'] || json
+ @options = options
end
def uri
@@ -78,7 +79,7 @@ class ActivityPub::Parser::StatusParser
:public
elsif audience_cc.any? { |cc| ActivityPub::TagManager.instance.public_collection?(cc) }
:unlisted
- elsif audience_to.include?(@magic_values[:followers_collection])
+ elsif audience_to.include?(@options[:followers_collection])
:private
else
:direct
diff --git a/app/lib/admin/system_check/media_privacy_check.rb b/app/lib/admin/system_check/media_privacy_check.rb
index 1df05b120..2ddc8e8b0 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 @@ class Admin::SystemCheck::MediaPrivacyCheck < Admin::SystemCheck::BaseCheck
@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/annual_report.rb b/app/lib/annual_report.rb
new file mode 100644
index 000000000..cf4297f2a
--- /dev/null
+++ b/app/lib/annual_report.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+class AnnualReport
+ include DatabaseHelper
+
+ SOURCES = [
+ AnnualReport::Archetype,
+ AnnualReport::TypeDistribution,
+ AnnualReport::TopStatuses,
+ AnnualReport::MostUsedApps,
+ AnnualReport::CommonlyInteractedWithAccounts,
+ AnnualReport::TimeSeries,
+ AnnualReport::TopHashtags,
+ AnnualReport::MostRebloggedAccounts,
+ AnnualReport::Percentiles,
+ ].freeze
+
+ SCHEMA = 1
+
+ def initialize(account, year)
+ @account = account
+ @year = year
+ end
+
+ def generate
+ return if GeneratedAnnualReport.exists?(account: @account, year: @year)
+
+ GeneratedAnnualReport.create(
+ account: @account,
+ year: @year,
+ schema_version: SCHEMA,
+ data: data
+ )
+ end
+
+ private
+
+ def data
+ with_read_replica do
+ SOURCES.each_with_object({}) { |klass, hsh| hsh.merge!(klass.new(@account, @year).generate) }
+ end
+ end
+end
diff --git a/app/lib/annual_report/archetype.rb b/app/lib/annual_report/archetype.rb
new file mode 100644
index 000000000..ea9ef366d
--- /dev/null
+++ b/app/lib/annual_report/archetype.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+class AnnualReport::Archetype < AnnualReport::Source
+ # Average number of posts (including replies and reblogs) made by
+ # each active user in a single year (2023)
+ AVERAGE_PER_YEAR = 113
+
+ def generate
+ {
+ archetype: archetype,
+ }
+ end
+
+ private
+
+ def archetype
+ if (standalone_count + replies_count + reblogs_count) < AVERAGE_PER_YEAR
+ :lurker
+ elsif reblogs_count > (standalone_count * 2)
+ :booster
+ elsif polls_count > (standalone_count * 0.1) # standalone_count includes posts with polls
+ :pollster
+ elsif replies_count > (standalone_count * 2)
+ :replier
+ else
+ :oracle
+ end
+ end
+
+ def polls_count
+ @polls_count ||= base_scope.where.not(poll_id: nil).count
+ end
+
+ def reblogs_count
+ @reblogs_count ||= base_scope.where.not(reblog_of_id: nil).count
+ end
+
+ def replies_count
+ @replies_count ||= base_scope.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count
+ end
+
+ def standalone_count
+ @standalone_count ||= base_scope.without_replies.without_reblogs.count
+ end
+
+ def base_scope
+ @account.statuses.where(id: year_as_snowflake_range)
+ end
+end
diff --git a/app/lib/annual_report/commonly_interacted_with_accounts.rb b/app/lib/annual_report/commonly_interacted_with_accounts.rb
new file mode 100644
index 000000000..af5e854c2
--- /dev/null
+++ b/app/lib/annual_report/commonly_interacted_with_accounts.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AnnualReport::CommonlyInteractedWithAccounts < AnnualReport::Source
+ SET_SIZE = 40
+
+ def generate
+ {
+ commonly_interacted_with_accounts: commonly_interacted_with_accounts.map do |(account_id, count)|
+ {
+ account_id: account_id,
+ count: count,
+ }
+ end,
+ }
+ end
+
+ private
+
+ def commonly_interacted_with_accounts
+ @account.statuses.reorder(nil).where(id: year_as_snowflake_range).where.not(in_reply_to_account_id: @account.id).group(:in_reply_to_account_id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('in_reply_to_account_id, count(*) AS total'))
+ end
+end
diff --git a/app/lib/annual_report/most_reblogged_accounts.rb b/app/lib/annual_report/most_reblogged_accounts.rb
new file mode 100644
index 000000000..e3e8a7c90
--- /dev/null
+++ b/app/lib/annual_report/most_reblogged_accounts.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
+ SET_SIZE = 10
+
+ def generate
+ {
+ most_reblogged_accounts: most_reblogged_accounts.map do |(account_id, count)|
+ {
+ account_id: account_id,
+ count: count,
+ }
+ end,
+ }
+ end
+
+ private
+
+ def most_reblogged_accounts
+ @account.statuses.reorder(nil).where(id: year_as_snowflake_range).where.not(reblog_of_id: nil).joins(reblog: :account).group('accounts.id').having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('accounts.id, count(*) as total'))
+ end
+end
diff --git a/app/lib/annual_report/most_used_apps.rb b/app/lib/annual_report/most_used_apps.rb
new file mode 100644
index 000000000..85ff1ff86
--- /dev/null
+++ b/app/lib/annual_report/most_used_apps.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AnnualReport::MostUsedApps < AnnualReport::Source
+ SET_SIZE = 10
+
+ def generate
+ {
+ most_used_apps: most_used_apps.map do |(name, count)|
+ {
+ name: name,
+ count: count,
+ }
+ end,
+ }
+ end
+
+ private
+
+ def most_used_apps
+ @account.statuses.reorder(nil).where(id: year_as_snowflake_range).joins(:application).group('oauth_applications.name').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('oauth_applications.name, count(*) as total'))
+ end
+end
diff --git a/app/lib/annual_report/percentiles.rb b/app/lib/annual_report/percentiles.rb
new file mode 100644
index 000000000..9fe4698ee
--- /dev/null
+++ b/app/lib/annual_report/percentiles.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+class AnnualReport::Percentiles < AnnualReport::Source
+ def generate
+ {
+ percentiles: {
+ followers: (total_with_fewer_followers / (total_with_any_followers + 1.0)) * 100,
+ statuses: (total_with_fewer_statuses / (total_with_any_statuses + 1.0)) * 100,
+ },
+ }
+ end
+
+ private
+
+ def followers_gained
+ @followers_gained ||= @account.passive_relationships.where("date_part('year', follows.created_at) = ?", @year).count
+ end
+
+ def statuses_created
+ @statuses_created ||= @account.statuses.where(id: year_as_snowflake_range).count
+ end
+
+ def total_with_fewer_followers
+ @total_with_fewer_followers ||= Follow.find_by_sql([<<~SQL.squish, { year: @year, comparison: followers_gained }]).first.total
+ WITH tmp0 AS (
+ SELECT follows.target_account_id
+ FROM follows
+ INNER JOIN accounts ON accounts.id = follows.target_account_id
+ WHERE date_part('year', follows.created_at) = :year
+ AND accounts.domain IS NULL
+ GROUP BY follows.target_account_id
+ HAVING COUNT(*) < :comparison
+ )
+ SELECT count(*) AS total
+ FROM tmp0
+ SQL
+ end
+
+ def total_with_fewer_statuses
+ @total_with_fewer_statuses ||= Status.find_by_sql([<<~SQL.squish, { comparison: statuses_created, min_id: year_as_snowflake_range.first, max_id: year_as_snowflake_range.last }]).first.total
+ WITH tmp0 AS (
+ SELECT statuses.account_id
+ FROM statuses
+ INNER JOIN accounts ON accounts.id = statuses.account_id
+ WHERE statuses.id BETWEEN :min_id AND :max_id
+ AND accounts.domain IS NULL
+ GROUP BY statuses.account_id
+ HAVING count(*) < :comparison
+ )
+ SELECT count(*) AS total
+ FROM tmp0
+ SQL
+ end
+
+ def total_with_any_followers
+ @total_with_any_followers ||= Follow.where("date_part('year', follows.created_at) = ?", @year).joins(:target_account).merge(Account.local).count('distinct follows.target_account_id')
+ end
+
+ def total_with_any_statuses
+ @total_with_any_statuses ||= Status.where(id: year_as_snowflake_range).joins(:account).merge(Account.local).count('distinct statuses.account_id')
+ end
+end
diff --git a/app/lib/annual_report/source.rb b/app/lib/annual_report/source.rb
new file mode 100644
index 000000000..1ccb62267
--- /dev/null
+++ b/app/lib/annual_report/source.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AnnualReport::Source
+ attr_reader :account, :year
+
+ def initialize(account, year)
+ @account = account
+ @year = year
+ end
+
+ protected
+
+ def year_as_snowflake_range
+ (Mastodon::Snowflake.id_at(DateTime.new(year, 1, 1))..Mastodon::Snowflake.id_at(DateTime.new(year, 12, 31)))
+ end
+end
diff --git a/app/lib/annual_report/time_series.rb b/app/lib/annual_report/time_series.rb
new file mode 100644
index 000000000..a144bac0d
--- /dev/null
+++ b/app/lib/annual_report/time_series.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class AnnualReport::TimeSeries < AnnualReport::Source
+ def generate
+ {
+ time_series: (1..12).map do |month|
+ {
+ month: month,
+ statuses: statuses_per_month[month] || 0,
+ following: following_per_month[month] || 0,
+ followers: followers_per_month[month] || 0,
+ }
+ end,
+ }
+ end
+
+ private
+
+ def statuses_per_month
+ @statuses_per_month ||= @account.statuses.reorder(nil).where(id: year_as_snowflake_range).group(:period).pluck(Arel.sql("date_part('month', created_at)::int AS period, count(*)")).to_h
+ end
+
+ def following_per_month
+ @following_per_month ||= @account.active_relationships.where("date_part('year', created_at) = ?", @year).group(:period).pluck(Arel.sql("date_part('month', created_at)::int AS period, count(*)")).to_h
+ end
+
+ def followers_per_month
+ @followers_per_month ||= @account.passive_relationships.where("date_part('year', created_at) = ?", @year).group(:period).pluck(Arel.sql("date_part('month', created_at)::int AS period, count(*)")).to_h
+ end
+end
diff --git a/app/lib/annual_report/top_hashtags.rb b/app/lib/annual_report/top_hashtags.rb
new file mode 100644
index 000000000..488dacb1b
--- /dev/null
+++ b/app/lib/annual_report/top_hashtags.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class AnnualReport::TopHashtags < AnnualReport::Source
+ SET_SIZE = 40
+
+ def generate
+ {
+ top_hashtags: top_hashtags.map do |(name, count)|
+ {
+ name: name,
+ count: count,
+ }
+ end,
+ }
+ end
+
+ private
+
+ def top_hashtags
+ Tag.joins(:statuses).where(statuses: { id: @account.statuses.where(id: year_as_snowflake_range).reorder(nil).select(:id) }).group(:id).having('count(*) > 1').order(total: :desc).limit(SET_SIZE).pluck(Arel.sql('COALESCE(tags.display_name, tags.name), count(*) AS total'))
+ end
+end
diff --git a/app/lib/annual_report/top_statuses.rb b/app/lib/annual_report/top_statuses.rb
new file mode 100644
index 000000000..112e5591c
--- /dev/null
+++ b/app/lib/annual_report/top_statuses.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AnnualReport::TopStatuses < AnnualReport::Source
+ def generate
+ top_reblogs = base_scope.order(reblogs_count: :desc).first&.id
+ top_favourites = base_scope.where.not(id: top_reblogs).order(favourites_count: :desc).first&.id
+ top_replies = base_scope.where.not(id: [top_reblogs, top_favourites]).order(replies_count: :desc).first&.id
+
+ {
+ top_statuses: {
+ by_reblogs: top_reblogs,
+ by_favourites: top_favourites,
+ by_replies: top_replies,
+ },
+ }
+ end
+
+ def base_scope
+ @account.statuses.with_public_visibility.joins(:status_stat).where(id: year_as_snowflake_range).reorder(nil)
+ end
+end
diff --git a/app/lib/annual_report/type_distribution.rb b/app/lib/annual_report/type_distribution.rb
new file mode 100644
index 000000000..fc12a6f1f
--- /dev/null
+++ b/app/lib/annual_report/type_distribution.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AnnualReport::TypeDistribution < AnnualReport::Source
+ def generate
+ {
+ type_distribution: {
+ total: base_scope.count,
+ reblogs: base_scope.where.not(reblog_of_id: nil).count,
+ replies: base_scope.where.not(in_reply_to_id: nil).where.not(in_reply_to_account_id: @account.id).count,
+ standalone: base_scope.without_replies.without_reblogs.count,
+ },
+ }
+ end
+
+ private
+
+ def base_scope
+ @account.statuses.where(id: year_as_snowflake_range)
+ end
+end
diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb
index b28f5c3d7..32ccb0b13 100644
--- a/app/lib/attachment_batch.rb
+++ b/app/lib/attachment_batch.rb
@@ -37,7 +37,7 @@ class AttachmentBatch
def clear
remove_files
- batch.update_all(nullified_attributes) # rubocop:disable Rails/SkipsModelValidations
+ batch.update_all(nullified_attributes)
end
private
diff --git a/app/lib/content_security_policy.rb b/app/lib/content_security_policy.rb
index 966e41f03..210f37cea 100644
--- a/app/lib/content_security_policy.rb
+++ b/app/lib/content_security_policy.rb
@@ -10,7 +10,7 @@ class ContentSecurityPolicy
end
def media_hosts
- [assets_host, cdn_host_value].compact
+ [assets_host, cdn_host_value, paperclip_root_url].compact
end
private
@@ -23,6 +23,15 @@ class ContentSecurityPolicy
s3_alias_host || s3_cloudfront_host || azure_alias_host || s3_hostname_host
end
+ def paperclip_root_url
+ root_url = ENV.fetch('PAPERCLIP_ROOT_URL', nil)
+ return if root_url.blank?
+
+ (Addressable::URI.parse(assets_host) + root_url).tap do |uri|
+ uri.path += '/' unless uri.path.blank? || uri.path.end_with?('/')
+ end.to_s
+ end
+
def url_from_base_host
host_to_url(base_host)
end
diff --git a/app/lib/delivery_failure_tracker.rb b/app/lib/delivery_failure_tracker.rb
index d93826982..e17b45d66 100644
--- a/app/lib/delivery_failure_tracker.rb
+++ b/app/lib/delivery_failure_tracker.rb
@@ -28,7 +28,7 @@ class DeliveryFailureTracker
end
def available?
- !UnavailableDomain.where(domain: @host).exists?
+ !UnavailableDomain.exists?(domain: @host)
end
def exhausted_deliveries_days
diff --git a/app/lib/emoji_formatter.rb b/app/lib/emoji_formatter.rb
index 15b98dc57..2a3683c49 100644
--- a/app/lib/emoji_formatter.rb
+++ b/app/lib/emoji_formatter.rb
@@ -66,16 +66,6 @@ class EmojiFormatter
@emoji_map ||= custom_emojis.each_with_object({}) { |e, h| h[e.shortcode] = [full_asset_url(e.image.url), full_asset_url(e.image.url(:static))] }
end
- def count_tag_nesting(tag)
- if tag[1] == '/'
- -1
- elsif tag[-2] == '/'
- 0
- else
- 1
- end
- end
-
def tag_for_emoji(shortcode, emoji)
return content_tag(:span, ":#{shortcode}:", translate: 'no') if raw_shortcode?
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 53767486f..38a177e64 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -420,8 +420,8 @@ class FeedManager
check_for_blocks = status.active_mentions.pluck(:account_id)
check_for_blocks.push(status.in_reply_to_account) if status.reply? && !status.in_reply_to_account_id.nil?
- should_filter = blocks_or_mutes?(receiver_id, check_for_blocks, :mentions) # Filter if it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked (or muted)
- should_filter ||= status.account.silenced? && !Follow.where(account_id: receiver_id, target_account_id: status.account_id).exists? # of if the account is silenced and I'm not following them
+ should_filter = blocks_or_mutes?(receiver_id, check_for_blocks, :mentions) # Filter if it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked (or muted)
+ should_filter ||= status.account.silenced? && !Follow.exists?(account_id: receiver_id, target_account_id: status.account_id) # Filter if the account is silenced and I'm not following them
should_filter
end
@@ -434,7 +434,7 @@ class FeedManager
if status.reply? && status.in_reply_to_account_id != status.account_id
should_filter = status.in_reply_to_account_id != list.account_id
should_filter &&= !list.show_followed?
- should_filter &&= !(list.show_list? && ListAccount.where(list_id: list.id, account_id: status.in_reply_to_account_id).exists?)
+ should_filter &&= !(list.show_list? && ListAccount.exists?(list_id: list.id, account_id: status.in_reply_to_account_id))
return !!should_filter
end
diff --git a/app/lib/permalink_redirector.rb b/app/lib/permalink_redirector.rb
index 0dd37483e..f551f69db 100644
--- a/app/lib/permalink_redirector.rb
+++ b/app/lib/permalink_redirector.rb
@@ -5,17 +5,46 @@ class PermalinkRedirector
def initialize(path)
@path = path
+ @object = nil
+ end
+
+ def object
+ @object ||= begin
+ if at_username_status_request? || statuses_status_request?
+ status = Status.find_by(id: second_segment)
+ status if status&.distributable? && !status&.local?
+ elsif at_username_request?
+ username, domain = first_segment.delete_prefix('@').split('@')
+ domain = nil if TagManager.instance.local_domain?(domain)
+ account = Account.find_remote(username, domain)
+ account unless account&.local?
+ elsif accounts_request? && record_integer_id_request?
+ account = Account.find_by(id: second_segment)
+ account unless account&.local?
+ end
+ end
end
def redirect_path
- if at_username_status_request? || statuses_status_request?
- find_status_url_by_id(second_segment)
- elsif at_username_request?
- find_account_url_by_name(first_segment)
- elsif accounts_request? && record_integer_id_request?
- find_account_url_by_id(second_segment)
- elsif @path.start_with?('/deck')
- @path.delete_prefix('/deck')
+ return ActivityPub::TagManager.instance.url_for(object) if object.present?
+
+ @path.delete_prefix('/deck') if @path.start_with?('/deck')
+ end
+
+ def redirect_uri
+ return ActivityPub::TagManager.instance.uri_for(object) if object.present?
+
+ @path.delete_prefix('/deck') if @path.start_with?('/deck')
+ end
+
+ def redirect_confirmation_path
+ case object.class.name
+ when 'Account'
+ redirect_account_path(object.id)
+ when 'Status'
+ redirect_status_path(object.id)
+ else
+ @path.delete_prefix('/deck') if @path.start_with?('/deck')
end
end
@@ -56,22 +85,4 @@ class PermalinkRedirector
def path_segments
@path_segments ||= @path.delete_prefix('/deck').delete_prefix('/').split('/')
end
-
- def find_status_url_by_id(id)
- status = Status.find_by(id: id)
- ActivityPub::TagManager.instance.url_for(status) if status&.distributable? && !status.account.local?
- end
-
- def find_account_url_by_id(id)
- account = Account.find_by(id: id)
- ActivityPub::TagManager.instance.url_for(account) if account.present? && !account.local?
- end
-
- def find_account_url_by_name(name)
- username, domain = name.gsub(/\A@/, '').split('@')
- domain = nil if TagManager.instance.local_domain?(domain)
- account = Account.find_remote(username, domain)
-
- ActivityPub::TagManager.instance.url_for(account) if account.present? && !account.local?
- end
end
diff --git a/app/lib/settings/scoped_settings.rb b/app/lib/settings/scoped_settings.rb
deleted file mode 100644
index 3ad57cc1e..000000000
--- a/app/lib/settings/scoped_settings.rb
+++ /dev/null
@@ -1,79 +0,0 @@
-# frozen_string_literal: true
-
-module Settings
- class ScopedSettings
- DEFAULTING_TO_UNSCOPED = %w(
- theme
- noindex
- ).freeze
-
- def initialize(object)
- @object = object
- end
-
- def method_missing(method, *args)
- method_name = method.to_s
- # set a value for a variable
- if method_name[-1] == '='
- var_name = method_name.sub('=', '')
- value = args.first
- self[var_name] = value
- else
- # retrieve a value
- self[method_name]
- end
- end
-
- def respond_to_missing?(*)
- true
- end
-
- def all_as_records
- vars = thing_scoped
- records = vars.index_by(&:var)
-
- Setting.default_settings.each do |key, default_value|
- next if records.key?(key) || default_value.is_a?(Hash)
-
- records[key] = Setting.new(var: key, value: default_value)
- end
-
- records
- end
-
- def []=(key, value)
- key = key.to_s
- record = thing_scoped.find_or_initialize_by(var: key)
- record.update!(value: value)
-
- Rails.cache.write(Setting.cache_key(key, @object), value)
- end
-
- def [](key)
- Rails.cache.fetch(Setting.cache_key(key, @object)) do
- db_val = thing_scoped.find_by(var: key.to_s)
- if db_val
- default_value = ScopedSettings.default_settings[key]
- return default_value.with_indifferent_access.merge!(db_val.value) if default_value.is_a?(Hash)
-
- db_val.value
- else
- ScopedSettings.default_settings[key]
- end
- end
- end
-
- class << self
- def default_settings
- defaulting = DEFAULTING_TO_UNSCOPED.index_with { |k| Setting[k] }
- Setting.default_settings.merge!(defaulting)
- end
- end
-
- protected
-
- def thing_scoped
- Setting.unscoped.where(thing_type: @object.class.base_class.to_s, thing_id: @object.id)
- end
- end
-end
diff --git a/app/lib/status_cache_hydrator.rb b/app/lib/status_cache_hydrator.rb
index 45b50cb37..34f6199ec 100644
--- a/app/lib/status_cache_hydrator.rb
+++ b/app/lib/status_cache_hydrator.rb
@@ -26,11 +26,11 @@ class StatusCacheHydrator
def hydrate_non_reblog_payload(empty_payload, account_id)
empty_payload.tap do |payload|
- payload[:favourited] = Favourite.where(account_id: account_id, status_id: @status.id).exists?
- payload[:reblogged] = Status.where(account_id: account_id, reblog_of_id: @status.id).exists?
- payload[:muted] = ConversationMute.where(account_id: account_id, conversation_id: @status.conversation_id).exists?
- payload[:bookmarked] = Bookmark.where(account_id: account_id, status_id: @status.id).exists?
- payload[:pinned] = StatusPin.where(account_id: account_id, status_id: @status.id).exists? if @status.account_id == account_id
+ payload[:favourited] = Favourite.exists?(account_id: account_id, status_id: @status.id)
+ payload[:reblogged] = Status.exists?(account_id: account_id, reblog_of_id: @status.id)
+ payload[:muted] = ConversationMute.exists?(account_id: account_id, conversation_id: @status.conversation_id)
+ payload[:bookmarked] = Bookmark.exists?(account_id: account_id, status_id: @status.id)
+ payload[:pinned] = StatusPin.exists?(account_id: account_id, status_id: @status.id) if @status.account_id == account_id
payload[:filtered] = mapped_applied_custom_filter(account_id, @status)
if payload[:poll]
@@ -51,11 +51,11 @@ class StatusCacheHydrator
# used to create the status, we need to hydrate it here too
payload[:reblog][:application] = payload_reblog_application if payload[:reblog][:application].nil? && @status.reblog.account_id == account_id
- payload[:reblog][:favourited] = Favourite.where(account_id: account_id, status_id: @status.reblog_of_id).exists?
- payload[:reblog][:reblogged] = Status.where(account_id: account_id, reblog_of_id: @status.reblog_of_id).exists?
- payload[:reblog][:muted] = ConversationMute.where(account_id: account_id, conversation_id: @status.reblog.conversation_id).exists?
- payload[:reblog][:bookmarked] = Bookmark.where(account_id: account_id, status_id: @status.reblog_of_id).exists?
- payload[:reblog][:pinned] = StatusPin.where(account_id: account_id, status_id: @status.reblog_of_id).exists? if @status.reblog.account_id == account_id
+ payload[:reblog][:favourited] = Favourite.exists?(account_id: account_id, status_id: @status.reblog_of_id)
+ payload[:reblog][:reblogged] = Status.exists?(account_id: account_id, reblog_of_id: @status.reblog_of_id)
+ payload[:reblog][:muted] = ConversationMute.exists?(account_id: account_id, conversation_id: @status.reblog.conversation_id)
+ payload[:reblog][:bookmarked] = Bookmark.exists?(account_id: account_id, status_id: @status.reblog_of_id)
+ payload[:reblog][:pinned] = StatusPin.exists?(account_id: account_id, status_id: @status.reblog_of_id) if @status.reblog.account_id == account_id
payload[:reblog][:filtered] = payload[:filtered]
if payload[:reblog][:poll]
diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb
index 36fb0e80f..17e42e3ec 100644
--- a/app/lib/status_reach_finder.rb
+++ b/app/lib/status_reach_finder.rb
@@ -16,28 +16,28 @@ class StatusReachFinder
private
def reached_account_inboxes
+ Account.where(id: reached_account_ids).inboxes
+ end
+
+ def reached_account_ids
# When the status is a reblog, there are no interactions with it
# directly, we assume all interactions are with the original one
if @status.reblog?
- []
+ [reblog_of_account_id]
else
- Account.where(id: reached_account_ids).inboxes
- end
- end
-
- def reached_account_ids
- [
- replied_to_account_id,
- reblog_of_account_id,
- mentioned_account_ids,
- reblogs_account_ids,
- favourites_account_ids,
- replies_account_ids,
- ].tap do |arr|
- arr.flatten!
- arr.compact!
- arr.uniq!
+ [
+ replied_to_account_id,
+ reblog_of_account_id,
+ mentioned_account_ids,
+ reblogs_account_ids,
+ favourites_account_ids,
+ replies_account_ids,
+ ].tap do |arr|
+ arr.flatten!
+ arr.compact!
+ arr.uniq!
+ end
end
end
diff --git a/app/lib/suspicious_sign_in_detector.rb b/app/lib/suspicious_sign_in_detector.rb
index 1af5188c6..74f49aa55 100644
--- a/app/lib/suspicious_sign_in_detector.rb
+++ b/app/lib/suspicious_sign_in_detector.rb
@@ -19,7 +19,7 @@ class SuspiciousSignInDetector
end
def previously_seen_ip?(request)
- @user.ips.where('ip <<= ?', masked_ip(request)).exists?
+ @user.ips.exists?(['ip <<= ?', masked_ip(request)])
end
def freshly_signed_up?
diff --git a/app/lib/vacuum/media_attachments_vacuum.rb b/app/lib/vacuum/media_attachments_vacuum.rb
index ab7ea4092..e55819529 100644
--- a/app/lib/vacuum/media_attachments_vacuum.rb
+++ b/app/lib/vacuum/media_attachments_vacuum.rb
@@ -27,11 +27,17 @@ class Vacuum::MediaAttachmentsVacuum
end
def media_attachments_past_retention_period
- MediaAttachment.remote.cached.where(MediaAttachment.arel_table[:created_at].lt(@retention_period.ago)).where(MediaAttachment.arel_table[:updated_at].lt(@retention_period.ago))
+ MediaAttachment
+ .remote
+ .cached
+ .created_before(@retention_period.ago)
+ .updated_before(@retention_period.ago)
end
def orphaned_media_attachments
- MediaAttachment.unattached.where(MediaAttachment.arel_table[:created_at].lt(TTL.ago))
+ MediaAttachment
+ .unattached
+ .created_before(TTL.ago)
end
def retention_period?
diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb
index 5eecfed10..4eb38ec34 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/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index 432b851b5..3b1a085cb 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -191,6 +191,18 @@ class UserMailer < Devise::Mailer
end
end
+ def failed_2fa(user, remote_ip, user_agent, timestamp)
+ @resource = user
+ @remote_ip = remote_ip
+ @user_agent = user_agent
+ @detection = Browser.new(user_agent)
+ @timestamp = timestamp.to_time.utc
+
+ I18n.with_locale(locale) do
+ mail subject: default_i18n_subject
+ end
+ end
+
private
def default_devise_subject
diff --git a/app/models/account.rb b/app/models/account.rb
index 2145cfcb6..05e1f943c 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -108,6 +108,8 @@ class Account < ApplicationRecord
validates :shared_inbox_url, absence: true, if: :local?, on: :create
validates :followers_url, absence: true, if: :local?, on: :create
+ normalizes :username, with: ->(username) { username.squish }
+
scope :remote, -> { where.not(domain: nil) }
scope :local, -> { where(domain: nil) }
scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) }
@@ -121,15 +123,15 @@ class Account < ApplicationRecord
scope :bots, -> { where(actor_type: %w(Application Service)) }
scope :groups, -> { where(actor_type: 'Group') }
scope :alphabetic, -> { order(domain: :asc, username: :asc) }
+ scope :matches_uri_prefix, ->(value) { where(arel_table[:uri].matches("#{sanitize_sql_like(value)}/%", false, true)).or(where(uri: value)) }
scope :matches_username, ->(value) { where('lower((username)::text) LIKE lower(?)', "#{value}%") }
scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
- scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
scope :without_unapproved, -> { left_outer_joins(:user).merge(User.approved.confirmed).or(remote) }
+ scope :auditable, -> { where(id: Admin::ActionLog.select(:account_id).distinct) }
scope :searchable, -> { without_unapproved.without_suspended.where(moved_to_account_id: nil) }
scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat) }
- scope :followable_by, ->(account) { joins(arel_table.join(Follow.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(Follow.arel_table[:target_account_id]).and(Follow.arel_table[:account_id].eq(account.id))).join_sources).where(Follow.arel_table[:id].eq(nil)).joins(arel_table.join(FollowRequest.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:id].eq(FollowRequest.arel_table[:target_account_id]).and(FollowRequest.arel_table[:account_id].eq(account.id))).join_sources).where(FollowRequest.arel_table[:id].eq(nil)) }
scope :by_recent_status, -> { includes(:account_stat).merge(AccountStat.order('last_status_at DESC NULLS LAST')).references(:account_stat) }
- scope :by_recent_sign_in, -> { order(Arel.sql('users.current_sign_in_at DESC NULLS LAST')) }
+ scope :by_recent_activity, -> { left_joins(:user, :account_stat).order(coalesced_activity_timestamps.desc).order(id: :desc) }
scope :popular, -> { order('account_stats.followers_count desc') }
scope :by_domain_and_subdomains, ->(domain) { where(domain: Instance.by_domain_and_subdomains(domain).select(:domain)) }
scope :not_excluded_by_account, ->(account) { where.not(id: account.excluded_from_timeline_account_ids) }
@@ -442,6 +444,14 @@ class Account < ApplicationRecord
DeliveryFailureTracker.without_unavailable(urls)
end
+ def coalesced_activity_timestamps
+ Arel.sql(
+ <<~SQL.squish
+ COALESCE(users.current_sign_in_at, account_stats.last_status_at, to_timestamp(0))
+ SQL
+ )
+ end
+
def from_text(text)
return [] if text.blank?
@@ -475,7 +485,6 @@ class Account < ApplicationRecord
end
before_validation :prepare_contents, if: :local?
- before_validation :prepare_username, on: :create
before_create :generate_keys
before_destroy :clean_feed_manager
@@ -493,10 +502,6 @@ class Account < ApplicationRecord
note&.strip!
end
- def prepare_username
- username&.squish!
- end
-
def generate_keys
return unless local? && private_key.blank? && public_key.blank?
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index 55d34e85c..42b1c4953 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -104,15 +104,7 @@ class AccountFilter
def order_scope(value)
case value.to_s
when 'active'
- accounts_with_users
- .left_joins(:account_stat)
- .order(
- Arel.sql(
- <<~SQL.squish
- COALESCE(users.current_sign_in_at, account_stats.last_status_at, to_timestamp(0)) DESC, accounts.id DESC
- SQL
- )
- )
+ Account.by_recent_activity
when 'recent'
Account.recent
else
diff --git a/app/models/account_suggestions.rb b/app/models/account_suggestions.rb
index d62176c7c..25c8b04d5 100644
--- a/app/models/account_suggestions.rb
+++ b/app/models/account_suggestions.rb
@@ -29,7 +29,7 @@ class AccountSuggestions
# a complicated query on this end.
account_ids = account_ids_with_sources[offset, limit]
- accounts_map = Account.where(id: account_ids.map(&:first)).includes(:account_stat).index_by(&:id)
+ accounts_map = Account.where(id: account_ids.map(&:first)).includes(:account_stat, :user).index_by(&:id)
account_ids.filter_map do |(account_id, source)|
next unless accounts_map.key?(account_id)
diff --git a/app/models/account_suggestions/source.rb b/app/models/account_suggestions/source.rb
index ee93a1342..d83f5e377 100644
--- a/app/models/account_suggestions/source.rb
+++ b/app/models/account_suggestions/source.rb
@@ -8,11 +8,31 @@ class AccountSuggestions::Source
protected
def base_account_scope(account)
- Account.searchable
- .followable_by(account)
- .not_excluded_by_account(account)
- .not_domain_blocked_by_account(account)
- .where.not(id: account.id)
- .joins("LEFT OUTER JOIN follow_recommendation_mutes ON follow_recommendation_mutes.target_account_id = accounts.id AND follow_recommendation_mutes.account_id = #{account.id}").where(follow_recommendation_mutes: { target_account_id: nil })
+ Account
+ .searchable
+ .where.not(follows_sql, id: account.id)
+ .where.not(follow_requests_sql, id: account.id)
+ .not_excluded_by_account(account)
+ .not_domain_blocked_by_account(account)
+ .where.not(id: account.id)
+ .where.not(follow_recommendation_mutes_sql, id: account.id)
+ end
+
+ def follows_sql
+ <<~SQL.squish
+ EXISTS (SELECT 1 FROM follows WHERE follows.target_account_id = accounts.id AND follows.account_id = :id)
+ SQL
+ end
+
+ def follow_requests_sql
+ <<~SQL.squish
+ EXISTS (SELECT 1 FROM follow_requests WHERE follow_requests.target_account_id = accounts.id AND follow_requests.account_id = :id)
+ SQL
+ end
+
+ def follow_recommendation_mutes_sql
+ <<~SQL.squish
+ EXISTS (SELECT 1 FROM follow_recommendation_mutes WHERE follow_recommendation_mutes.target_account_id = accounts.id AND follow_recommendation_mutes.account_id = :id)
+ SQL
end
end
diff --git a/app/models/account_summary.rb b/app/models/account_summary.rb
index 0d8835b83..30ada50cc 100644
--- a/app/models/account_summary.rb
+++ b/app/models/account_summary.rb
@@ -12,11 +12,15 @@
class AccountSummary < ApplicationRecord
self.primary_key = :account_id
+ has_many :follow_recommendation_suppressions, primary_key: :account_id, foreign_key: :account_id, inverse_of: false
+
scope :safe, -> { where(sensitive: false) }
- scope :localized, ->(locale) { where(language: locale) }
- scope :filtered, -> { joins(arel_table.join(FollowRecommendationSuppression.arel_table, Arel::Nodes::OuterJoin).on(arel_table[:account_id].eq(FollowRecommendationSuppression.arel_table[:account_id])).join_sources).where(FollowRecommendationSuppression.arel_table[:id].eq(nil)) }
+ scope :localized, ->(locale) { order(Arel::Nodes::Case.new.when(arel_table[:language].eq(locale)).then(1).else(0).desc) }
+ scope :filtered, -> { where.missing(:follow_recommendation_suppressions) }
def self.refresh
+ Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false)
+ rescue ActiveRecord::StatementInvalid
Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false)
end
diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb
index d413cb386..f581af74e 100644
--- a/app/models/admin/action_log_filter.rb
+++ b/app/models/admin/action_log_filter.rb
@@ -72,7 +72,7 @@ class Admin::ActionLogFilter
end
def results
- scope = latest_action_logs.includes(:target)
+ scope = latest_action_logs.includes(:target, :account)
params.each do |key, value|
next if key.to_s == 'page'
diff --git a/app/models/announcement.rb b/app/models/announcement.rb
index 83a8d3682..e63057002 100644
--- a/app/models/announcement.rb
+++ b/app/models/announcement.rb
@@ -20,9 +20,8 @@
class Announcement < ApplicationRecord
scope :unpublished, -> { where(published: false) }
scope :published, -> { where(published: true) }
- scope :without_muted, ->(account) { joins("LEFT OUTER JOIN announcement_mutes ON announcement_mutes.announcement_id = announcements.id AND announcement_mutes.account_id = #{account.id}").where(announcement_mutes: { id: nil }) }
- scope :chronological, -> { order(Arel.sql('COALESCE(announcements.starts_at, announcements.scheduled_at, announcements.published_at, announcements.created_at) ASC')) }
- scope :reverse_chronological, -> { order(Arel.sql('COALESCE(announcements.starts_at, announcements.scheduled_at, announcements.published_at, announcements.created_at) DESC')) }
+ scope :chronological, -> { order(coalesced_chronology_timestamps.asc) }
+ scope :reverse_chronological, -> { order(coalesced_chronology_timestamps.desc) }
has_many :announcement_mutes, dependent: :destroy
has_many :announcement_reactions, dependent: :destroy
@@ -33,6 +32,16 @@ class Announcement < ApplicationRecord
before_validation :set_published, on: :create
+ class << self
+ def coalesced_chronology_timestamps
+ Arel.sql(
+ <<~SQL.squish
+ COALESCE(announcements.starts_at, announcements.scheduled_at, announcements.published_at, announcements.created_at)
+ SQL
+ )
+ end
+ end
+
def to_log_human_identifier
text
end
@@ -45,10 +54,6 @@ class Announcement < ApplicationRecord
update!(published: false, scheduled_at: nil)
end
- def time_range?
- starts_at? && ends_at?
- end
-
def mentions
@mentions ||= Account.from_text(text)
end
@@ -70,22 +75,41 @@ class Announcement < ApplicationRecord
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/app/models/appeal.rb b/app/models/appeal.rb
index f1290ad01..395056b76 100644
--- a/app/models/appeal.rb
+++ b/app/models/appeal.rb
@@ -20,8 +20,11 @@ class Appeal < ApplicationRecord
belongs_to :account
belongs_to :strike, class_name: 'AccountWarning', foreign_key: 'account_warning_id', inverse_of: :appeal
- belongs_to :approved_by_account, class_name: 'Account', optional: true
- belongs_to :rejected_by_account, class_name: 'Account', optional: true
+
+ with_options class_name: 'Account', optional: true do
+ belongs_to :approved_by_account
+ belongs_to :rejected_by_account
+ end
validates :text, presence: true, length: { maximum: 2_000 }
validates :account_warning_id, uniqueness: true
diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb
index 810e47184..406fb2aba 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/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb
index 351530c2f..5b05c31e0 100644
--- a/app/models/concerns/account/interactions.rb
+++ b/app/models/concerns/account/interactions.rb
@@ -183,7 +183,7 @@ module Account::Interactions
end
def following?(other_account)
- active_relationships.where(target_account: other_account).exists?
+ active_relationships.exists?(target_account: other_account)
end
def following_anyone?
@@ -199,51 +199,51 @@ module Account::Interactions
end
def blocking?(other_account)
- block_relationships.where(target_account: other_account).exists?
+ block_relationships.exists?(target_account: other_account)
end
def domain_blocking?(other_domain)
- domain_blocks.where(domain: other_domain).exists?
+ domain_blocks.exists?(domain: other_domain)
end
def muting?(other_account)
- mute_relationships.where(target_account: other_account).exists?
+ mute_relationships.exists?(target_account: other_account)
end
def muting_conversation?(conversation)
- conversation_mutes.where(conversation: conversation).exists?
+ conversation_mutes.exists?(conversation: conversation)
end
def muting_notifications?(other_account)
- mute_relationships.where(target_account: other_account, hide_notifications: true).exists?
+ mute_relationships.exists?(target_account: other_account, hide_notifications: true)
end
def muting_reblogs?(other_account)
- active_relationships.where(target_account: other_account, show_reblogs: false).exists?
+ active_relationships.exists?(target_account: other_account, show_reblogs: false)
end
def requested?(other_account)
- follow_requests.where(target_account: other_account).exists?
+ follow_requests.exists?(target_account: other_account)
end
def favourited?(status)
- status.proper.favourites.where(account: self).exists?
+ status.proper.favourites.exists?(account: self)
end
def bookmarked?(status)
- status.proper.bookmarks.where(account: self).exists?
+ status.proper.bookmarks.exists?(account: self)
end
def reblogged?(status)
- status.proper.reblogs.where(account: self).exists?
+ status.proper.reblogs.exists?(account: self)
end
def pinned?(status)
- status_pins.where(status: status).exists?
+ status_pins.exists?(status: status)
end
def endorsed?(account)
- account_pins.where(target_account: account).exists?
+ account_pins.exists?(target_account: account)
end
def status_matches_filters(status)
diff --git a/app/models/concerns/user/omniauthable.rb b/app/models/concerns/user/omniauthable.rb
index 6d1d1b8cc..113bfda23 100644
--- a/app/models/concerns/user/omniauthable.rb
+++ b/app/models/concerns/user/omniauthable.rb
@@ -61,7 +61,7 @@ module User::Omniauthable
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/custom_emoji.rb b/app/models/custom_emoji.rb
index 97b1c63bf..1c9b44395 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -41,7 +41,7 @@ class CustomEmoji < ApplicationRecord
has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' } }, validate_media_type: false
- before_validation :downcase_domain
+ normalizes :domain, with: ->(domain) { domain.downcase }
validates_attachment :image, content_type: { content_type: IMAGE_MIME_TYPES }, presence: true, size: { less_than: LIMIT }
validates :shortcode, uniqueness: { scope: :domain }, format: { with: SHORTCODE_ONLY_RE }, length: { minimum: 2 }
@@ -86,7 +86,7 @@ class CustomEmoji < ApplicationRecord
end
def search(shortcode)
- where('"custom_emojis"."shortcode" ILIKE ?', "%#{shortcode}%")
+ where(arel_table[:shortcode].matches("%#{sanitize_sql_like(shortcode)}%"))
end
end
@@ -95,8 +95,4 @@ class CustomEmoji < ApplicationRecord
def remove_entity_cache
Rails.cache.delete(EntityCache.instance.to_key(:emoji, shortcode, domain))
end
-
- def downcase_domain
- self.domain = domain.downcase unless domain.nil?
- end
end
diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb
index ed7a8dda1..870cc7197 100644
--- a/app/models/custom_emoji_filter.rb
+++ b/app/models/custom_emoji_filter.rb
@@ -31,7 +31,7 @@ class CustomEmojiFilter
def scope_for(key, value)
case key.to_s
when 'local'
- CustomEmoji.local.left_joins(:category).reorder(Arel.sql('custom_emoji_categories.name ASC NULLS FIRST, custom_emojis.shortcode ASC'))
+ CustomEmoji.local.left_joins(:category).reorder(CustomEmojiCategory.arel_table[:name].asc.nulls_first).order(shortcode: :asc)
when 'remote'
CustomEmoji.remote
when 'by_domain'
diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index 9c936fed3..c8120c239 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -17,23 +17,8 @@
class CustomFilter < ApplicationRecord
self.ignored_columns += %w(whole_word irreversible)
- # NOTE: We previously used `alias_attribute` but this does not play nicely
- # with cache
- def title
- phrase
- end
-
- def title=(value)
- self.phrase = value
- end
-
- def filter_action
- action
- end
-
- def filter_action=(value)
- self.action = value
- end
+ alias_attribute :title, :phrase
+ alias_attribute :filter_action, :action
VALID_CONTEXTS = %w(
home
@@ -83,16 +68,7 @@ class CustomFilter < ApplicationRecord
scope = CustomFilterKeyword.includes(:custom_filter).where(custom_filter: { account_id: account_id }).where(Arel.sql('expires_at IS NULL OR expires_at > NOW()'))
scope.to_a.group_by(&:custom_filter).each do |filter, keywords|
- keywords.map! do |keyword|
- if keyword.whole_word
- sb = /\A[[:word:]]/.match?(keyword.keyword) ? '\b' : ''
- eb = /[[:word:]]\z/.match?(keyword.keyword) ? '\b' : ''
-
- /(?mix:#{sb}#{Regexp.escape(keyword.keyword)}#{eb})/
- else
- /#{Regexp.escape(keyword.keyword)}/i
- end
- end
+ keywords.map!(&:to_regex)
filters_hash[filter.id] = { keywords: Regexp.union(keywords), filter: filter }
end.to_h
@@ -143,6 +119,10 @@ class CustomFilter < ApplicationRecord
end
def context_must_be_valid
- errors.add(:context, I18n.t('filters.errors.invalid_context')) if context.empty? || context.any? { |c| !VALID_CONTEXTS.include?(c) }
+ errors.add(:context, I18n.t('filters.errors.invalid_context')) if invalid_context_value?
+ end
+
+ def invalid_context_value?
+ context.blank? || context.difference(VALID_CONTEXTS).any?
end
end
diff --git a/app/models/custom_filter_keyword.rb b/app/models/custom_filter_keyword.rb
index 1812a4308..979d0b822 100644
--- a/app/models/custom_filter_keyword.rb
+++ b/app/models/custom_filter_keyword.rb
@@ -17,22 +17,30 @@ class CustomFilterKeyword < ApplicationRecord
validates :keyword, presence: true
- # NOTE: We previously used `alias_attribute` but this does not play nicely
- # with cache
- def phrase
- keyword
- end
-
- def phrase=(value)
- self.keyword = value
- end
+ alias_attribute :phrase, :keyword
before_save :prepare_cache_invalidation!
before_destroy :prepare_cache_invalidation!
after_commit :invalidate_cache!
+ def to_regex
+ if whole_word?
+ /(?mix:#{to_regex_sb}#{Regexp.escape(keyword)}#{to_regex_eb})/
+ else
+ /#{Regexp.escape(keyword)}/i
+ end
+ end
+
private
+ def to_regex_sb
+ /\A[[:word:]]/.match?(keyword) ? '\b' : ''
+ end
+
+ def to_regex_eb
+ /[[:word:]]\z/.match?(keyword) ? '\b' : ''
+ end
+
def prepare_cache_invalidation!
custom_filter.prepare_cache_invalidation!
end
diff --git a/app/models/domain_allow.rb b/app/models/domain_allow.rb
index ce9597b4d..47ada7ac2 100644
--- a/app/models/domain_allow.rb
+++ b/app/models/domain_allow.rb
@@ -17,8 +17,6 @@ class DomainAllow < ApplicationRecord
validates :domain, presence: true, uniqueness: true, domain: true
- scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
-
def to_log_human_identifier
domain
end
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index ff23f8fcc..a05db099a 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -28,10 +28,9 @@ class DomainBlock < ApplicationRecord
has_many :accounts, foreign_key: :domain, primary_key: :domain, inverse_of: false, dependent: nil
delegate :count, to: :accounts, prefix: true
- scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
scope :with_user_facing_limitations, -> { where(severity: [:silence, :suspend]) }
scope :with_limitations, -> { where(severity: [:silence, :suspend]).or(where(reject_media: true)) }
- scope :by_severity, -> { order(Arel.sql('(CASE severity WHEN 0 THEN 1 WHEN 1 THEN 2 WHEN 2 THEN 0 END), domain')) }
+ scope :by_severity, -> { in_order_of(:severity, %w(noop silence suspend)).order(:domain) }
def to_log_human_identifier
domain
@@ -85,11 +84,6 @@ class DomainBlock < ApplicationRecord
(reject_media || !other_block.reject_media) && (reject_reports || !other_block.reject_reports)
end
- def affected_accounts_count
- scope = suspend? ? accounts.where(suspended_at: created_at) : accounts.where(silenced_at: created_at)
- scope.count
- end
-
def public_domain
return domain unless obfuscate?
diff --git a/app/models/email_domain_block.rb b/app/models/email_domain_block.rb
index f1b14c8b0..40be59420 100644
--- a/app/models/email_domain_block.rb
+++ b/app/models/email_domain_block.rb
@@ -21,8 +21,10 @@ class EmailDomainBlock < ApplicationRecord
include DomainNormalizable
include Paginable
- belongs_to :parent, class_name: 'EmailDomainBlock', optional: true
- has_many :children, class_name: 'EmailDomainBlock', foreign_key: :parent_id, inverse_of: :parent, dependent: :destroy
+ with_options class_name: 'EmailDomainBlock' do
+ belongs_to :parent, optional: true
+ has_many :children, foreign_key: :parent_id, inverse_of: :parent, dependent: :destroy
+ end
validates :domain, presence: true, uniqueness: true, domain: true
diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb
index 7c36aa8b0..ea8aa4787 100644
--- a/app/models/featured_tag.rb
+++ b/app/models/featured_tag.rb
@@ -45,7 +45,7 @@ class FeaturedTag < ApplicationRecord
end
def decrement(deleted_status_id)
- update(statuses_count: [0, statuses_count - 1].max, last_status_at: account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).where.not(id: deleted_status_id).select(:created_at).first&.created_at)
+ update(statuses_count: [0, statuses_count - 1].max, last_status_at: visible_tagged_account_statuses.where.not(id: deleted_status_id).select(:created_at).first&.created_at)
end
private
@@ -55,8 +55,8 @@ class FeaturedTag < ApplicationRecord
end
def reset_data
- self.statuses_count = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).count
- self.last_status_at = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).select(:created_at).first&.created_at
+ self.statuses_count = visible_tagged_account_statuses.count
+ self.last_status_at = visible_tagged_account_statuses.select(:created_at).first&.created_at
end
def validate_featured_tags_limit
@@ -66,6 +66,14 @@ class FeaturedTag < ApplicationRecord
end
def validate_tag_uniqueness
- errors.add(:name, :taken) if FeaturedTag.by_name(name).where(account_id: account_id).exists?
+ errors.add(:name, :taken) if tag_already_featured_for_account?
+ end
+
+ def tag_already_featured_for_account?
+ FeaturedTag.by_name(name).exists?(account_id: account_id)
+ end
+
+ def visible_tagged_account_statuses
+ account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag)
end
end
diff --git a/app/models/follow_recommendation.rb b/app/models/follow_recommendation.rb
index 9d2648394..6b49a3ca6 100644
--- a/app/models/follow_recommendation.rb
+++ b/app/models/follow_recommendation.rb
@@ -19,6 +19,8 @@ class FollowRecommendation < ApplicationRecord
scope :localized, ->(locale) { joins(:account_summary).merge(AccountSummary.localized(locale)) }
def self.refresh
+ Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false)
+ rescue ActiveRecord::StatementInvalid
Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false)
end
diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb
index 3c5e8f96f..c13cc718d 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 712acf370..fc83d9c58 100644
--- a/app/models/form/import.rb
+++ b/app/models/form/import.rb
@@ -69,7 +69,7 @@ class Form::Import
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/app/models/generated_annual_report.rb b/app/models/generated_annual_report.rb
new file mode 100644
index 000000000..43c97d710
--- /dev/null
+++ b/app/models/generated_annual_report.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: generated_annual_reports
+#
+# id :bigint(8) not null, primary key
+# account_id :bigint(8) not null
+# year :integer not null
+# data :jsonb not null
+# schema_version :integer not null
+# viewed_at :datetime
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+
+class GeneratedAnnualReport < ApplicationRecord
+ belongs_to :account
+
+ scope :pending, -> { where(viewed_at: nil) }
+
+ def viewed?
+ viewed_at.present?
+ end
+
+ def view!
+ update!(viewed_at: Time.now.utc)
+ end
+
+ def account_ids
+ data['most_reblogged_accounts'].pluck('account_id') + data['commonly_interacted_with_accounts'].pluck('account_id')
+ end
+
+ def status_ids
+ data['top_statuses'].values
+ end
+end
diff --git a/app/models/instance.rb b/app/models/instance.rb
index 17ee0cbb1..0fd31c809 100644
--- a/app/models/instance.rb
+++ b/app/models/instance.rb
@@ -13,22 +13,37 @@ class Instance < ApplicationRecord
attr_accessor :failure_days
- has_many :accounts, foreign_key: :domain, primary_key: :domain, inverse_of: false
-
with_options foreign_key: :domain, primary_key: :domain, inverse_of: false do
belongs_to :domain_block
belongs_to :domain_allow
- belongs_to :unavailable_domain # skipcq: RB-RL1031
+ belongs_to :unavailable_domain
+
+ has_many :accounts, dependent: nil
end
scope :searchable, -> { where.not(domain: DomainBlock.select(:domain)) }
scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
+ scope :domain_starts_with, ->(value) { where(arel_table[:domain].matches("#{sanitize_sql_like(value)}%", false, true)) }
scope :by_domain_and_subdomains, ->(domain) { where("reverse('.' || domain) LIKE reverse(?)", "%.#{domain}") }
+ scope :with_domain_follows, ->(domains) { where(domain: domains).where(domain_account_follows) }
def self.refresh
Scenic.database.refresh_materialized_view(table_name, concurrently: true, cascade: false)
end
+ def self.domain_account_follows
+ Arel.sql(
+ <<~SQL.squish
+ EXISTS (
+ SELECT 1
+ FROM follows
+ JOIN accounts ON follows.account_id = accounts.id OR follows.target_account_id = accounts.id
+ WHERE accounts.domain = instances.domain
+ )
+ SQL
+ )
+ end
+
def readonly?
true
end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 1f40e5725..7ff6a15f5 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -204,12 +204,14 @@ class MediaAttachment < ApplicationRecord
validates :file, presence: true, if: :local?
validates :thumbnail, absence: true, if: -> { local? && !audio_or_video? }
- scope :attached, -> { where.not(status_id: nil).or(where.not(scheduled_status_id: nil)) }
- scope :cached, -> { remote.where.not(file_file_name: nil) }
- scope :local, -> { where(remote_url: '') }
- scope :ordered, -> { order(id: :asc) }
- scope :remote, -> { where.not(remote_url: '') }
+ scope :attached, -> { where.not(status_id: nil).or(where.not(scheduled_status_id: nil)) }
+ scope :cached, -> { remote.where.not(file_file_name: nil) }
+ scope :created_before, ->(value) { where(arel_table[:created_at].lt(value)) }
+ scope :local, -> { where(remote_url: '') }
+ scope :ordered, -> { order(id: :asc) }
+ scope :remote, -> { where.not(remote_url: '') }
scope :unattached, -> { where(status_id: nil, scheduled_status_id: nil) }
+ scope :updated_before, ->(value) { where(arel_table[:updated_at].lt(value)) }
attr_accessor :skip_download
diff --git a/app/models/poll.rb b/app/models/poll.rb
index 72f04f00a..cc4184f80 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -27,8 +27,11 @@ class Poll < ApplicationRecord
belongs_to :status
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :delete_all
- has_many :voters, -> { group('accounts.id') }, through: :votes, class_name: 'Account', source: :account
- has_many :local_voters, -> { group('accounts.id').merge(Account.local) }, through: :votes, class_name: 'Account', source: :account
+
+ with_options class_name: 'Account', source: :account, through: :votes do
+ has_many :voters, -> { group('accounts.id') }
+ has_many :local_voters, -> { group('accounts.id').merge(Account.local) }
+ end
has_many :notifications, as: :activity, dependent: :destroy
@@ -54,7 +57,7 @@ class Poll < ApplicationRecord
end
def voted?(account)
- account.id == account_id || votes.where(account: account).exists?
+ account.id == account_id || votes.exists?(account: account)
end
def own_votes(account)
diff --git a/app/models/privacy_policy.rb b/app/models/privacy_policy.rb
index 36cbf1882..c0d6e1b76 100644
--- a/app/models/privacy_policy.rb
+++ b/app/models/privacy_policy.rb
@@ -1,66 +1,7 @@
# frozen_string_literal: true
class PrivacyPolicy < ActiveModelSerializers::Model
- DEFAULT_PRIVACY_POLICY = <<~TXT
- This privacy policy describes how %{domain} ("%{domain}", "we", "us") collects, protects and uses the personally identifiable information you may provide through the %{domain} website or its API. The policy also describes the choices available to you regarding our use of your personal information and how you can access and update this information. This policy does not apply to the practices of companies that %{domain} does not own or control, or to individuals that %{domain} does not employ or manage.
-
- # What information do we collect?
-
- - **Basic account information**: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.
- - **Posts, following and other public information**: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.
- - **Direct and followers-only posts**: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. **Please keep in mind that the operators of the server and any receiving server may view such messages**, and that recipients may screenshot, copy or otherwise re-share them. **Do not share any sensitive information over Mastodon.**
- - **IPs and other metadata**: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.
-
- # What do we use your information for?
-
- Any of the information we collect from you may be used in the following ways:
-
- - To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.
- - To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.
- - The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.
-
- # How do we protect your information?
-
- We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. You may enable two-factor authentication to further secure access to your account.
-
- # What is our data retention policy?
-
- We will make a good faith effort to:
-
- - Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.
- - Retain the IP addresses associated with registered users no more than 12 months.
-
- You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.
-
- You may irreversibly delete your account at any time.
-
- # Do we use cookies?
-
- Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.
-
- We use cookies to understand and save your preferences for future visits.
-
- # Do we disclose any information to outside parties?
-
- We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety.
-
- Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.
-
- When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your favourites. Applications can never access your e-mail address or password.
-
- # Site usage by children
-
- If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site.
-
- If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.
-
- Law requirements can be different if this server is in another jurisdiction.
-
- ___
-
- This document is CC-BY-SA. Originally adapted from the [Discourse privacy policy](https://github.com/discourse/discourse).
- TXT
-
+ DEFAULT_PRIVACY_POLICY = Rails.root.join('config', 'templates', 'privacy-policy.md').read
DEFAULT_UPDATED_AT = DateTime.new(2022, 10, 7).freeze
attributes :updated_at, :text
diff --git a/app/models/report.rb b/app/models/report.rb
index c565362cc..38da26d7b 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -29,16 +29,19 @@ class Report < ApplicationRecord
rate_limit by: :account, family: :reports
belongs_to :account
- belongs_to :target_account, class_name: 'Account'
- belongs_to :action_taken_by_account, class_name: 'Account', optional: true
- belongs_to :assigned_account, class_name: 'Account', optional: true
+
+ with_options class_name: 'Account' do
+ belongs_to :target_account
+ belongs_to :action_taken_by_account, optional: true
+ belongs_to :assigned_account, optional: true
+ end
has_many :notes, class_name: 'ReportNote', inverse_of: :report, dependent: :destroy
has_many :notifications, as: :activity, dependent: :destroy
scope :unresolved, -> { where(action_taken_at: nil) }
scope :resolved, -> { where.not(action_taken_at: nil) }
- scope :with_accounts, -> { includes([:account, :target_account, :action_taken_by_account, :assigned_account].index_with({ user: [:invite_request, :invite] })) }
+ scope :with_accounts, -> { includes([:account, :target_account, :action_taken_by_account, :assigned_account].index_with([:account_stat, { user: [:invite_request, :invite, :ips] }])) }
# A report is considered local if the reporter is local
delegate :local?, to: :account
diff --git a/app/models/session_activation.rb b/app/models/session_activation.rb
index 7f5f0d9a9..c67180d3b 100644
--- a/app/models/session_activation.rb
+++ b/app/models/session_activation.rb
@@ -41,7 +41,7 @@ class SessionActivation < ApplicationRecord
class << self
def active?(id)
- id && where(session_id: id).exists?
+ id && exists?(session_id: id)
end
def activate(**options)
diff --git a/app/models/setting.rb b/app/models/setting.rb
index 3bdc6ffb4..6af7a98c6 100644
--- a/app/models/setting.rb
+++ b/app/models/setting.rb
@@ -13,49 +13,114 @@
# thing_id :bigint(8)
#
-class Setting < RailsSettings::Base
- source Rails.root.join('config', 'settings.yml')
+# This file is derived from a fork of the `rails-settings-cached` gem available at
+# https://github.com/mastodon/rails-settings-cached/tree/v0.6.6-aliases-true, with
+# the original available at:
+# https://github.com/huacnlee/rails-settings-cached/tree/0.x
+
+# It is licensed as follows:
+
+# Copyright (c) 2006 Alex Wayne
+# Some additional features added 2009 by Georg Ledermann
+
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND
+# NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+class Setting < ApplicationRecord
+ after_commit :rewrite_cache, on: %i(create update)
+ after_commit :expire_cache, on: %i(destroy)
+
+ # Settings are server-wide settings only, but they were previously
+ # used for users too. This can be dropped later with a database
+ # migration dropping any scoped setting.
+ default_scope { where(thing_type: nil, thing_id: nil) }
+
+ class << self
+ # get or set a variable with the variable as the called method
+ # rubocop:disable Style/MissingRespondToMissing
+ def method_missing(method, *args)
+ # set a value for a variable
+ if method.end_with?('=')
+ var_name = method.to_s.chomp('=')
+ value = args.first
+ self[var_name] = value
+ else
+ # retrieve a value
+ self[method.to_s]
+ end
+ end
+ # rubocop:enable Style/MissingRespondToMissing
+
+ def cache_prefix_by_startup
+ @cache_prefix_by_startup ||= Digest::MD5.hexdigest(default_settings.to_s)
+ end
+
+ def cache_key(var_name)
+ "rails_settings_cached/#{cache_prefix_by_startup}/#{var_name}"
+ end
+
+ def [](key)
+ Rails.cache.fetch(cache_key(key)) do
+ db_val = find_by(var: key)
+ db_val ? db_val.value : default_settings[key]
+ end
+ end
+
+ # set a setting value by [] notation
+ def []=(var_name, value)
+ record = find_or_initialize_by(var: var_name.to_s)
+ record.value = value
+ record.save!
+ end
+
+ def default_settings
+ return @default_settings if defined?(@default_settings)
+
+ content = Rails.root.join('config', 'settings.yml').read
+ hash = content.empty? ? {} : YAML.safe_load(ERB.new(content).result, aliases: true).to_hash
+ @default_settings = (hash[Rails.env] || {}).freeze
+ end
+ end
+
+ # get the value field, YAML decoded
+ def value
+ YAML.safe_load(self[:value], permitted_classes: [ActiveSupport::HashWithIndifferentAccess, Symbol]) if self[:value].present?
+ end
+
+ # set the value field, YAML encoded
+ def value=(new_value)
+ self[:value] = new_value.to_yaml
+ end
+
+ def rewrite_cache
+ Rails.cache.write(cache_key, value)
+ end
+
+ def expire_cache
+ Rails.cache.delete(cache_key)
+ end
+
+ def cache_key
+ self.class.cache_key(var)
+ end
def to_param
var
end
-
- class << self
- def [](key)
- return super(key) unless rails_initialized?
-
- Rails.cache.fetch(cache_key(key, nil)) do
- db_val = object(key)
-
- if db_val
- default_value = default_settings[key]
-
- return default_value.with_indifferent_access.merge!(db_val.value) if default_value.is_a?(Hash)
-
- db_val.value
- else
- default_settings[key]
- end
- end
- end
-
- def all_as_records
- vars = thing_scoped
- records = vars.index_by(&:var)
-
- default_settings.each do |key, default_value|
- next if records.key?(key) || default_value.is_a?(Hash)
-
- records[key] = Setting.new(var: key, value: default_value)
- end
-
- records
- end
-
- def default_settings
- return {} unless RailsSettings::Default.enabled?
-
- RailsSettings::Default.instance
- end
- end
end
diff --git a/app/models/status.rb b/app/models/status.rb
index 96e47c6e6..4b2dff019 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -60,9 +60,11 @@ class Status < ApplicationRecord
belongs_to :conversation, optional: true
belongs_to :preloadable_poll, class_name: 'Poll', foreign_key: 'poll_id', optional: true, inverse_of: false
- belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
- belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
- belongs_to :quote, class_name: 'Status', inverse_of: :quoted, optional: true
+ with_options class_name: 'Status', optional: true do
+ belongs_to :thread, foreign_key: 'in_reply_to_id', inverse_of: :replies
+ belongs_to :reblog, foreign_key: 'reblog_of_id', inverse_of: :reblogs
+ belongs_to :quote, inverse_of: :quoted
+ end
has_many :favourites, inverse_of: :status, dependent: :destroy
has_many :bookmarks, inverse_of: :status, dependent: :destroy
@@ -112,8 +114,6 @@ class Status < ApplicationRecord
scope :without_reblogs, -> { where(statuses: { reblog_of_id: nil }) }
scope :with_public_visibility, -> { where(visibility: :public) }
scope :tagged_with, ->(tag_ids) { joins(:statuses_tags).where(statuses_tags: { tag_id: tag_ids }) }
- scope :excluding_silenced_accounts, -> { left_outer_joins(:account).where(accounts: { silenced_at: nil }) }
- scope :including_silenced_accounts, -> { left_outer_joins(:account).where.not(accounts: { silenced_at: nil }) }
scope :not_excluded_by_account, ->(account) { where.not(account_id: account.excluded_from_timeline_account_ids) }
scope :not_domain_blocked_by_account, ->(account) { account.excluded_from_timeline_domains.blank? ? left_outer_joins(:account) : left_outer_joins(:account).where('accounts.domain IS NULL OR accounts.domain NOT IN (?)', account.excluded_from_timeline_domains) }
scope :tagged_with_all, lambda { |tag_ids|
@@ -275,7 +275,7 @@ class Status < ApplicationRecord
end
def reported?
- @reported ||= Report.where(target_account: account).unresolved.where('? = ANY(status_ids)', id).exists?
+ @reported ||= Report.where(target_account: account).unresolved.exists?(['? = ANY(status_ids)', id])
end
def emojis
diff --git a/app/models/tag.rb b/app/models/tag.rb
index 46e55d74f..f2168ae90 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -39,6 +39,8 @@ class Tag < ApplicationRecord
HASHTAG_NAME_RE = /\A(#{HASHTAG_NAME_PAT})\z/i
HASHTAG_INVALID_CHARS_RE = /[^[:alnum:]\u0E47-\u0E4E#{HASHTAG_SEPARATORS}]/
+ RECENT_STATUS_LIMIT = 1000
+
validates :name, presence: true, format: { with: HASHTAG_NAME_RE }
validates :display_name, format: { with: HASHTAG_NAME_RE }
validate :validate_name_change, if: -> { !new_record? && name_changed? }
@@ -53,7 +55,7 @@ class Tag < ApplicationRecord
scope :not_trendable, -> { where(trendable: false) }
scope :recently_used, lambda { |account|
joins(:statuses)
- .where(statuses: { id: account.statuses.select(:id).limit(1000) })
+ .where(statuses: { id: account.statuses.select(:id).limit(RECENT_STATUS_LIMIT) })
.group(:id).order(Arel.sql('count(*) desc'))
}
scope :matches_name, ->(term) { where(arel_table[:name].lower.matches(arel_table.lower("#{sanitize_sql_like(Tag.normalize(term))}%"), nil, true)) } # Search with case-sensitive to use B-tree index
diff --git a/app/models/user.rb b/app/models/user.rb
index be1e84b49..70c24336f 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -117,16 +117,16 @@ class User < ApplicationRecord
scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended_at: nil }) }
scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
scope :matches_ip, ->(value) { left_joins(:ips).where('user_ips.ip <<= ?', value).group('users.id') }
- scope :emailable, -> { confirmed.enabled.joins(:account).merge(Account.searchable) }
- before_validation :sanitize_languages
before_validation :sanitize_role
- before_validation :sanitize_time_zone
- before_validation :sanitize_locale
before_create :set_approved
after_commit :send_pending_devise_notifications
after_create_commit :trigger_webhooks
+ normalizes :locale, with: ->(locale) { I18n.available_locales.exclude?(locale.to_sym) ? nil : locale }
+ normalizes :time_zone, with: ->(time_zone) { ActiveSupport::TimeZone[time_zone].nil? ? nil : time_zone }
+ normalizes :chosen_languages, with: ->(chosen_languages) { chosen_languages.compact_blank.presence }
+
# This avoids a deprecation warning from Rails 5.1
# It seems possible that a future release of devise-two-factor will
# handle this itself, and this can be removed from our User class.
@@ -149,6 +149,10 @@ class User < ApplicationRecord
end
end
+ def self.skip_mx_check?
+ Rails.env.local?
+ end
+
def role
if role_id.nil?
UserRole.everyone
@@ -186,37 +190,16 @@ class User < ApplicationRecord
end
def confirm
- new_user = !confirmed?
- self.approved = true if open_registrations? && !sign_up_from_ip_requires_approval?
-
- 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 open_registrations?
-
- 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
@@ -426,14 +409,53 @@ class User < ApplicationRecord
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 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?
+ sign_up_ip.present? && IpBlock.sign_up_requires_approval.exists?(['ip >>= ?', sign_up_ip.to_s])
end
def sign_up_email_requires_approval?
- return false unless email.present? || unconfirmed_email.present?
+ return false if email.blank?
- EmailDomainBlock.requires_approval?(email.presence || unconfirmed_email, attempt_ip: sign_up_ip)
+ _, 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?(records + [domain], attempt_ip: sign_up_ip)
end
def open_registrations?
@@ -448,25 +470,10 @@ class User < ApplicationRecord
@bypass_invite_request_check
end
- def sanitize_languages
- return if chosen_languages.nil?
-
- chosen_languages.compact_blank!
- self.chosen_languages = nil if chosen_languages.empty?
- end
-
def sanitize_role
self.role = nil if role.present? && role.everyone?
end
- def sanitize_time_zone
- self.time_zone = nil if time_zone.present? && ActiveSupport::TimeZone[time_zone].nil?
- end
-
- def sanitize_locale
- self.locale = nil if locale.present? && I18n.available_locales.exclude?(locale.to_sym)
- end
-
def prepare_new_user!
BootstrapTimelineWorker.perform_async(account_id)
ActivityTracker.increment('activity:accounts:local')
@@ -499,7 +506,7 @@ class User < ApplicationRecord
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/app/policies/status_policy.rb b/app/policies/status_policy.rb
index 322d3aec5..540e26642 100644
--- a/app/policies/status_policy.rb
+++ b/app/policies/status_policy.rb
@@ -57,7 +57,7 @@ class StatusPolicy < ApplicationPolicy
if record.mentions.loaded?
record.mentions.any? { |mention| mention.account_id == current_account.id }
else
- record.mentions.where(account: current_account).exists?
+ record.mentions.exists?(account: current_account)
end
end
diff --git a/app/presenters/annual_reports_presenter.rb b/app/presenters/annual_reports_presenter.rb
new file mode 100644
index 000000000..001e1d37b
--- /dev/null
+++ b/app/presenters/annual_reports_presenter.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AnnualReportsPresenter
+ alias read_attribute_for_serialization send
+
+ attr_reader :annual_reports
+
+ def initialize(annual_reports)
+ @annual_reports = annual_reports
+ end
+
+ def accounts
+ @accounts ||= Account.where(id: @annual_reports.flat_map(&:account_ids)).includes(:account_stat, :moved_to_account, user: :role)
+ end
+
+ def statuses
+ @statuses ||= Status.where(id: @annual_reports.flat_map(&:status_ids)).with_includes
+ end
+
+ def self.model_name
+ @model_name ||= ActiveModel::Name.new(self)
+ end
+end
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index 501bb788e..1c1f7d0ad 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -39,7 +39,7 @@ class ManifestSerializer < ActiveModel::Serializer
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/announcement_serializer.rb b/app/serializers/rest/announcement_serializer.rb
index 23b2fa514..8cee27127 100644
--- a/app/serializers/rest/announcement_serializer.rb
+++ b/app/serializers/rest/announcement_serializer.rb
@@ -23,7 +23,7 @@ class REST::AnnouncementSerializer < ActiveModel::Serializer
end
def read
- object.announcement_mutes.where(account: current_user.account).exists?
+ object.announcement_mutes.exists?(account: current_user.account)
end
def content
diff --git a/app/serializers/rest/annual_report_serializer.rb b/app/serializers/rest/annual_report_serializer.rb
new file mode 100644
index 000000000..1fb5ddb5c
--- /dev/null
+++ b/app/serializers/rest/annual_report_serializer.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class REST::AnnualReportSerializer < ActiveModel::Serializer
+ attributes :year, :data, :schema_version
+end
diff --git a/app/serializers/rest/annual_reports_serializer.rb b/app/serializers/rest/annual_reports_serializer.rb
new file mode 100644
index 000000000..ea9572be1
--- /dev/null
+++ b/app/serializers/rest/annual_reports_serializer.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class REST::AnnualReportsSerializer < ActiveModel::Serializer
+ has_many :annual_reports, serializer: REST::AnnualReportSerializer
+ has_many :accounts, serializer: REST::AccountSerializer
+ has_many :statuses, serializer: REST::StatusSerializer
+end
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index eeab951d2..af6c17d3c 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -28,7 +28,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
}
else
{
- url: full_pack_url('media/images/preview.png'),
+ url: frontend_asset_url('images/preview.png'),
}
end
end
diff --git a/app/serializers/rest/tag_serializer.rb b/app/serializers/rest/tag_serializer.rb
index 7801e77d1..017b57271 100644
--- a/app/serializers/rest/tag_serializer.rb
+++ b/app/serializers/rest/tag_serializer.rb
@@ -19,7 +19,7 @@ class REST::TagSerializer < ActiveModel::Serializer
if instance_options && instance_options[:relationships]
instance_options[:relationships].following_map[object.id] || false
else
- TagFollow.where(tag_id: object.id, account_id: current_user.account_id).exists?
+ TagFollow.exists?(tag_id: object.id, account_id: current_user.account_id)
end
end
diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb
index 99d1b2bd6..fdf939cfc 100644
--- a/app/serializers/rest/v1/instance_serializer.rb
+++ b/app/serializers/rest/v1/instance_serializer.rb
@@ -33,7 +33,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer
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/services/activitypub/fetch_featured_collection_service.rb b/app/services/activitypub/fetch_featured_collection_service.rb
index d2bae08a0..89c3a1b6c 100644
--- a/app/services/activitypub/fetch_featured_collection_service.rb
+++ b/app/services/activitypub/fetch_featured_collection_service.rb
@@ -23,9 +23,9 @@ class ActivityPub::FetchFeaturedCollectionService < BaseService
case collection['type']
when 'Collection', 'CollectionPage'
- collection['items']
+ as_array(collection['items'])
when 'OrderedCollection', 'OrderedCollectionPage'
- collection['orderedItems']
+ as_array(collection['orderedItems'])
end
end
diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb
index 567dd8a14..7b083d889 100644
--- a/app/services/activitypub/fetch_remote_account_service.rb
+++ b/app/services/activitypub/fetch_remote_account_service.rb
@@ -2,7 +2,7 @@
class ActivityPub::FetchRemoteAccountService < ActivityPub::FetchRemoteActorService
# Does a WebFinger roundtrip on each call, unless `only_key` is true
- def call(uri, id: true, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil)
+ def call(uri, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil)
actor = super
return actor if actor.nil? || actor.is_a?(Account)
diff --git a/app/services/activitypub/fetch_remote_actor_service.rb b/app/services/activitypub/fetch_remote_actor_service.rb
index 8df8c7587..86a134bb4 100644
--- a/app/services/activitypub/fetch_remote_actor_service.rb
+++ b/app/services/activitypub/fetch_remote_actor_service.rb
@@ -10,15 +10,15 @@ class ActivityPub::FetchRemoteActorService < BaseService
SUPPORTED_TYPES = %w(Application Group Organization Person Service).freeze
# Does a WebFinger roundtrip on each call, unless `only_key` is true
- def call(uri, id: true, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil)
+ def call(uri, prefetched_body: nil, break_on_redirect: false, only_key: false, suppress_errors: true, request_id: nil)
return if domain_not_allowed?(uri)
return ActivityPub::TagManager.instance.uri_to_actor(uri) if ActivityPub::TagManager.instance.local_uri?(uri)
@json = begin
if prefetched_body.nil?
- fetch_resource(uri, id)
+ fetch_resource(uri, true)
else
- body_to_json(prefetched_body, compare_id: id ? uri : nil)
+ body_to_json(prefetched_body, compare_id: uri)
end
rescue Oj::ParseError
raise Error, "Error parsing JSON-LD document #{uri}"
diff --git a/app/services/activitypub/fetch_remote_key_service.rb b/app/services/activitypub/fetch_remote_key_service.rb
index 8eb97c1e6..e96b5ad3b 100644
--- a/app/services/activitypub/fetch_remote_key_service.rb
+++ b/app/services/activitypub/fetch_remote_key_service.rb
@@ -6,23 +6,10 @@ class ActivityPub::FetchRemoteKeyService < BaseService
class Error < StandardError; end
# Returns actor that owns the key
- def call(uri, id: true, prefetched_body: nil, suppress_errors: true)
+ def call(uri, suppress_errors: true)
raise Error, 'No key URI given' if uri.blank?
- if prefetched_body.nil?
- if id
- @json = fetch_resource_without_id_validation(uri)
- if actor_type?
- @json = fetch_resource(@json['id'], true)
- elsif uri != @json['id']
- raise Error, "Fetched URI #{uri} has wrong id #{@json['id']}"
- end
- else
- @json = fetch_resource(uri, id)
- end
- else
- @json = body_to_json(prefetched_body, compare_id: id ? uri : nil)
- end
+ @json = fetch_resource(uri, false)
raise Error, "Unable to fetch key JSON at #{uri}" if @json.nil?
raise Error, "Unsupported JSON-LD context for document #{uri}" unless supported_context?(@json)
diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb
index a491b32b2..6f8882378 100644
--- a/app/services/activitypub/fetch_remote_status_service.rb
+++ b/app/services/activitypub/fetch_remote_status_service.rb
@@ -8,14 +8,14 @@ class ActivityPub::FetchRemoteStatusService < BaseService
DISCOVERIES_PER_REQUEST = 1000
# Should be called when uri has already been checked for locality
- def call(uri, id: true, prefetched_body: nil, on_behalf_of: nil, expected_actor_uri: nil, request_id: nil)
+ def call(uri, prefetched_body: nil, on_behalf_of: nil, expected_actor_uri: nil, request_id: nil)
return if domain_not_allowed?(uri)
@request_id = request_id || "#{Time.now.utc.to_i}-status-#{uri}"
@json = if prefetched_body.nil?
- fetch_resource(uri, id, on_behalf_of)
+ fetch_resource(uri, true, on_behalf_of)
else
- body_to_json(prefetched_body, compare_id: id ? uri : nil)
+ body_to_json(prefetched_body, compare_id: uri)
end
return unless supported_context?
@@ -44,7 +44,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService
# If we fetched a status that already exists, then we need to treat the
# activity as an update rather than create
- activity_json['type'] = 'Update' if equals_or_includes_any?(activity_json['type'], %w(Create)) && Status.where(uri: object_uri, account_id: actor.id).exists?
+ activity_json['type'] = 'Update' if equals_or_includes_any?(activity_json['type'], %w(Create)) && Status.exists?(uri: object_uri, account_id: actor.id)
with_redis do |redis|
discoveries = redis.incr("status_discovery_per_request:#{@request_id}")
@@ -65,7 +65,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService
def account_from_uri(uri)
actor = ActivityPub::TagManager.instance.uri_to_resource(uri, Account)
- actor = ActivityPub::FetchRemoteAccountService.new.call(uri, id: true, request_id: @request_id) if actor.nil? || actor.possibly_stale?
+ actor = ActivityPub::FetchRemoteAccountService.new.call(uri, request_id: @request_id) if actor.nil? || actor.possibly_stale?
actor
end
diff --git a/app/services/activitypub/fetch_replies_service.rb b/app/services/activitypub/fetch_replies_service.rb
index b5c7759ec..e2ecdef16 100644
--- a/app/services/activitypub/fetch_replies_service.rb
+++ b/app/services/activitypub/fetch_replies_service.rb
@@ -26,9 +26,9 @@ class ActivityPub::FetchRepliesService < BaseService
case collection['type']
when 'Collection', 'CollectionPage'
- collection['items']
+ as_array(collection['items'])
when 'OrderedCollection', 'OrderedCollectionPage'
- collection['orderedItems']
+ as_array(collection['orderedItems'])
end
end
@@ -37,7 +37,20 @@ class ActivityPub::FetchRepliesService < BaseService
return unless @allow_synchronous_requests
return if non_matching_uri_hosts?(@account.uri, collection_or_uri)
- fetch_resource_without_id_validation(collection_or_uri, nil, true)
+ # NOTE: For backward compatibility reasons, Mastodon signs outgoing
+ # queries incorrectly by default.
+ #
+ # While this is relevant for all URLs with query strings, this is
+ # the only code path where this happens in practice.
+ #
+ # Therefore, retry with correct signatures if this fails.
+ begin
+ fetch_resource_without_id_validation(collection_or_uri, nil, true)
+ rescue Mastodon::UnexpectedResponseError => e
+ raise unless e.response && e.response.code == 401 && Addressable::URI.parse(collection_or_uri).query.present?
+
+ fetch_resource_without_id_validation(collection_or_uri, nil, true, request_options: { with_query_string: true })
+ end
end
def filtered_replies
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 8fc0989a3..9e787ace5 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -277,7 +277,7 @@ class ActivityPub::ProcessAccountService < BaseService
def moved_account
account = ActivityPub::TagManager.instance.uri_to_resource(@json['movedTo'], Account)
- account ||= ActivityPub::FetchRemoteAccountService.new.call(@json['movedTo'], id: true, break_on_redirect: true, request_id: @options[:request_id])
+ account ||= ActivityPub::FetchRemoteAccountService.new.call(@json['movedTo'], break_on_redirect: true, request_id: @options[:request_id])
account
end
diff --git a/app/services/activitypub/synchronize_followers_service.rb b/app/services/activitypub/synchronize_followers_service.rb
index 7ccc91730..f51d671a0 100644
--- a/app/services/activitypub/synchronize_followers_service.rb
+++ b/app/services/activitypub/synchronize_followers_service.rb
@@ -59,9 +59,9 @@ class ActivityPub::SynchronizeFollowersService < BaseService
case collection['type']
when 'Collection', 'CollectionPage'
- collection['items']
+ as_array(collection['items'])
when 'OrderedCollection', 'OrderedCollectionPage'
- collection['orderedItems']
+ as_array(collection['orderedItems'])
end
end
diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb
index a3406e5a5..71c6cca79 100644
--- a/app/services/fetch_resource_service.rb
+++ b/app/services/fetch_resource_service.rb
@@ -48,7 +48,15 @@ class FetchResourceService < BaseService
body = response.body_with_limit
json = body_to_json(body)
- [json['id'], { prefetched_body: body, id: true }] if supported_context?(json) && (equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteActorService::SUPPORTED_TYPES) || expected_type?(json))
+ return unless supported_context?(json) && (equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteActorService::SUPPORTED_TYPES) || expected_type?(json))
+
+ if json['id'] != @url
+ return if terminal
+
+ return process(json['id'], terminal: true)
+ end
+
+ [@url, { prefetched_body: body }]
elsif !terminal
link_header = response['Link'] && parse_link_header(response)
diff --git a/app/services/keys/query_service.rb b/app/services/keys/query_service.rb
index 14c9d9205..33e13293f 100644
--- a/app/services/keys/query_service.rb
+++ b/app/services/keys/query_service.rb
@@ -69,7 +69,7 @@ class Keys::QueryService < BaseService
return if json['items'].blank?
- @devices = json['items'].map do |device|
+ @devices = as_array(json['items']).map do |device|
Device.new(device_id: device['id'], name: device['name'], identity_key: device.dig('identityKey', 'publicKeyBase64'), fingerprint_key: device.dig('fingerprintKey', 'publicKeyBase64'), claim_url: device['claim'])
end
rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error => e
diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb
index 960315ed8..cca79eced 100644
--- a/app/services/reblog_service.rb
+++ b/app/services/reblog_service.rb
@@ -43,11 +43,7 @@ class ReblogService < BaseService
def create_notification(reblog)
reblogged_status = reblog.reblog
- if reblogged_status.account.local?
- LocalNotificationWorker.perform_async(reblogged_status.account_id, reblog.id, reblog.class.name, 'reblog')
- elsif reblogged_status.account.activitypub? && !reblogged_status.account.following?(reblog.account)
- ActivityPub::DeliveryWorker.perform_async(build_json(reblog), reblog.account_id, reblogged_status.account.inbox_url)
- end
+ LocalNotificationWorker.perform_async(reblogged_status.account_id, reblog.id, reblog.class.name, 'reblog') if reblogged_status.account.local?
end
def increment_statistics
diff --git a/app/services/vote_service.rb b/app/services/vote_service.rb
index 3e92a1690..878350388 100644
--- a/app/services/vote_service.rb
+++ b/app/services/vote_service.rb
@@ -19,7 +19,7 @@ class VoteService < BaseService
already_voted = true
with_redis_lock("vote:#{@poll.id}:#{@account.id}") do
- already_voted = @poll.votes.where(account: @account).exists?
+ already_voted = @poll.votes.exists?(account: @account)
ApplicationRecord.transaction do
@choices.each do |choice|
diff --git a/app/validators/email_mx_validator.rb b/app/validators/email_mx_validator.rb
index a30a0c820..794377894 100644
--- a/app/validators/email_mx_validator.rb
+++ b/app/validators/email_mx_validator.rb
@@ -47,6 +47,7 @@ class EmailMxValidator < ActiveModel::Validator
dns.timeouts = 5
records = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }
+ next if records == [''] # This domain explicitly rejects emails
([domain] + records).uniq.each do |hostname|
ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s })
diff --git a/app/validators/reaction_validator.rb b/app/validators/reaction_validator.rb
index 4ed3376e8..89d83de5a 100644
--- a/app/validators/reaction_validator.rb
+++ b/app/validators/reaction_validator.rb
@@ -19,7 +19,7 @@ class ReactionValidator < ActiveModel::Validator
end
def new_reaction?(reaction)
- !reaction.announcement.announcement_reactions.where(name: reaction.name).exists?
+ !reaction.announcement.announcement_reactions.exists?(name: reaction.name)
end
def limit_reached?(reaction)
diff --git a/app/validators/vote_validator.rb b/app/validators/vote_validator.rb
index fa2bd223d..e725b4c0b 100644
--- a/app/validators/vote_validator.rb
+++ b/app/validators/vote_validator.rb
@@ -35,7 +35,7 @@ class VoteValidator < ActiveModel::Validator
if vote.persisted?
account_votes_on_same_poll(vote).where(choice: vote.choice).where.not(poll_votes: { id: vote }).exists?
else
- account_votes_on_same_poll(vote).where(choice: vote.choice).exists?
+ account_votes_on_same_poll(vote).exists?(choice: vote.choice)
end
end
diff --git a/app/views/admin/account_warnings/_account_warning.html.haml b/app/views/admin/account_warnings/_account_warning.html.haml
index 85bac789f..5702e4f6d 100644
--- a/app/views/admin/account_warnings/_account_warning.html.haml
+++ b/app/views/admin/account_warnings/_account_warning.html.haml
@@ -5,7 +5,10 @@
= fa_icon 'warning'
.log-entry__content
.log-entry__title
- = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account ? account_warning.account.username : I18n.t('admin.action_logs.deleted_account'), class: 'username'), target: content_tag(:span, account_warning.target_account.pretty_acct, class: 'target')).html_safe
+ = t(account_warning.action,
+ scope: 'admin.strikes.actions',
+ name: content_tag(:span, account_warning.account ? account_warning.account.username : I18n.t('admin.action_logs.deleted_account'), class: 'username'),
+ target: content_tag(:span, account_warning.target_account.pretty_acct, class: 'target')).html_safe
.log-entry__timestamp
%time.formatted{ datetime: account_warning.created_at.iso8601 }
= l(account_warning.created_at)
diff --git a/app/views/admin/action_logs/_action_log.html.haml b/app/views/admin/action_logs/_action_log.html.haml
index a2fce2d11..dcc333180 100644
--- a/app/views/admin/action_logs/_action_log.html.haml
+++ b/app/views/admin/action_logs/_action_log.html.haml
@@ -4,6 +4,8 @@
= image_tag action_log.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar'
.log-entry__content
.log-entry__title
- = t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}_html", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target'))
+ = t "admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}_html",
+ name: content_tag(:span, action_log.account.username, class: 'username'),
+ target: content_tag(:span, log_target(action_log), class: 'target')
.log-entry__timestamp
%time.formatted{ datetime: action_log.created_at.iso8601 }
diff --git a/app/views/admin/reports/_media_attachments.html.haml b/app/views/admin/reports/_media_attachments.html.haml
index 8ecd7444d..3c52d6917 100644
--- a/app/views/admin/reports/_media_attachments.html.haml
+++ b/app/views/admin/reports/_media_attachments.html.haml
@@ -2,6 +2,16 @@
= render_video_component(status, visible: false)
- elsif status.ordered_media_attachments.first.audio?
- audio = status.ordered_media_attachments.first
- = react_component :audio, src: audio.file.url(:original), height: 110, alt: audio.description, lang: status.language, duration: audio.file.meta.dig(:original, :duration)
+ = react_component :audio,
+ alt: audio.description,
+ duration: audio.file.meta.dig(:original, :duration),
+ height: 110,
+ lang: status.language,
+ src: audio.file.url(:original)
- else
- = react_component :media_gallery, height: 343, sensitive: status.sensitive?, visible: false, lang: status.language, media: status.ordered_media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
+ = react_component :media_gallery,
+ height: 343,
+ lang: status.language,
+ media: status.ordered_media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json },
+ sensitive: status.sensitive?,
+ visible: false
diff --git a/app/views/application/mailer/_account.html.haml b/app/views/application/mailer/_account.html.haml
new file mode 100644
index 000000000..27493f770
--- /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/application/mailer/_button.html.haml b/app/views/application/mailer/_button.html.haml
new file mode 100644
index 000000000..61430732e
--- /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 000000000..83072bd36
--- /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 frontend_asset_url('images/mailer-new/welcome/checkbox-on.png'), alt: '', width: 20, height: 20
+ - else
+ = 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
+ %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 000000000..74403e767
--- /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 000000000..9fc5dc747
--- /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/auth/challenges/new.html.haml b/app/views/auth/challenges/new.html.haml
index 4f21e4af6..50dcebb00 100644
--- a/app/views/auth/challenges/new.html.haml
+++ b/app/views/auth/challenges/new.html.haml
@@ -5,7 +5,11 @@
= f.input :return_to, as: :hidden
.field-group
- = f.input :current_password, wrapper: :with_block_label, input_html: { autocomplete: 'current-password', autofocus: true }, label: t('challenge.prompt'), required: true
+ = f.input :current_password,
+ input_html: { autocomplete: 'current-password', autofocus: true },
+ label: t('challenge.prompt'),
+ required: true,
+ wrapper: :with_block_label
.actions
= f.button :button, t('challenge.confirm'), type: :submit
diff --git a/app/views/auth/confirmations/new.html.haml b/app/views/auth/confirmations/new.html.haml
index 0cb82a1f8..eaa9d9add 100644
--- a/app/views/auth/confirmations/new.html.haml
+++ b/app/views/auth/confirmations/new.html.haml
@@ -21,7 +21,13 @@
= render 'shared/error_messages', object: resource
.fields-group
- = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label': t('simple_form.labels.defaults.email') }, readonly: current_user.present?, hint: current_user.present? && t('auth.confirmations.wrong_email_hint')
+ = f.input :email,
+ autofocus: true,
+ hint: current_user.present? && t('auth.confirmations.wrong_email_hint'),
+ input_html: { 'aria-label': t('simple_form.labels.defaults.email') },
+ label: t('simple_form.labels.defaults.email'),
+ readonly: current_user.present?,
+ wrapper: :with_label
.actions
= f.button :button, t('auth.resend_confirmation'), type: :submit
diff --git a/app/views/auth/passwords/edit.html.haml b/app/views/auth/passwords/edit.html.haml
index b95a9b676..a75dc2d9f 100644
--- a/app/views/auth/passwords/edit.html.haml
+++ b/app/views/auth/passwords/edit.html.haml
@@ -8,9 +8,18 @@
= f.input :reset_password_token, as: :hidden
.fields-group
- = f.input :password, wrapper: :with_label, autofocus: true, label: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label': t('simple_form.labels.defaults.new_password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last }, required: true
+ = f.input :password,
+ autofocus: true,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.new_password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last },
+ label: t('simple_form.labels.defaults.new_password'),
+ required: true,
+ wrapper: :with_label
.fields-group
- = f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_new_password'), autocomplete: 'new-password' }, required: true
+ = f.input :password_confirmation,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_new_password'), autocomplete: 'new-password' },
+ label: t('simple_form.labels.defaults.confirm_new_password'),
+ required: true,
+ wrapper: :with_label
.actions
= f.button :button, t('auth.set_new_password'), type: :submit
diff --git a/app/views/auth/passwords/new.html.haml b/app/views/auth/passwords/new.html.haml
index 10ad108ea..8d5adaf3b 100644
--- a/app/views/auth/passwords/new.html.haml
+++ b/app/views/auth/passwords/new.html.haml
@@ -5,7 +5,12 @@
= render 'shared/error_messages', object: resource
.fields-group
- = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label': t('simple_form.labels.defaults.email') }, hint: false
+ = f.input :email,
+ autofocus: true,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.email') },
+ label: t('simple_form.labels.defaults.email'),
+ wrapper: :with_label
.actions
= f.button :button, t('auth.reset_password'), type: :submit
diff --git a/app/views/auth/registrations/_account_warning.html.haml b/app/views/auth/registrations/_account_warning.html.haml
index 40e7e1296..19e5746ff 100644
--- a/app/views/auth/registrations/_account_warning.html.haml
+++ b/app/views/auth/registrations/_account_warning.html.haml
@@ -5,7 +5,9 @@
= fa_icon 'warning'
.log-entry__content
.log-entry__title
- = t('disputes.strikes.title', action: t(account_warning.action, scope: 'disputes.strikes.title_actions'), date: l(account_warning.created_at.to_date))
+ = t 'disputes.strikes.title',
+ action: t(account_warning.action, scope: 'disputes.strikes.title_actions'),
+ date: l(account_warning.created_at.to_date)
.log-entry__timestamp
%time.formatted{ datetime: account_warning.created_at.iso8601 }= l(account_warning.created_at)
diff --git a/app/views/auth/registrations/_session.html.haml b/app/views/auth/registrations/_session.html.haml
index 28499a7c9..2fa7db70c 100644
--- a/app/views/auth/registrations/_session.html.haml
+++ b/app/views/auth/registrations/_session.html.haml
@@ -3,7 +3,9 @@
%span{ title: session.user_agent }<
= fa_icon "#{session_device_icon(session)} fw", 'aria-label': session_device_icon(session)
- = t 'sessions.description', browser: t("sessions.browsers.#{session.browser}", default: session.browser.to_s), platform: t("sessions.platforms.#{session.platform}", default: session.platform.to_s)
+ = t 'sessions.description',
+ browser: t("sessions.browsers.#{session.browser}", default: session.browser.to_s),
+ platform: t("sessions.platforms.#{session.platform}", default: session.platform.to_s)
%td
%samp= session.ip
%td
diff --git a/app/views/auth/registrations/edit.html.haml b/app/views/auth/registrations/edit.html.haml
index f5ef4e97e..48350f478 100644
--- a/app/views/auth/registrations/edit.html.haml
+++ b/app/views/auth/registrations/edit.html.haml
@@ -15,15 +15,33 @@
- if (!use_seamless_external_login? || resource.encrypted_password.present?) && !omniauth_only?
.fields-row
.fields-row__column.fields-group.fields-row__column-6
- = f.input :email, wrapper: :with_label, input_html: { 'aria-label': t('simple_form.labels.defaults.email') }, required: true, disabled: current_account.suspended?
+ = f.input :email,
+ disabled: current_account.suspended?,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.email') },
+ required: true,
+ wrapper: :with_label
.fields-row__column.fields-group.fields-row__column-6
- = f.input :current_password, wrapper: :with_label, input_html: { 'aria-label': t('simple_form.labels.defaults.current_password'), autocomplete: 'current-password' }, required: true, disabled: current_account.suspended?, hint: false
+ = f.input :current_password,
+ disabled: current_account.suspended?,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.current_password'), autocomplete: 'current-password' },
+ required: true,
+ wrapper: :with_label
.fields-row
.fields-row__column.fields-group.fields-row__column-6
- = f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label': t('simple_form.labels.defaults.new_password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last }, hint: t('simple_form.hints.defaults.password'), disabled: current_account.suspended?
+ = f.input :password,
+ disabled: current_account.suspended?,
+ hint: t('simple_form.hints.defaults.password'),
+ input_html: { 'aria-label': t('simple_form.labels.defaults.new_password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last },
+ label: t('simple_form.labels.defaults.new_password'),
+ wrapper: :with_label
.fields-row__column.fields-group.fields-row__column-6
- = f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_new_password'), autocomplete: 'new-password' }, disabled: current_account.suspended?
+ = f.input :password_confirmation,
+ disabled: current_account.suspended?,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_new_password'), autocomplete: 'new-password' },
+ label: t('simple_form.labels.defaults.confirm_new_password'),
+ wrapper: :with_label
.actions
= f.button :button, t('generic.save_changes'), type: :submit, class: 'button', disabled: current_account.suspended?
diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml
index 4cac7b51b..1e5aac297 100644
--- a/app/views/auth/registrations/new.html.haml
+++ b/app/views/auth/registrations/new.html.haml
@@ -19,25 +19,61 @@
.fields-group
= f.simple_fields_for :account do |ff|
- = ff.input :username, wrapper: :with_label, label: false, required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.username'), autocomplete: 'off', placeholder: t('simple_form.labels.defaults.username'), pattern: '[a-zA-Z0-9_]+', maxlength: 30 }, append: "@#{site_hostname}"
- = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.email'), autocomplete: 'username' }, hint: false
- = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last }, hint: false
- = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_password'), autocomplete: 'new-password' }, hint: false
- = f.input :confirm_password, as: :string, placeholder: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), required: false, input_html: { 'aria-label': t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), autocomplete: 'off' }, hint: false
- = f.input :website, as: :url, wrapper: :with_label, label: t('simple_form.labels.defaults.honeypot', label: 'Website'), required: false, input_html: { 'aria-label': t('simple_form.labels.defaults.honeypot', label: 'Website'), autocomplete: 'off' }
+ = ff.input :username,
+ append: "@#{site_hostname}",
+ input_html: { 'aria-label': t('simple_form.labels.defaults.username'), autocomplete: 'off', placeholder: t('simple_form.labels.defaults.username'), pattern: '[a-zA-Z0-9_]+', maxlength: 30 },
+ label: false,
+ required: true,
+ wrapper: :with_label
+ = f.input :email,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.email'), autocomplete: 'username' },
+ placeholder: t('simple_form.labels.defaults.email'),
+ required: true
+ = f.input :password,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.password'), autocomplete: 'new-password', minlength: User.password_length.first, maxlength: User.password_length.last },
+ placeholder: t('simple_form.labels.defaults.password'),
+ required: true
+ = f.input :password_confirmation,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.confirm_password'), autocomplete: 'new-password' },
+ placeholder: t('simple_form.labels.defaults.confirm_password'),
+ required: true
+ = f.input :confirm_password,
+ as: :string,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), autocomplete: 'off' },
+ placeholder: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')),
+ required: false
+ = f.input :website,
+ as: :url,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.honeypot', label: 'Website'), autocomplete: 'off' },
+ label: t('simple_form.labels.defaults.honeypot', label: 'Website'),
+ required: false,
+ wrapper: :with_label
- if approved_registrations? && @invite.blank?
%p.lead= t('auth.sign_up.manual_review', domain: site_hostname)
.fields-group
= f.simple_fields_for :invite_request, resource.invite_request || resource.build_invite_request do |invite_request_fields|
- = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: Setting.require_invite_text, label: false, hint: false
+ = invite_request_fields.input :text,
+ as: :text,
+ hint: false,
+ label: false,
+ required: Setting.require_invite_text,
+ wrapper: :with_block_label
= hidden_field_tag :accept, params[:accept]
= f.input :invite_code, as: :hidden
.fields-group
- = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.privacy_policy_agreement_html', rules_path: about_more_path, privacy_policy_path: privacy_policy_path), required: true
+ = f.input :agreement,
+ as: :boolean,
+ label: t('auth.privacy_policy_agreement_html', rules_path: about_more_path, privacy_policy_path: privacy_policy_path),
+ required: true,
+ wrapper: :with_label
.actions
= f.button :button, @invite.present? ? t('auth.register') : sign_up_message, type: :submit
diff --git a/app/views/auth/sessions/new.html.haml b/app/views/auth/sessions/new.html.haml
index 7914e0157..89903581a 100644
--- a/app/views/auth/sessions/new.html.haml
+++ b/app/views/auth/sessions/new.html.haml
@@ -10,11 +10,25 @@
%p.lead= t('auth.sign_in.preamble_html', domain: site_hostname)
.fields-group
- if use_seamless_external_login?
- = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.username_or_email'), input_html: { 'aria-label': t('simple_form.labels.defaults.username_or_email') }, hint: false
+ = f.input :email,
+ autofocus: true,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.username_or_email') },
+ label: t('simple_form.labels.defaults.username_or_email'),
+ wrapper: :with_label
- else
- = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.email'), input_html: { 'aria-label': t('simple_form.labels.defaults.email') }, hint: false
+ = f.input :email,
+ autofocus: true,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.email') },
+ label: t('simple_form.labels.defaults.email'),
+ wrapper: :with_label
.fields-group
- = f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.password'), input_html: { 'aria-label': t('simple_form.labels.defaults.password'), autocomplete: 'current-password' }, hint: false
+ = f.input :password,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.password'), autocomplete: 'current-password' },
+ label: t('simple_form.labels.defaults.password'),
+ wrapper: :with_label
.actions
= f.button :button, t('auth.login'), type: :submit
diff --git a/app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml b/app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml
index 8cc2c8561..30e97a68c 100644
--- a/app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml
+++ b/app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml
@@ -5,7 +5,12 @@
%p.hint.authentication-hint= t('simple_form.hints.sessions.otp')
.fields-group
- = f.input :otp_attempt, type: :number, wrapper: :with_label, label: t('simple_form.labels.defaults.otp_attempt'), input_html: { 'aria-label': t('simple_form.labels.defaults.otp_attempt'), autocomplete: 'one-time-code' }, autofocus: true
+ = f.input :otp_attempt,
+ autofocus: true,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.otp_attempt'), autocomplete: 'one-time-code' },
+ label: t('simple_form.labels.defaults.otp_attempt'),
+ type: :number,
+ wrapper: :with_label
.actions
= f.button :button, t('auth.login'), type: :submit
diff --git a/app/views/auth/setup/show.html.haml b/app/views/auth/setup/show.html.haml
index 97c826d70..713f77470 100644
--- a/app/views/auth/setup/show.html.haml
+++ b/app/views/auth/setup/show.html.haml
@@ -16,7 +16,10 @@
%p.lead= t('auth.setup.email_below_hint_html')
.fields-group
- = f.input :email, required: true, hint: false, input_html: { 'aria-label': t('simple_form.labels.defaults.email'), autocomplete: 'off' }
+ = f.input :email,
+ hint: false,
+ input_html: { 'aria-label': t('simple_form.labels.defaults.email'), autocomplete: 'off' },
+ required: true
.actions
= f.button :button, t('auth.resend_confirmation'), type: :submit, class: 'button timer-button', disabled: true
diff --git a/app/views/custom_css/show.css.erb b/app/views/custom_css/show.css.erb
index 9cd38fb37..78da809ed 100644
--- a/app/views/custom_css/show.css.erb
+++ b/app/views/custom_css/show.css.erb
@@ -1,8 +1,8 @@
-<%- if Setting.custom_css.present? %>
-<%= raw Setting.custom_css %>
+<%- if custom_css_styles.present? %>
+<%= raw custom_css_styles %>
<%- end %>
-<%- UserRole.where(highlighted: true).select { |role| role.color.present? }.each do |role| %>
+<%- @user_roles.each do |role| %>
.user-role-<%= role.id %> {
--user-role-accent: <%= role.color %>;
}
diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml
index 62695b155..5f7213882 100644
--- a/app/views/disputes/strikes/show.html.haml
+++ b/app/views/disputes/strikes/show.html.haml
@@ -21,7 +21,7 @@
.report-header
.report-header__card
- = render 'card', strike: @strike
+ = render 'disputes/strikes/card', strike: @strike
.report-header__details
.report-header__details__item
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 1244fd5eb..c72107367 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' }/
@@ -28,12 +28,14 @@
= stylesheet_pack_tag 'common', media: 'all', crossorigin: 'anonymous'
= stylesheet_pack_tag current_theme, media: 'all', crossorigin: 'anonymous'
+ -# Needed for the wicg-inert polyfill. It needs to be on it's own