From ee631bf82602c36eddc74a123b5dbd9b01b1c3b3 Mon Sep 17 00:00:00 2001 From: Valtteri Laitinen Date: Wed, 4 Feb 2026 12:56:33 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Make=20=E2=80=9CFollowing=E2=80=9D=20correc?= =?UTF-8?q?tly=20translatable=20(#37671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/application/mailer/_account.html.haml | 2 +- config/locales/en.yml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/application/mailer/_account.html.haml b/app/views/application/mailer/_account.html.haml index 27493f770d..bc11c01a01 100644 --- a/app/views/application/mailer/_account.html.haml +++ b/app/views/application/mailer/_account.html.haml @@ -24,7 +24,7 @@ %span= t('accounts.posts', count: account.statuses_count) %td %b= account_formatted_stat(account.following_count) - %span= t('accounts.following') + %span= t('accounts.following', count: account.following_count) %td %b= account_formatted_stat(account.followers_count) %span= t('accounts.followers', count: account.followers_count) diff --git a/config/locales/en.yml b/config/locales/en.yml index d7dcdf4cc5..2b9a182ec1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -12,7 +12,9 @@ en: followers: one: Follower other: Followers - following: Following + following: + one: Following + other: Following instance_actor_flash: This account is a virtual actor used to represent the server itself and not any individual user. It is used for federation purposes and should not be suspended. last_active: last active link_verified_on: Ownership of this link was checked on %{date} From 7f53a77fa3585a36a054f058105e0fe170d2bc0b Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 4 Feb 2026 14:12:21 +0100 Subject: [PATCH 2/5] Refactors header from Status component (#37732) --- app/javascript/mastodon/components/status.jsx | 77 +++++------ .../mastodon/components/status/header.tsx | 128 ++++++++++++++++++ .../mastodon/components/status_quoted.tsx | 29 +++- 3 files changed, 189 insertions(+), 45 deletions(-) create mode 100644 app/javascript/mastodon/components/status/header.tsx diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 8d7d689a6a..59f6f7d07e 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -3,14 +3,12 @@ import PropTypes from 'prop-types'; import { injectIntl, defineMessages, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; -import { Link } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; -import CancelFillIcon from '@/material-icons/400-24px/cancel-fill.svg?react'; import { Hotkeys } from 'mastodon/components/hotkeys'; import { ContentWarning } from 'mastodon/components/content_warning'; import { FilterWarning } from 'mastodon/components/filter_warning'; @@ -26,16 +24,12 @@ import { MediaGallery, Video, Audio } from '../features/ui/util/async-components import { SensitiveMediaContext } from '../features/ui/util/sensitive_media_context'; import { displayMedia } from '../initial_state'; -import { Avatar } from './avatar'; -import { AvatarOverlay } from './avatar_overlay'; +import { StatusHeader } from './status/header' import { LinkedDisplayName } from './display_name'; import { getHashtagBarForStatus } from './hashtag_bar'; -import { RelativeTimestamp } from './relative_timestamp'; import StatusActionBar from './status_action_bar'; import StatusContent from './status_content'; import { StatusThreadLabel } from './status_thread_label'; -import { VisibilityIcon } from './visibility_icon'; -import { IconButton } from './icon_button'; const domParser = new DOMParser(); @@ -112,7 +106,6 @@ class Status extends ImmutablePureComponent { onToggleCollapsed: PropTypes.func, onTranslate: PropTypes.func, onInteractionModal: PropTypes.func, - onQuoteCancel: PropTypes.func, muted: PropTypes.bool, hidden: PropTypes.bool, unread: PropTypes.bool, @@ -129,6 +122,7 @@ class Status extends ImmutablePureComponent { avatarSize: PropTypes.number, deployPictureInPicture: PropTypes.func, unfocusable: PropTypes.bool, + headerRenderFn: PropTypes.func, pictureInPicture: ImmutablePropTypes.contains({ inUse: PropTypes.bool, available: PropTypes.bool, @@ -146,7 +140,6 @@ class Status extends ImmutablePureComponent { 'hidden', 'unread', 'pictureInPicture', - 'onQuoteCancel', ]; state = { @@ -364,10 +357,6 @@ class Status extends ImmutablePureComponent { this.setState(state => ({ ...state, showDespiteFilter: !state.showDespiteFilter })); }; - handleQuoteCancel = () => { - this.props.onQuoteCancel?.(); - } - _properStatus () { const { status } = this.props; @@ -383,7 +372,24 @@ class Status extends ImmutablePureComponent { }; render () { - const { intl, hidden, featured, unfocusable, unread, showThread, showActions = true, isQuotedPost = false, scrollKey, pictureInPicture, previousId, nextInReplyToId, rootId, skipPrepend, avatarSize = 46, children } = this.props; + const { + intl, + hidden, + featured, + unfocusable, + unread, + showThread, + showActions = true, + isQuotedPost = false, + scrollKey, + pictureInPicture, + previousId, + nextInReplyToId, + rootId, + skipPrepend, + avatarSize = 46, + children, + } = this.props; let { status, account, ...other } = this.props; @@ -405,7 +411,7 @@ class Status extends ImmutablePureComponent { onTranslate: this.handleTranslate, }; - let media, statusAvatar, prepend, rebloggedByText; + let media, prepend, rebloggedByText; const connectUp = previousId && previousId === status.get('in_reply_to_id'); const connectToRoot = rootId && rootId === status.get('in_reply_to_id'); @@ -547,13 +553,19 @@ class Status extends ImmutablePureComponent { ); } - if (account === undefined || account === null) { - statusAvatar = ; - } else { - statusAvatar = ; - } - const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status); + + const header = this.props.headerRenderFn + ? this.props.headerRenderFn({ status, account, avatarSize, messages, onHeaderClick: this.handleHeaderClick }) + : ( + + ); + return (
@@ -575,28 +587,7 @@ class Status extends ImmutablePureComponent { > {(connectReply || connectUp || connectToRoot) &&
} -
- - - {status.get('edited_at') && *} - - - -
- {statusAvatar} -
-
- - {isQuotedPost && !!this.props.onQuoteCancel && ( - - )} -
+ {header} {matchedFilters && } diff --git a/app/javascript/mastodon/components/status/header.tsx b/app/javascript/mastodon/components/status/header.tsx new file mode 100644 index 0000000000..3416c39dd2 --- /dev/null +++ b/app/javascript/mastodon/components/status/header.tsx @@ -0,0 +1,128 @@ +import type { FC, HTMLAttributes, MouseEventHandler, ReactNode } from 'react'; + +import { defineMessage, useIntl } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import { isStatusVisibility } from '@/mastodon/api_types/statuses'; +import type { Account } from '@/mastodon/models/account'; +import type { Status } from '@/mastodon/models/status'; + +import { Avatar } from '../avatar'; +import { AvatarOverlay } from '../avatar_overlay'; +import type { DisplayNameProps } from '../display_name'; +import { LinkedDisplayName } from '../display_name'; +import { RelativeTimestamp } from '../relative_timestamp'; +import { VisibilityIcon } from '../visibility_icon'; + +export interface StatusHeaderProps { + status: Status; + account?: Account; + avatarSize?: number; + children?: ReactNode; + wrapperProps?: HTMLAttributes; + displayNameProps?: DisplayNameProps; + onHeaderClick?: MouseEventHandler; +} + +export type StatusHeaderRenderFn = (args: StatusHeaderProps) => ReactNode; + +export const StatusHeader: FC = ({ + status, + account, + children, + avatarSize = 48, + wrapperProps, + onHeaderClick, +}) => { + const statusAccount = status.get('account') as Account | undefined; + const editedAt = status.get('edited_at') as string; + + return ( + /* eslint-disable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ +
+ + + + {editedAt && } + + + + + {children} +
+ ); +}; + +export const StatusVisibility: FC<{ visibility: unknown }> = ({ + visibility, +}) => { + if (typeof visibility !== 'string' || !isStatusVisibility(visibility)) { + return null; + } + return ( + + + + ); +}; + +const editMessage = defineMessage({ + id: 'status.edited', + defaultMessage: 'Edited {date}', +}); + +export const StatusEditedAt: FC<{ editedAt: string }> = ({ editedAt }) => { + const intl = useIntl(); + return ( + + {' '} + * + + ); +}; + +export const StatusDisplayName: FC<{ + statusAccount?: Account; + friendAccount?: Account; + avatarSize: number; +}> = ({ statusAccount, friendAccount, avatarSize }) => { + const AccountComponent = friendAccount ? AvatarOverlay : Avatar; + return ( + +
+ +
+
+ ); +}; diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index 33e791a548..8effec874f 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -1,9 +1,10 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { FormattedMessage } from 'react-intl'; +import { defineMessage, FormattedMessage, useIntl } from 'react-intl'; import type { Map as ImmutableMap } from 'immutable'; +import CancelFillIcon from '@/material-icons/400-24px/cancel-fill.svg?react'; import { fetchRelationships } from 'mastodon/actions/accounts'; import { revealAccount } from 'mastodon/actions/accounts_typed'; import { fetchStatus } from 'mastodon/actions/statuses'; @@ -18,6 +19,9 @@ import type { RootState } from 'mastodon/store'; import { useAppDispatch, useAppSelector } from 'mastodon/store'; import { Button } from './button'; +import { IconButton } from './icon_button'; +import type { StatusHeaderRenderFn } from './status/header'; +import { StatusHeader } from './status/header'; const MAX_QUOTE_POSTS_NESTING_LEVEL = 1; @@ -147,6 +151,11 @@ interface QuotedStatusProps { onQuoteCancel?: () => void; // Used for composer. } +const quoteCancelMessage = defineMessage({ + id: 'status.quote.cancel', + defaultMessage: 'Cancel quote', +}); + export const QuotedStatus: React.FC = ({ quote, contextType, @@ -213,6 +222,22 @@ export const QuotedStatus: React.FC = ({ if (accountId && hiddenAccount) dispatch(fetchRelationships([accountId])); }, [accountId, hiddenAccount, dispatch]); + const intl = useIntl(); + const headerRenderFn: StatusHeaderRenderFn = useCallback( + (props) => ( + + + + ), + [intl, onQuoteCancel], + ); + const isFilteredAndHidden = loadingState === 'filtered'; let quoteError: React.ReactNode = null; @@ -314,7 +339,7 @@ export const QuotedStatus: React.FC = ({ id={quotedStatusId} contextType={contextType} avatarSize={32} - onQuoteCancel={onQuoteCancel} + headerRenderFn={headerRenderFn} > {canRenderChildQuote && ( Date: Wed, 4 Feb 2026 18:03:08 +0100 Subject: [PATCH 3/5] New Crowdin Translations (automated) (#37733) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ca.json | 36 ++++++++++++++++++++++ app/javascript/mastodon/locales/fi.json | 14 ++++----- app/javascript/mastodon/locales/fr-CA.json | 19 +++++++++--- app/javascript/mastodon/locales/fr.json | 21 ++++++++++--- app/javascript/mastodon/locales/ga.json | 19 ++++++++++++ app/javascript/mastodon/locales/tok.json | 2 +- config/locales/af.yml | 1 - config/locales/an.yml | 1 - config/locales/ar.yml | 1 - config/locales/be.yml | 1 - config/locales/bg.yml | 1 - config/locales/bn.yml | 1 - config/locales/br.yml | 1 - config/locales/ca.yml | 2 +- config/locales/ckb.yml | 1 - config/locales/co.yml | 1 - config/locales/cs.yml | 1 - config/locales/cy.yml | 1 - config/locales/da.yml | 4 ++- config/locales/de.yml | 1 - config/locales/el.yml | 1 - config/locales/en-GB.yml | 4 ++- config/locales/eo.yml | 1 - config/locales/es-AR.yml | 4 ++- config/locales/es-MX.yml | 1 - config/locales/es.yml | 1 - config/locales/et.yml | 1 - config/locales/eu.yml | 1 - config/locales/fa.yml | 1 - config/locales/fi.yml | 34 ++++++++++---------- config/locales/fil.yml | 1 - config/locales/fo.yml | 1 - config/locales/fr-CA.yml | 10 +++--- config/locales/fr.yml | 14 +++++---- config/locales/fy.yml | 1 - config/locales/ga.yml | 7 ++++- config/locales/gd.yml | 1 - config/locales/gl.yml | 4 ++- config/locales/he.yml | 6 +++- config/locales/hi.yml | 1 - config/locales/hr.yml | 1 - config/locales/hu.yml | 1 - config/locales/hy.yml | 1 - config/locales/ia.yml | 1 - config/locales/id.yml | 1 - config/locales/ie.yml | 1 - config/locales/io.yml | 1 - config/locales/is.yml | 4 ++- config/locales/it.yml | 4 ++- config/locales/ja.yml | 1 - config/locales/ka.yml | 1 - config/locales/kab.yml | 1 - config/locales/kk.yml | 1 - config/locales/ko.yml | 1 - config/locales/ku.yml | 1 - config/locales/la.yml | 1 - config/locales/lad.yml | 1 - config/locales/lt.yml | 1 - config/locales/lv.yml | 1 - config/locales/ml.yml | 1 - config/locales/ms.yml | 1 - config/locales/my.yml | 1 - config/locales/nan-TW.yml | 1 - config/locales/nl.yml | 1 - config/locales/nn.yml | 1 - config/locales/no.yml | 1 - config/locales/oc.yml | 1 - config/locales/pa.yml | 1 - config/locales/pl.yml | 1 - config/locales/pt-BR.yml | 1 - config/locales/pt-PT.yml | 1 - config/locales/ro.yml | 1 - config/locales/ru.yml | 1 - config/locales/ry.yml | 1 - config/locales/sc.yml | 1 - config/locales/sco.yml | 1 - config/locales/si.yml | 1 - config/locales/simple_form.fi.yml | 8 ++--- config/locales/sk.yml | 1 - config/locales/sl.yml | 1 - config/locales/sq.yml | 1 - config/locales/sr-Latn.yml | 1 - config/locales/sr.yml | 1 - config/locales/sv.yml | 1 - config/locales/ta.yml | 1 - config/locales/te.yml | 1 - config/locales/th.yml | 1 - config/locales/tok.yml | 1 - config/locales/tr.yml | 4 ++- config/locales/tt.yml | 1 - config/locales/uk.yml | 1 - config/locales/vi.yml | 1 - config/locales/zh-CN.yml | 1 - config/locales/zh-HK.yml | 1 - config/locales/zh-TW.yml | 3 +- 95 files changed, 165 insertions(+), 132 deletions(-) diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index b16133c521..993ca4e613 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -17,8 +17,12 @@ "account.activity": "Activitat", "account.add_note": "Afegeix una nota personal", "account.add_or_remove_from_list": "Afegeix o elimina de les llistes", + "account.badges.admin": "Administrador", + "account.badges.blocked": "Blocat", "account.badges.bot": "Automatitzat", + "account.badges.domain_blocked": "Domini blocat", "account.badges.group": "Grup", + "account.badges.muted": "Silenciat", "account.block": "Bloca @{name}", "account.block_domain": "Bloca el domini {domain}", "account.block_short": "Bloca", @@ -42,6 +46,8 @@ "account.featured.hashtags": "Etiquetes", "account.featured_tags.last_status_at": "Darrer tut el {date}", "account.featured_tags.last_status_never": "No hi ha tuts", + "account.fields.scroll_next": "Mostrar el següent", + "account.fields.scroll_prev": "Mostrar l'anterior", "account.filters.all": "Tota l'activitat", "account.filters.boosts_toggle": "Mostra els impulsos", "account.filters.posts_boosts": "Publicacions i impulsos", @@ -73,6 +79,23 @@ "account.locked_info": "L'estat de privacitat del compte està definit com a blocat. El propietari revisa manualment qui pot seguir-lo.", "account.media": "Contingut", "account.mention": "Menciona @{name}", + "account.menu.add_to_list": "Afegir a la llista…", + "account.menu.block": "Blocar el compte", + "account.menu.block_domain": "Blocar {domain}", + "account.menu.copied": "Compte copiat al porta-retalls", + "account.menu.copy": "Copiar l'enllaç", + "account.menu.direct": "Mencionar privadament", + "account.menu.hide_reblogs": "Amagar impulsos en les línies de temps", + "account.menu.mention": "Mencionar", + "account.menu.mute": "Silenciar el compte", + "account.menu.open_original_page": "Veure a {domain}", + "account.menu.remove_follower": "Eliminar el seguidor", + "account.menu.report": "Denunciar el compte", + "account.menu.share": "Compartir…", + "account.menu.show_reblogs": "Mostrar impulsos en les línies de temps", + "account.menu.unblock": "Desblocar el compte", + "account.menu.unblock_domain": "Desblocar {domain}", + "account.menu.unmute": "Deixar de silenciar el compte", "account.moved_to": "{name} ha indicat que el seu nou compte és:", "account.mute": "Silencia @{name}", "account.mute_notifications_short": "Silencia les notificacions", @@ -185,21 +208,31 @@ "closed_registrations_modal.find_another_server": "Troba un altre servidor", "closed_registrations_modal.preamble": "Mastodon és descentralitzat. Per tant, tinguis on tinguis el compte, seràs capaç de seguir i interactuar amb tothom des d'aquest servidor. Fins i tot pots tenir el compte en el teu propi servidor!", "closed_registrations_modal.title": "Registrant-se a Mastodon", + "collections.collection_description": "Descripció", + "collections.collection_name": "Nom", + "collections.collection_topic": "Tema", "collections.create_a_collection_hint": "Creeu una coŀlecció per a recomanar o compartir amb d'altres els vostres comptes preferits.", "collections.create_collection": "Crea una coŀlecció", "collections.delete_collection": "Elimina la coŀlecció", + "collections.description_length_hint": "Límit de 100 caràcters", "collections.error_loading_collections": "Hi ha hagut un error en carregar les vostres coŀleccions.", + "collections.mark_as_sensitive": "Marcar com a sensible", + "collections.mark_as_sensitive_hint": "Amaga la descripció i els comptes de la coŀlecció rere un avís de contingut. El nom de la coŀlecció serà encara visible.", + "collections.name_length_hint": "Límit de 100 caràcters", "collections.no_collections_yet": "Encara no hi ha coŀleccions.", + "collections.topic_hint": "Afegir una etiqueta que ajudi altres a entendre el tema principal de la coŀlecció.", "collections.view_collection": "Mostra la coŀlecció", "column.about": "Quant a", "column.blocks": "Usuaris blocats", "column.bookmarks": "Marcadors", "column.collections": "Les meves coŀleccions", "column.community": "Línia de temps local", + "column.create_collection": "Crear una coŀlecció", "column.create_list": "Crea una llista", "column.direct": "Mencions privades", "column.directory": "Navega pels perfils", "column.domain_blocks": "Dominis blocats", + "column.edit_collection": "Editar la col·lecció", "column.edit_list": "Edita la llista", "column.favourites": "Favorits", "column.firehose": "Tuts en directe", @@ -254,6 +287,9 @@ "confirmations.delete.confirm": "Elimina", "confirmations.delete.message": "Segur que vols eliminar aquest tut?", "confirmations.delete.title": "Eliminar la publicació?", + "confirmations.delete_collection.confirm": "Eliminar", + "confirmations.delete_collection.message": "Aquesta acció no es pot desfer.", + "confirmations.delete_collection.title": "Voleu eliminar «{name}»?", "confirmations.delete_list.confirm": "Elimina", "confirmations.delete_list.message": "Segur que vols suprimir permanentment aquesta llista?", "confirmations.delete_list.title": "Eliminar la llista?", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 0038703593..d5f1ce17b2 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -16,7 +16,7 @@ "account.account_note_header": "Henkilökohtainen muistiinpano", "account.activity": "Toiminta", "account.add_note": "Lisää henkilökohtainen muistiinpano", - "account.add_or_remove_from_list": "Lisää tai poista listoista", + "account.add_or_remove_from_list": "Lisää tai poista listoilta", "account.badges.admin": "Ylläpitäjä", "account.badges.blocked": "Estetty", "account.badges.bot": "Botti", @@ -95,7 +95,7 @@ "account.menu.show_reblogs": "Näytä tehostukset aikajanalla", "account.menu.unblock": "Kumoa tilin esto", "account.menu.unblock_domain": "Kumoa palvelimen {domain} esto", - "account.menu.unmute": "Poista tilin mykistys", + "account.menu.unmute": "Kumoa tilin mykistys", "account.moved_to": "{name} on ilmoittanut uudeksi tilikseen", "account.mute": "Mykistä @{name}", "account.mute_notifications_short": "Mykistä ilmoitukset", @@ -128,9 +128,9 @@ "account.unblock_short": "Kumoa esto", "account.unendorse": "Kumoa profiilissa esittely", "account.unfollow": "Älä seuraa", - "account.unmute": "Poista käyttäjän @{name} mykistys", - "account.unmute_notifications_short": "Poista ilmoitusten mykistys", - "account.unmute_short": "Poista mykistys", + "account.unmute": "Kumoa käyttäjän @{name} mykistys", + "account.unmute_notifications_short": "Kumoa ilmoitusten mykistys", + "account.unmute_short": "Kumoa mykistys", "account_note.placeholder": "Lisää muistiinpano napsauttamalla", "admin.dashboard.daily_retention": "Käyttäjien pysyvyys päivittäin rekisteröitymisen jälkeen", "admin.dashboard.monthly_retention": "Käyttäjien pysyvyys kuukausittain rekisteröitymisen jälkeen", @@ -501,7 +501,7 @@ "follow_suggestions.popular_suggestion_longer": "Suosittu palvelimella {domain}", "follow_suggestions.similar_to_recently_followed_longer": "Samankaltainen kuin äskettäin seuraamasi profiilit", "follow_suggestions.view_all": "Näytä kaikki", - "follow_suggestions.who_to_follow": "Ehdotuksia seurattavaksi", + "follow_suggestions.who_to_follow": "Seurantaehdotuksia", "followed_tags": "Seurattavat aihetunnisteet", "footer.about": "Tietoja", "footer.about_mastodon": "Tietoja Mastodonista", @@ -1111,7 +1111,7 @@ "video.play": "Toista", "video.skip_backward": "Siirry taaksepäin", "video.skip_forward": "Siirry eteenpäin", - "video.unmute": "Poista mykistys", + "video.unmute": "Kumoa mykistys", "video.volume_down": "Vähennä äänenvoimakkuutta", "video.volume_up": "Lisää äänenvoimakkuutta", "visibility_modal.button_title": "Aseta näkyvyys", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index f52d479c74..fb2244ae45 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -57,7 +57,7 @@ "account.follow": "Suivre", "account.follow_back": "Suivre en retour", "account.follow_back_short": "Suivre en retour", - "account.follow_request": "Demande d’abonnement", + "account.follow_request": "Demander à suivre", "account.follow_request_cancel": "Annuler la demande", "account.follow_request_cancel_short": "Annuler", "account.follow_request_short": "Demander à suivre", @@ -85,12 +85,23 @@ "account.menu.copied": "Lien du compte copié dans le presse-papiers", "account.menu.copy": "Copier le lien", "account.menu.direct": "Mentionner en privé", + "account.menu.hide_reblogs": "Masquer les partages dans le fil d’actualité", + "account.menu.mention": "Mentionner", + "account.menu.mute": "Masquer le compte", + "account.menu.open_original_page": "Voir sur {domain}", + "account.menu.remove_follower": "Supprimer des abonné·e·s", + "account.menu.report": "Signaler le compte", + "account.menu.share": "Partager…", + "account.menu.show_reblogs": "Afficher les partages dans le fil d'actualité", + "account.menu.unblock": "Débloquer le compte", + "account.menu.unblock_domain": "Débloquer {domain}", + "account.menu.unmute": "Ne plus masquer le compte", "account.moved_to": "{name} a indiqué que son nouveau compte est maintenant:", "account.mute": "Masquer @{name}", "account.mute_notifications_short": "Rendre les notifications muettes", "account.mute_short": "Rendre muet", "account.muted": "Masqué·e", - "account.muting": "Sourdine", + "account.muting": "Masqué", "account.mutual": "Vous vous suivez mutuellement", "account.no_bio": "Description manquante.", "account.node_modal.callout": "Les notes personnelles sont ne sont visibles que pour vous.", @@ -523,7 +534,7 @@ "hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} aujourd’hui", "hashtag.feature": "Mettre en avant sur votre profil", "hashtag.follow": "Suivre ce hashtag", - "hashtag.mute": "Mettre #{hashtag} en sourdine", + "hashtag.mute": "Masquer #{hashtag}", "hashtag.unfeature": "Ne plus mettre en avant sur votre profil", "hashtag.unfollow": "Ne plus suivre ce hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", @@ -1008,7 +1019,7 @@ "status.quote_error.filtered": "Caché par un de vos filtres", "status.quote_error.limited_account_hint.action": "Afficher quand même", "status.quote_error.limited_account_hint.title": "Ce compte a été masqué par la modération de {domain}.", - "status.quote_error.muted_account_hint.title": "Ce message est masqué car vous avez masqué @{name}.", + "status.quote_error.muted_account_hint.title": "Ce message est caché car vous avez masqué @{name}.", "status.quote_error.not_available": "Message indisponible", "status.quote_error.pending_approval": "Message en attente", "status.quote_error.pending_approval_popout.body": "Sur Mastodon, vous pouvez contrôler si quelqu'un peut vous citer. Ce message est en attente pendant que nous recevons l'approbation de l'auteur original.", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index b9e00326de..89d66de5b4 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -57,7 +57,7 @@ "account.follow": "Suivre", "account.follow_back": "Suivre en retour", "account.follow_back_short": "Suivre en retour", - "account.follow_request": "Demande d’abonnement", + "account.follow_request": "Demander à suivre", "account.follow_request_cancel": "Annuler la demande", "account.follow_request_cancel_short": "Annuler", "account.follow_request_short": "Demander à suivre", @@ -85,12 +85,23 @@ "account.menu.copied": "Lien du compte copié dans le presse-papiers", "account.menu.copy": "Copier le lien", "account.menu.direct": "Mentionner en privé", + "account.menu.hide_reblogs": "Masquer les partages dans le fil d’actualité", + "account.menu.mention": "Mentionner", + "account.menu.mute": "Masquer le compte", + "account.menu.open_original_page": "Voir sur {domain}", + "account.menu.remove_follower": "Supprimer des abonné·e·s", + "account.menu.report": "Signaler le compte", + "account.menu.share": "Partager…", + "account.menu.show_reblogs": "Afficher les partages dans le fil d'actualité", + "account.menu.unblock": "Débloquer le compte", + "account.menu.unblock_domain": "Débloquer {domain}", + "account.menu.unmute": "Ne plus masquer le compte", "account.moved_to": "{name} a indiqué que son nouveau compte est maintenant :", "account.mute": "Masquer @{name}", "account.mute_notifications_short": "Désactiver les notifications", - "account.mute_short": "Mettre en sourdine", + "account.mute_short": "Masquer", "account.muted": "Masqué·e", - "account.muting": "Sourdine", + "account.muting": "Masqué", "account.mutual": "Vous vous suivez mutuellement", "account.no_bio": "Aucune description fournie.", "account.node_modal.callout": "Les notes personnelles sont ne sont visibles que pour vous.", @@ -523,7 +534,7 @@ "hashtag.counter_by_uses_today": "{count, plural, one {{counter} message} other {{counter} messages}} aujourd’hui", "hashtag.feature": "Mettre en avant sur votre profil", "hashtag.follow": "Suivre le hashtag", - "hashtag.mute": "Mettre #{hashtag} en sourdine", + "hashtag.mute": "Masquer #{hashtag}", "hashtag.unfeature": "Ne plus mettre en avant sur votre profil", "hashtag.unfollow": "Ne plus suivre le hashtag", "hashtags.and_other": "…et {count, plural, other {# de plus}}", @@ -1008,7 +1019,7 @@ "status.quote_error.filtered": "Caché par un de vos filtres", "status.quote_error.limited_account_hint.action": "Afficher quand même", "status.quote_error.limited_account_hint.title": "Ce compte a été masqué par la modération de {domain}.", - "status.quote_error.muted_account_hint.title": "Ce message est masqué car vous avez masqué @{name}.", + "status.quote_error.muted_account_hint.title": "Ce message est caché car vous avez masqué @{name}.", "status.quote_error.not_available": "Message indisponible", "status.quote_error.pending_approval": "Message en attente", "status.quote_error.pending_approval_popout.body": "Sur Mastodon, vous pouvez contrôler si quelqu'un peut vous citer. Ce message est en attente pendant que nous recevons l'approbation de l'auteur original.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 0b395fbcb8..63d85c286e 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -46,6 +46,8 @@ "account.featured.hashtags": "Haischlibeanna", "account.featured_tags.last_status_at": "Postáil is déanaí ar {date}", "account.featured_tags.last_status_never": "Gan aon phoist", + "account.fields.scroll_next": "Taispeáin an chéad cheann eile", + "account.fields.scroll_prev": "Taispeáin roimhe seo", "account.filters.all": "Gach gníomhaíocht", "account.filters.boosts_toggle": "Taispeáin borradh", "account.filters.posts_boosts": "Poist agus borradh", @@ -77,6 +79,23 @@ "account.locked_info": "Tá an socrú príobháideachais don cuntas seo curtha go 'faoi ghlas'. Déanann an t-úinéir léirmheas ar cén daoine atá ceadaithe an cuntas leanúint.", "account.media": "Meáin", "account.mention": "Luaigh @{name}", + "account.menu.add_to_list": "Cuir leis an liosta…", + "account.menu.block": "Cuntas blocáilte", + "account.menu.block_domain": "Blocáil {domain}", + "account.menu.copied": "Cóipeáladh nasc an chuntais chuig an ghearrthaisce", + "account.menu.copy": "Cóipeáil nasc", + "account.menu.direct": "Luaigh go príobháideach", + "account.menu.hide_reblogs": "Folaigh borradh sa líne ama", + "account.menu.mention": "Luaigh", + "account.menu.mute": "Balbhaigh cuntas", + "account.menu.open_original_page": "Féach ar {domain}", + "account.menu.remove_follower": "Bain leantóir", + "account.menu.report": "Tuairiscigh cuntas", + "account.menu.share": "Comhroinn…", + "account.menu.show_reblogs": "Taispeáin borradh san amlíne", + "account.menu.unblock": "Díbhlocáil cuntas", + "account.menu.unblock_domain": "Díbhlocáil {domain}", + "account.menu.unmute": "Díbholg an cuntas", "account.moved_to": "Tá tugtha le fios ag {name} gurb é an cuntas nua atá acu ná:", "account.mute": "Balbhaigh @{name}", "account.mute_notifications_short": "Balbhaigh fógraí", diff --git a/app/javascript/mastodon/locales/tok.json b/app/javascript/mastodon/locales/tok.json index 8faa4fa17f..941097c900 100644 --- a/app/javascript/mastodon/locales/tok.json +++ b/app/javascript/mastodon/locales/tok.json @@ -411,7 +411,7 @@ "keyboard_shortcuts.muted": "o lukin e lipu sina pi jan len", "keyboard_shortcuts.my_profile": "o lukin e lipu sina", "keyboard_shortcuts.open_media": "o lukin e sitelen", - "keyboard_shortcuts.pinned": "o lukin pi lipu sina pi toki sewi", + "keyboard_shortcuts.pinned": "o lukin pi toki sina sewi", "keyboard_shortcuts.reply": "o toki lon ijo ni", "keyboard_shortcuts.toggle_hidden": "o lukin ala lukin e toki len", "keyboard_shortcuts.toggle_sensitivity": "o lukin ala lukin e sitelen", diff --git a/config/locales/af.yml b/config/locales/af.yml index 4f6cacffea..e42f686478 100644 --- a/config/locales/af.yml +++ b/config/locales/af.yml @@ -9,7 +9,6 @@ af: followers: one: Volgeling other: Volgelinge - following: Volg nothing_here: Daar is niks hier nie! posts: one: Plasing diff --git a/config/locales/an.yml b/config/locales/an.yml index c9777055b9..72b2de5d20 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -10,7 +10,6 @@ an: followers: one: Seguidor other: Seguidores - following: Seguindo instance_actor_flash: Esta cuenta ye un actor virtual utilizau pa representar a lo servidor en ell mesmo y no a garra usuario individual. S'utiliza pa propositos d'a federación y no s'ha de suspender. last_active: zaguera connexión link_verified_on: La propiedat d'este vinclo estió verificada lo %{date} diff --git a/config/locales/ar.yml b/config/locales/ar.yml index ea00760c5d..d988ce54b9 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -14,7 +14,6 @@ ar: other: متابِعون two: متابِعان zero: لا متابِع - following: مُتابَع instance_actor_flash: هذا الحساب هو ممثل افتراضي يُستخدم لتمثيل الخادم نفسه ولا يمثل أي مستخدم فردي، يُستخدم لأغراض الاتحاد ولا ينبغي حظره. last_active: آخر نشاط link_verified_on: تم التحقق مِن ملكية هذا الرابط بتاريخ %{date} diff --git a/config/locales/be.yml b/config/locales/be.yml index 1ce8030824..c309e335bd 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -14,7 +14,6 @@ be: many: Падпісчыкаў one: Падпісчык other: Падпісчыкі - following: Падпіскі instance_actor_flash: Гэты ўліковы запіс - лічбавы аватар, неабходны для рэпрэзентацыі самога сервера, а не якой-небудзь асобы. Ён выкарыстоўваецца для федэралізацыі і не можа быць замарожаны. last_active: апошняя актыўнасць link_verified_on: Права ўласнасці на гэтую спасылку праверана %{date} diff --git a/config/locales/bg.yml b/config/locales/bg.yml index c87f57ce84..2f56d9025e 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -10,7 +10,6 @@ bg: followers: one: Последовател other: Последователи - following: Следва instance_actor_flash: Акаунтът е виртуално действащо лице, представляващо сървъра, а не отделен потребител. Използва се за целите на федериране и не бива да се спира. last_active: последна дейност link_verified_on: Собствеността върху тази връзка е проверена на %{date} diff --git a/config/locales/bn.yml b/config/locales/bn.yml index 74ff25d754..f77c9ad0fb 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -10,7 +10,6 @@ bn: followers: one: যুক্ত আছে other: যারা যুক্ত হয়েছে - following: যুক্ত করা instance_actor_flash: এই অ্যাকাউন্টটি একটি ভার্চুয়াল সত্তা যা সার্ভারের প্রতিনিধিত্ব করতে ব্যবহৃত হয় এবং কোনও স্বতন্ত্র ব্যবহারকারী নয়। এটি ফেডারেশনের উদ্দেশ্যে ব্যবহার করা হয় এবং স্থগিত করা উচিত নয়. last_active: শেষ সক্রিয় ছিল link_verified_on: এই লিংকের মালিকানা শেষ চেক করা হয় %{date} তারিখে diff --git a/config/locales/br.yml b/config/locales/br.yml index ee9c576515..56a8500d00 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -12,7 +12,6 @@ br: one: Heulier·ez other: Heulier·ez two: Heulier·ez - following: Koumanantoù last_active: oberiantiz ziwezhañ nothing_here: N'eus netra amañ ! posts: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 9e34da6fb7..3f462b691d 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -12,7 +12,6 @@ ca: followers: one: Seguidor other: Seguidors - following: Seguint instance_actor_flash: Aquest compte és un actor virtual usat per a representar el mateix servidor i no cap usuari individual. Es fa servir per a federar i no s'hauria d'esborrar. last_active: última activitat link_verified_on: La propietat d'aquest enllaç va quedar verificada el %{date} @@ -1665,6 +1664,7 @@ ca: disabled_account: El teu compte actual no serà plenament utilitzable després. Tanmateix, tindràs accés a exportació de dades així com reactivació. followers: Aquesta acció mourà tots els seguidors des de l'actual al compte nou only_redirect_html: Alternativament, pots posar només una redirecció en el teu perfil. + other_data: No es mourà cap altra dada automàticament (incloses les vostres publicacions ni els comptes que seguiu) redirect: El perfil del teu compte actual serà actualitzat amb un avís de redirecció i serà exclòs de les cerques moderation: title: Moderació diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 4129efd045..2a4051ba6f 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -10,7 +10,6 @@ ckb: followers: one: شوێنکەوتوو other: شوێن‌کەوتووان - following: شوێن‌کەوتووی instance_actor_flash: ئەم ئەکاونتە ئەکتەرێکی مەجازییە کە بەکاردێت بۆ نوێنەرایەتیکردنی خودی سێرڤەرەکە نەک هیچ بەکارهێنەرێکی تاکەکەسی. بۆ مەبەستی فیدراسیۆن بەکاردێت و نابێت ڕابگیرێت. last_active: دوا چالاکی link_verified_on: خاوەنداریەتی ئەم لینکە لە %{date} چێک کراوە diff --git a/config/locales/co.yml b/config/locales/co.yml index e86e96846e..80be761bca 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -9,7 +9,6 @@ co: followers: one: Abbunatu·a other: Abbunati - following: Abbunamenti instance_actor_flash: Stu contu virtuale riprisenta u servore stessu, micca un'utilizatore individuale. Hè utilizatu per scopi di federazione è ùn duveria mai esse suspesu. last_active: ultima attività link_verified_on: A pruprietà d'issu ligame hè stata verificata u %{date} diff --git a/config/locales/cs.yml b/config/locales/cs.yml index acbbf0cd44..5a0c7c169d 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -14,7 +14,6 @@ cs: many: Sledujících one: Sledující other: Sledujících - following: Sledovaných instance_actor_flash: Tento účet je virtuální aktér, který představuje server samotný, nikoliv jednotlivého uživatele. Používá se pro účely federace a neměl by být pozastaven. last_active: naposledy aktivní link_verified_on: Vlastnictví tohoto odkazu bylo zkontrolováno %{date} diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 1f38ea6eee..897e410e41 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -16,7 +16,6 @@ cy: other: Dilynwyr two: Dilynwyr zero: Dilynwyr - following: Yn dilyn instance_actor_flash: Mae'r cyfrif hwn yn actor rhithwir sy'n cael ei ddefnyddio i gynrychioli'r gweinydd ei hun ac nid unrhyw ddefnyddiwr unigol. Mae'n cael ei ddefnyddio at ddibenion ffederasiwn ac ni ddylid ei atal. last_active: gweithgar ddiwethaf link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date} diff --git a/config/locales/da.yml b/config/locales/da.yml index 5c28950e05..2c686c1f95 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -12,7 +12,9 @@ da: followers: one: Følger other: Følgere - following: Følger + following: + one: Fulgt + other: Fulgte instance_actor_flash: Denne konto er en virtuel aktør repræsenterende selve serveren og ikke en individuel bruger. Den anvendes til fællesformål og bør ikke suspenderes. last_active: senest aktiv link_verified_on: Ejerskab af dette link blev tjekket %{date} diff --git a/config/locales/de.yml b/config/locales/de.yml index fe4c6dfd7c..2b307d7390 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -12,7 +12,6 @@ de: followers: one: Follower other: Follower - following: Folge ich instance_actor_flash: Dieses Konto ist ein virtueller Akteur, der den Server selbst repräsentiert, und kein persönliches Profil. Es wird für Föderationszwecke verwendet und sollte daher nicht gesperrt werden. last_active: zuletzt aktiv link_verified_on: Das Profil mit dieser E-Mail-Adresse wurde bereits am %{date} bestätigt diff --git a/config/locales/el.yml b/config/locales/el.yml index 08535f24e9..86c1b51959 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -12,7 +12,6 @@ el: followers: one: Ακόλουθος other: Ακόλουθοι - following: Ακολουθείτε instance_actor_flash: Αυτός ο λογαριασμός είναι εικονικός και χρησιμοποιείται για να αντιπροσωπεύει τον ίδιο τον διακομιστή και όχι κάποιον μεμονωμένο χρήστη. Χρησιμοποιείται για σκοπούς ομοσπονδίας και δεν πρέπει να ανασταλεί. last_active: τελευταία ενεργός/ή link_verified_on: Η ιδιοκτησία αυτού του συνδέσμου ελέγχθηκε στις %{date} diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 59a0fadb86..141ed8779b 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -12,7 +12,9 @@ en-GB: followers: one: Follower other: Followers - following: Following + following: + one: Following + other: Following instance_actor_flash: This account is a virtual actor used to represent the server itself and not any individual user. It is used for federation purposes and should not be suspended. last_active: last active link_verified_on: Ownership of this link was checked on %{date} diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 39149e8653..fb54537b7c 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -10,7 +10,6 @@ eo: followers: one: Sekvanto other: Sekvantoj - following: Sekvatoj instance_actor_flash: Ĉi tiu konto estas virtuala agento uzata por reprezenti la servilon mem kaj neniun individuan uzanton. Ĝi estas uzata por federaciaj celoj kaj ĝi devas ne esti suspendita. last_active: laste aktiva link_verified_on: Proprieto de ĉi tiu ligilo estis kontrolita je %{date} diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index d45061f125..c258394629 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -12,7 +12,9 @@ es-AR: followers: one: Seguidor other: Seguidores - following: Siguiendo + following: + one: Siguiendo + other: Siguiendo instance_actor_flash: Esta cuenta es un actor virtual usado para representar al servidor en sí mismo y no a ningún usuario individual. Se usa para propósitos de la federación y no debe ser suspendido. last_active: última actividad link_verified_on: La propiedad de este enlace fue verificada el %{date} diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 24717b8b52..ce0fbacc77 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -12,7 +12,6 @@ es-MX: followers: one: Seguidor other: Seguidores - following: Siguiendo instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al servidor en sí mismo y no a ningún usuario individual. Se utiliza para propósitos de la federación y no se debe suspender. last_active: última conexión link_verified_on: La propiedad de este vínculo fue verificada el %{date} diff --git a/config/locales/es.yml b/config/locales/es.yml index 1dfff213b4..1f50067bb9 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -12,7 +12,6 @@ es: followers: one: Seguidor other: Seguidores - following: Siguiendo instance_actor_flash: Esta cuenta es un actor virtual utilizado para representar al propio servidor y no a ningún usuario individual. Se utiliza con fines de federación y no debe suspenderse. last_active: última conexión link_verified_on: La propiedad de este vínculo fue verificada el %{date} diff --git a/config/locales/et.yml b/config/locales/et.yml index 2679873bcd..1dd3e38a97 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -12,7 +12,6 @@ et: followers: one: Jälgija other: Jälgijaid - following: Jälgib instance_actor_flash: See on serveri enda virtuaalne konto. See ei esinda ühtegi kindlat kasutajat, vaid seda kasutatakse födereerumisel. Seda kontot ei tohi kustutada. last_active: viimati aktiivne link_verified_on: Selle lingi autorsust kontrolliti %{date} diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 5565c49e62..b0fc5241ed 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -12,7 +12,6 @@ eu: followers: one: Jarraitzaile other: jarraitzaile - following: Jarraitzen instance_actor_flash: Kontu hau zerbitzaria adierazten duen aktore birtual bat da eta ez banako erabiltzaile bat. Federatzeko helburuarekin erabiltzen da eta ez da kanporatu behar. last_active: azkenekoz aktiboa link_verified_on: 'Esteka honen jabetzaren egiaztaketa data: %{date}' diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 6d31bee2ec..5bb36b1c33 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -12,7 +12,6 @@ fa: followers: one: پی‌گیرنده other: پی‌گیرنده - following: پی می‌گیرد instance_actor_flash: این حساب عاملی مجازیست که به نمایندگی از خود کارساز استفاده می‌شود و نه کاربری جداگانه. این حساب به منظور اتصال به فدراسیون استفاده می‌شود و نباید معلق شود. last_active: آخرین فعّالیت link_verified_on: مالکیت این پیوند در %{date} بررسی شد diff --git a/config/locales/fi.yml b/config/locales/fi.yml index ce28cb3dd3..6af6739f95 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -12,7 +12,9 @@ fi: followers: one: seuraaja other: seuraajaa - following: seurattavaa + following: + one: seurattava + other: seurattavaa instance_actor_flash: Tämä tili on virtuaalinen toimija, jota käytetään edustamaan itse palvelinta eikä yksittäistä käyttäjää. Sitä käytetään federointitarkoituksiin, eikä sitä tule jäädyttää. last_active: viimeksi aktiivinen link_verified_on: Tämän linkin omistus on tarkastettu %{date} @@ -693,13 +695,13 @@ fi: no_one_assigned: Ei kukaan notes: create: Lisää muistiinpano - create_and_resolve: Ratkaise ja jätä muistiinpano - create_and_unresolve: Avaa uudelleen ja jätä muistiinpano + create_and_resolve: Ratkaise ja lisää muistiinpano + create_and_unresolve: Avaa uudelleen ja lisää muistiinpano delete: Poista placeholder: Kuvaile tehtyjä toimia tai lisää muita käyttäjään liittyviä merkintöjä… title: Muistiinpanot notes_description_html: Tarkastele ja jätä muistiinpanoja muille moderaattoreille ja itsellesi tulevaisuuteen - processed_msg: Raportin nro %{id} käsittely onnistui + processed_msg: Raportin nro %{id} käsittely onnistui quick_actions_description_html: 'Suorita pikatoiminto tai vieritä alas nähdäksesi raportoitu sisältö:' remote_user_placeholder: etäkäyttäjä palvelimelta %{instance} reopen: Avaa raportti uudelleen @@ -724,7 +726,7 @@ fi: mark_as_sensitive_html: Merkitse loukkaavien julkaisujen media arkaluonteiseksi silence_html: Rajoita merkittävästi käyttäjän @%{acct} tavoitettavuutta tekemällä profiilista ja sen sisällöstä näkyviä vain niille, jotka jo seuraavat tiliä tai etsivät sen manuaalisesti suspend_html: Jäädytä @%{acct}, jolloin hänen profiilinsa ja sisältönsä ei ole käytettävissä ja hänen kanssaan on mahdotonta olla vuorovaikutuksessa - close_report: Merkitse raportti nro %{id} ratkaistuksi + close_report: Merkitse raportti nro %{id} ratkaistuksi close_reports_html: Merkitse kaikki käyttäjään @%{acct} kohdistuvat raportit ratkaistuiksi delete_data_html: Poista käyttäjän @%{acct} profiili ja sen sisältö 30 päivän kuluttua, ellei jäädytystä sillä välin kumota preview_preamble_html: "@%{acct} saa varoituksen, jonka sisältö on seuraava:" @@ -900,7 +902,7 @@ fi: back_to_account: Takaisin tilisivulle back_to_report: Takaisin raporttisivulle batch: - add_to_report: Lisää raporttiin nro %{id} + add_to_report: Lisää raporttiin nro %{id} remove_from_report: Poista raportista report: Raportoi contents: Sisältö @@ -1178,7 +1180,7 @@ fi: new_report: body: "%{reporter} on raportoinut kohteen %{target}" body_remote: Joku palvelimelta %{domain} raportoi kohteen %{target} - subject: Uusi raportti palvelimesta %{instance} (nro %{id}) + subject: Uusi raportti palvelimelta %{instance} (nro %{id}) new_software_updates: body: Uusia Mastodon-versioita on julkaistu, joten saatat haluta päivittää! subject: Palvelimelle %{instance} ovat saatavilla uusia Mastodon-versioita! @@ -1380,7 +1382,7 @@ fi: description_html: Nämä ovat tiliisi kohdistuvia toimia sekä varoituksia, jotka palvelimen %{instance} ylläpito on lähettänyt sinulle. recipient: Osoitettu käyttäjälle reject_appeal: Hylkää valitus - status: Julkaisu nro %{id} + status: Julkaisu nro %{id} status_removed: Julkaisu on jo poistettu järjestelmästä title: "%{action} alkaen %{date}" title_actions: @@ -1709,7 +1711,7 @@ fi: follow_request: action: Hallitse seurantapyyntöjä body: "%{name} on pyytänyt lupaa seurata sinua" - subject: 'Odottava seuraamispyyntö: %{name}' + subject: 'Odottava seuraaja: %{name}' title: Uusi seurantapyyntö mention: action: Vastaa @@ -1849,7 +1851,7 @@ fi: edge: Edge electron: Electron firefox: Firefox - generic: tuntematon selain + generic: Tuntematon selain huawei_browser: Huawei-selain ie: Internet Explorer micro_messenger: MicroMessenger @@ -1860,7 +1862,7 @@ fi: qq: QQ Browser safari: Safari uc_browser: UC Browser - unknown_browser: tuntematon selain + unknown_browser: Tuntematon selain weibo: Weibo current_session: Nykyinen istunto date: Päivämäärä @@ -1950,7 +1952,7 @@ fi: pin_errors: direct: Vain mainituille käyttäjille näkyviä julkaisuja ei voi kiinnittää limit: Olet jo kiinnittänyt enimmäismäärän julkaisuja - ownership: Muiden julkaisuja ei voi kiinnittää + ownership: Toisen julkaisua ei voi kiinnittää reblog: Tehostusta ei voi kiinnittää quote_error: not_available: Julkaisu ei saatavilla @@ -1968,7 +1970,7 @@ fi: public: Julkinen public_long: Kuka tahansa Mastodonissa ja sen ulkopuolella unlisted: Vaivihkaa julkinen - unlisted_long: Piilotettu Mastodonin hakutuloksista, trendeistä ja julkisilta aikajanoilta + unlisted_long: Piilotetaan Mastodonin hakutuloksista, trendeistä ja julkisilta aikajanoilta statuses_cleanup: enabled: Poista vanhat julkaisut automaattisesti enabled_hint: Poistaa julkaisusi automaattisesti, kun ne saavuttavat valitun ikäkynnyksen, ellei jokin alla olevista poikkeuksista tule kyseeseen @@ -2105,7 +2107,7 @@ fi: silence: Voit edelleen käyttää tiliäsi, mutta vain sinua jo seuraavat käyttäjät näkevät julkaisusi tällä palvelimella ja sinut voidaan sulkea pois eri löydettävyysominaisuuksista. Toiset voivat kuitenkin edelleen seurata sinua manuaalisesti. suspend: Et voi enää käyttää tiliäsi, eivätkä profiilisi ja muut tiedot ole enää käytettävissä. Voit silti kirjautua sisään pyytääksesi tietojesi varmuuskopiota, kunnes tiedot on poistettu kokonaan noin 30 päivän kuluttua. Säilytämme kuitenkin joitain perustietoja, jotka estävät sinua kiertämästä jäädytystä. reason: 'Syy:' - statuses: 'Julkaisuja lainattu:' + statuses: 'Viitatut julkaisut:' subject: delete_statuses: Julkaisusi tilillä %{acct} on poistettu disable: Tilisi %{acct} on jäädytetty @@ -2138,7 +2140,7 @@ fi: feature_audience_title: Rakenna yleisöäsi luottavaisin mielin feature_control: Tiedät itse parhaiten, mitä haluat nähdä kotisyötteessäsi. Ei algoritmeja eikä mainoksia tuhlaamassa aikaasi. Seuraa yhdellä tilillä ketä tahansa, miltä tahansa Mastodon-palvelimelta, vastaanota heidän julkaisunsa aikajärjestyksessä ja tee omasta internetin nurkastasi hieman enemmän omanlaisesi. feature_control_title: Pidä aikajanasi hallussasi - feature_creativity: Mastodon tukee ääni-, video- ja kuvajulkaisuja, saavutettavuuskuvauksia, äänestyksiä, sisältövaroituksia, animoituja avattaria, mukautettuja emojeita, pikkukuvien rajauksen hallintaa ja paljon muuta, mikä auttaa ilmaisemaan itseäsi verkossa. Julkaisetpa sitten taidetta, musiikkia tai podcastia, Mastodon on sinua varten. + feature_creativity: Mastodon tukee ääni-, video- ja kuvajulkaisuja, saavutettavuuskuvauksia, äänestyksiä, sisältövaroituksia, animoituja avattaria, mukautettuja emojeita, pienoiskuvien rajauksen hallintaa ja paljon muuta, mikä auttaa ilmaisemaan itseäsi verkossa. Julkaisetpa sitten taidetta, musiikkia tai podcastia, Mastodon on sinua varten. feature_creativity_title: Luovuutta vertaansa vailla feature_moderation: Mastodon palauttaa päätöksenteon käsiisi. Jokainen palvelin luo omat sääntönsä ja määräyksensä, joita valvotaan paikallisesti eikä ylhäältä alas kuten kaupallisessa sosiaalisessa mediassa, mikä tekee siitä joustavimman vastaamaan eri ihmisryhmien tarpeisiin. Liity palvelimelle, jonka säännöt sopivat sinulle, tai ylläpidä omaa palvelinta. feature_moderation_title: Moderointi juuri kuten sen pitäisi olla @@ -2165,7 +2167,7 @@ fi: users: follow_limit_reached: Et voi seurata yli %{limit} käyttäjää go_to_sso_account_settings: Avaa identiteettitarjoajasi tiliasetukset - invalid_otp_token: Virheellinen kaksivaiheisen todennuksen koodi + invalid_otp_token: Väärä kaksivaiheisen todennuksen koodi otp_lost_help_html: Jos sinulla ei ole pääsyä kumpaankaan, voit ottaa yhteyden osoitteeseen %{email} rate_limited: Liian monta todennusyritystä – yritä uudelleen myöhemmin. seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä. diff --git a/config/locales/fil.yml b/config/locales/fil.yml index cb26371ca8..39706a4368 100644 --- a/config/locales/fil.yml +++ b/config/locales/fil.yml @@ -7,7 +7,6 @@ fil: hosted_on: Mastodon hosted sa %{domain} title: About accounts: - following: Following instance_actor_flash: Ang account na ito ay virtual actor na ginagamit para i-represent ang mismong server at hindi anumang indibidwal na user. Ginagamit ito para sa mga layunin ng pederasyon at hindi dapat i-suspend. last_active: huling aktibo link_verified_on: Ang pagmamay-ari ng link na ito ay huling na-check sa %{date} diff --git a/config/locales/fo.yml b/config/locales/fo.yml index a531e0bc13..aea4d294e7 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -12,7 +12,6 @@ fo: followers: one: Fylgjari other: Fylgjarar - following: Fylgir instance_actor_flash: Hendan kontan er ein tykisligur aktørur, sum verður brúktur til at umboða ambætaran sjálvan og ikki nakran ávísan brúkara. Hon verður brúkt til sameind endamál og eigur ikki at vera tikin úr gildi. last_active: virkin seinast link_verified_on: Eigaraskapur av hesum leinki var eftirkannaður tann %{date} diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 0b85877787..b6913688e6 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -12,7 +12,9 @@ fr-CA: followers: one: Abonné·e other: Abonné·e·s - following: Abonnements + following: + one: Abonnement + other: Abonnements instance_actor_flash: Ce compte est un acteur virtuel utilisé pour représenter le serveur lui-même et non un utilisateur individuel. Il est utilisé à des fins de fédération et ne doit pas être suspendu. last_active: dernière activité link_verified_on: La propriété de ce lien a été vérifiée le %{date} @@ -23,11 +25,11 @@ fr-CA: one: Message other: Messages posts_tab_heading: Messages - self_follow_error: Il n'est pas possible de suivre votre propre compte + self_follow_error: Suivre votre propre compte n'est pas autorisé admin: account_actions: action: Effectuer l'action - already_silenced: Ce compte a déjà été limité. + already_silenced: Ce compte est déjà limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: @@ -50,7 +52,7 @@ fr-CA: title: Modifier le courriel pour %{username} change_role: changed_msg: Rôle modifié avec succès ! - edit_roles: Gérer les rôles d'utilisateur·ices + edit_roles: Gérer les rôles d'utilisateur·ice label: Modifier le rôle no_role: Aucun rôle title: Modifier le rôle de %{username} diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ee7b35ab19..e08a646864 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -12,7 +12,9 @@ fr: followers: one: Abonné·e other: Abonné·e·s - following: Abonnements + following: + one: Abonnement + other: Abonnements instance_actor_flash: Ce compte est un acteur virtuel utilisé pour représenter le serveur lui-même et non un utilisateur individuel. Il est utilisé à des fins de fédération et ne doit pas être suspendu. last_active: dernière activité link_verified_on: La propriété de ce lien a été vérifiée le %{date} @@ -23,11 +25,11 @@ fr: one: Message other: Messages posts_tab_heading: Messages - self_follow_error: Il n'est pas possible de suivre votre propre compte + self_follow_error: Suivre votre propre compte n'est pas autorisé admin: account_actions: action: Effectuer l'action - already_silenced: Ce compte a déjà été limité. + already_silenced: Ce compte est déjà limité. already_suspended: Ce compte est déjà suspendu. title: Effectuer une action de modération sur %{acct} account_moderation_notes: @@ -46,18 +48,18 @@ fr: current_email: Adresse de courriel actuelle label: Modifier l’adresse de courriel new_email: Nouvelle adresse de courriel - submit: Modifier le courriel + submit: Modifier l’adresse de courriel title: Modifier l’adresse de courriel pour %{username} change_role: changed_msg: Rôle modifié avec succès ! - edit_roles: Gérer les rôles d'utilisateur·ices + edit_roles: Gérer les rôles d'utilisateur·ice label: Modifier le rôle no_role: Aucun rôle title: Modifier le rôle de %{username} confirm: Confirmer confirmed: Confirmé confirming: Confirmation - custom: Personnalisé + custom: Personnaliser delete: Supprimer les données deleted: Supprimé demote: Rétrograder diff --git a/config/locales/fy.yml b/config/locales/fy.yml index e7ff8991a6..e5133203a5 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -10,7 +10,6 @@ fy: followers: one: Folger other: Folgers - following: Folgjend instance_actor_flash: Dizze account is in ‘virtual actor’ wêrmei’t de server himsels fertsjinwurdiget en is dus gjin yndividuele brûker. It wurdt foar federaasjedoeleinen brûkt en moat net útsteld wurde. last_active: lêst warber link_verified_on: Eigendom fan dizze keppeling is kontrolearre op %{date} diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 9024a66eb9..15adc1861a 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -15,7 +15,12 @@ ga: one: Leantóir other: LeantóiríLeantóirí two: Leantóirí - following: Ag leanúint + following: + few: Ag leanúint + many: Ag leanúint + one: Ag leanúint + other: Ag leanúint + two: Ag leanúint instance_actor_flash: Is gníomhaí fíorúil é an cuntas seo a úsáidtear chun an freastalaí féin agus ní aon úsáideoir aonair a léiriú. Úsáidtear é chun críocha cónaidhme agus níor cheart é a chur ar fionraí. last_active: deireanach gníomhach link_verified_on: Seiceáladh úinéireacht an naisc seo ar %{date} diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 543cd0cb46..f3426d0f90 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -14,7 +14,6 @@ gd: one: Neach-leantainn other: Luchd-leantainn two: Luchd-leantainn - following: A’ leantainn instance_actor_flash: "’S e actar biortail a tha sa chunntas seo a riochdaicheas am frithealaiche fhèin seach cleachdaiche sònraichte. Tha e ’ga chleachdadh a chùm co-nasgaidh agus cha bu chòir dhut a chur à rèim." last_active: an gnìomh mu dheireadh link_verified_on: Chaidh dearbhadh cò leis a tha an ceangal seo %{date} diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 6c9ed9b6c9..d06f62c266 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -12,7 +12,9 @@ gl: followers: one: Seguidora other: Seguidoras - following: A Seguir + following: + one: Seguimento + other: Seguimentos instance_actor_flash: Esta conta é un actor virtual utilizado para representar ó servidor mesmo e non a unha usuaria individual. Utilízase por motivos de federación e non debería estar suspendida. last_active: última actividade link_verified_on: A propiedade desta ligazón foi verificada en %{date} diff --git a/config/locales/he.yml b/config/locales/he.yml index bfe09b8753..10dec56bcf 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -14,7 +14,11 @@ he: one: עוקב other: עוקבים two: עוקבים - following: נעקבים + following: + many: נעקבים + one: נעקבים + other: נעקבים + two: נעקביים instance_actor_flash: חשבון זה הינו פועל וירטואלי המשמש לייצוג השרת עצמו ולא אף משתמש ספציפי. הוא משמש למטרות פדרציה ואין להשעותו. last_active: פעילות אחרונה link_verified_on: בעלות על קישורית זו נבדקה לאחרונה ב-%{date} diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 37df2afe1a..65f0ff6293 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -5,7 +5,6 @@ hi: contact_unavailable: लागू नहीं है title: के बारे में accounts: - following: फ़ॉलो कर रहे हैं instance_actor_flash: यह खाता आभासी है जो सर्वर को दिखाने के लिये है और ये किसी व्यक्तिका प्रतिनिधित्व नहि करता। यह सिर्फ देखरेख के हेतु से कार्यरत है और इसको निलंबित करने कि आवश्यकता नहि है। last_active: आखिरि बार इस वक्त सक्रिय थे link_verified_on: इस लिंक का स्वामित्व %{date} को चेक किया गया था diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 4439460df6..09e904525d 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -5,7 +5,6 @@ hr: contact_missing: Nije postavljeno title: O aplikaciji accounts: - following: Praćenih last_active: posljednja aktivnost nothing_here: Ovdje nema ničeg! posts_tab_heading: Tootovi diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 7c869a68d5..3c68c023af 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -12,7 +12,6 @@ hu: followers: one: Követő other: Követő - following: Követett instance_actor_flash: Ez a fiók virtuális, magát a kiszolgálót reprezentálja, nem pedig konkrét felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni. last_active: utoljára aktív link_verified_on: 'A hivatkozás tulajdonosa ekkor volt ellenőrizve: %{date}' diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 3dc7913784..3280ffc4eb 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -10,7 +10,6 @@ hy: followers: one: Հետեւորդ other: Հետևորդներ - following: Հետեւած instance_actor_flash: Այս հաշիւը վիրտուալ դերասան է, որը ներկայացնում է հանգոյցը, եւ ոչ որեւէ անհատ օգտատիրոջ։ Այն օգտագործուում է ֆեդերացիայի նպատակներով եւ չպէտք է կասեցուի։ last_active: վերջին այցը link_verified_on: Սոյն յղման տիրապետումը ստուգուած է՝ %{date}֊ին diff --git a/config/locales/ia.yml b/config/locales/ia.yml index ce837ff418..2afbd1b780 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -10,7 +10,6 @@ ia: followers: one: Sequitor other: Sequitores - following: Sequente instance_actor_flash: Iste conto es un agente virtual usate pro representar le servitor mesme e non alcun usator individual. Illo es usate pro le federation e non debe esser suspendite. last_active: ultime activitate link_verified_on: Le proprietate de iste ligamine ha essite verificate le %{date} diff --git a/config/locales/id.yml b/config/locales/id.yml index 55e1a2ea18..f3f6207133 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -9,7 +9,6 @@ id: accounts: followers: other: Pengikut - following: Mengikuti instance_actor_flash: Akun ini adalah aktor virtual yang merepresentasikan server itu sendiri dan bukan pengguna individu. Ini dipakai untuk tujuan gabungan dan seharusnya tidak ditangguhkan. last_active: terakhir aktif link_verified_on: Kepemilikan tautan ini telah dicek pada %{date} diff --git a/config/locales/ie.yml b/config/locales/ie.yml index ecfd599c95..cb0dec5e83 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -10,7 +10,6 @@ ie: followers: one: Sequitor other: Sequitores - following: Sequent instance_actor_flash: Ti-ci conto es un virtual actor usat por representer li servitor self e null individual usator. It es usat por federational rasones e deve ne esser suspendet. last_active: ultim activitá link_verified_on: Proprietá de ti-ci ligament esset verificat ye %{date} diff --git a/config/locales/io.yml b/config/locales/io.yml index ef215736df..576b7d136c 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -10,7 +10,6 @@ io: followers: one: Sequanto other: Sequanti - following: Sequati instance_actor_flash: Ca konto esas virtuala aganto quo uzesas por reprezentar la servilo e ne irga individuala uzanto. Ol uzesas por federskopo e ne debas restriktesar. last_active: lasta aktiva tempo link_verified_on: Proprieteso di ca ligilo kontrolesis ye %{date} diff --git a/config/locales/is.yml b/config/locales/is.yml index b2eb345f03..1fba521318 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -12,7 +12,9 @@ is: followers: one: fylgjandi other: fylgjendur - following: Fylgist með + following: + one: Fylgist með + other: Fylgist með instance_actor_flash: Þessi notandaaðgangur er sýndarnotandi sem stendur fyrir sjálfan netþjóninn en ekki neinn einstakling. Hann er notaður við skýjasambandsmiðlun og ætti ekki að setja hann í frysti eða banna. last_active: síðasta virkni link_verified_on: Eignarhald á þessum tengli var athugað þann %{date} diff --git a/config/locales/it.yml b/config/locales/it.yml index 49719320e3..8a630520f0 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -12,7 +12,9 @@ it: followers: one: Seguace other: Seguaci - following: Seguiti + following: + one: Stai seguendo + other: Stai seguendo instance_actor_flash: Questo profilo è un attore virtuale, utilizzato per rappresentare il server stesso e non un singolo utente. È utilizzato per scopi federativi e non dovrebbe esser sospeso. last_active: ultima attività link_verified_on: La proprietà di questo link è stata controllata il %{date} diff --git a/config/locales/ja.yml b/config/locales/ja.yml index a8419916ed..095410a994 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -9,7 +9,6 @@ ja: accounts: followers: other: フォロワー - following: フォロー中 instance_actor_flash: このアカウントは、個々のユーザーではなく、サーバー自体を表すために使用される仮想のユーザーです。 連合のために使用されるため、停止しないで下さい。 last_active: 最後の活動 link_verified_on: このリンクの所有権は%{date}に確認されました diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 200dac1880..acbfb6802e 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -6,7 +6,6 @@ ka: contact_unavailable: მიუწ. hosted_on: მასტოდონს მასპინძლობს %{domain} accounts: - following: მიჰყვება nothing_here: აქ არაფერია! pin_errors: following: იმ ადამიანს, ვინც მოგწონთ, უკვე უნდა მიჰყვებოდეთ diff --git a/config/locales/kab.yml b/config/locales/kab.yml index b25254b620..7495e7de8e 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -10,7 +10,6 @@ kab: followers: one: Umeḍfaṛ other: Imeḍfaṛen - following: Yeṭṭafaṛ last_active: armud aneggaru nothing_here: Ulac kra da! posts: diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 628dcbc3f8..d054c51b45 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -9,7 +9,6 @@ kk: followers: one: Оқырман other: Оқырман - following: Жазылғандары last_active: соңғы әрекеті link_verified_on: Сілтеме меншігі расталған күн %{date} nothing_here: Бұл жерде ештеңе жоқ! diff --git a/config/locales/ko.yml b/config/locales/ko.yml index f0ede70b9d..6ade109e34 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -11,7 +11,6 @@ ko: cannot_be_added_to_collections: 이 계정은 컬렉션에 추가할 수 없습니다. followers: other: 팔로워 - following: 팔로잉 instance_actor_flash: 이 계정은 서버 자신을 나타내기 위한 가상의 계정이며 개인 사용자가 아닙니다. 이 계정은 연합을 위해 사용되며 정지되지 않아야 합니다. last_active: 최근 활동 link_verified_on: "%{date}에 이 링크의 소유가 확인되었습니다" diff --git a/config/locales/ku.yml b/config/locales/ku.yml index be29235c38..1541ec1ac1 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -10,7 +10,6 @@ ku: followers: one: Şopîner other: Şopîner - following: Dişopîne instance_actor_flash: Ev ajimêr listikvaneke rastkî ye ku ji bo wek nûnerê rajekar bixwe tê bikaranîn û ne bikarhênerek kesane. Ew ji bo mebestên giştî tê bikaranîn û divê neyê rawestandin. last_active: çalakiya dawî link_verified_on: Xwedaniya li vê girêdanê di %{date} de hatiye kontrolkirin diff --git a/config/locales/la.yml b/config/locales/la.yml index cc92bf6d28..e6ac78b437 100644 --- a/config/locales/la.yml +++ b/config/locales/la.yml @@ -10,7 +10,6 @@ la: followers: one: Sectātor other: Sectātōrēs - following: Sequendī instance_actor_flash: Hic ratio est actōr virtuālis ad repraesentandam ipsum servatorem et non ullam individuam usorem. Ad scopōs foederātiōnis ūtor nec suspendendus est. last_active: Ultimum Actum link_verified_on: Dominium huius nexūs est comprobatum die %{date}. diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 6984830f7e..95c931270c 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -10,7 +10,6 @@ lad: followers: one: Suivante other: Suivantes - following: Sigiendo instance_actor_flash: Este kuento es un aktor virtual utilizado para reprezentar al sirvidor en si mezmo i no a dingun utilizador individual. Se utiliza para butos de la federasyon i no se deve suspender. last_active: ultima koneksyon link_verified_on: La propiedad de este atadijo fue verifikada el %{date} diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 6666a4d7bd..6d68e28078 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -12,7 +12,6 @@ lt: many: Sekėjo one: Sekėjas other: Sekėjų - following: Seka instance_actor_flash: Ši paskyra yra virtualus veikėjas (-a), naudojamas atstovauti pačiam serveriui, o ne atskiram naudotojui. Tai naudojama federacijos tikslais ir neturėtų būti pristabdyta. last_active: paskutinį kartą aktyvus link_verified_on: Šios nuorodos nuosavybė buvo patikrinta %{date} diff --git a/config/locales/lv.yml b/config/locales/lv.yml index ffc506c6e2..eda3eed69b 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -11,7 +11,6 @@ lv: one: Sekotājs other: Sekotāji zero: Sekotāju - following: Seko instance_actor_flash: Šis konts ir virtuāls aktieris, ko izmanto, lai pārstāvētu pašu serveri, nevis atsevišķu lietotāju. To izmanto federācijas nolūkos, un to nevajadzētu apturēt. last_active: pēdējā aktivitāte link_verified_on: Šīs saites piederība tika pārbaudīta %{date} diff --git a/config/locales/ml.yml b/config/locales/ml.yml index c27e5e5467..e8c443e799 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -7,7 +7,6 @@ ml: followers: one: പിന്തുടരാളി other: പിന്തുടരുന്നവർ - following: പിന്തുടരുന്നു last_active: അവസാനം സജീവമായിരുന്നത് link_verified_on: സന്ധിയുടെ ഉടമസ്ഥാവസ്‌കാശം %{date} ൽ പരിശോധിക്കപ്പെട്ടു nothing_here: ഇവിടെ ഒന്നുമില്ല! diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 4126f96684..5e30ca8d86 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -9,7 +9,6 @@ ms: accounts: followers: other: Pengikut - following: Mengikuti instance_actor_flash: Akaun ini ialah pelaku maya yang digunakan untuk mewakili pelayan itu sendiri dan bukan mana-mana pengguna individu. Ia digunakan untuk tujuan persekutuan dan tidak patut digantung. last_active: aktif terakhir link_verified_on: Pemilikan pautan ini diperiksa pada %{date} diff --git a/config/locales/my.yml b/config/locales/my.yml index 5fbfe4e2dd..854c55b32f 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -9,7 +9,6 @@ my: accounts: followers: other: စောင့်ကြည့်သူ - following: စောင့်ကြည့်နေသည် instance_actor_flash: ဤအကောင့်သည် ဆာဗာကို ကိုယ်စားပြုသည့် အကောင့်တခုသာဖြစ်ပြီး မည်သည့်အသုံးပြုသူမှမဟုတ်ပါ။ ၎င်းကို Federation ရည်ရွယ်ချက်များအတွက် အသုံးပြုသည့်အတွက် ပိတ်ပင် ဆိုင်းငံ့ခြင်း မပြုသင့်ပါ။ last_active: နောက်ဆုံးအသုံးပြုခဲ့သည့်အချိန် link_verified_on: ဤလင့်ခ်၏ ပိုင်ဆိုင်မှုကို %{date} တွင် စစ်ဆေးခဲ့သည် diff --git a/config/locales/nan-TW.yml b/config/locales/nan-TW.yml index 00f56669cb..47ee07f804 100644 --- a/config/locales/nan-TW.yml +++ b/config/locales/nan-TW.yml @@ -11,7 +11,6 @@ nan-TW: cannot_be_added_to_collections: Tsit ê口座袂當加入kàu集合。 followers: other: 跟tuè ê - following: Leh跟tuè instance_actor_flash: Tsit ê口座是虛ê,用來代表tsit臺服侍器,毋是個人用者ê。伊用來做聯邦ê路用,毋好kā伊ê權限停止。 last_active: 頂kái活動ê時間 link_verified_on: Tsit ê連結ê所有權佇 %{date} 受檢查 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 427810a745..2ee31744b6 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -12,7 +12,6 @@ nl: followers: one: Volger other: Volgers - following: Volgend instance_actor_flash: Dit account is een 'virtual actor' waarmee de server zichzelf vertegenwoordigt en is dus geen individuele gebruiker. Het wordt voor federatiedoeleinden gebruikt en moet niet worden opgeschort. last_active: laatst actief link_verified_on: Eigendom van deze link is gecontroleerd op %{date} diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 792a4e2866..1ea42b8b9d 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -12,7 +12,6 @@ nn: followers: one: Fylgjar other: Fylgjarar - following: Fylgjer instance_actor_flash: Denne kontoen er ein virtuell figur som nyttast som representant for tenaren, og ikkje som individuell brukar. Den nyttast til forbundsformål og bør ikkje suspenderast. last_active: sist aktiv link_verified_on: Eigarskap for denne lenkja vart sist sjekka %{date} diff --git a/config/locales/no.yml b/config/locales/no.yml index 3c2e2e54b8..137b564569 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -10,7 +10,6 @@ followers: one: Følger other: Følgere - following: Følger instance_actor_flash: Denne kontoen er en virtuell figur som brukes til å representere selve serveren og ikke noen individuell bruker. Den brukes til forbundsformål og bør ikke oppheves. last_active: sist aktiv link_verified_on: Eierskap av denne lenken ble sjekket %{date} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index e7252a1a41..176a8bf95e 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -10,7 +10,6 @@ oc: followers: one: Seguidor other: Seguidors - following: Abonaments last_active: darrièra activitat link_verified_on: La proprietat d’aqueste ligam foguèt verificada lo %{date} nothing_here: I a pas res aquí ! diff --git a/config/locales/pa.yml b/config/locales/pa.yml index f9508f9b9a..894edeb8cd 100644 --- a/config/locales/pa.yml +++ b/config/locales/pa.yml @@ -10,7 +10,6 @@ pa: followers: one: ਫ਼ਾਲੋਅਰ other: ਫ਼ਾਲੋਅਰ - following: ਫ਼ਾਲੋ ਕੀਤੇ ਜਾ ਰਹੇ posts: one: ਪੋਸਟ other: ਪੋਸਟਾਂ diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 86f015878a..118af18cfb 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -12,7 +12,6 @@ pl: many: śledzących one: śledzący other: obserwujących - following: Obserwowanych instance_actor_flash: To konto jest wirtualnym profilem używanym do reprezentowania samego serwera, a nie żadnego indywidualnego użytkownika. Jest ono stosowane do celów federacji i nie powinien być zawieszany. last_active: ostatnio aktywny(-a) link_verified_on: Własność tego odnośnika została sprawdzona %{date} diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 581b1fd965..1e197af51a 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -12,7 +12,6 @@ pt-BR: followers: one: Seguidor other: Seguidores - following: Seguindo instance_actor_flash: Esta conta é um ator virtual usado para representar o próprio servidor e não um usuário individual. É utilizada para fins de federação e não deve ser suspensa. last_active: última atividade link_verified_on: O link foi verificado em %{date} diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index a03b13e405..7cafce55b2 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -12,7 +12,6 @@ pt-PT: followers: one: Seguidor other: Seguidores - following: Seguindo instance_actor_flash: Esta conta é um ator virtual utilizado para representar o servidor em si e não um utilizador individual. É utilizada para efeitos de federação e não deve ser suspensa. last_active: última atividade link_verified_on: A posse desta hiperligação foi verificada em %{date} diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 57b82a35d4..c908f2b36e 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -11,7 +11,6 @@ ro: few: Urmăritori one: Urmăritor other: De Urmăritori - following: Urmăriți instance_actor_flash: Acest cont este un actor virtual folosit pentru a reprezenta serverul în sine și nu un utilizator individual. Acesta este utilizat în scopuri federative şi nu trebuie suspendat. last_active: ultima activitate link_verified_on: Proprietatea acestui link a fost verificată la %{date} diff --git a/config/locales/ru.yml b/config/locales/ru.yml index da0e83a515..2db4e6c702 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -12,7 +12,6 @@ ru: many: подписчиков one: подписчик other: подписчиков - following: подписки instance_actor_flash: Эта учетная запись - виртуальный пользователь, используемый для представления самого сервера, а не отдельного пользователя. Она используется для организационных целей и не может быть заморожена. last_active: последняя активность link_verified_on: Владение этой ссылкой было проверено %{date} diff --git a/config/locales/ry.yml b/config/locales/ry.yml index dd1b78600c..321ecde341 100644 --- a/config/locales/ry.yml +++ b/config/locales/ry.yml @@ -1,7 +1,6 @@ --- ry: accounts: - following: Пудпискы posts: few: Публикації one: Публикація diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 55bb21608d..c1cc7c18e7 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -10,7 +10,6 @@ sc: followers: one: Sighidura other: Sighiduras - following: Sighende instance_actor_flash: Custu contu est un'atore virtuale chi costumaiat a rapresentare su serbidore etotu e nono unu cale si siat utente individuale. Est impreadu pro finalidades de sa federatzione e non si depet suspèndere. last_active: ùrtima atividade link_verified_on: Sa propiedade de custu ligàmene est istada controllada su %{date} diff --git a/config/locales/sco.yml b/config/locales/sco.yml index 2edfe28222..2a6ca23c6f 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -10,7 +10,6 @@ sco: followers: one: Follaer other: Follaers - following: Follaein instance_actor_flash: This accoont is a virtual actor uised tae represent the server itsel an no onie individual uiser. It is uised fir federation purposes an shuidnae be suspendit. last_active: last active link_verified_on: Ainership o this link wis checkt on %{date} diff --git a/config/locales/si.yml b/config/locales/si.yml index 9c3ff9c904..868d36b518 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -10,7 +10,6 @@ si: followers: one: අනුගාමිකයා other: අනුගාමිකයින් - following: අනුගමන instance_actor_flash: මෙම ගිණුම සේවාදායකයම නියෝජනය කිරීමට භාවිතා කරන අතථ්‍ය නළුවෙකු වන අතර කිසිදු තනි පරිශීලකයෙකු නොවේ. එය ෆෙඩරේෂන් අරමුණු සඳහා භාවිතා කරන අතර අත්හිටුවිය යුතු නොවේ. last_active: අවසාන ක්රියාකාරී link_verified_on: මෙම සබැඳියේ හිමිකාරිත්වය %{date}හි පරීක්ෂා කරන ලදී diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 3e169199dc..bb4170c412 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -231,7 +231,7 @@ fi: max_uses: Käyttökertoja enintään new_password: Uusi salasana note: Elämäkerta - otp_attempt: Kaksivaiheisen todennuksen tunnusluku + otp_attempt: Kaksivaiheisen todennuksen koodi password: Salasana phrase: Avainsana tai fraasi setting_advanced_layout: Ota edistynyt selainkäyttöliittymä käyttöön @@ -321,7 +321,7 @@ fi: must_be_following: Estä ilmoitukset käyttäjiltä, joita et seuraa must_be_following_dm: Estä yksityisviestit käyttäjiltä, joita et seuraa invite: - comment: Kommentoi + comment: Kommentti invite_request: text: Miksi haluat liittyä? ip_block: @@ -348,7 +348,7 @@ fi: critical: Ilmoita vain kriittisistä päivityksistä label: Uusi Mastodon-versio on saatavilla none: Älä koskaan ilmoita päivityksistä (ei suositeltu) - patch: Ilmoita virhekorjauspäivityksistä + patch: Ilmoita virheenkorjauspäivityksistä trending_tag: Uusi trendi vaatii tarkastuksen rule: hint: Lisätietoja @@ -401,7 +401,7 @@ fi: recommended: Suositellaan required: mark: "*" - text: vaadittu tieto + text: pakollinen title: sessions: webauthn: Käytä yhtä suojausavaimistasi kirjautuaksesi sisään diff --git a/config/locales/sk.yml b/config/locales/sk.yml index e10e49ce7e..05961652be 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -12,7 +12,6 @@ sk: many: Sledovateľov one: Sledujúci other: Sledujúci - following: Nasledujem instance_actor_flash: Toto konto je virtuálny aktér, ktorý predstavuje samotný server, a nie konkrétneho používateľa. Používa sa na účely federácie a nemal by byť pozastavený. last_active: posledná aktivita link_verified_on: Vlastníctvo tohto odkazu bolo skontrolované %{date} diff --git a/config/locales/sl.yml b/config/locales/sl.yml index b577eb45a5..e442df4081 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -14,7 +14,6 @@ sl: one: Sledilec other: Sledilcev two: Sledilca - following: Sledi instance_actor_flash: Ta račun je navidezni akter, ki se uporablja za predstavljanje strežnika samega in ne posameznega uporabnika. Uporablja se za namene federacije in se ne sme začasno ustaviti. last_active: zadnja dejavnost link_verified_on: Lastništvo te povezave je bilo preverjeno %{date} diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 159014d168..500807cfce 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -12,7 +12,6 @@ sq: followers: one: Ndjekës other: Ndjekës - following: Po ndjek instance_actor_flash: Kjo llogari është një aktor virtual, i përdorur për të përfaqësuar vetë serverin dhe jo ndonjë përdorues. Përdoret për qëllime federimi dhe s’duhet pezulluar. last_active: aktiv së fundi link_verified_on: Pronësia e kësaj lidhjeje qe kontrolluar më %{date} diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 710158e130..b9e6722fe3 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -11,7 +11,6 @@ sr-Latn: few: Pratioca one: Pratilac other: Pratilaca - following: Pratim instance_actor_flash: Ovaj nalog je virtuelni akter koji ne predstavlja nijednog korisnika lično, već sâm server. Koristi se u svrhu federacije i ne treba ga suspendovati. last_active: najskorija aktivnost link_verified_on: Vlasništvo nad ovom vezom je provereno %{date} diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 92a41003e4..6530aecb67 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -11,7 +11,6 @@ sr: few: Пратиоца one: Пратилац other: Пратилаца - following: Пратим instance_actor_flash: Овај налог је виртуелни актер који не представља ниједног корисника лично, већ сâм сервер. Користи се у сврху федерације и не треба га суспендовати. last_active: најскорија активност link_verified_on: Власништво над овом везом је проверено %{date} diff --git a/config/locales/sv.yml b/config/locales/sv.yml index d390baf720..d070808a33 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -12,7 +12,6 @@ sv: followers: one: Följare other: Följare - following: Följer instance_actor_flash: Detta konto är en virtuell aktör som används för att representera servern i sig och inte någon enskild användare. Den används för federeringsändamål och bör inte stängas av. last_active: senast aktiv link_verified_on: Ägarskap för denna länk kontrollerades den %{date} diff --git a/config/locales/ta.yml b/config/locales/ta.yml index 56b2895c74..64d56781fe 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -9,7 +9,6 @@ ta: followers: one: பின்தொடர்பவர் other: பின்தொடர்பவர்கள் - following: பின்தொடரும் last_active: கடைசியாக பார்த்தது nothing_here: இங்கு எதுவும் இல்லை! pin_errors: diff --git a/config/locales/te.yml b/config/locales/te.yml index 84697a4aef..6b7e40bf87 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -9,7 +9,6 @@ te: followers: one: అనుచరి other: అనుచరులు - following: అనుసరిస్తున్నారు last_active: చివరిగా క్రియాశీలకంగా వుంది link_verified_on: ఈ లంకె యొక్క యాజమాన్యాన్ని చివరిగా పరిశీలించింది %{date}న nothing_here: ఇక్కడ ఏమీ లేదు! diff --git a/config/locales/th.yml b/config/locales/th.yml index 799da97443..2e7c6c75a2 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -9,7 +9,6 @@ th: accounts: followers: other: ผู้ติดตาม - following: กำลังติดตาม instance_actor_flash: บัญชีนี้เป็นตัวดำเนินการเสมือนที่ใช้เพื่อเป็นตัวแทนของเซิร์ฟเวอร์เองและไม่ใช่ผู้ใช้รายบุคคลใด ๆ มีการใช้บัญชีสำหรับวัตถุประสงค์ในการติดต่อกับภายนอกและไม่ควรได้รับการระงับ last_active: ใช้งานล่าสุด link_verified_on: ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %{date} diff --git a/config/locales/tok.yml b/config/locales/tok.yml index d004b4bd82..bc099acbb7 100644 --- a/config/locales/tok.yml +++ b/config/locales/tok.yml @@ -9,7 +9,6 @@ tok: accounts: followers: other: jan ni li kute e sina - following: sina kute e jan ni instance_actor_flash: sijelo ni li lon ala, li jan wan taso ala, li kulupu jan. ona li pona e nasin pi lawa mute. jan lawa o weka ala e sijelo ni. last_active: tenpo poka link_verified_on: "%{date} la mi sona e ni: jan seme li jo e lipu ni" diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 1f8e2d2cb5..1eb418911f 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -12,7 +12,9 @@ tr: followers: one: Takipçi other: Takipçiler - following: Takip ediliyor + following: + one: Takip ediliyor + other: Takip ediliyor instance_actor_flash: Bu hesap, herhangi bir bireysel kullanıcı değil, sunucunun kendisini temsil etmek için kullanılan sanal bir aktördür. Birleştirme amacıyla kullanılmaktadır ve askıya alınmamalıdır. last_active: son etkinlik link_verified_on: Bu bağlantının mülkiyeti %{date} tarihinde kontrol edildi diff --git a/config/locales/tt.yml b/config/locales/tt.yml index c929313476..85bcaaeafa 100644 --- a/config/locales/tt.yml +++ b/config/locales/tt.yml @@ -6,7 +6,6 @@ tt: accounts: followers: other: язылучы - following: Язылгансыз posts: other: Язма posts_tab_heading: Язмалар diff --git a/config/locales/uk.yml b/config/locales/uk.yml index da50416bb0..2d49c326d7 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -12,7 +12,6 @@ uk: many: Підписників one: Підписник other: Підписники - following: Підписок instance_actor_flash: Цей обліковий запис є віртуальним персонажем, який використовується для показу самого сервера, а не будь-якого окремого користувача. Він використовується з метою федералізації і не повинен бути зупинений. last_active: остання активність link_verified_on: Права власності на це посилання були перевірені %{date} diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 01088f1680..9e0b1d12da 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -11,7 +11,6 @@ vi: cannot_be_added_to_collections: Tài khoản này không thể thêm vào bộ sưu tập. followers: other: Người theo dõi - following: Theo dõi instance_actor_flash: Tài khoản này được dùng để đại diện cho máy chủ và không phải là người thật. Đừng bao giờ vô hiệu hóa tài khoản này. last_active: online link_verified_on: Liên kết này đã được xác minh quyền sở hữu vào %{date} diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 557ae88e3d..f422a3abae 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -11,7 +11,6 @@ zh-CN: cannot_be_added_to_collections: 此账号无法被添加到收藏列表内。 followers: other: 关注者 - following: 正在关注 instance_actor_flash: 该账号用来代表虚拟角色,并不代表个人用户,仅代表服务器本身。该账号用于联合目的,不应该被停用。 last_active: 上次活跃 link_verified_on: 此链接的所有权已在 %{date} 验证 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index b5ef8a00df..deaa117a89 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -9,7 +9,6 @@ zh-HK: accounts: followers: other: 關注者 - following: 正在關注 instance_actor_flash: 這個帳戶是結盟用的本伺服器的虛擬象徵,並不代表任何個別用戶。請不要把帳號停權。 last_active: 上次活躍時間 link_verified_on: 此連結的所有權已在 %{date} 檢查過 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 100c57ab1c..d0e67e1e74 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -11,7 +11,8 @@ zh-TW: cannot_be_added_to_collections: 此帳號無法被加至集合中。 followers: other: 跟隨者 - following: 正在跟隨 + following: + other: 正在跟隨 instance_actor_flash: 此帳號是用來代表此伺服器的虛擬執行者,而非個別使用者。它的用途為維繫聯邦宇宙,且不應被停權。 last_active: 上次活躍時間 link_verified_on: 此連結之所有權已於 %{date} 檢查過 From 0d6fc8026d91c5b169c62a04097c34b741675a56 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 4 Feb 2026 12:42:50 -0500 Subject: [PATCH 4/5] Convert `auth/confirmations` spec controller->request (#37735) --- .../auth/confirmations_controller_spec.rb | 100 ------------------ spec/requests/auth/confirmations_spec.rb | 85 +++++++++++++++ 2 files changed, 85 insertions(+), 100 deletions(-) delete mode 100644 spec/controllers/auth/confirmations_controller_spec.rb create mode 100644 spec/requests/auth/confirmations_spec.rb diff --git a/spec/controllers/auth/confirmations_controller_spec.rb b/spec/controllers/auth/confirmations_controller_spec.rb deleted file mode 100644 index 09a178f0e8..0000000000 --- a/spec/controllers/auth/confirmations_controller_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -RSpec.describe Auth::ConfirmationsController do - render_views - - describe 'GET #new' do - it 'returns http success' do - request.env['devise.mapping'] = Devise.mappings[:user] - get :new - expect(response).to have_http_status(200) - end - end - - describe 'GET #show' do - context 'when user is unconfirmed' do - let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil) } - - before do - allow(BootstrapTimelineWorker).to receive(:perform_async) - request.env['devise.mapping'] = Devise.mappings[:user] - get :show, params: { confirmation_token: 'foobar' } - end - - it 'redirects to login and queues worker' do - expect(response) - .to redirect_to(new_user_session_path) - expect(BootstrapTimelineWorker) - .to have_received(:perform_async).with(user.account_id) - end - end - - context 'when user is unconfirmed and unapproved' do - let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil, approved: false) } - - before do - allow(BootstrapTimelineWorker).to receive(:perform_async) - request.env['devise.mapping'] = Devise.mappings[:user] - get :show, params: { confirmation_token: 'foobar' } - end - - it 'redirects to login and confirms user' do - expect(response).to redirect_to(new_user_session_path) - expect(user.reload.confirmed_at).to_not be_nil - end - end - - context 'when user is already confirmed' do - let!(:user) { Fabricate(:user) } - - before do - allow(BootstrapTimelineWorker).to receive(:perform_async) - request.env['devise.mapping'] = Devise.mappings[:user] - sign_in(user, scope: :user) - get :show, params: { confirmation_token: 'foobar' } - end - - it 'redirects to root path' do - expect(response).to redirect_to(root_path) - end - end - - context 'when user is already confirmed but unapproved' do - let!(:user) { Fabricate(:user, approved: false) } - - before do - allow(BootstrapTimelineWorker).to receive(:perform_async) - request.env['devise.mapping'] = Devise.mappings[:user] - user.approved = false - user.save! - sign_in(user, scope: :user) - get :show, params: { confirmation_token: 'foobar' } - end - - it 'redirects to settings' do - expect(response).to redirect_to(edit_user_registration_path) - end - end - - context 'when user is updating email' do - let!(:user) { Fabricate(:user, confirmation_token: 'foobar', unconfirmed_email: 'new-email@example.com') } - - before do - allow(BootstrapTimelineWorker).to receive(:perform_async) - request.env['devise.mapping'] = Devise.mappings[:user] - get :show, params: { confirmation_token: 'foobar' } - end - - it 'redirects to login, confirms email, does not queue worker' do - expect(response) - .to redirect_to(new_user_session_path) - expect(user.reload.unconfirmed_email) - .to be_nil - expect(BootstrapTimelineWorker) - .to_not have_received(:perform_async) - end - end - end -end diff --git a/spec/requests/auth/confirmations_spec.rb b/spec/requests/auth/confirmations_spec.rb new file mode 100644 index 0000000000..09633a4119 --- /dev/null +++ b/spec/requests/auth/confirmations_spec.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Auth Confirmation' do + describe 'GET /auth/confirmation/new' do + it 'returns http success' do + get new_user_confirmation_path + + expect(response) + .to have_http_status(200) + end + end + + describe 'GET /auth/confirmation' do + context 'when user is unconfirmed' do + let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil) } + + it 'redirects to login and queues worker' do + get user_confirmation_path(confirmation_token: 'foobar') + + expect(response) + .to redirect_to(new_user_session_path) + expect(BootstrapTimelineWorker) + .to have_enqueued_sidekiq_job(user.account_id) + end + end + + context 'when user is unconfirmed and unapproved' do + let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil, approved: false) } + + it 'redirects to login and confirms user' do + expect { get user_confirmation_path(confirmation_token: 'foobar') } + .to change { user.reload.confirmed_at }.to(be_present) + + expect(response) + .to redirect_to(new_user_session_path) + end + end + + context 'when user is already confirmed' do + let!(:user) { Fabricate(:user) } + + before { sign_in(user) } + + it 'redirects to root path' do + get user_confirmation_path(confirmation_token: 'foobar') + + expect(response) + .to redirect_to(root_path) + end + end + + context 'when user is already confirmed but unapproved' do + let!(:user) { Fabricate(:user, approved: false) } + + before do + user.approved = false + user.save! + sign_in(user, scope: :user) + end + + it 'redirects to settings' do + get user_confirmation_path(confirmation_token: 'foobar') + + expect(response) + .to redirect_to(edit_user_registration_path) + end + end + + context 'when user is updating email' do + let!(:user) { Fabricate(:user, confirmation_token: 'foobar', unconfirmed_email: 'new-email@example.com') } + + it 'redirects to login, confirms email, does not queue worker' do + expect { get user_confirmation_path(confirmation_token: 'foobar') } + .to change { user.reload.unconfirmed_email }.to(be_nil) + + expect(response) + .to redirect_to(new_user_session_path) + expect(BootstrapTimelineWorker) + .to_not have_enqueued_sidekiq_job + end + end + end +end From 8ebe2e673e2fd175140df7275eb362c8eecfec31 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Wed, 4 Feb 2026 18:45:41 +0100 Subject: [PATCH 5/5] Split collection editor into dedicated routes (#37731) --- .../mastodon/api_types/collections.ts | 3 +- .../mastodon/components/form_fields/index.ts | 2 + .../mastodon/features/collections/editor.tsx | 268 ------------------ .../features/collections/editor/accounts.tsx | 67 +++++ .../features/collections/editor/details.tsx | 172 +++++++++++ .../features/collections/editor/index.tsx | 135 +++++++++ .../features/collections/editor/settings.tsx | 197 +++++++++++++ .../features/collections/editor/state.ts | 41 +++ .../collections/editor/styles.module.scss | 15 + .../collections/editor/wizard_step_header.tsx | 23 ++ .../mastodon/features/collections/index.tsx | 35 ++- app/javascript/mastodon/features/ui/index.jsx | 5 +- app/javascript/mastodon/locales/en.json | 19 +- 13 files changed, 699 insertions(+), 283 deletions(-) delete mode 100644 app/javascript/mastodon/features/collections/editor.tsx create mode 100644 app/javascript/mastodon/features/collections/editor/accounts.tsx create mode 100644 app/javascript/mastodon/features/collections/editor/details.tsx create mode 100644 app/javascript/mastodon/features/collections/editor/index.tsx create mode 100644 app/javascript/mastodon/features/collections/editor/settings.tsx create mode 100644 app/javascript/mastodon/features/collections/editor/state.ts create mode 100644 app/javascript/mastodon/features/collections/editor/styles.module.scss create mode 100644 app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx diff --git a/app/javascript/mastodon/api_types/collections.ts b/app/javascript/mastodon/api_types/collections.ts index c1a17b5dc2..cded45f1a3 100644 --- a/app/javascript/mastodon/api_types/collections.ts +++ b/app/javascript/mastodon/api_types/collections.ts @@ -70,7 +70,8 @@ type CommonPayloadFields = Pick< ApiCollectionJSON, 'name' | 'description' | 'sensitive' | 'discoverable' > & { - tag_name?: string; + tag_name?: string | null; + language?: ApiCollectionJSON['language']; }; export interface ApiUpdateCollectionPayload extends Partial { diff --git a/app/javascript/mastodon/components/form_fields/index.ts b/app/javascript/mastodon/components/form_fields/index.ts index f87626cb65..e44525e383 100644 --- a/app/javascript/mastodon/components/form_fields/index.ts +++ b/app/javascript/mastodon/components/form_fields/index.ts @@ -1,6 +1,8 @@ export { FormStack } from './form_stack'; +export { Fieldset } from './fieldset'; export { TextInputField, TextInput } from './text_input_field'; export { TextAreaField, TextArea } from './text_area_field'; export { CheckboxField, Checkbox } from './checkbox_field'; +export { RadioButtonField, RadioButton } from './radio_button_field'; export { ToggleField, Toggle } from './toggle_field'; export { SelectField, Select } from './select_field'; diff --git a/app/javascript/mastodon/features/collections/editor.tsx b/app/javascript/mastodon/features/collections/editor.tsx deleted file mode 100644 index af301e121c..0000000000 --- a/app/javascript/mastodon/features/collections/editor.tsx +++ /dev/null @@ -1,268 +0,0 @@ -import { useCallback, useState, useEffect } from 'react'; - -import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; - -import { Helmet } from 'react-helmet'; -import { useParams, useHistory } from 'react-router-dom'; - -import { isFulfilled } from '@reduxjs/toolkit'; - -import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; -import type { - ApiCollectionJSON, - ApiCreateCollectionPayload, - ApiUpdateCollectionPayload, -} from 'mastodon/api_types/collections'; -import { Button } from 'mastodon/components/button'; -import { Column } from 'mastodon/components/column'; -import { ColumnHeader } from 'mastodon/components/column_header'; -import { - CheckboxField, - FormStack, - TextAreaField, -} from 'mastodon/components/form_fields'; -import { TextInputField } from 'mastodon/components/form_fields/text_input_field'; -import { LoadingIndicator } from 'mastodon/components/loading_indicator'; -import { - createCollection, - fetchCollection, - updateCollection, -} from 'mastodon/reducers/slices/collections'; -import { useAppDispatch, useAppSelector } from 'mastodon/store'; - -const messages = defineMessages({ - edit: { id: 'column.edit_collection', defaultMessage: 'Edit collection' }, - create: { - id: 'column.create_collection', - defaultMessage: 'Create collection', - }, -}); - -const CollectionSettings: React.FC<{ - collection?: ApiCollectionJSON | null; -}> = ({ collection }) => { - const dispatch = useAppDispatch(); - const history = useHistory(); - - const { - id, - name: initialName = '', - description: initialDescription = '', - tag, - discoverable: initialDiscoverable = true, - sensitive: initialSensitive = false, - } = collection ?? {}; - - const [name, setName] = useState(initialName); - const [description, setDescription] = useState(initialDescription); - const [topic, setTopic] = useState(tag?.name ?? ''); - const [discoverable] = useState(initialDiscoverable); - const [sensitive, setSensitive] = useState(initialSensitive); - - const handleNameChange = useCallback( - (event: React.ChangeEvent) => { - setName(event.target.value); - }, - [], - ); - - const handleDescriptionChange = useCallback( - (event: React.ChangeEvent) => { - setDescription(event.target.value); - }, - [], - ); - - const handleTopicChange = useCallback( - (event: React.ChangeEvent) => { - setTopic(event.target.value); - }, - [], - ); - - const handleSensitiveChange = useCallback( - (event: React.ChangeEvent) => { - setSensitive(event.target.checked); - }, - [], - ); - - const handleSubmit = useCallback( - (e: React.FormEvent) => { - e.preventDefault(); - - if (id) { - const payload: ApiUpdateCollectionPayload = { - id, - name, - description, - tag_name: topic, - discoverable, - sensitive, - }; - - void dispatch(updateCollection({ payload })).then(() => { - history.push(`/collections`); - }); - } else { - const payload: ApiCreateCollectionPayload = { - name, - description, - discoverable, - sensitive, - }; - if (topic) { - payload.tag_name = topic; - } - - void dispatch( - createCollection({ - payload, - }), - ).then((result) => { - if (isFulfilled(result)) { - history.replace( - `/collections/${result.payload.collection.id}/edit`, - ); - history.push(`/collections`); - } - }); - } - }, - [id, dispatch, name, description, topic, discoverable, sensitive, history], - ); - - return ( - - - } - hint={ - - } - value={name} - onChange={handleNameChange} - maxLength={40} - /> - - - } - hint={ - - } - value={description} - onChange={handleDescriptionChange} - maxLength={100} - /> - - - } - hint={ - - } - value={topic} - onChange={handleTopicChange} - maxLength={40} - /> - - - } - hint={ - - } - checked={sensitive} - onChange={handleSensitiveChange} - /> - -
- -
-
- ); -}; - -export const CollectionEditorPage: React.FC<{ - multiColumn?: boolean; -}> = ({ multiColumn }) => { - const intl = useIntl(); - const dispatch = useAppDispatch(); - const { id } = useParams<{ id?: string }>(); - const collection = useAppSelector((state) => - id ? state.collections.collections[id] : undefined, - ); - const isEditMode = !!id; - const isLoading = isEditMode && !collection; - - useEffect(() => { - if (id) { - void dispatch(fetchCollection({ collectionId: id })); - } - }, [dispatch, id]); - - const pageTitle = intl.formatMessage(id ? messages.edit : messages.create); - - return ( - - - -
- {isLoading ? ( - - ) : ( - - )} -
- - - {pageTitle} - - -
- ); -}; diff --git a/app/javascript/mastodon/features/collections/editor/accounts.tsx b/app/javascript/mastodon/features/collections/editor/accounts.tsx new file mode 100644 index 0000000000..7e78874765 --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/accounts.tsx @@ -0,0 +1,67 @@ +import { useCallback } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { useHistory, useLocation } from 'react-router-dom'; + +import type { ApiCollectionJSON } from 'mastodon/api_types/collections'; +import { Button } from 'mastodon/components/button'; +import { FormStack } from 'mastodon/components/form_fields'; + +import type { TempCollectionState } from './state'; +import { getInitialState } from './state'; +import { WizardStepHeader } from './wizard_step_header'; + +export const CollectionAccounts: React.FC<{ + collection?: ApiCollectionJSON | null; +}> = ({ collection }) => { + const history = useHistory(); + const location = useLocation(); + + const { id } = getInitialState(collection, location.state); + + const handleSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + + if (!id) { + history.push(`/collections/new/details`); + } + }, + [id, history], + ); + + return ( + + {!id && ( + + } + description={ + + } + /> + )} +
+ +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/collections/editor/details.tsx b/app/javascript/mastodon/features/collections/editor/details.tsx new file mode 100644 index 0000000000..65c00b5f26 --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/details.tsx @@ -0,0 +1,172 @@ +import { useCallback, useState } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { useHistory, useLocation } from 'react-router-dom'; + +import type { + ApiCollectionJSON, + ApiCreateCollectionPayload, + ApiUpdateCollectionPayload, +} from 'mastodon/api_types/collections'; +import { Button } from 'mastodon/components/button'; +import { FormStack, TextAreaField } from 'mastodon/components/form_fields'; +import { TextInputField } from 'mastodon/components/form_fields/text_input_field'; +import { updateCollection } from 'mastodon/reducers/slices/collections'; +import { useAppDispatch } from 'mastodon/store'; + +import type { TempCollectionState } from './state'; +import { getInitialState } from './state'; +import { WizardStepHeader } from './wizard_step_header'; + +export const CollectionDetails: React.FC<{ + collection?: ApiCollectionJSON | null; +}> = ({ collection }) => { + const dispatch = useAppDispatch(); + const history = useHistory(); + const location = useLocation(); + + const { id, initialName, initialDescription, initialTopic } = getInitialState( + collection, + location.state, + ); + + const [name, setName] = useState(initialName); + const [description, setDescription] = useState(initialDescription); + const [topic, setTopic] = useState(initialTopic); + + const handleNameChange = useCallback( + (event: React.ChangeEvent) => { + setName(event.target.value); + }, + [], + ); + + const handleDescriptionChange = useCallback( + (event: React.ChangeEvent) => { + setDescription(event.target.value); + }, + [], + ); + + const handleTopicChange = useCallback( + (event: React.ChangeEvent) => { + setTopic(event.target.value); + }, + [], + ); + + const handleSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + + if (id) { + const payload: ApiUpdateCollectionPayload = { + id, + name, + description, + tag_name: topic || null, + }; + + void dispatch(updateCollection({ payload })).then(() => { + history.push(`/collections`); + }); + } else { + const payload: Partial = { + name, + description, + tag_name: topic || null, + }; + + history.replace('/collections/new', payload); + history.push('/collections/new/settings', payload); + } + }, + [id, dispatch, name, description, topic, history], + ); + + return ( + + {!id && ( + + } + /> + )} + + } + hint={ + + } + value={name} + onChange={handleNameChange} + maxLength={40} + /> + + + } + hint={ + + } + value={description} + onChange={handleDescriptionChange} + maxLength={100} + /> + + + } + hint={ + + } + value={topic} + onChange={handleTopicChange} + maxLength={40} + /> + +
+ +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/collections/editor/index.tsx b/app/javascript/mastodon/features/collections/editor/index.tsx new file mode 100644 index 0000000000..ad378e3a43 --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/index.tsx @@ -0,0 +1,135 @@ +import { useEffect } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { Helmet } from 'react-helmet'; +import { + Switch, + Route, + useParams, + useRouteMatch, + matchPath, + useLocation, +} from 'react-router-dom'; + +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import { Column } from 'mastodon/components/column'; +import { ColumnHeader } from 'mastodon/components/column_header'; +import { LoadingIndicator } from 'mastodon/components/loading_indicator'; +import { fetchCollection } from 'mastodon/reducers/slices/collections'; +import { useAppDispatch, useAppSelector } from 'mastodon/store'; + +import { CollectionAccounts } from './accounts'; +import { CollectionDetails } from './details'; +import { CollectionSettings } from './settings'; + +export const messages = defineMessages({ + create: { + id: 'collections.create_collection', + defaultMessage: 'Create collection', + }, + newCollection: { + id: 'collections.new_collection', + defaultMessage: 'New collection', + }, + editDetails: { + id: 'collections.edit_details', + defaultMessage: 'Edit basic details', + }, + manageAccounts: { + id: 'collections.manage_accounts', + defaultMessage: 'Manage accounts', + }, + manageAccountsLong: { + id: 'collections.manage_accounts_in_collection', + defaultMessage: 'Manage accounts in this collection', + }, + editSettings: { + id: 'collections.edit_settings', + defaultMessage: 'Edit settings', + }, +}); + +function usePageTitle(id: string | undefined) { + const { path } = useRouteMatch(); + const location = useLocation(); + + if (!id) { + return messages.newCollection; + } + + if (matchPath(location.pathname, { path, exact: true })) { + return messages.manageAccounts; + } else if (matchPath(location.pathname, { path: `${path}/details` })) { + return messages.editDetails; + } else if (matchPath(location.pathname, { path: `${path}/settings` })) { + return messages.editSettings; + } else { + throw new Error('No page title defined for route'); + } +} + +export const CollectionEditorPage: React.FC<{ + multiColumn?: boolean; +}> = ({ multiColumn }) => { + const intl = useIntl(); + const dispatch = useAppDispatch(); + const { id } = useParams<{ id?: string }>(); + const { path } = useRouteMatch(); + const collection = useAppSelector((state) => + id ? state.collections.collections[id] : undefined, + ); + const isEditMode = !!id; + const isLoading = isEditMode && !collection; + + useEffect(() => { + if (id) { + void dispatch(fetchCollection({ collectionId: id })); + } + }, [dispatch, id]); + + const pageTitle = intl.formatMessage(usePageTitle(id)); + + return ( + + + +
+ {isLoading ? ( + + ) : ( + + } + /> + } + /> + } + /> + + )} +
+ + + {pageTitle} + + +
+ ); +}; diff --git a/app/javascript/mastodon/features/collections/editor/settings.tsx b/app/javascript/mastodon/features/collections/editor/settings.tsx new file mode 100644 index 0000000000..22e96448f4 --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/settings.tsx @@ -0,0 +1,197 @@ +import { useCallback, useState } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { useHistory, useLocation } from 'react-router-dom'; + +import { isFulfilled } from '@reduxjs/toolkit'; + +import type { + ApiCollectionJSON, + ApiCreateCollectionPayload, + ApiUpdateCollectionPayload, +} from 'mastodon/api_types/collections'; +import { Button } from 'mastodon/components/button'; +import { + Fieldset, + FormStack, + CheckboxField, + RadioButtonField, +} from 'mastodon/components/form_fields'; +import { + createCollection, + updateCollection, +} from 'mastodon/reducers/slices/collections'; +import { useAppDispatch } from 'mastodon/store'; + +import type { TempCollectionState } from './state'; +import { getInitialState } from './state'; +import { WizardStepHeader } from './wizard_step_header'; + +export const CollectionSettings: React.FC<{ + collection?: ApiCollectionJSON | null; +}> = ({ collection }) => { + const dispatch = useAppDispatch(); + const history = useHistory(); + const location = useLocation(); + + const { id, initialDiscoverable, initialSensitive, ...temporaryState } = + getInitialState(collection, location.state); + + const [discoverable, setDiscoverable] = useState(initialDiscoverable); + const [sensitive, setSensitive] = useState(initialSensitive); + + const handleDiscoverableChange = useCallback( + (event: React.ChangeEvent) => { + setDiscoverable(event.target.value === 'public'); + }, + [], + ); + + const handleSensitiveChange = useCallback( + (event: React.ChangeEvent) => { + setSensitive(event.target.checked); + }, + [], + ); + + const handleSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + + if (id) { + const payload: ApiUpdateCollectionPayload = { + id, + discoverable, + sensitive, + }; + + void dispatch(updateCollection({ payload })).then(() => { + history.push(`/collections`); + }); + } else { + const payload: ApiCreateCollectionPayload = { + name: temporaryState.initialName, + description: temporaryState.initialDescription, + discoverable, + sensitive, + }; + if (temporaryState.initialTopic) { + payload.tag_name = temporaryState.initialTopic; + } + + void dispatch( + createCollection({ + payload, + }), + ).then((result) => { + if (isFulfilled(result)) { + history.replace( + `/collections/${result.payload.collection.id}/edit/settings`, + ); + history.push(`/collections`); + } + }); + } + }, + [id, discoverable, sensitive, dispatch, history, temporaryState], + ); + + return ( + + {!id && ( + + } + /> + )} +
+ } + > + + } + hint={ + + } + value='public' + checked={discoverable} + onChange={handleDiscoverableChange} + /> + + } + hint={ + + } + value='unlisted' + checked={!discoverable} + onChange={handleDiscoverableChange} + /> +
+ +
+ } + > + + } + hint={ + + } + checked={sensitive} + onChange={handleSensitiveChange} + /> +
+ +
+ +
+
+ ); +}; diff --git a/app/javascript/mastodon/features/collections/editor/state.ts b/app/javascript/mastodon/features/collections/editor/state.ts new file mode 100644 index 0000000000..1856677651 --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/state.ts @@ -0,0 +1,41 @@ +import type { + ApiCollectionJSON, + ApiCreateCollectionPayload, +} from '@/mastodon/api_types/collections'; + +/** + * Temporary editor state across creation steps, + * kept in location state + */ +export type TempCollectionState = + | Partial + | undefined; + +/** + * Resolve initial editor state. Temporary location state + * trumps stored data, otherwise initial values are returned. + */ +export function getInitialState( + collection: ApiCollectionJSON | null | undefined, + locationState: TempCollectionState, +) { + const { + id, + name = '', + description = '', + tag, + language = '', + discoverable = true, + sensitive = false, + } = collection ?? {}; + + return { + id, + initialName: locationState?.name ?? name, + initialDescription: locationState?.description ?? description, + initialTopic: locationState?.tag_name ?? tag?.name ?? '', + initialLanguage: locationState?.language ?? language, + initialDiscoverable: locationState?.discoverable ?? discoverable, + initialSensitive: locationState?.sensitive ?? sensitive, + }; +} diff --git a/app/javascript/mastodon/features/collections/editor/styles.module.scss b/app/javascript/mastodon/features/collections/editor/styles.module.scss new file mode 100644 index 0000000000..5dc942659b --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/styles.module.scss @@ -0,0 +1,15 @@ +.step { + font-size: 13px; + color: var(--color-text-secondary); +} + +.title { + font-size: 22px; + line-height: 1.2; + margin-top: 4px; +} + +.description { + font-size: 15px; + margin-top: 8px; +} diff --git a/app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx b/app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx new file mode 100644 index 0000000000..dcf0ed4a3f --- /dev/null +++ b/app/javascript/mastodon/features/collections/editor/wizard_step_header.tsx @@ -0,0 +1,23 @@ +import { FormattedMessage } from 'react-intl'; + +import classes from './styles.module.scss'; + +export const WizardStepHeader: React.FC<{ + step: number; + title: React.ReactElement; + description?: React.ReactElement; +}> = ({ step, title, description }) => { + return ( +
+ + {(content) =>

{content}

} +
+

{title}

+ {!!description &&

{description}

} +
+ ); +}; diff --git a/app/javascript/mastodon/features/collections/index.tsx b/app/javascript/mastodon/features/collections/index.tsx index bd1c4f790b..0a587aedf4 100644 --- a/app/javascript/mastodon/features/collections/index.tsx +++ b/app/javascript/mastodon/features/collections/index.tsx @@ -21,12 +21,10 @@ import { } from 'mastodon/reducers/slices/collections'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; +import { messages as editorMessages } from './editor'; + const messages = defineMessages({ heading: { id: 'column.collections', defaultMessage: 'My collections' }, - create: { - id: 'collections.create_collection', - defaultMessage: 'Create collection', - }, view: { id: 'collections.view_collection', defaultMessage: 'View collection', @@ -60,14 +58,35 @@ const ListItem: React.FC<{ const menu = useMemo( () => [ { text: intl.formatMessage(messages.view), to: `/collections/${id}` }, - { text: intl.formatMessage(messages.delete), action: handleDeleteClick }, + null, + { + text: intl.formatMessage(editorMessages.manageAccounts), + to: `/collections/${id}/edit`, + }, + { + text: intl.formatMessage(editorMessages.editDetails), + to: `/collections/${id}/edit/details`, + }, + { + text: intl.formatMessage(editorMessages.editSettings), + to: `/collections/${id}/edit/settings`, + }, + null, + { + text: intl.formatMessage(messages.delete), + action: handleDeleteClick, + dangerous: true, + }, ], [intl, id, handleDeleteClick], ); return (
- + {name} @@ -132,8 +151,8 @@ export const Collections: React.FC<{ diff --git a/app/javascript/mastodon/features/ui/index.jsx b/app/javascript/mastodon/features/ui/index.jsx index 5ba78f599a..abe09e81a4 100644 --- a/app/javascript/mastodon/features/ui/index.jsx +++ b/app/javascript/mastodon/features/ui/index.jsx @@ -231,10 +231,7 @@ class SwitchingColumnsArea extends PureComponent { {areCollectionsEnabled() && - - } - {areCollectionsEnabled() && - + } {areCollectionsEnabled() && diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index b722b21898..e89efa84d5 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -236,28 +236,43 @@ "collections.collection_description": "Description", "collections.collection_name": "Name", "collections.collection_topic": "Topic", + "collections.content_warning": "Content warning", + "collections.continue": "Continue", + "collections.create.accounts_subtitle": "Only accounts you follow who have opted into discovery can be added.", + "collections.create.accounts_title": "Who will you feature in this collection?", + "collections.create.basic_details_title": "Basic details", + "collections.create.settings_title": "Settings", + "collections.create.steps": "Step {step}/{total}", "collections.create_a_collection_hint": "Create a collection to recommend or share your favourite accounts with others.", "collections.create_collection": "Create collection", "collections.delete_collection": "Delete collection", "collections.description_length_hint": "100 characters limit", + "collections.edit_details": "Edit basic details", + "collections.edit_settings": "Edit settings", "collections.error_loading_collections": "There was an error when trying to load your collections.", + "collections.manage_accounts": "Manage accounts", + "collections.manage_accounts_in_collection": "Manage accounts in this collection", "collections.mark_as_sensitive": "Mark as sensitive", "collections.mark_as_sensitive_hint": "Hides the collection's description and accounts behind a content warning. The collection name will still be visible.", "collections.name_length_hint": "100 characters limit", + "collections.new_collection": "New collection", "collections.no_collections_yet": "No collections yet.", "collections.topic_hint": "Add a hashtag that helps others understand the main topic of this collection.", "collections.view_collection": "View collection", + "collections.visibility_public": "Public", + "collections.visibility_public_hint": "Discoverable in search results and other areas where recommendations appear.", + "collections.visibility_title": "Visibility", + "collections.visibility_unlisted": "Unlisted", + "collections.visibility_unlisted_hint": "Visible to anyone with a link. Hidden from search results and recommendations.", "column.about": "About", "column.blocks": "Blocked users", "column.bookmarks": "Bookmarks", "column.collections": "My collections", "column.community": "Local timeline", - "column.create_collection": "Create collection", "column.create_list": "Create list", "column.direct": "Private mentions", "column.directory": "Browse profiles", "column.domain_blocks": "Blocked domains", - "column.edit_collection": "Edit collection", "column.edit_list": "Edit list", "column.favourites": "Favorites", "column.firehose": "Live feeds",