diff --git a/CHANGELOG.md b/CHANGELOG.md index b706b8ac47ef78..f30b502ad144cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,17 +2,18 @@ All notable changes to this project will be documented in this file. -## [4.5.0] - UNRELEASED +## [4.5.0] - 2025-11-06 ### Added -- **Add support for allowing and authoring quotes** (#35355, #35578, #35614, #35618, #35624, #35626, #35652, #35629, #35665, #35653, #35670, #35677, #35690, #35697, #35689, #35699, #35700, #35701, #35709, #35714, #35713, #35715, #35725, #35749, #35769, #35780, #35762, #35804, #35808, #35805, #35819, #35824, #35828, #35822, #35835, #35865, #35860, #35832, #35891, #35894, #35895, #35820, #35917, #35924, #35925, #35914, #35930, #35941, #35939, #35948, #35955, #35967, #35990, #35991, #35975, #35971, #36002, #35986, #36031, #36034, #36038, #36054, #36052, #36055, #36065, #36068, #36083, #36087, #36080, #36091, #36090, #36118, #36119, #36128, #36094, #36129, #36138, #36132, #36151, #36158, #36171, #36194, #36220, #36169, #36130, #36249, #36153, #36299, #36291, #36301, #36315, #36317, #36364, #36383, #36381, #36459, #36464, #36461, #36516, #36528, #36549, #36550 and #36559 by @ChaosExAnima, @ClearlyClaire, @Lycolia, @diondiondion, and @tribela)\ +- **Add support for allowing and authoring quotes** (#35355, #35578, #35614, #35618, #35624, #35626, #35652, #35629, #35665, #35653, #35670, #35677, #35690, #35697, #35689, #35699, #35700, #35701, #35709, #35714, #35713, #35715, #35725, #35749, #35769, #35780, #35762, #35804, #35808, #35805, #35819, #35824, #35828, #35822, #35835, #35865, #35860, #35832, #35891, #35894, #35895, #35820, #35917, #35924, #35925, #35914, #35930, #35941, #35939, #35948, #35955, #35967, #35990, #35991, #35975, #35971, #36002, #35986, #36031, #36034, #36038, #36054, #36052, #36055, #36065, #36068, #36083, #36087, #36080, #36091, #36090, #36118, #36119, #36128, #36094, #36129, #36138, #36132, #36151, #36158, #36171, #36194, #36220, #36169, #36130, #36249, #36153, #36299, #36291, #36301, #36315, #36317, #36364, #36383, #36381, #36459, #36464, #36461, #36516, #36528, #36549, #36550, #36559, #36693, #36704, #36690, #36689, #36696, #36721, #36695 and #36736 by @ChaosExAnima, @ClearlyClaire, @Lycolia, @diondiondion, and @tribela)\ This includes a revamp of the composer interface.\ See https://blog.joinmastodon.org/2025/09/introducing-quote-posts/ for a user-centric overview of the feature, and https://docs.joinmastodon.org/client/quotes/ for API documentation. - **Add support for fetching and refreshing replies to the web UI** (#35210, #35496, #35575, #35500, #35577, #35602, #35603, #35654, #36141, #36237, #36172, #36256, #36271, #36334, #36382, #36239, #36484, #36481, #36583, #36627 and #36547 by @ClearlyClaire, @diondiondion, @Gargron and @renchap) - **Add ability to block words in usernames** (#35407, #35655, and #35806 by @ClearlyClaire and @Gargron) -- Add ability to individually disable local or remote feeds for visitors or logged-in users `disabled` value to server setting for live and topic feeds, as well as user permission to bypass that (#36338, #36467, #36497, #36563, #36577, #36585, and #36607 by @ClearlyClaire)\ - This splits the `timeline_preview` setting into four more granular settings controlling live feeds and topic (hashtag, trending link) feeds, with 3 values each: `public`, `authenticated`, `disabled`.\ +- Add ability to individually disable local or remote feeds for visitors or logged-in users `disabled` value to server setting for live and topic feeds, as well as user permission to bypass that (#36338, #36467, #36497, #36563, #36577, #36585, #36607 and #36703 by @ClearlyClaire)\ + This splits the `timeline_preview` setting into four more granular settings controlling live feeds and topic (hashtag, trending link) feeds.\ + The setting for local topic feeds has 2 values: `public` and `authenticated`. Every other setting has 3 values: `public`, `authenticated`, `disabled`.\ When `disabled`, users with the “View live and topic feeds” will still be able to view them. - Add support for displaying of quote posts in Moderator UI (#35964 by @ThisIsMissEm) - Add support for displaying link previews for Admin UI (#35958 by @ThisIsMissEm) @@ -20,21 +21,22 @@ All notable changes to this project will be documented in this file. - Add support for `Update` activities on converted object types (#36322 by @ClearlyClaire) - Add support for dynamic viewport height (#36272 by @e1berd) - Add support for numeric-based URIs for new local accounts (#32724, #36304, #36316, and #36365 by @ClearlyClaire) +- Add default visualizer for audio upload without poster (#36734 by @ChaosExAnima) - Add Traditional Mongolian to posting languages (#36196 by @shimon1024) - Add example post with manual quote approval policy to `dev:populate_sample_data` (#36099 by @ClearlyClaire) - Add server-side support for handling posts with a quote policy allowing followers to quote (#36093 and #36127 by @ClearlyClaire) - Add schema.org markup to SEO-enabled posts (#36075 by @Gargron) - Add migration to fill unset default quote policy based on default post privacy (#36041 by @ClearlyClaire) +- Add “Posting defaults” setting page, moving existing settings from “Other” (#35896, #36033, #35966, #35969, and #36084 by @ClearlyClaire and @diondiondion) +- Added emoji from Twemoji v16 (#36501 and #36530 by @ChaosExAnima) +- Add feature to select custom emoji rendering (#35229, #35282, #35253, #35424, #35473, #35483, #35505, #35568, #35605, #35659, #35664, #35739, #35985, #36051, #36071, #36137, #36165, #36248, #36262, #36275, #36293, #36341, #36342, #36366, #36377, #36378, #36385, #36393, #36397, #36403, #36413, #36410, #36454, #36402, #36503, #36502, #36532, #36603, #36409, #36638 and #36750 by @ChaosExAnima, @ClearlyClaire and @braddunbar)\ + This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places. - Add support for exposing conversation context for new public conversations according to FEP-7888 (#35959 and #36064 by @ClearlyClaire and @jesseplusplus) - Add digest re-check before removing followers in synchronization mechanism (#34273 by @ClearlyClaire) -- Add “Posting defaults” setting page, moving existing settings from “Other” (#35896, #36033, #35966, #35969, and #36084 by @ClearlyClaire and @diondiondion) - Add support for displaying Valkey version on admin dashboard (#35785 by @ykzts) - Add delivery failure tracking and handling to FASP jobs (#35625, #35628, and #35723 by @oneiros) - Add example of quote post with a preview card to development sample data (#35616 by @ClearlyClaire) - Add second set of blocked text that applies to accounts regardless of account age for spam-blocking (#35563 by @ClearlyClaire) -- Added emoji from Twemoji v16 (#36501 and #36530 by @ChaosExAnima) -- Add feature to select custom emoji rendering (#35229, #35282, #35253, #35424, #35473, #35483, #35505, #35568, #35605, #35659, #35664, #35739, #35985, #36051, #36071, #36137, #36165, #36248, #36262, #36275, #36293, #36341, #36342, #36366, #36377, #36378, #36385, #36393, #36397, #36403, #36413, #36410, #36454, #36402, #36503, #36502, #36532, #36603, #36409 and #36638 by @ChaosExAnima, @ClearlyClaire and @braddunbar)\ - This also completely reworks the processing and rendering of emojis and server-rendered HTML in statuses and other places. ### Changed @@ -43,6 +45,9 @@ All notable changes to this project will be documented in this file. - Change appearance settings to introduce new Advanced settings section (#36496 and #36506 by @diondiondion) - Change display of blocked and muted quoted users (#36619 by @ClearlyClaire)\ This adds `blocked_account`, `blocked_domain` and `muted_account` values to the `state` attribute of `Quote` and `ShallowQuote` REST API entities. +- Change submitting an empty post to show an error rather than failing silently (#36650 by @diondiondion) +- Change "Privacy and reach" settings from "Public profile" to their own top-level category (#27294 by @ChaelCodes) +- Change number of times quote verification is retried to better deal with temporary failures (#36698 by @ClearlyClaire) - Change display of content warnings in Admin UI (#35935 by @ThisIsMissEm) - Change styling of column banners (#36531 by @ClearlyClaire) - Change recommended Node version to 24 (LTS) (#36539 by @renchap) @@ -70,9 +75,11 @@ All notable changes to this project will be documented in this file. - Fix relationship not being fetched to evaluate whether to show a quote post (#36517 by @ClearlyClaire) - Fix rendering of poll options in status history modal (#35633 by @ThisIsMissEm) - Fix “mute” button being displayed to unauthenticated visitors in hashtag dropdown (#36353 by @mkljczk) +- Fix initially selected language in Rules panel, hide selector when no alternative translations exist (#36672 by @diondiondion) - Fix URL comparison for mentions in case of empty path (#36613 and #36626 by @ClearlyClaire) - Fix hashtags not being picked up when full-width hash sign is used (#36103 and #36625 by @ClearlyClaire and @Gargron) - Fix layout of severed relationships when purged events are listed (#36593 by @mejofi) +- Fix Skeleton placeholders being animated when setting to reduce animations is enabled (#36716 by @ClearlyClaire) - Fix vacuum tasks being interrupted by a single batch failure (#36606 by @Gargron) - Fix handling of unreachable network error for search services (#36587 by @mjankowski) - Fix bookmarks export when a bookmarked status is soft-deleted (#36576 by @ClearlyClaire) diff --git a/Dockerfile b/Dockerfile index 1c9c956b72c92f..c64d529918d0b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -183,7 +183,7 @@ FROM build AS libvips # libvips version to compile, change with [--build-arg VIPS_VERSION="8.15.2"] # renovate: datasource=github-releases depName=libvips packageName=libvips/libvips -ARG VIPS_VERSION=8.17.2 +ARG VIPS_VERSION=8.17.3 # libvips download URL, change with [--build-arg VIPS_URL="https://github.com/libvips/libvips/releases/download"] ARG VIPS_URL=https://github.com/libvips/libvips/releases/download diff --git a/Gemfile.lock b/Gemfile.lock index 2a0da53d4bf754..417b89ffae8d93 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -128,7 +128,7 @@ GEM blurhash (0.1.8) bootsnap (1.18.6) msgpack (~> 1.2) - brakeman (7.0.2) + brakeman (7.1.1) racc browser (6.2.0) builder (3.3.0) @@ -224,7 +224,7 @@ GEM mail (~> 2.7) email_validator (2.2.4) activemodel - erb (5.1.1) + erb (5.1.3) erubi (1.13.1) et-orbi (1.4.0) tzinfo @@ -337,7 +337,7 @@ GEM activesupport (>= 3.0) nokogiri (>= 1.6) io-console (0.8.1) - irb (1.15.2) + irb (1.15.3) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) @@ -621,7 +621,7 @@ GEM activesupport (>= 3.0.0) raabro (1.4.0) racc (1.8.1) - rack (3.2.3) + rack (3.2.4) rack-attack (6.8.0) rack (>= 1.0, < 4) rack-cors (3.0.0) @@ -691,7 +691,7 @@ GEM readline (~> 0.0) rdf-normalize (0.7.0) rdf (~> 3.3) - rdoc (6.15.0) + rdoc (6.15.1) erb psych (>= 4.0.0) tsort @@ -791,7 +791,7 @@ GEM ruby-vips (2.2.5) ffi (~> 1.12) logger - rubyzip (3.2.1) + rubyzip (3.2.2) rufus-scheduler (3.9.2) fugit (~> 1.1, >= 1.11.1) safety_net_attestation (0.5.0) @@ -805,7 +805,7 @@ GEM securerandom (0.4.1) shoulda-matchers (6.5.0) activesupport (>= 5.2.0) - sidekiq (8.0.8) + sidekiq (8.0.9) connection_pool (>= 2.5.0) json (>= 2.9.0) logger (>= 1.6.2) diff --git a/app/controllers/activitypub/quote_authorizations_controller.rb b/app/controllers/activitypub/quote_authorizations_controller.rb index f2f5313e1ad3c6..f4a150555084d0 100644 --- a/app/controllers/activitypub/quote_authorizations_controller.rb +++ b/app/controllers/activitypub/quote_authorizations_controller.rb @@ -9,7 +9,7 @@ class ActivityPub::QuoteAuthorizationsController < ActivityPub::BaseController before_action :set_quote_authorization def show - expires_in 30.seconds, public: true if @quote.status.distributable? && public_fetch_mode? + expires_in 30.seconds, public: true if @quote.quoted_status.distributable? && public_fetch_mode? render json: @quote, serializer: ActivityPub::QuoteAuthorizationSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' end @@ -23,7 +23,7 @@ def set_quote_authorization @quote = Quote.accepted.where(quoted_account: @account).find(params[:id]) return not_found unless @quote.status.present? && @quote.quoted_status.present? - authorize @quote.status, :show? + authorize @quote.quoted_status, :show? rescue Mastodon::NotPermittedError not_found end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 76093ad7377c29..7e6ca19267f228 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -140,11 +140,10 @@ def destroy @status = Status.where(account: current_account).find(params[:id]) authorize @status, :destroy? - json = render_to_body json: @status, serializer: REST::StatusSerializer, source_requested: true - @status.discard_with_reblogs StatusPin.find_by(status: @status)&.destroy @status.account.statuses_count = @status.account.statuses_count - 1 + json = render_to_body json: @status, serializer: REST::StatusSerializer, source_requested: true RemovalWorker.perform_async(@status.id, { 'redraft' => !truthy_param?(:delete_media) }) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 68271682b1289c..9f11f7a4d4d308 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -5,6 +5,7 @@ import { throttle } from 'lodash'; import api from 'mastodon/api'; import { browserHistory } from 'mastodon/components/router'; +import { countableText } from 'mastodon/features/compose/util/counter'; import { search as emojiSearch } from 'mastodon/features/emoji/emoji_mart_search_light'; import { tagHistory } from 'mastodon/settings'; @@ -57,9 +58,6 @@ export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT'; export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE'; export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE'; export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE'; -export const COMPOSE_MARKDOWN_CHANGE = 'COMPOSE_MARKDOWN_CHANGE'; -export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE'; -export const COMPOSE_SEARCHABILITY_CHANGE= 'COMPOSE_SEARCHABILITY_CHANGE'; export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE'; export const COMPOSE_LANGUAGE_CHANGE = 'COMPOSE_LANGUAGE_CHANGE'; @@ -79,8 +77,6 @@ export const COMPOSE_POLL_OPTION_CHANGE = 'COMPOSE_POLL_OPTION_CHANGE'; export const COMPOSE_POLL_OPTION_REMOVE = 'COMPOSE_POLL_OPTION_REMOVE'; export const COMPOSE_POLL_SETTINGS_CHANGE = 'COMPOSE_POLL_SETTINGS_CHANGE'; -export const COMPOSE_CIRCLE_CHANGE = 'COMPOSE_CIRCLE_CHANGE'; - export const INIT_MEDIA_EDIT_MODAL = 'INIT_MEDIA_EDIT_MODAL'; export const COMPOSE_CHANGE_MEDIA_DESCRIPTION = 'COMPOSE_CHANGE_MEDIA_DESCRIPTION'; @@ -97,6 +93,7 @@ const messages = defineMessages({ open: { id: 'compose.published.open', defaultMessage: 'Open' }, published: { id: 'compose.published.body', defaultMessage: 'Post published.' }, saved: { id: 'compose.saved.body', defaultMessage: 'Post saved.' }, + blankPostError: { id: 'compose.error.blank_post', defaultMessage: 'Post can\'t be blank.' }, }); export const ensureComposeIsVisible = (getState) => { @@ -208,7 +205,15 @@ export function submitCompose(successCallback) { const hasQuote = !!getState().getIn(['compose', 'quoted_status_id']); const spoiler_text = getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : ''; - if (!(status?.length || media.size !== 0 || (hasQuote && spoiler_text?.length))) { + const fulltext = `${spoiler_text ?? ''}${countableText(status ?? '')}`; + const hasText = fulltext.trim().length > 0; + + if (!(hasText || media.size !== 0 || (hasQuote && spoiler_text?.length))) { + dispatch(showAlert({ + message: messages.blankPostError, + })); + dispatch(focusCompose()); + return; } @@ -811,26 +816,6 @@ export function changeComposeSpoilerText(text) { }; } -export function changeComposeMarkdown() { - return { - type: COMPOSE_MARKDOWN_CHANGE, - }; -} - -export function changeComposeVisibility(value) { - return { - type: COMPOSE_VISIBILITY_CHANGE, - value, - }; -} - -export function changeComposeSearchability(value) { - return { - type: COMPOSE_SEARCHABILITY_CHANGE, - value, - }; -} - export function insertEmojiCompose(position, emoji, needsSpace) { return { type: COMPOSE_EMOJI_INSERT, @@ -924,10 +909,3 @@ export const changeMediaOrder = (a, b) => ({ a, b, }); - -export function changeCircle(circleId) { - return { - type: COMPOSE_CIRCLE_CHANGE, - circleId, - }; -} diff --git a/app/javascript/mastodon/actions/compose_typed.ts b/app/javascript/mastodon/actions/compose_typed.ts index 0c1f47fd9ae644..f944cef7f5dc40 100644 --- a/app/javascript/mastodon/actions/compose_typed.ts +++ b/app/javascript/mastodon/actions/compose_typed.ts @@ -13,10 +13,12 @@ import { } from 'mastodon/store/typed_functions'; import type { ApiQuotePolicy } from '../api_types/quotes'; -import type { Status } from '../models/status'; +import type { StatusSearchability } from '../api_types/statuses'; +import type { Status, StatusVisibility } from '../models/status'; +import type { RootState } from '../store'; import { showAlert } from './alerts'; -import { focusCompose } from './compose'; +import { changeCompose, focusCompose } from './compose'; import { importFetchedStatuses } from './importer'; import { openModal } from './modal'; @@ -41,6 +43,10 @@ const messages = defineMessages({ id: 'quote_error.unauthorized', defaultMessage: 'You are not authorized to quote this post.', }, + quoteErrorPrivateMention: { + id: 'quote_error.private_mentions', + defaultMessage: 'Quoting is not allowed with direct mentions.', + }, }); type SimulatedMediaAttachmentJSON = ApiMediaAttachmentJSON & { @@ -67,6 +73,51 @@ const simulateModifiedApiResponse = ( return data; }; +export const changeComposeVisibility = createAppThunk( + 'compose/visibility_change', + (visibility: StatusVisibility, { dispatch, getState }) => { + if (visibility !== 'direct') { + return visibility; + } + + const state = getState(); + const quotedStatusId = state.compose.get('quoted_status_id') as + | string + | null; + if (!quotedStatusId) { + return visibility; + } + + // Remove the quoted status + dispatch(quoteComposeCancel()); + const quotedStatus = state.statuses.get(quotedStatusId) as Status | null; + if (!quotedStatus) { + return visibility; + } + + // Append the quoted status URL to the compose text + const url = quotedStatus.get('url') as string; + const text = state.compose.get('text') as string; + if (!text.includes(url)) { + const newText = text.trim() ? `${text}\n\n${url}` : url; + dispatch(changeCompose(newText)); + } + return visibility; + }, +); + +export const changeComposeSearchability = createAppThunk( + 'compose/searchability_change', + (searchability: StatusSearchability) => searchability, +); + +export const changeComposeMarkdown = createAction('compose/markdown_change'); + +export const changeCircle = createAppThunk( + 'compose/circle_change', + (circleId: string) => circleId, +); + export const changeUploadCompose = createDataLoadingThunk( 'compose/changeUpload', async ( @@ -129,6 +180,8 @@ export const quoteComposeByStatus = createAppThunk( if (composeState.get('id')) { dispatch(showAlert({ message: messages.quoteErrorEdit })); + } else if (composeState.get('privacy') === 'direct') { + dispatch(showAlert({ message: messages.quoteErrorPrivateMention })); } else if (composeState.get('quoted_status_id')) { dispatch(showAlert({ message: messages.quoteErrorQuote })); } else if ( @@ -161,6 +214,17 @@ export const quoteComposeById = createAppThunk( }, ); +const composeStateForbidsLink = (composeState: RootState['compose']) => { + return ( + composeState.get('quoted_status_id') || + composeState.get('is_submitting') || + composeState.get('poll') || + composeState.get('is_uploading') || + composeState.get('id') || + composeState.get('privacy') === 'direct' + ); +}; + export const pasteLinkCompose = createDataLoadingThunk( 'compose/pasteLink', async ({ url }: { url: string }) => { @@ -171,15 +235,12 @@ export const pasteLinkCompose = createDataLoadingThunk( limit: 2, }); }, - (data, { dispatch, getState }) => { + (data, { dispatch, getState, requestId }) => { const composeState = getState().compose; if ( - composeState.get('quoted_status_id') || - composeState.get('is_submitting') || - composeState.get('poll') || - composeState.get('is_uploading') || - composeState.get('id') + composeStateForbidsLink(composeState) || + composeState.get('fetching_link') !== requestId // Request has been cancelled ) return; @@ -195,6 +256,17 @@ export const pasteLinkCompose = createDataLoadingThunk( dispatch(quoteComposeById(data.statuses[0].id)); } }, + { + useLoadingBar: false, + condition: (_, { getState }) => + !getState().compose.get('fetching_link') && + !composeStateForbidsLink(getState().compose), + }, +); + +// Ideally this would cancel the action and the HTTP request, but this is good enough +export const cancelPasteLinkCompose = createAction( + 'compose/cancelPasteLinkCompose', ); export const quoteComposeCancel = createAction('compose/quoteComposeCancel'); diff --git a/app/javascript/mastodon/components/carousel/carousel.stories.tsx b/app/javascript/mastodon/components/carousel/carousel.stories.tsx deleted file mode 100644 index 5117bc08e3530d..00000000000000 --- a/app/javascript/mastodon/components/carousel/carousel.stories.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import type { FC } from 'react'; - -import type { Meta, StoryObj } from '@storybook/react-vite'; -import { fn, userEvent, expect } from 'storybook/test'; - -import type { CarouselProps } from './index'; -import { Carousel } from './index'; - -interface TestSlideProps { - id: number; - text: string; - color: string; -} - -const TestSlide: FC = ({ - active, - text, - color, -}) => ( -
- {text} -
-); - -const slides: TestSlideProps[] = [ - { - id: 1, - text: 'first', - color: 'red', - }, - { - id: 2, - text: 'second', - color: 'pink', - }, - { - id: 3, - text: 'third', - color: 'orange', - }, -]; - -type StoryProps = Pick< - CarouselProps, - 'items' | 'renderItem' | 'emptyFallback' | 'onChangeSlide' ->; - -const meta = { - title: 'Components/Carousel', - args: { - items: slides, - renderItem(item, active) { - return ; - }, - onChangeSlide: fn(), - emptyFallback: 'No slides available', - }, - render(args) { - return ( - <> - - - - ); - }, - argTypes: { - emptyFallback: { - type: 'string', - }, - }, - tags: ['test'], -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - async play({ args, canvas }) { - const nextButton = await canvas.findByRole('button', { name: /next/i }); - const slides = await canvas.findAllByRole('group'); - await expect(slides).toHaveLength(slides.length); - - await userEvent.click(nextButton); - await expect(args.onChangeSlide).toHaveBeenCalledWith(1, slides[1]); - - await userEvent.click(nextButton); - await expect(args.onChangeSlide).toHaveBeenCalledWith(2, slides[2]); - - // Wrap around - await userEvent.click(nextButton); - await expect(args.onChangeSlide).toHaveBeenCalledWith(0, slides[0]); - }, -}; - -export const DifferentHeights: Story = { - args: { - items: slides.map((props, index) => ({ - ...props, - styles: { height: 100 + index * 100 }, - })), - }, -}; - -export const NoSlides: Story = { - args: { - items: [], - }, -}; diff --git a/app/javascript/mastodon/components/carousel/index.tsx b/app/javascript/mastodon/components/carousel/index.tsx deleted file mode 100644 index f2b9e9823b2ffa..00000000000000 --- a/app/javascript/mastodon/components/carousel/index.tsx +++ /dev/null @@ -1,244 +0,0 @@ -import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react'; -import type { - ComponentPropsWithoutRef, - ComponentType, - ReactElement, - ReactNode, -} from 'react'; - -import type { MessageDescriptor } from 'react-intl'; -import { defineMessages, useIntl } from 'react-intl'; - -import classNames from 'classnames'; - -import { usePrevious } from '@dnd-kit/utilities'; -import { animated, useSpring } from '@react-spring/web'; -import { useDrag } from '@use-gesture/react'; - -import type { CarouselPaginationProps } from './pagination'; -import { CarouselPagination } from './pagination'; - -import './styles.scss'; - -const defaultMessages = defineMessages({ - previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, - next: { id: 'lightbox.next', defaultMessage: 'Next' }, - current: { - id: 'carousel.current', - defaultMessage: 'Slide {current, number} / {max, number}', - }, - slide: { - id: 'carousel.slide', - defaultMessage: 'Slide {current, number} of {max, number}', - }, -}); - -export type MessageKeys = keyof typeof defaultMessages; - -export interface CarouselSlideProps { - id: string | number; -} - -export type RenderSlideFn< - SlideProps extends CarouselSlideProps = CarouselSlideProps, -> = (item: SlideProps, active: boolean, index: number) => ReactElement; - -export interface CarouselProps< - SlideProps extends CarouselSlideProps = CarouselSlideProps, -> { - items: SlideProps[]; - renderItem: RenderSlideFn; - onChangeSlide?: (index: number, ref: Element) => void; - paginationComponent?: ComponentType | null; - paginationProps?: Partial; - messages?: Record; - emptyFallback?: ReactNode; - classNamePrefix?: string; - slideClassName?: string; -} - -export const Carousel = < - SlideProps extends CarouselSlideProps = CarouselSlideProps, ->({ - items, - renderItem, - onChangeSlide, - paginationComponent: Pagination = CarouselPagination, - paginationProps = {}, - messages = defaultMessages, - children, - emptyFallback = null, - className, - classNamePrefix = 'carousel', - slideClassName, - ...wrapperProps -}: CarouselProps & ComponentPropsWithoutRef<'div'>) => { - // Handle slide change - const [slideIndex, setSlideIndex] = useState(0); - const wrapperRef = useRef(null); - const handleSlideChange = useCallback( - (direction: number) => { - setSlideIndex((prev) => { - const max = items.length - 1; - let newIndex = prev + direction; - if (newIndex < 0) { - newIndex = max; - } else if (newIndex > max) { - newIndex = 0; - } - - const slide = wrapperRef.current?.children[newIndex]; - if (slide) { - setCurrentSlideHeight(slide.scrollHeight); - onChangeSlide?.(newIndex, slide); - if (slide instanceof HTMLElement) { - slide.focus({ preventScroll: true }); - } - } - - return newIndex; - }); - }, - [items.length, onChangeSlide], - ); - - // Handle slide heights - const [currentSlideHeight, setCurrentSlideHeight] = useState( - wrapperRef.current?.scrollHeight ?? 0, - ); - const previousSlideHeight = usePrevious(currentSlideHeight); - const observerRef = useRef( - new ResizeObserver(() => { - handleSlideChange(0); - }), - ); - const wrapperStyles = useSpring({ - x: `-${slideIndex * 100}%`, - height: currentSlideHeight, - // Don't animate from zero to the height of the initial slide - immediate: !previousSlideHeight, - }); - useLayoutEffect(() => { - // Update slide height when the component mounts - if (currentSlideHeight === 0) { - handleSlideChange(0); - } - }, [currentSlideHeight, handleSlideChange]); - - // Handle swiping animations - const bind = useDrag( - ({ swipe: [swipeX] }) => { - handleSlideChange(swipeX * -1); // Invert swipe as swiping left loads the next slide. - }, - { pointer: { capture: false } }, - ); - const handlePrev = useCallback(() => { - handleSlideChange(-1); - }, [handleSlideChange]); - const handleNext = useCallback(() => { - handleSlideChange(1); - }, [handleSlideChange]); - - const intl = useIntl(); - - if (items.length === 0) { - return emptyFallback; - } - - return ( -
-
- {children} - {Pagination && items.length > 1 && ( - - )} -
- - - {items.map((itemsProps, index) => ( - - item={itemsProps} - renderItem={renderItem} - observer={observerRef.current} - index={index} - key={`slide-${itemsProps.id}`} - className={classNames(`${classNamePrefix}__slide`, slideClassName, { - active: index === slideIndex, - })} - active={index === slideIndex} - label={intl.formatMessage(messages.slide, { - current: index + 1, - max: items.length, - })} - /> - ))} - -
- ); -}; - -type CarouselSlideWrapperProps = { - observer: ResizeObserver; - className: string; - active: boolean; - item: SlideProps; - index: number; - label: string; -} & Pick, 'renderItem'>; - -const CarouselSlideWrapper = ({ - observer, - className, - active, - renderItem, - item, - index, - label, -}: CarouselSlideWrapperProps) => { - const handleRef = useCallback( - (instance: HTMLDivElement | null) => { - if (instance) { - observer.observe(instance); - } - }, - [observer], - ); - - const children = useMemo( - () => renderItem(item, active, index), - [renderItem, item, active, index], - ); - - return ( -
- {children} -
- ); -}; diff --git a/app/javascript/mastodon/components/carousel/pagination.tsx b/app/javascript/mastodon/components/carousel/pagination.tsx deleted file mode 100644 index a2666f486fe2ab..00000000000000 --- a/app/javascript/mastodon/components/carousel/pagination.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { FC, MouseEventHandler } from 'react'; - -import type { MessageDescriptor } from 'react-intl'; -import { useIntl } from 'react-intl'; - -import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; -import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; - -import { IconButton } from '../icon_button'; - -import type { MessageKeys } from './index'; - -export interface CarouselPaginationProps { - onNext: MouseEventHandler; - onPrev: MouseEventHandler; - current: number; - max: number; - className?: string; - messages: Record; -} - -export const CarouselPagination: FC = ({ - onNext, - onPrev, - current, - max, - className = '', - messages, -}) => { - const intl = useIntl(); - return ( -
- - - {intl.formatMessage(messages.current, { - current: current + 1, - max, - sr: (chunk) => {chunk}, - })} - - -
- ); -}; diff --git a/app/javascript/mastodon/components/carousel/styles.scss b/app/javascript/mastodon/components/carousel/styles.scss deleted file mode 100644 index bcd0bc7d3af76b..00000000000000 --- a/app/javascript/mastodon/components/carousel/styles.scss +++ /dev/null @@ -1,28 +0,0 @@ -.carousel { - gap: 16px; - overflow: hidden; - touch-action: pan-y; - - &__header { - padding: 8px 16px; - } - - &__pagination { - display: flex; - align-items: center; - justify-content: center; - gap: 4px; - } - - &__slides { - display: flex; - flex-wrap: nowrap; - align-items: start; - } - - &__slide { - flex: 0 0 100%; - width: 100%; - overflow: hidden; - } -} diff --git a/app/javascript/mastodon/components/featured_carousel.tsx b/app/javascript/mastodon/components/featured_carousel.tsx index c35f2f37f06354..df64c43b421836 100644 --- a/app/javascript/mastodon/components/featured_carousel.tsx +++ b/app/javascript/mastodon/components/featured_carousel.tsx @@ -1,43 +1,38 @@ -import { useCallback, useEffect, useId } from 'react'; +import type { ComponentPropsWithRef } from 'react'; +import { + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState, + useId, +} from 'react'; -import { defineMessages, FormattedMessage } from 'react-intl'; +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import type { Map as ImmutableMap } from 'immutable'; import { List as ImmutableList } from 'immutable'; +import type { AnimatedProps } from '@react-spring/web'; +import { animated, useSpring } from '@react-spring/web'; +import { useDrag } from '@use-gesture/react'; + import { expandAccountFeaturedTimeline } from '@/mastodon/actions/timelines'; import { Icon } from '@/mastodon/components/icon'; +import { IconButton } from '@/mastodon/components/icon_button'; import { StatusQuoteManager } from '@/mastodon/components/status_quoted'; -import { - createAppSelector, - useAppDispatch, - useAppSelector, -} from '@/mastodon/store'; +import { usePrevious } from '@/mastodon/hooks/usePrevious'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import PushPinIcon from '@/material-icons/400-24px/push_pin.svg?react'; -import { Carousel } from './carousel'; - -const pinnedStatusesSelector = createAppSelector( - [ - (state, accountId: string, tagged?: string) => - (state.timelines as ImmutableMap).getIn( - [`account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, 'items'], - ImmutableList(), - ) as ImmutableList, - ], - (items) => items.toArray().map((id) => ({ id })), -); - const messages = defineMessages({ - previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, - next: { id: 'lightbox.next', defaultMessage: 'Next' }, - current: { - id: 'featured_carousel.current', - defaultMessage: 'Post {current, number} / {max, number}', - }, + previous: { id: 'featured_carousel.previous', defaultMessage: 'Previous' }, + next: { id: 'featured_carousel.next', defaultMessage: 'Next' }, slide: { id: 'featured_carousel.slide', - defaultMessage: 'Post {current, number} of {max, number}', + defaultMessage: '{index} of {total}', }, }); @@ -45,6 +40,7 @@ export const FeaturedCarousel: React.FC<{ accountId: string; tagged?: string; }> = ({ accountId, tagged }) => { + const intl = useIntl(); const accessibilityId = useId(); // Load pinned statuses @@ -54,37 +50,175 @@ export const FeaturedCarousel: React.FC<{ void dispatch(expandAccountFeaturedTimeline(accountId, { tagged })); } }, [accountId, dispatch, tagged]); - const pinnedStatuses = useAppSelector((state) => - pinnedStatusesSelector(state, accountId, tagged), + const pinnedStatuses = useAppSelector( + (state) => + (state.timelines as ImmutableMap).getIn( + [`account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, 'items'], + ImmutableList(), + ) as ImmutableList, ); - const renderSlide = useCallback( - ({ id }: { id: string }) => ( - - ), - [], + // Handle slide change + const [slideIndex, setSlideIndex] = useState(0); + const wrapperRef = useRef(null); + const handleSlideChange = useCallback( + (direction: number) => { + setSlideIndex((prev) => { + const max = pinnedStatuses.size - 1; + let newIndex = prev + direction; + if (newIndex < 0) { + newIndex = max; + } else if (newIndex > max) { + newIndex = 0; + } + const slide = wrapperRef.current?.children[newIndex]; + if (slide) { + setCurrentSlideHeight(slide.scrollHeight); + } + return newIndex; + }); + }, + [pinnedStatuses.size], ); - if (!accountId || pinnedStatuses.length === 0) { + // Handle slide heights + const [currentSlideHeight, setCurrentSlideHeight] = useState( + wrapperRef.current?.scrollHeight ?? 0, + ); + const previousSlideHeight = usePrevious(currentSlideHeight); + const observerRef = useRef( + new ResizeObserver(() => { + handleSlideChange(0); + }), + ); + const wrapperStyles = useSpring({ + x: `-${slideIndex * 100}%`, + height: currentSlideHeight, + // Don't animate from zero to the height of the initial slide + immediate: !previousSlideHeight, + }); + useLayoutEffect(() => { + // Update slide height when the component mounts + if (currentSlideHeight === 0) { + handleSlideChange(0); + } + }, [currentSlideHeight, handleSlideChange]); + + // Handle swiping animations + const bind = useDrag(({ swipe: [swipeX] }) => { + handleSlideChange(swipeX * -1); // Invert swipe as swiping left loads the next slide. + }); + const handlePrev = useCallback(() => { + handleSlideChange(-1); + }, [handleSlideChange]); + const handleNext = useCallback(() => { + handleSlideChange(1); + }, [handleSlideChange]); + + if (!accountId || pinnedStatuses.isEmpty()) { return null; } return ( - +
+

+ + +

+ {pinnedStatuses.size > 1 && ( + <> + + + + {(text) => {text}} + + {slideIndex + 1} / {pinnedStatuses.size} + + + + )} +
+ + {pinnedStatuses.map((statusId, index) => ( + + ))} + + + ); +}; + +interface FeaturedCarouselItemProps { + statusId: string; + active: boolean; + observer: ResizeObserver; +} + +const FeaturedCarouselItem: React.FC< + FeaturedCarouselItemProps & AnimatedProps> +> = ({ statusId, active, observer, ...props }) => { + const handleRef = useCallback( + (instance: HTMLDivElement | null) => { + if (instance) { + observer.observe(instance); + } + }, + [observer], + ); + + return ( + -

- - -

-
+ + ); }; diff --git a/app/javascript/mastodon/components/status_banner.tsx b/app/javascript/mastodon/components/status_banner.tsx index a1d200133f8062..b7f7289652d8be 100644 --- a/app/javascript/mastodon/components/status_banner.tsx +++ b/app/javascript/mastodon/components/status_banner.tsx @@ -49,6 +49,7 @@ export const StatusBanner: React.FC<{ 在社交网络和人们互动。", "domain_pill.who_you_are": "用户名可以表明你的身份和你所在的站点,这样人们就可以通过在社交网络与你互动。", "domain_pill.your_handle": "你的用户名:", - "domain_pill.your_server": "你的数字家园,你的所有嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。", + "domain_pill.your_server": "你的数字家园,你的全部嘟文都在此存储。不喜欢这里吗?你可以随时迁移到其它服务器,并带上你的关注者。", "domain_pill.your_username": "你在此服务器上的唯一标识。不同服务器上可能存在相同用户名的用户。", "dropdown.empty": "选项", "embed.instructions": "复制下列代码以在你的网站中嵌入此嘟文。", @@ -333,6 +341,7 @@ "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加书签。添加书签后的嘟文会显示在这里。", "empty_column.community": "本站时间线还没有内容,写点什么并公开发布,让它活跃起来吧!", "empty_column.direct": "你还未使用过私下提及。当你发出或者收到私下提及时,它将显示在此。", + "empty_column.disabled_feed": "此动态已被你的服务器管理员禁用。", "empty_column.domain_blocks": "暂且没有被屏蔽的站点。", "empty_column.explore_statuses": "目前没有热门内容,稍后再来看看吧!", "empty_column.favourited_statuses": "你没有喜欢过任何嘟文。喜欢过的嘟文会显示在这里。", @@ -661,9 +670,9 @@ "notifications.column_settings.admin.sign_up": "新注册:", "notifications.column_settings.alert": "桌面通知", "notifications.column_settings.favourite": "喜欢:", - "notifications.column_settings.filter_bar.advanced": "显示所有类别", + "notifications.column_settings.filter_bar.advanced": "显示全部类别", "notifications.column_settings.filter_bar.category": "快速筛选栏", - "notifications.column_settings.follow": "新粉丝:", + "notifications.column_settings.follow": "新关注者:", "notifications.column_settings.follow_request": "新关注请求:", "notifications.column_settings.group": "分组", "notifications.column_settings.mention": "提及:", @@ -755,6 +764,7 @@ "privacy_policy.title": "隐私政策", "quote_error.edit": "编辑嘟文时无法添加引用。", "quote_error.poll": "不允许引用投票嘟文。", + "quote_error.private_mentions": "不允许引用私下提及嘟文。", "quote_error.quote": "一次只能引用一条嘟文。", "quote_error.unauthorized": "你没有权限引用此嘟文。", "quote_error.upload": "不允许引用有媒体附件的嘟文。", @@ -807,9 +817,9 @@ "report.reasons.spam_description": "恶意链接、虚假互动或重复回复", "report.reasons.violation": "违反服务器规则", "report.reasons.violation_description": "你清楚它违反了特定的规则", - "report.rules.subtitle": "选择所有适用选项", + "report.rules.subtitle": "选择全部适用选项", "report.rules.title": "违反了哪些规则?", - "report.statuses.subtitle": "选择所有适用选项", + "report.statuses.subtitle": "选择全部适用选项", "report.statuses.title": "是否有任何嘟文可以支持这一报告?", "report.submit": "提交", "report.target": "举报 {target}", @@ -860,7 +870,7 @@ "server_banner.is_one_of_many": "{domain} 是可用于参与联邦宇宙的众多独立 Mastodon 站点之一。", "server_banner.server_stats": "服务器统计数据:", "sign_in_banner.create_account": "创建账号", - "sign_in_banner.follow_anyone": "关注联邦宇宙中的任何人,并按时间顺序查看所有内容。没有算法、广告或诱导链接。", + "sign_in_banner.follow_anyone": "关注联邦宇宙中的任何人,并按时间顺序查看全部内容。没有算法、广告或诱导链接。", "sign_in_banner.mastodon_is": "Mastodon 是了解最新动态的最佳途径。", "sign_in_banner.sign_in": "登录", "sign_in_banner.sso_redirect": "登录或注册", @@ -908,9 +918,12 @@ "status.pin": "在个人资料页面置顶", "status.quote": "引用", "status.quote.cancel": "取消引用", + "status.quote_error.blocked_account_hint.title": "由于你已屏蔽@{name},此嘟文已隐藏。", + "status.quote_error.blocked_domain_hint.title": "由于你已屏蔽{domain},此嘟文已隐藏。", "status.quote_error.filtered": "已根据你的筛选器过滤", "status.quote_error.limited_account_hint.action": "仍然显示", "status.quote_error.limited_account_hint.title": "此账号已被 {domain} 管理员隐藏。", + "status.quote_error.muted_account_hint.title": "由于你已设置隐藏@{name},此嘟文已隐藏。", "status.quote_error.not_available": "嘟文不可用", "status.quote_error.pending_approval": "嘟文待发布", "status.quote_error.pending_approval_popout.body": "在Mastodon上,你可以控制其他人引用你嘟文的权限。此嘟文在得到原作者的同意后就会发布。", @@ -954,7 +967,7 @@ "status.uncached_media_warning": "预览不可用", "status.unmute_conversation": "恢复此对话的通知提醒", "status.unpin": "在个人资料页面取消置顶", - "subscribed_languages.lead": "更改此选择后,只有选定语言的嘟文才会出现在你的主页和列表时间线上。选择「无」将显示所有语言的嘟文。", + "subscribed_languages.lead": "更改此选择后,只有选定语言的嘟文才会出现在你的主页和列表时间线上。选择「无」将显示全部语言的嘟文。", "subscribed_languages.save": "保存更改", "subscribed_languages.target": "更改 {target} 的订阅语言", "tabs_bar.home": "主页", @@ -1005,13 +1018,15 @@ "video.volume_down": "音量减小", "video.volume_up": "提高音量", "visibility_modal.button_title": "设置可见性", + "visibility_modal.direct_quote_warning.text": "如果你保存当前设置,引用的嘟文将被转换为链接。", + "visibility_modal.direct_quote_warning.title": "引用嘟文无法嵌入到私下提及中", "visibility_modal.header": "可见性和互动", "visibility_modal.helper.direct_quoting": "Mastodon上发布的私下提及无法被他人引用。", "visibility_modal.helper.privacy_editing": "嘟文发布后便无法更改可见性。", "visibility_modal.helper.privacy_private_self_quote": "自我引用的私人嘟文无法设置为公开。", "visibility_modal.helper.private_quoting": "Mastodon上发布的仅限关注者可见的嘟文无法被他人引用。", "visibility_modal.helper.unlisted_quoting": "当其他人引用你时,他们的嘟文也会从热门时间线上隐藏。", - "visibility_modal.instructions": "控制谁可以和此嘟文互动。你也可以前往偏好设置 > 发布默认值将此设置应用到所有未来发布的嘟文。", + "visibility_modal.instructions": "控制谁可以和此嘟文互动。你也可以前往偏好设置 > 发布默认值将此设置应用到全部未来发布的嘟文。", "visibility_modal.privacy_label": "可见性", "visibility_modal.quote_followers": "仅关注者", "visibility_modal.quote_label": "谁可以引用", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 3626f7da54aa38..fd3eb665ab4b6d 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -28,6 +28,7 @@ "account.disable_notifications": "當 @{name} 發文時不要再通知我", "account.domain_blocking": "封鎖網域", "account.edit_profile": "修改個人檔案", + "account.edit_profile_short": "編輯", "account.enable_notifications": "當 @{name} 發文時通知我", "account.endorse": "在個人檔案中推薦對方", "account.familiar_followers_many": "{name1}、{name2} 及{othersCount, plural, other {你認識的 # 人}}已追蹤", @@ -40,12 +41,18 @@ "account.featured_tags.last_status_never": "暫無文章", "account.follow": "關注", "account.follow_back": "追蹤對方", + "account.follow_back_short": "追蹤對方", + "account.follow_request": "追蹤請求", + "account.follow_request_cancel": "取消請求", + "account.follow_request_cancel_short": "取消", + "account.follow_request_short": "請求", "account.followers": "追蹤者", "account.followers.empty": "尚未有人追蹤這位使用者。", "account.followers_counter": "{count, plural, other {{counter} 個追蹤者}}", "account.followers_you_know_counter": "你認識的 {counter} 人", "account.following": "正在追蹤", "account.follows.empty": "這位使用者尚未追蹤任何人。", + "account.follows_you": "正追蹤你", "account.go_to_profile": "前往個人檔案", "account.hide_reblogs": "隱藏 @{name} 的轉推", "account.in_memoriam": "謹此悼念。", @@ -60,10 +67,13 @@ "account.mute_notifications_short": "靜音通知", "account.mute_short": "靜音", "account.muted": "靜音", + "account.muting": "靜音", + "account.mutual": "你們已互相追蹤", "account.no_bio": "未提供描述。", "account.open_original_page": "打開原始頁面", "account.posts": "帖文", "account.posts_with_replies": "帖文與回覆", + "account.remove_from_followers": "移除追蹤者{name}", "account.report": "檢舉 @{name}", "account.requested_follow": "{name} 要求追蹤你", "account.share": "分享 @{name} 的個人檔案", @@ -130,8 +140,11 @@ "column.direct": "私人提及", "column.directory": "瀏覽個人資料", "column.domain_blocks": "封鎖的服務站", + "column.edit_list": "編輯列表", "column.favourites": "最愛", "column.firehose": "即時動態", + "column.firehose_local": "本伺服器的即時動態", + "column.firehose_singular": "即時動態", "column.follow_requests": "追蹤請求", "column.home": "主頁", "column.lists": "列表", @@ -182,15 +195,28 @@ "confirmations.delete_list.confirm": "刪除", "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?", "confirmations.delete_list.title": "刪除列表?", + "confirmations.discard_draft.post.title": "要捨棄文章的草稿?", "confirmations.discard_edit_media.confirm": "捨棄", "confirmations.discard_edit_media.message": "您在媒體描述或預覽有尚未儲存的變更。確定要捨棄它們嗎?", + "confirmations.follow_to_list.title": "追蹤使用者?", "confirmations.logout.confirm": "登出", "confirmations.logout.message": "確定要登出嗎?", "confirmations.logout.title": "登出?", + "confirmations.missing_alt_text.confirm": "新增替代文字", + "confirmations.missing_alt_text.message": "你的貼文尚未附上替代文字。新增描述有助更多人存取其內容。", "confirmations.mute.confirm": "靜音", + "confirmations.quiet_post_quote_info.dismiss": "不再提醒", + "confirmations.quiet_post_quote_info.got_it": "知道了", "confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.message": "你確定要移除並重新起草這篇帖文嗎?你將會失去最愛和轉推,而回覆也會與原始帖文斷開連接。", + "confirmations.revoke_quote.message": "此操作無法還原。", + "confirmations.revoke_quote.title": "移除貼文?", + "confirmations.unblock.confirm": "解除封鎖", + "confirmations.unblock.title": "解除封鎖 {name}?", "confirmations.unfollow.confirm": "取消追蹤", + "confirmations.unfollow.title": "取消追蹤 {name}?", + "confirmations.withdraw_request.confirm": "撤回請求", + "confirmations.withdraw_request.title": "撤回追蹤{name}的請求?", "content_warning.hide": "隱藏嘟文", "content_warning.show": "仍要顯示", "content_warning.show_more": "顯示更多", @@ -432,6 +458,8 @@ "navigation_bar.follows_and_followers": "追蹤及追蹤者", "navigation_bar.import_export": "匯入及匯出", "navigation_bar.lists": "列表", + "navigation_bar.live_feed_local": "即時動態(本地)", + "navigation_bar.live_feed_public": "即時動態(公開)", "navigation_bar.logout": "登出", "navigation_bar.more": "更多", "navigation_bar.mutes": "靜音名單", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 7525498c2adf01..924edc7fbfdad1 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -194,6 +194,7 @@ "community.column_settings.local_only": "只顯示本站", "community.column_settings.media_only": "只顯示媒體", "community.column_settings.remote_only": "只顯示遠端", + "compose.error.blank_post": "嘟文無法為空白。", "compose.language.change": "變更語言", "compose.language.search": "搜尋語言...", "compose.published.body": "發嘟成功。", @@ -246,6 +247,11 @@ "confirmations.missing_alt_text.secondary": "仍要發嘟", "confirmations.missing_alt_text.title": "是否新增 ALT 說明文字?", "confirmations.mute.confirm": "靜音", + "confirmations.private_quote_notify.cancel": "返回至編輯", + "confirmations.private_quote_notify.confirm": "發表嘟文", + "confirmations.private_quote_notify.do_not_show_again": "不再顯示此訊息", + "confirmations.private_quote_notify.message": "您所引用與提及之使用者將被通知且能檢視您的嘟文,即便他們並無跟隨您。", + "confirmations.private_quote_notify.title": "是否和跟隨者與提及使用者分享此內容?", "confirmations.quiet_post_quote_info.dismiss": "不要再提醒我", "confirmations.quiet_post_quote_info.got_it": "了解", "confirmations.quiet_post_quote_info.message": "當引用不於公開時間軸顯示之嘟文時,您的嘟文將自熱門時間軸隱藏。", @@ -604,8 +610,8 @@ "notification.annual_report.view": "檢視 #Wrapstodon", "notification.favourite": "{name} 已將您的嘟文加入最愛", "notification.favourite.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的嘟文加入最愛", - "notification.favourite_pm": "{name} 將您的私人提及加入最愛", - "notification.favourite_pm.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的私人提及加入最愛", + "notification.favourite_pm": "{name} 將您的私訊加入最愛", + "notification.favourite_pm.name_and_others_with_link": "{name} 與{count, plural, other {其他 # 個人}}已將您的私訊加入最愛", "notification.follow": "{name} 已跟隨您", "notification.follow.name_and_others": "{name} 與{count, plural, other {其他 # 個人}}已跟隨您", "notification.follow_request": "{name} 要求跟隨您", @@ -758,6 +764,7 @@ "privacy_policy.title": "隱私權政策", "quote_error.edit": "編輯嘟文時無法新增引用嘟文。", "quote_error.poll": "無法引用投票嘟文。", + "quote_error.private_mentions": "無法引用私訊嘟文。", "quote_error.quote": "一次僅能引用一則嘟文。", "quote_error.unauthorized": "您不被授權允許引用此嘟文。", "quote_error.upload": "無法引用多媒體內容嘟文。", @@ -911,9 +918,12 @@ "status.pin": "釘選至個人檔案頁面", "status.quote": "引用", "status.quote.cancel": "取消引用嘟文", + "status.quote_error.blocked_account_hint.title": "由於您已封鎖 @{name},此嘟文已被隱藏。", + "status.quote_error.blocked_domain_hint.title": "由於您已封鎖 {domain},此嘟文已被隱藏。", "status.quote_error.filtered": "由於您的過濾器,該嘟文被隱藏", "status.quote_error.limited_account_hint.action": "仍要顯示", "status.quote_error.limited_account_hint.title": "此個人檔案已被 {domain} 的管理員隱藏。", + "status.quote_error.muted_account_hint.title": "由於您已靜音 @{name},此嘟文已被隱藏。", "status.quote_error.not_available": "無法取得該嘟文", "status.quote_error.pending_approval": "嘟文正在等候審核中", "status.quote_error.pending_approval_popout.body": "您能於 Mastodon 控制是否允許引用您的嘟文。此嘟文正在等待原始作者審核。", @@ -1008,8 +1018,10 @@ "video.volume_down": "降低音量", "video.volume_up": "提高音量", "visibility_modal.button_title": "設定可見性", + "visibility_modal.direct_quote_warning.text": "若您儲存目前設定,引用嘟文將被轉為連結。", + "visibility_modal.direct_quote_warning.title": "引用嘟文無法被內嵌於私訊中", "visibility_modal.header": "可見性與互動", - "visibility_modal.helper.direct_quoting": "Mastodon 上發佈之私人提及嘟文無法被其他使用者引用。", + "visibility_modal.helper.direct_quoting": "Mastodon 上發佈之私訊嘟文無法被其他使用者引用。", "visibility_modal.helper.privacy_editing": "嘟文發布後無法變更可見性。", "visibility_modal.helper.privacy_private_self_quote": "自我引用之私嘟無法設為公開可見。", "visibility_modal.helper.private_quoting": "Mastodon 上發佈之僅限跟隨者嘟文無法被其他使用者引用。", diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 5c63dedc48e23b..4b72574c97d500 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -1,11 +1,17 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; import { + changeComposeVisibility, + changeComposeSearchability, + changeComposeMarkdown, + changeCircle, changeUploadCompose, quoteCompose, quoteComposeCancel, setComposeQuotePolicy, -} from 'mastodon/actions/compose_typed'; + pasteLinkCompose, + cancelPasteLinkCompose, +} from '@/mastodon/actions/compose_typed'; import { timelineDelete } from 'mastodon/actions/timelines_typed'; import { @@ -38,8 +44,6 @@ import { COMPOSE_SENSITIVITY_CHANGE, COMPOSE_SPOILERNESS_CHANGE, COMPOSE_SPOILER_TEXT_CHANGE, - COMPOSE_MARKDOWN_CHANGE, - COMPOSE_VISIBILITY_CHANGE, COMPOSE_LANGUAGE_CHANGE, COMPOSE_COMPOSING_CHANGE, COMPOSE_EMOJI_INSERT, @@ -51,10 +55,8 @@ import { COMPOSE_POLL_REMOVE, COMPOSE_POLL_OPTION_CHANGE, COMPOSE_POLL_SETTINGS_CHANGE, - COMPOSE_CIRCLE_CHANGE, COMPOSE_CHANGE_MEDIA_ORDER, COMPOSE_SET_STATUS, - COMPOSE_SEARCHABILITY_CHANGE, COMPOSE_FOCUS, } from '../actions/compose'; import { REDRAFT } from '../actions/statuses'; @@ -106,6 +108,7 @@ const initialState = ImmutableMap({ quoted_status_id: null, quote_policy: 'public', default_quote_policy: 'public', // Set in hydration. + fetching_link: null, }); const initialPoll = ImmutableMap({ @@ -417,7 +420,22 @@ const calculateProgress = (loaded, total) => Math.min(Math.round((loaded / total /** @type {import('@reduxjs/toolkit').Reducer} */ export const composeReducer = (state = initialState, action) => { - if (changeUploadCompose.fulfilled.match(action)) { + if (changeComposeVisibility.match(action)) { + return state + .set('privacy', action.payload) + .set('idempotencyKey', uuid()); + } else if (changeComposeSearchability.match(action)) { + return state + .set('searchability', action.payload) + .set('idempotencyKey', uuid()); + } else if (changeComposeMarkdown.match(action)) { + return state.withMutations(map => { + map.set('markdown', !state.get('markdown')); + map.set('idempotencyKey', uuid()); + }); + } else if (changeCircle.match(action)) { + return state.set('circle_id', action.payload); + } else if (changeUploadCompose.fulfilled.match(action)) { return state .set('is_changing_upload', false) .update('media_attachments', list => list.map(item => { @@ -433,15 +451,27 @@ export const composeReducer = (state = initialState, action) => { return state.set('is_changing_upload', false); } else if (quoteCompose.match(action)) { const status = action.payload; + const isDirect = state.get('privacy') === 'direct'; return state - .set('quoted_status_id', status.get('id')) + .set('quoted_status_id', isDirect ? null : status.get('id')) .set('spoiler', status.get('sensitive')) .set('spoiler_text', status.get('spoiler_text')) - .update('privacy', (visibility) => ['public', 'unlisted'].includes(visibility) && status.get('visibility') === 'private' ? 'private' : visibility); + .update('privacy', (visibility) => { + if (['public', 'unlisted'].includes(visibility) && status.get('visibility') === 'private') { + return 'private'; + } + return visibility; + }); } else if (quoteComposeCancel.match(action)) { return state.set('quoted_status_id', null); } else if (setComposeQuotePolicy.match(action)) { return state.set('quote_policy', action.payload); + } else if (pasteLinkCompose.pending.match(action)) { + return state.set('fetching_link', action.meta.requestId); + } else if (pasteLinkCompose.fulfilled.match(action) || pasteLinkCompose.rejected.match(action)) { + return action.meta.requestId === state.get('fetching_link') ? state.set('fetching_link', null) : state; + } else if (cancelPasteLinkCompose.match(action)) { + return state.set('fetching_link', null); } switch(action.type) { @@ -485,19 +515,6 @@ export const composeReducer = (state = initialState, action) => { return state .set('spoiler_text', action.text) .set('idempotencyKey', uuid()); - case COMPOSE_MARKDOWN_CHANGE: - return state.withMutations(map => { - map.set('markdown', !state.get('markdown')); - map.set('idempotencyKey', uuid()); - }); - case COMPOSE_VISIBILITY_CHANGE: - return state - .set('privacy', action.value) - .set('idempotencyKey', uuid()); - case COMPOSE_SEARCHABILITY_CHANGE: - return state - .set('searchability', action.value) - .set('idempotencyKey', uuid()); case COMPOSE_CHANGE: return state .set('text', action.text) @@ -726,8 +743,6 @@ export const composeReducer = (state = initialState, action) => { return updatePoll(state, action.index, action.title, action.maxOptions); case COMPOSE_POLL_SETTINGS_CHANGE: return state.update('poll', poll => poll.set('expires_in', action.expiresIn).set('multiple', action.isMultiple)); - case COMPOSE_CIRCLE_CHANGE: - return state.set('circle_id', action.circleId); case COMPOSE_LANGUAGE_CHANGE: return state.set('language', action.language); case COMPOSE_FOCUS: diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index 4d7341b0c829bd..5ceb05909f0f0f 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -42,7 +42,7 @@ interface AppThunkConfig { } export type AppThunkApi = Pick< GetThunkAPI, - 'getState' | 'dispatch' + 'getState' | 'dispatch' | 'requestId' >; interface AppThunkOptions { @@ -60,7 +60,7 @@ type AppThunk = ( type AppThunkCreator = ( arg: Arg, - api: AppThunkApi, + api: Pick, extra?: ExtraArg, ) => Returned; @@ -143,10 +143,10 @@ export function createAsyncThunk( name, async ( arg: Arg, - { getState, dispatch, fulfillWithValue, rejectWithValue }, + { getState, dispatch, requestId, fulfillWithValue, rejectWithValue }, ) => { try { - const result = await creator(arg, { dispatch, getState }); + const result = await creator(arg, { dispatch, getState, requestId }); return fulfillWithValue(result, { useLoadingBar: options.useLoadingBar, @@ -280,10 +280,11 @@ export function createDataLoadingThunk< return createAsyncThunk( name, - async (arg, { getState, dispatch }) => { + async (arg, { getState, dispatch, requestId }) => { const data = await loadData(arg, { dispatch, getState, + requestId, }); if (!onData) return data as Returned; @@ -291,6 +292,7 @@ export function createDataLoadingThunk< const result = await onData(data, { dispatch, getState, + requestId, discardLoadData: discardLoadDataInPayload, actionArg: arg, }); diff --git a/app/javascript/material-icons/400-24px/audio.svg b/app/javascript/material-icons/400-24px/audio.svg new file mode 100644 index 00000000000000..417e47c18fee37 --- /dev/null +++ b/app/javascript/material-icons/400-24px/audio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index a8cd0b7b72e510..98724f010bd12a 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1316,6 +1316,10 @@ a.sparkline { line-height: 1; width: 100%; animation: skeleton 1.2s ease-in-out infinite; + + .reduce-motion & { + animation: none; + } } @keyframes skeleton { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 8c2a3de5e2a8f8..0cd36fe4eed996 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -787,16 +787,43 @@ padding: 8px; } - &__preview { + &__preview, + &__visualizer { position: absolute; width: 100%; height: 100%; - border-radius: 6px; z-index: -1; top: 0; + } + + &__preview { + border-radius: 6px; inset-inline-start: 0; } + &__visualizer { + padding: 16px; + box-sizing: border-box; + + .audio-player__visualizer { + margin: 0 auto; + display: block; + height: 100%; + } + + .icon { + position: absolute; + top: 50%; + inset-inline-start: 50%; + transform: translate(-50%, -50%); + opacity: 0.75; + color: var(--player-foreground-color); + filter: var(--overlay-icon-shadow); + width: 48px; + height: 48px; + } + } + &__thumbnail { width: 100%; height: 100%; @@ -1380,7 +1407,7 @@ } } -.announcements__content { +.announcements__item__content { overflow-wrap: break-word; overflow-y: auto; @@ -6064,6 +6091,34 @@ a.status-card { } } +.visibility-modal { + &__quote-warning { + color: var(--nested-card-text); + background: + /* This is a bit of a silly hack for layering two background colours + * since --nested-card-background is too transparent for a tooltip */ + linear-gradient( + var(--nested-card-background), + var(--nested-card-background) + ), + linear-gradient(var(--background-color), var(--background-color)); + border: var(--nested-card-border); + padding: 16px; + border-radius: 4px; + + h3 { + font-weight: 500; + margin-bottom: 4px; + color: $darker-text-color; + } + + p { + font-size: 0.8em; + color: $dark-text-color; + } + } +} + .visibility-dropdown { &__overlay[data-popper-placement] { z-index: 9999; @@ -9409,21 +9464,10 @@ noscript { } .announcements { - width: calc(100% - 124px); - flex: 0 0 auto; - position: relative; - overflow: hidden; - - @media screen and (max-width: (124px + 300px)) { - width: 100%; - } - - &__root { - background: lighten($ui-base-color, 8%); - font-size: 13px; - display: flex; - align-items: flex-end; - } + background: lighten($ui-base-color, 8%); + font-size: 13px; + display: flex; + align-items: flex-end; &__mastodon { width: 124px; @@ -9434,16 +9478,19 @@ noscript { } } - &__slides { - display: flex; - flex-wrap: nowrap; - align-items: start; + &__container { + width: calc(100% - 124px); + flex: 0 0 auto; + position: relative; + + @media screen and (max-width: (124px + 300px)) { + width: 100%; + } } - &__slide { + &__item { box-sizing: border-box; width: 100%; - flex: 0 0 100%; padding: 15px; position: relative; font-size: 15px; @@ -9452,25 +9499,26 @@ noscript { font-weight: 400; max-height: 50vh; overflow: hidden; + display: flex; flex-direction: column; - } - &__range { - display: block; - font-weight: 500; - margin-bottom: 10px; - padding-inline-end: 18px; - } + &__range { + display: block; + font-weight: 500; + margin-bottom: 10px; + padding-inline-end: 18px; + } - &__unread { - position: absolute; - top: 19px; - inset-inline-end: 19px; - display: block; - background: $highlight-text-color; - border-radius: 50%; - width: 0.625rem; - height: 0.625rem; + &__unread { + position: absolute; + top: 19px; + inset-inline-end: 19px; + display: block; + background: $highlight-text-color; + border-radius: 50%; + width: 0.625rem; + height: 0.625rem; + } } &__pagination { @@ -9481,7 +9529,6 @@ noscript { inset-inline-end: 0; display: flex; align-items: center; - z-index: 1; } } @@ -12105,10 +12152,4 @@ noscript { height: 16px; } } - - &__pagination { - display: flex; - align-items: center; - gap: 4px; - } } diff --git a/app/javascript/types/dom.d.ts b/app/javascript/types/dom.d.ts deleted file mode 100644 index fcb1b0346faf13..00000000000000 --- a/app/javascript/types/dom.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare namespace React { - interface HTMLAttributes extends AriaAttributes, DOMAttributes { - // Add inert attribute support, which is only in React 19.2. See: https://github.com/facebook/react/pull/24730 - inert?: ''; - } -} diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb index 406d08bdf99977..b0cd5621c4a2e9 100644 --- a/app/models/form/admin_settings.rb +++ b/app/models/form/admin_settings.rb @@ -142,6 +142,7 @@ class Form::AdminSettings DOMAIN_BLOCK_AUDIENCES = %w(disabled users all).freeze REGISTRATION_MODES = %w(open approved none).freeze FEED_ACCESS_MODES = %w(public authenticated disabled).freeze + ALTERNATE_FEED_ACCESS_MODES = %w(public authenticated).freeze LANDING_PAGE = %w(trends about local_feed).freeze attr_accessor(*KEYS) @@ -153,7 +154,7 @@ class Form::AdminSettings validates :show_domain_blocks_rationale, inclusion: { in: DOMAIN_BLOCK_AUDIENCES }, if: -> { defined?(@show_domain_blocks_rationale) } validates :local_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_live_feed_access) } validates :remote_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_live_feed_access) } - validates :local_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) } + validates :local_topic_feed_access, inclusion: { in: ALTERNATE_FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) } validates :remote_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_topic_feed_access) } validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) } validates :min_age, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@min_age) } diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 994626819088c8..324994e84c21a8 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -167,6 +167,7 @@ def process_status! UpdateStatusExpirationService.new.call(@status) + safeguard_private_mention_quote!(@status) attach_quote!(@status) antispam = Antispam.new(@status) @@ -180,6 +181,16 @@ def process_status! end end + def safeguard_private_mention_quote!(status) + return if @quoted_status.nil? || @visibility.to_sym != :direct + + # The mentions array test here is awkward because the relationship is not persisted at this time + return if @quoted_status.account_id == @account.id || status.mentions.to_a.any? { |mention| mention.account_id == @quoted_status.account_id && !mention.silent } + + status.errors.add(:base, I18n.t('statuses.errors.quoted_user_not_mentioned')) + raise ActiveRecord::RecordInvalid, status + end + def attach_quote!(status) return if @quoted_status.nil? @@ -206,6 +217,7 @@ def safeguard_mentions!(status) def schedule_status! status_for_validation = @account.statuses.build(status_attributes) + safeguard_private_mention_quote!(status_for_validation) antispam = Antispam.new(status_for_validation) antispam.local_preflight_check! diff --git a/app/views/admin/ng_rules/_ng_rule.html.haml b/app/views/admin/ng_rules/_ng_rule.html.haml index 9848e5bc63ac1b..bac2c7df542b6b 100644 --- a/app/views/admin/ng_rules/_ng_rule.html.haml +++ b/app/views/admin/ng_rules/_ng_rule.html.haml @@ -1,4 +1,4 @@ -.filters-list__item{ class: [(ng_rule.expired? || !ng_rule.available) && 'expired'] } +.filters-list__item{ class: [(ng_rule.expired? || !ng_rule.available?) && 'expired'] } = link_to edit_admin_ng_rule_path(ng_rule), class: 'filters-list__item__title' do = ng_rule.title.presence || "(#{t('admin.ng_rules.index.empty_title')})" diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml index 58c194ca4618f2..fd9b3d5a922a6f 100644 --- a/app/views/admin/settings/discovery/show.html.haml +++ b/app/views/admin/settings/discovery/show.html.haml @@ -43,7 +43,7 @@ .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :local_topic_feed_access, - collection: f.object.class::FEED_ACCESS_MODES, + collection: f.object.class::ALTERNATE_FEED_ACCESS_MODES, include_blank: false, label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") }, wrapper: :with_label diff --git a/app/views/settings/privacy/show.html.haml b/app/views/settings/privacy/show.html.haml index c862d2601ee75c..09985ebdbe9db5 100644 --- a/app/views/settings/privacy/show.html.haml +++ b/app/views/settings/privacy/show.html.haml @@ -2,8 +2,7 @@ = t('privacy.title') - content_for :heading do - %h2= t('settings.profile') - = render partial: 'settings/shared/profile_navigation' + %h2= t('privacy.title') = simple_form_for @account, url: settings_privacy_path do |f| = render 'shared/error_messages', object: @account diff --git a/app/views/settings/shared/_profile_navigation.html.haml b/app/views/settings/shared/_profile_navigation.html.haml index 45a31f896cce5a..c54903d2adf8ca 100644 --- a/app/views/settings/shared/_profile_navigation.html.haml +++ b/app/views/settings/shared/_profile_navigation.html.haml @@ -2,7 +2,6 @@ = render_navigation renderer: :links do |primary| :ruby primary.item :edit_profile, safe_join([material_symbol('person'), t('settings.edit_profile')]), settings_profile_path - primary.item :privacy_reach, safe_join([material_symbol('lock'), t('privacy.title')]), settings_privacy_path primary.item :privacy_extra, safe_join([material_symbol('lock'), t('privacy_extra.title')]), settings_privacy_extra_path primary.item :verification, safe_join([material_symbol('check'), t('verification.verification')]), settings_verification_path primary.item :featured_tags, safe_join([material_symbol('tag'), t('settings.featured_tags')]), settings_featured_tags_path diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb index e2df0231030767..1a8dd40541e9d7 100644 --- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb +++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb @@ -5,7 +5,7 @@ class ActivityPub::RefetchAndVerifyQuoteWorker include ExponentialBackoff include JsonLdHelper - sidekiq_options queue: 'pull', retry: 3 + sidekiq_options queue: 'pull', retry: 5 def perform(quote_id, quoted_uri, options = {}) quote = Quote.find(quote_id) diff --git a/config/locales/be.yml b/config/locales/be.yml index 2a9a61c34722f9..dd46c81c8fd4f3 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -2015,6 +2015,7 @@ be: errors: in_reply_not_found: Здаецца, допіс, на які вы спрабуеце адказаць, не існуе. quoted_status_not_found: Выглядае, што допісу, які Вы спрабуеце цытаваць, не існуе. + quoted_user_not_mentioned: Немагчыма цытаваць незгаданага карыстальніка ў допісе прыватнага згадвання. over_character_limit: перавышаная колькасць сімвалаў у %{max} pin_errors: direct: Допісы, бачныя толькі згаданым карыстальнікам, нельга замацаваць diff --git a/config/locales/ca.yml b/config/locales/ca.yml index caa472fb399b94..2588e41c72e9d1 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -586,6 +586,7 @@ ca: created_msg: S'ha creat la nota de moderació d'instància. description_html: Mireu i deixeu notes per als altres moderadors i per a un mateix destroyed_msg: S'ha esborrat la nota de moderació d'instància. + placeholder: Informació sobre aquesta instància, accions preses o qualsevol altra cosa que us pugui ajudar a moderar-la en el futur. title: Notes de moderació private_comment: Comentari privat public_comment: Comentari públic @@ -895,6 +896,7 @@ ca: no_status_selected: No s’han canviat els estatus perquè cap no ha estat seleccionat open: Obre la publicació original_status: Publicació original + quotes: Cites reblogs: Impulsos replied_to_html: En resposta a %{acct_link} status_changed: Publicació canviada @@ -902,6 +904,7 @@ ca: title: Publicacions del compte - @%{name} trending: Tendència view_publicly: Vegeu en públic + view_quoted_post: Veure la publicació citada visibility: Visibilitat with_media: Amb contingut multimèdia strikes: @@ -1577,6 +1580,13 @@ ca: expires_at: Caduca uses: Usos title: Convidar persones + link_preview: + author_html: Per %{name} + potentially_sensitive_content: + action: Feu clic per a mostrar + confirm_visit: Esteu segur que voleu obrir aquest enllaç? + hide_button: Amaga + label: Contingut potencialment sensible lists: errors: limit: Has assolit la quantitat màxima de llistes @@ -1885,6 +1895,9 @@ ca: other: "%{count} vídeos" boosted_from_html: Impulsat des de %{acct_link} content_warning: 'Avís de contingut: %{warning}' + content_warnings: + hide: Amaga la publicació + show: Mostra'n més default_language: El mateix que a la llengua de la interfície disallowed_hashtags: one: 'conté una etiqueta no permesa: %{tags}' @@ -1899,10 +1912,15 @@ ca: limit: Ja has fixat el màxim nombre de tuts ownership: No es pot fixar el tut d'algú altre reblog: No es pot fixar un impuls + quote_error: + not_available: Publicació no disponible + pending_approval: Publicació pendent + revoked: Publicació eliminada per l'autor quote_policies: followers: Només seguidors nobody: Només jo public: Qualsevol + quote_post_author: S'ha citat una publicació de @%{acct} title: '%{name}: "%{quote}"' visibilities: direct: Menció privada diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 9c69ab844916b7..8bfc5ecd8dfadb 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -2015,6 +2015,7 @@ cs: errors: in_reply_not_found: Příspěvek, na který se pokoušíte odpovědět, neexistuje. quoted_status_not_found: Zdá se, že příspěvek, který se pokoušíte citovat neexistuje. + quoted_user_not_mentioned: Nelze citovat nezmíněného uživatele v soukromé zmínce. over_character_limit: byl překročen limit %{max} znaků pin_errors: direct: Příspěvky viditelné pouze zmíněným uživatelům nelze připnout diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 4b875b2c02cbd4..54973fe9ccbb61 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -911,6 +911,11 @@ cy: authenticated: Defnyddwyr dilys yn unig disabled: Gofyn am rôl defnyddiwr penodol public: Pawb + landing_page: + values: + about: Ynghylch + local_feed: Ffrwd leol + trends: Trendiau registrations: moderation_recommandation: Gwnewch yn siŵr bod gennych chi dîm cymedroli digonol ac adweithiol cyn i chi agor cofrestriadau i bawb! preamble: Rheoli pwy all greu cyfrif ar eich gweinydd. diff --git a/config/locales/da.yml b/config/locales/da.yml index c6a30afaaee955..45f3a9365a34a3 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1929,6 +1929,7 @@ da: errors: in_reply_not_found: Indlægget, der forsøges besvaret, ser ikke ud til at eksistere. quoted_status_not_found: Indlægget, du forsøger at citere, ser ikke ud til at eksistere. + quoted_user_not_mentioned: Kan ikke citere en ikke-omtalt bruger i et privat omtale-indlæg. over_character_limit: grænsen på %{max} tegn overskredet pin_errors: direct: Indlæg, som kun kan ses af omtalte brugere, kan ikke fastgøres diff --git a/config/locales/de.yml b/config/locales/de.yml index e4a579575f12a0..71d9eb5b8e7e73 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -796,6 +796,8 @@ de: view_dashboard_description: Gewährt Benutzer*innen den Zugriff auf das Dashboard und verschiedene Metriken view_devops: DevOps view_devops_description: Erlaubt es Benutzer*innen, auf die Sidekiq- und pgHero-Dashboards zuzugreifen + view_feeds: Live-Feeds und Hashtags anzeigen + view_feeds_description: Ermöglicht Nutzer*innen unabhängig von den Servereinstellungen den Zugriff auf die Live-Feeds und Hashtags title: Rollen rules: add_new: Regel hinzufügen @@ -851,10 +853,13 @@ de: feed_access: modes: authenticated: Nur authentifizierte Nutzer*innen + disabled: Bestimmte Rolle erforderlich public: Alle landing_page: values: about: Über + local_feed: Lokaler Feed + trends: Trends registrations: moderation_recommandation: Bitte vergewissere dich, dass du ein geeignetes und reaktionsschnelles Moderationsteam hast, bevor du die Registrierungen uneingeschränkt zulässt! preamble: Lege fest, wer auf deinem Server ein Konto erstellen darf. @@ -1193,7 +1198,8 @@ de: appearance: advanced_settings: Erweiterte Einstellungen animations_and_accessibility: Animationen und Barrierefreiheit - boosting_preferences: Teilen-Einstellungen + boosting_preferences: Teilen + boosting_preferences_info_html: "Tipp: Shift + Klick beim %{icon} Teilen-Symbol wird den Beitrag immer sofort teilen." discovery: Entdecken localization: body: Mastodon wird von Freiwilligen übersetzt. @@ -1923,6 +1929,7 @@ de: errors: in_reply_not_found: Der Beitrag, auf den du antworten möchtest, scheint nicht zu existieren. quoted_status_not_found: Der Beitrag, den du zitieren möchtest, scheint nicht zu existieren. + quoted_user_not_mentioned: Nur ein erwähntes Profil kann in einer privaten Erwähnung zitiert werden. over_character_limit: Begrenzung von %{max} Zeichen überschritten pin_errors: direct: Beiträge, die nur für erwähnte Profile sichtbar sind, können nicht angeheftet werden diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index f228843863e5e4..924c9cf7fdfad0 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -9,6 +9,7 @@ ca: Si us plau, verifica la carpeta de la brossa si no l'has rebut. failure: already_authenticated: Ja t'has registrat. + closed_registrations: El vostre intent de registre s'ha blocat per una política de xarxa. Si creieu que és un error, contacteu %{email}. inactive: El teu compte encara no s'ha activat. invalid: "%{authentication_keys} o contrasenya no són vàlids." last_attempt: Tens un intent més abans no es bloqui el teu compte. diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index 71cd7699fe2393..31001d2c1a7ad7 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -7,6 +7,7 @@ fa: send_paranoid_instructions: اگر نشانی رایانامه‌تان در پایگاه داده‌مان وجود داشته باشد، تا دقایقی دیگر تا دقایقی دیگر رایانامه‌ای با دستورالعمل تأیید نشانی رایانامه‌تان دریافت خواهید کرد. اگر این رایانامه را نگرفتید، لطفاً پوشهٔ هرزنامه‌هایتان را بررسی کنید. failure: already_authenticated: از پیش وارد شده‌اید. + closed_registrations: تلاشتان برا ثبت‌نام به دلیل سیاست شبکه مسدود شد. اگر باور دارید خطایی رخ داده با %{email} تماس بگیرید. inactive: هنوز حسابتان فعّال نشده. invalid: "%{authentication_keys} یا گذرواژه نامعتبر." last_attempt: پیش از آن که حساب شما قفل شود، یک فرصت دیگر دارید. diff --git a/config/locales/devise.fr-CA.yml b/config/locales/devise.fr-CA.yml index fbe549743c96ee..1acb5d1770f27b 100644 --- a/config/locales/devise.fr-CA.yml +++ b/config/locales/devise.fr-CA.yml @@ -7,6 +7,7 @@ fr-CA: send_paranoid_instructions: Si votre adresse courriel existe dans notre base de données, vous allez recevoir un courriel contenant les instructions de confirmation de votre adresse. Veuillez vérifier votre dossier de pourriels si vous n'avez pas reçu ce message. failure: already_authenticated: Vous êtes déjà connecté·e. + closed_registrations: Votre tentative d'inscription a été bloquée en raison d'une politique de réseau. Si vous pensez qu'il s'agit d'une erreur, contactez %{email}. inactive: Votre compte n’est pas encore activé. invalid: "%{authentication_keys} ou mot de passe invalide." last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 10c49b22e661ff..c2147fcf9fcae8 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -7,6 +7,7 @@ fr: send_paranoid_instructions: Si votre adresse électronique existe dans notre base de données, vous allez bientôt recevoir un courriel contenant les instructions de confirmation de votre compte. Veuillez, dans le cas où vous ne recevriez pas ce message, vérifier votre dossier d’indésirables. failure: already_authenticated: Vous êtes déjà connecté⋅e. + closed_registrations: Votre tentative d'inscription a été bloquée en raison d'une politique de réseau. Si vous pensez qu'il s'agit d'une erreur, contactez %{email}. inactive: Votre compte n’est pas encore activé. invalid: "%{authentication_keys} ou mot de passe invalide." last_attempt: Vous avez droit à une dernière tentative avant que votre compte ne soit verrouillé. diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml index 6fd47ec3564434..ffffe0cbf46b44 100644 --- a/config/locales/devise.zh-CN.yml +++ b/config/locales/devise.zh-CN.yml @@ -7,7 +7,7 @@ zh-CN: send_paranoid_instructions: 如果你的邮箱地址存在于我们的数据库中,你将在几分钟内收到一封邮件,内含如何验证邮箱地址的指引。如果你没有收到这封邮件,请检查你的垃圾邮件文件夹。 failure: already_authenticated: 你已登录。 - closed_registrations: 您的注册因为网络政策已被阻止。若您认为这是错误,请联系 %{email}。 + closed_registrations: 你的注册因为网络政策已被阻止。若您认为这是错误,请联系 %{email}。 inactive: 你还没有激活账号。 invalid: "%{authentication_keys} 无效或密码错误。" last_attempt: 你只有最后一次尝试机会,若未通过,账号将被锁定。 diff --git a/config/locales/doorkeeper.et.yml b/config/locales/doorkeeper.et.yml index b21afa9a791c1a..df10f9a0cec65e 100644 --- a/config/locales/doorkeeper.et.yml +++ b/config/locales/doorkeeper.et.yml @@ -130,11 +130,11 @@ et: crypto: Otspunktkrüpteerimine favourites: Lemmikud filters: Filtrid - follow: Jälgitavad, Vaigistatud ja Blokeeritud + follow: Jälgitavad, summutamised ja blokeerimised follows: Jälgimised lists: Loetelud media: Lisatud meedia - mutes: Vaigistused + mutes: Summutamised notifications: Teavitused profile: Sinu Mastodoni profiil push: Tõuketeated @@ -177,7 +177,7 @@ et: read:filters: näha su filtreid read:follows: näha su jälgimisi read:lists: näha su loetelusid - read:mutes: näha su vaigistusi + read:mutes: näha su summutamisi read:notifications: näha teateid read:reports: näha teavitusi read:search: otsida sinu nimel @@ -186,13 +186,13 @@ et: write:accounts: muuta profiili write:blocks: kontode ja domeenide blokeerimine write:bookmarks: lisada postitusele järjehoidja - write:conversations: vaigista ja kustuta vestlused + write:conversations: summuta ja kustuta vestlused write:favourites: lisada postitusi lemmikuks write:filters: luua filtreid write:follows: jälgida inimesi write:lists: luua loetelusid write:media: üles laadida meediafaile - write:mutes: vaigista inimesi ja vestluseid + write:mutes: summuta inimesi ja vestluseid write:notifications: tühjendada teateid write:reports: teavitada teistest inimestest write:statuses: avaldada postitusi diff --git a/config/locales/el.yml b/config/locales/el.yml index 0f2339b1cadde9..0bbffd2a133688 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1929,6 +1929,7 @@ el: errors: in_reply_not_found: Η ανάρτηση στην οποία προσπαθείς να απαντήσεις δεν φαίνεται να υπάρχει. quoted_status_not_found: Η ανάρτηση την οποία προσπαθείς να παραθέσεις δεν φαίνεται να υπάρχει. + quoted_user_not_mentioned: Δεν είναι δυνατή η παράθεση ενός μη επισημασμένου χρήστη σε μια ανάρτηση Ιδιωτικής επισήμανσης. over_character_limit: υπέρβαση μέγιστου ορίου %{max} χαρακτήρων pin_errors: direct: Αναρτήσεις που είναι ορατές μόνο στους αναφερόμενους χρήστες δεν μπορούν να καρφιτσωθούν diff --git a/config/locales/en.yml b/config/locales/en.yml index 461eafef2612e9..9c2bae4a8d98b2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2266,6 +2266,7 @@ en: errors: in_reply_not_found: The post you are trying to reply to does not appear to exist. quoted_status_not_found: The post you are trying to quote does not appear to exist. + quoted_user_not_mentioned: Cannot quote a non-mentioned user in a Private Mention post. over_character_limit: character limit of %{max} exceeded pin_errors: direct: Posts that are only visible to mentioned users cannot be pinned diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index eec0c3f465d4f2..cce8987f75939c 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1929,6 +1929,7 @@ es-AR: errors: in_reply_not_found: El mensaje al que intentás responder no existe. quoted_status_not_found: El mensaje al que intentás citar parece que no existe. + quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en un mensaje de mención privada. over_character_limit: se excedió el límite de %{max} caracteres pin_errors: direct: Los mensajes que sólo son visibles para los usuarios mencionados no pueden ser fijados diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index ecfc06836ef0ff..d0dfe82739198a 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1929,6 +1929,7 @@ es-MX: errors: in_reply_not_found: La publicación a la que estás intentando responder no existe. quoted_status_not_found: La publicación que intentas citar no parece existir. + quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en una Mención Privada. over_character_limit: Límite de caracteres de %{max} superado pin_errors: direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse diff --git a/config/locales/es.yml b/config/locales/es.yml index da0d9ac34bb9bc..fa1b55fcf726ab 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1929,6 +1929,7 @@ es: errors: in_reply_not_found: La publicación a la que intentas responder no existe. quoted_status_not_found: La publicación que estás intentando citar no parece existir. + quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en una Mención Privada. over_character_limit: Límite de caracteres de %{max} superado pin_errors: direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse diff --git a/config/locales/et.yml b/config/locales/et.yml index 8f56b20b1afffe..265005cae77b51 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -796,6 +796,8 @@ et: view_dashboard_description: Lubab kasutajail pääseda ligi töölauale ja erinevale meetrikale view_devops: DevOps view_devops_description: Lubab kasutajail ligipääsu Sidekiq ja pgHero töölaudadele + view_feeds: Vaata postituste ja teemade voogu reaalajas + view_feeds_description: Sõltumata serveri seadistustest luba kasutajatel vaadata postituste ja teemade voogu reaalajas title: Rollid rules: add_new: Lisa reegel @@ -855,6 +857,8 @@ et: public: Kõik landing_page: values: + about: Teave + local_feed: Kohalik sisuvoog trends: Trendid registrations: moderation_recommandation: Enne kõigi jaoks registreerimise avamist veendu, et oleks olemas adekvaatne ja reageerimisvalmis modereerijaskond! @@ -1419,7 +1423,7 @@ et: csv: CSV domain_blocks: Domeeni blokeeringud lists: Loetelud - mutes: Oled vaigistanud + mutes: Oled summutanud storage: Meedia hoidla featured_tags: add_new: Lisa uus @@ -1524,8 +1528,8 @@ et: one: Oled asendamas oma loetelusid faili %{filename} sisuga. Uutesse loeteludesse lisatakse kuni %{count} konto. other: Oled asendamas oma loetelusid faili %{filename} sisuga. Uutesse loeteludesse lisatakse kuni %{count} kontot. muting_html: - one: Oled asendamas oma vaigistatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} konto. - other: Oled asendamas oma vaigistatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} kontot. + one: Oled asendamas oma summutatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} konto. + other: Oled asendamas oma summutatud kontode loetelu faili %{filename} sisuga, milles on kuni %{count} kontot. preambles: blocking_html: one: Oled blokeerimas kuni %{count} konto failist %{filename}. @@ -1543,8 +1547,8 @@ et: one: Oled lisamas oma loeteludesse failist %{filename} kuni %{count} konto. Kui pole loetelusi, kuhu lisada, luuakse uued loetelud. other: Oled lisamas oma loeteludesse failist %{filename} kuni %{count} kontot. Kui pole loetelusi, kuhu lisada, luuakse uued loetelud. muting_html: - one: Oled vaigistamas kuni %{count} konto failist %{filename}. - other: Oled vaigistamas kuni %{count} kontot failist %{filename}. + one: Oled summutamas kuni %{count} konto failist %{filename}. + other: Oled summutamas kuni %{count} kontot failist %{filename}. preface: Saad importida mistahes andmeid, mis on eksporditud teisest serverist. Näiteks nimekirja inimestest, keda jälgid ja keda blokeerid. recent_imports: Viimati imporditud states: @@ -1561,11 +1565,11 @@ et: domain_blocking: Blokeeritud domeenide importimine following: Jälgitavate kontode importimine lists: Loetelude importimine - muting: Vaigistatud kontode importimine + muting: Summutatud kontode importimine type: Importimise tüüp type_groups: constructive: Jälgimised & Järjehoidjad - destructive: Blokeerimised & Vaigistamised + destructive: Blokeerimised & summutamised types: blocking: Blokeeringute nimekiri bookmarks: Järjehoidjad @@ -1674,7 +1678,7 @@ et: title: Modereerimine move_handler: carry_blocks_over_text: See kasutaja kolis kontolt %{acct}, mis oli keelatud. - carry_mutes_over_text: Kasutaja kolis ümber kontolt %{acct}, mis oli vaigistatud. + carry_mutes_over_text: Kasutaja kolis ümber kontolt %{acct}, mis oli summutatud. copy_account_note_text: 'Kasutaja kolis kontolt %{acct}, kus olid eelnevad märkmed tema kohta:' navigation: toggle_menu: Menüü lülimine @@ -1925,6 +1929,7 @@ et: errors: in_reply_not_found: Postitus, millele üritad vastata, ei näi enam eksisteerivat. quoted_status_not_found: Postitus, mida üritad tsiteerida, ei näi enam eksisteerivat. + quoted_user_not_mentioned: Privaatses mainimisega postituses ei saa tsiteerida mittemaninitud kasutajat. over_character_limit: tähtmärkide limiit %{max} ületatud pin_errors: direct: Ei saa kinnitada postitusi, mis on nähtavad vaid mainitud kasutajatele diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 92e305bcee3671..b457f5b2ddeb78 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -796,6 +796,8 @@ fa: view_dashboard_description: اجازه به کاربران برای دسترسی به داشتبورد و سنجه‌های مختلف view_devops: دواپس view_devops_description: به کاربران امکان دسترسی به داشبورد Sidekiq و pgHero را می دهد + view_feeds: دیدن خوراک‌های موضوع و زنده + view_feeds_description: می‌گذارد کاربران فارغ از تنظیمات کارساز به خوراک‌های موضوع و زنده دسترسی داشته باشند title: نقش‌ها rules: add_new: افزودن قانون @@ -837,6 +839,7 @@ fa: title: درخواست خروج از اندیس‌گذاری پیش‌گزیدهٔ موتور جست‌وجو discovery: follow_recommendations: پیروی از پیشنهادها + preamble: ارائه محتوای جذّاب برای آغاز به کار کاربرانی که شاید کسی را روی ماستودون نشناسند ضروری است. واپایش چگونگی کار کردن ویژگی‌های کشف روی کارسازتان. privacy: محرمانگی profile_directory: شاخهٔ نمایه public_timelines: خط زمانی‌های عمومی @@ -847,6 +850,16 @@ fa: all: برای همه disabled: برای هیچ‌کدام users: برای کاربران محلی واردشده + feed_access: + modes: + authenticated: تنها کاربران تأیید شده + disabled: نیازمند نقش کاربری خاص + public: هرکسی + landing_page: + values: + about: درباره + local_feed: خوراک محلی + trends: داغ‌ها registrations: moderation_recommandation: لطفاً قبل از اینکه ثبت نام را برای همه باز کنید، مطمئن شوید که یک تیم نظارتی مناسب و واکنشی دارید! preamble: کنترل کنید چه کسی می تواند در سرور شما یک حساب ایجاد کند. @@ -900,6 +913,7 @@ fa: no_status_selected: هیچ فرسته‌ای تغییری نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند open: گشودن فرسته original_status: فرستهٔ اصلی + quotes: نقل‌ها reblogs: تقویت‌ها replied_to_html: به %{acct_link} پاسخ داد status_changed: فرسته تغییر کرد @@ -907,6 +921,7 @@ fa: title: پست‌های حساب - @%{name} trending: پرطرفدار view_publicly: مشاهده عمومی + view_quoted_post: دیدن فرستهٔ نقل شده visibility: نمایانی with_media: دارای عکس یا ویدیو strikes: @@ -1181,7 +1196,10 @@ fa: hint_html: اگر می‌خواهید از حساب دیگری به این حساب منتقل شوید، این‌جا می‌توانید یک نام مستعار بسازید که برای انتقال از حساب قدیمی به این حساب لازم است. این کار به تنهایی بی‌ضرر و قابل بازگشت است. فرایند انتقال حساب از حساب قدیمی آغاز خواهد شد. remove: حذف ارتباط نام مستعار appearance: + advanced_settings: تنظیمات پیش‌رفته animations_and_accessibility: پویانمایی‌های و دسترسی‌پذیری + boosting_preferences: ترجیحات تقویت + boosting_preferences_info_html: "‏نکته: فارغ از تنظیمات، تبدیل + کلیک روی %{icon} نقشک تقویت بلافاصله تقویت خواهد کرد" discovery: کاوش localization: body: ماستودون توسط داوطلبان ترجمه شده است. @@ -1583,6 +1601,13 @@ fa: expires_at: تاریخ انقضا uses: استفاده‌ها title: دعوت دیگران + link_preview: + author_html: به دست %{name} + potentially_sensitive_content: + action: زدن برای نمایش + confirm_visit: مطمئنید که می‌خواهید این پیوند را بگشایید؟ + hide_button: نهفتن + label: محتوای بالقوه حسّاس lists: errors: limit: به بیشینهٔ تعداد سیاهه‌ها رسیدید @@ -1735,6 +1760,9 @@ fa: self_vote: شما نمی توانید در نظرسنجی خودتان رای دهید too_few_options: حتماً باید بیش از یک گزینه داشته باشد too_many_options: نمی‌تواند بیشتر از %{max} گزینه داشته باشد + vote: رأی + posting_defaults: + explanation: این تنظیمات هنگام ایجاد فرسته به عنوان پیش‌گزیده استفاده خواهند شد؛ ولی می‌توانید در نویسنده برای هر فرسته تغییرش دهید. preferences: other: سایر تنظیمات posting_defaults: تنظیمات پیش‌فرض انتشار @@ -1890,6 +1918,9 @@ fa: other: "%{count} ویدیو" boosted_from_html: تقویت شده از طرف %{acct_link} content_warning: 'هشدا محتوا: %{warning}' + content_warnings: + hide: نهفتن فرسته + show: نمایش بیش‌تر default_language: همانند زبان واسط disallowed_hashtags: one: 'دارای برچسبی غیرمجاز: %{tags}' @@ -1904,10 +1935,23 @@ fa: limit: از این بیشتر نمی‌شود نوشته‌های ثابت داشت ownership: نوشته‌های دیگران را نمی‌توان ثابت کرد reblog: تقویت نمی‌تواند سنجاق شود + quote_error: + not_available: فرسته ناموجود + pending_approval: فرسته منتظر + revoked: فرسته به دست نگارنده برداشته شد + quote_policies: + followers: تنها پی‌گیران + nobody: فقط من + public: هرکسی + quote_post_author: فرسته‌ای از %{acct} را نقل کرد title: "%{name}: «%{quote}»" visibilities: direct: اشاره خصوصی + private: تنها پی‌گیران public: عمومی + public_long: هرکسی داخل و خارج از ماستودون + unlisted: عمومی ساکت + unlisted_long: نهفته از نتیجه‌های جست‌وجوی ماستودون و خط‌های زمانی داغ و عمومی statuses_cleanup: enabled: حذف خودکار فرسته‌های قدیمی enabled_hint: فرسته‌هایتان را هنگام رسیدن به کرانهٔ سن خاصی به صورت خودکار حذف می‌کند، مگر این که با یکی از استثناهای زیر مطابق باشند diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 86494261296958..d1203fbee6f7a6 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -839,12 +839,12 @@ fi: title: Jätä käyttäjät oletusarvoisesti hakukoneindeksoinnin ulkopuolelle discovery: follow_recommendations: Seurantasuositukset - preamble: Mielenkiintoisen sisällön esille tuominen on keskeistä uusien käyttäjien perehdyttämisessä, jotka eivät ehkä tunne ketään Mastodonissa. Hallitse, miten eri löydettävyysominaisuudet toimivat palvelimellasi. + preamble: Mielenkiintoisen sisällön esille tuominen on keskeistä perehdyttäessä uusia käyttäjiä, jotka eivät ehkä tunne ketään Mastodonissa. Hallitse, miten eri löydettävyysominaisuudet toimivat palvelimellasi. privacy: Yksityisyys profile_directory: Profiilihakemisto public_timelines: Julkiset aikajanat publish_statistics: Julkaise tilastot - title: Löytäminen + title: Löydettävyys trends: Trendit domain_blocks: all: Kaikille @@ -1200,7 +1200,7 @@ fi: animations_and_accessibility: Animaatiot ja saavutettavuus boosting_preferences: Tehostusasetukset boosting_preferences_info_html: "Vihje: Asetuksista riippumatta Vaihto + napsautus %{icon} Tehosta-kuvakkeeseen tehostaa välittömästi." - discovery: Löytäminen + discovery: Löydettävyys localization: body: Mastodonin ovat kääntäneet vapaaehtoiset. guide_link: https://crowdin.com/project/mastodon @@ -1929,6 +1929,7 @@ fi: errors: in_reply_not_found: Julkaisua, johon yrität vastata, ei näytä olevan olemassa. quoted_status_not_found: Julkaisua, jota yrität lainata, ei näytä olevan olemassa. + quoted_user_not_mentioned: Mainitsematonta käyttäjää ei voi lainata yksityismaininnassa. over_character_limit: merkkimäärän rajoitus %{max} ylitetty pin_errors: direct: Vain mainituille käyttäjille näkyviä julkaisuja ei voi kiinnittää @@ -2085,7 +2086,7 @@ fi: disable: Et voi enää käyttää tiliäsi, mutta profiilisi ja muut tiedot pysyvät muuttumattomina. Voit pyytää varmuuskopiota tiedoistasi, vaihtaa tilin asetuksia tai poistaa tilisi. mark_statuses_as_sensitive: Palvelimen %{instance} moderaattorit ovat merkinneet osan julkaisuistasi arkaluonteisiksi. Tämä tarkoittaa sitä, että mediaa täytyy napauttaa ennen kuin sen esikatselu näytetään. Voit merkitä median itse arkaluonteiseksi, kun julkaiset tulevaisuudessa. sensitive: Tästä lähtien kaikki lähetetyt mediatiedostot merkitään arkaluonteisiksi ja piilotetaan napsautusvaroituksen taakse. - 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öytämisominaisuuksista. Toiset voivat kuitenkin edelleen seurata sinua manuaalisesti. + 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:' diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 3938235eee8ac2..6569f67380e89c 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -1929,6 +1929,7 @@ fo: errors: in_reply_not_found: Posturin, sum tú roynir at svara, sýnist ikki at finnast. quoted_status_not_found: Posturin, sum tú roynir at sitera, sýnist ikki at finnast. + quoted_user_not_mentioned: Kann ikki sitera ein brúkara, sum ikki er nevndur, í einum posti, sum er ein privat umrøða. over_character_limit: mesta tal av teknum, %{max}, rokkið pin_errors: direct: Postar, sum einans eru sjónligir hjá nevndum brúkarum, kunnu ikki festast diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index b27d53eea8d167..d393ab294a2174 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -190,6 +190,7 @@ fr-CA: create_relay: Créer un relais create_unavailable_domain: Créer un domaine indisponible create_user_role: Créer le rôle + create_username_block: Créer une règle de nom d'utilisateur demote_user: Rétrograder l’utilisateur·ice destroy_announcement: Supprimer l’annonce destroy_canonical_email_block: Supprimer le blocage de courriel @@ -203,6 +204,7 @@ fr-CA: destroy_status: Supprimer le message destroy_unavailable_domain: Supprimer le domaine indisponible destroy_user_role: Détruire le rôle + destroy_username_block: Supprimer la règle de nom d'utilisateur disable_2fa_user: Désactiver l’A2F disable_custom_emoji: Désactiver les émojis personnalisés disable_relay: Désactiver le relais @@ -237,6 +239,7 @@ fr-CA: update_report: Mettre à jour le rapport update_status: Mettre à jour le message update_user_role: Mettre à jour le rôle + update_username_block: Mettre à jour la règle de nom d'utilisateur actions: approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}" approve_user_html: "%{name} a approuvé l’inscription de %{target}" @@ -255,6 +258,7 @@ fr-CA: create_relay_html: "%{name} a créé un relais %{target}" create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" create_user_role_html: "%{name} a créé le rôle %{target}" + create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur contenant %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" @@ -268,6 +272,7 @@ fr-CA: destroy_status_html: "%{name} a supprimé le message de %{target}" destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}" destroy_user_role_html: "%{name} a supprimé le rôle %{target}" + destroy_username_block_html: "%{name} a supprimé une règle pour les noms d'utilisateurs contenant %{target}" disable_2fa_user_html: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur·rice %{target}" disable_custom_emoji_html: "%{name} a désactivé l'émoji %{target}" disable_relay_html: "%{name} a désactivé le relais %{target}" @@ -302,6 +307,7 @@ fr-CA: update_report_html: "%{name} a mis à jour le rapport de signalement %{target}" update_status_html: "%{name} a mis à jour le message de %{target}" update_user_role_html: "%{name} a changé le rôle %{target}" + update_username_block_html: "%{name} a mis à jour une règle pour les noms d'utilisateurs contenant %{target}" deleted_account: compte supprimé empty: Aucun journal trouvé. filter_by_action: Filtrer par action @@ -489,9 +495,17 @@ fr-CA: created_at: Créé à delete: Supprimer ip: Adresse IP + request_body: Corps de la demande providers: + active: Activé + base_url: URL de base + callback: Rappel + delete: Supprimer + edit: Modifier un fournisseur + finish_registration: Terminer l'inscription name: Nom providers: Fournisseur + registration_requested: Inscription demandée registrations: confirm: Confirmer description: Vous avez reçu une souscription d'un FSAF. Rejetez-la si vous ne l'avez pas initiée. Si c'est bien votre intention, comparez le nom et l'empreinte de la clé avant de confirmer la souscription. @@ -502,6 +516,7 @@ fr-CA: sign_in: Se connecter status: État title: Fournisseurs de Services Auxiliaire du Fedivers + title: FASP follow_recommendations: description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée." language: Pour la langue @@ -571,6 +586,11 @@ fr-CA: limited: Limité title: Modération moderation_notes: + create: Ajouter une note de modération + created_msg: Note de modération de l'instance créée avec succès ! + description_html: Voir et laisser des notes pour les autres modérateurs et pour référence future + destroyed_msg: Note de modération de l'instance supprimée avec succès ! + placeholder: Informations à propos de cette instance, actions entreprises ou de toute autre chose qui vous aidera à modérer cette instance à l'avenir. title: Notes de modération private_comment: Commentaire privé public_comment: Commentaire public @@ -777,6 +797,8 @@ fr-CA: view_dashboard_description: Permet aux utilisateur⋅rice⋅s d'accéder au tableau de bord et à diverses statistiques view_devops: DevOps view_devops_description: Permet aux utilisateur⋅rice⋅s d'accéder aux tableaux de bord Sidekiq et pgHero + view_feeds: Voir les flux en direct et les fils de discussion + view_feeds_description: Permet aux utilisateur·rice·s d'accéder aux flux en direct et de discussion indépendamment des paramètres du serveur title: Rôles rules: add_new: Ajouter une règle @@ -785,9 +807,12 @@ fr-CA: description_html: Bien que la plupart des gens prétende avoir lu les conditions d'utilisation avant de les accepter, généralement les utilisateur·rice·s ne les lisent vraiment que lorsque un problème apparaît. Pour faciliter la visualisation des règles de votre serveur en un seul coup d’œil, présentez-les sous la forme d'une liste à puces ! Essayez de garder chacune des règles simple et concise, mais faites attention à ne pas non plus les diviser en de trop nombreux éléments distincts. edit: Modifier la règle empty: Aucune règle de serveur n'a été définie pour l'instant. + move_down: Déplacer vers le bas + move_up: Déplacer vers le haut title: Règles du serveur translation: Traduction translations: Traductions + translations_explanation: Vous pouvez éventuellement ajouter des traductions pour les règles. La valeur par défaut sera affichée si aucune version traduite n'est disponible. Veuillez toujours vous assurer que toute traduction fournie est synchronisée avec la valeur par défaut. settings: about: manage_rules: Gérer les règles du serveur @@ -812,6 +837,7 @@ fr-CA: title: Par défaut, ne pas indexer les comptes dans les moteurs de recherche discovery: follow_recommendations: Suivre les recommandations + privacy: Vie privée profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques @@ -821,6 +847,15 @@ fr-CA: all: À tout le monde disabled: À personne users: Aux utilisateur·rice·s connecté·e·s localement + feed_access: + modes: + authenticated: Utilisateurs authentifiés uniquement + public: Tout le monde + landing_page: + values: + about: À propos + local_feed: Fil local + trends: Tendances registrations: moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! preamble: Affecte qui peut créer un compte sur votre serveur. @@ -874,6 +909,7 @@ fr-CA: no_status_selected: Aucun message n’a été modifié car aucun n’a été sélectionné open: Ouvrir le message original_status: Message original + quotes: Citations reblogs: Partages replied_to_html: Répondu à %{acct_link} status_changed: Publication modifiée @@ -881,6 +917,7 @@ fr-CA: title: Messages du compte - @%{name} trending: Tendances view_publicly: Afficher de manière publique + view_quoted_post: Voir la publication citée visibility: Visibilité with_media: Avec médias strikes: @@ -1062,6 +1099,22 @@ fr-CA: other: Utilisé par %{count} personnes au cours de la dernière semaine title: Recommandations et tendances trending: Tendances + username_blocks: + add_new: Ajouter un nouveau + block_registrations: Bloquer les inscriptions + comparison: + contains: Contient + equals: Est égal à + contains_html: Contient %{string} + created_msg: Règle de nom d'utilisateur créée avec succès + delete: Supprimer + edit: + title: Modifier la règle de nom d'utilisateur + new: + create: Créer une règle + title: Créer une nouvelle règle de nom d'utilisateur + no_username_block_selected: Aucune règle de nom d'utilisateur n'a été modifiée car aucune n'a été sélectionnée + title: Règles de nom d'utilisateur warning_presets: add_new: Ajouter un nouveau delete: Supprimer @@ -1134,7 +1187,9 @@ fr-CA: hint_html: Si vous voulez déménager d’un autre compte vers celui-ci, vous pouvez créer ici un alias, qui est nécessaire avant de pouvoir migrer les abonné·e·s de l’ancien compte vers celui-ci. Cette action en soi est inoffensive et réversible. La migration du compte est initiée à partir de l’ancien compte. remove: Détacher l'alias appearance: + advanced_settings: Paramètres avancés animations_and_accessibility: Animations et accessibilité + boosting_preferences: Préférences de partage discovery: Découverte localization: body: Mastodon est traduit par des volontaires. @@ -1323,6 +1378,10 @@ fr-CA: basic_information: Informations de base hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." other: Autre + emoji_styles: + auto: Auto + native: Natif + twemoji: Twemoji errors: '400': La demande que vous avez soumise est invalide ou mal formée. '403': Vous n’avez pas accès à cette page. @@ -1532,6 +1591,12 @@ fr-CA: expires_at: Expire uses: Utilisations title: Inviter des gens + link_preview: + author_html: Par %{name} + potentially_sensitive_content: + confirm_visit: Voulez-vous vraiment ouvrir ce lien ? + hide_button: Masquer + label: Contenu potentiellement sensible lists: errors: limit: Vous avez atteint le nombre maximum de listes @@ -1632,6 +1697,10 @@ fr-CA: title: Nouvelle mention poll: subject: Un sondage de %{name} est terminé + quote: + body: 'Votre message a été cité par %{name}:' + subject: "%{name} a cité votre message" + title: Nouvelle citation reblog: body: 'Votre message été partagé par %{name} :' subject: "%{name} a partagé votre message" @@ -1680,6 +1749,9 @@ fr-CA: self_vote: Vous ne pouvez pas voter à vos propres sondages too_few_options: doit avoir plus qu’une proposition too_many_options: ne peut contenir plus de %{max} propositions + vote: Voter + posting_defaults: + explanation: Ces paramètres seront utilisés par défaut lorsque vous créez de nouveaux messages, mais vous pouvez les modifier par message dans le champs de rédaction. preferences: other: Autre posting_defaults: Paramètres de publication par défaut @@ -1835,6 +1907,9 @@ fr-CA: other: "%{count} vidéos" boosted_from_html: Partagé depuis %{acct_link} content_warning: 'Avertissement sur le contenu : %{warning}' + content_warnings: + hide: Masquer le message + show: Afficher plus default_language: Même langue que celle de l’interface disallowed_hashtags: one: 'contient un hashtag désactivé : %{tags}' @@ -1842,15 +1917,29 @@ fr-CA: edited_at_html: Édité le %{date} errors: in_reply_not_found: Le message auquel vous essayez de répondre ne semble pas exister. + quoted_status_not_found: Le message que vous essayez de citer ne semble pas exister. over_character_limit: limite de %{max} caractères dépassée pin_errors: direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés limit: Vous avez déjà épinglé le nombre maximum de messages ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas reblog: Un partage ne peut pas être épinglé + quote_error: + not_available: Message indisponible + pending_approval: Message en attente + revoked: Message supprimé par l'auteur + quote_policies: + followers: Abonné·e·s seulement + nobody: Moi uniquement + public: Tout le monde + quote_post_author: A cité un message de %{acct} title: "%{name} : « %{quote} »" visibilities: + direct: Mention privée + private: Abonné·e·s seulement public: Publique + public_long: Tout le monde sur et en dehors de Mastodon + unlisted: Public discret statuses_cleanup: enabled: Supprimer automatiquement vos anciens messages enabled_hint: Supprime automatiquement vos messages une fois qu'ils ont atteint un seuil d'ancienneté défini, à moins qu'ils ne correspondent à l'une des exceptions ci-dessous diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 6b04aca1afb681..a268d87dd316d2 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -190,6 +190,7 @@ fr: create_relay: Créer un relais create_unavailable_domain: Créer un domaine indisponible create_user_role: Créer le rôle + create_username_block: Créer une règle de nom d'utilisateur demote_user: Rétrograder l’utilisateur·ice destroy_announcement: Supprimer l’annonce destroy_canonical_email_block: Supprimer le blocage de courriel @@ -203,6 +204,7 @@ fr: destroy_status: Supprimer le message destroy_unavailable_domain: Supprimer le domaine indisponible destroy_user_role: Détruire le rôle + destroy_username_block: Supprimer la règle de nom d'utilisateur disable_2fa_user: Désactiver l’A2F disable_custom_emoji: Désactiver les émojis personnalisés disable_relay: Désactiver le relais @@ -237,6 +239,7 @@ fr: update_report: Mettre à jour le rapport update_status: Mettre à jour le message update_user_role: Mettre à jour le rôle + update_username_block: Mettre à jour la règle de nom d'utilisateur actions: approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}" approve_user_html: "%{name} a approuvé l’inscription de %{target}" @@ -255,6 +258,7 @@ fr: create_relay_html: "%{name} a créé un relais %{target}" create_unavailable_domain_html: "%{name} a arrêté la livraison vers le domaine %{target}" create_user_role_html: "%{name} a créé le rôle %{target}" + create_username_block_html: "%{name} a ajouté une règle pour les noms d'utilisateur contenant %{target}" demote_user_html: "%{name} a rétrogradé l'utilisateur·rice %{target}" destroy_announcement_html: "%{name} a supprimé l'annonce %{target}" destroy_canonical_email_block_html: "%{name} a débloqué l'adresse email avec le hachage %{target}" @@ -268,6 +272,7 @@ fr: destroy_status_html: "%{name} a supprimé le message de %{target}" destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}" destroy_user_role_html: "%{name} a supprimé le rôle %{target}" + destroy_username_block_html: "%{name} a supprimé une règle pour les noms d'utilisateurs contenant %{target}" disable_2fa_user_html: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur·rice %{target}" disable_custom_emoji_html: "%{name} a désactivé l'émoji %{target}" disable_relay_html: "%{name} a désactivé le relais %{target}" @@ -302,6 +307,7 @@ fr: update_report_html: "%{name} a mis à jour le rapport de signalement %{target}" update_status_html: "%{name} a mis à jour le message de %{target}" update_user_role_html: "%{name} a changé le rôle %{target}" + update_username_block_html: "%{name} a mis à jour une règle pour les noms d'utilisateurs contenant %{target}" deleted_account: compte supprimé empty: Aucun journal trouvé. filter_by_action: Filtrer par action @@ -489,9 +495,17 @@ fr: created_at: Créé à delete: Supprimer ip: Adresse IP + request_body: Corps de la demande providers: + active: Activé + base_url: URL de base + callback: Rappel + delete: Supprimer + edit: Modifier un fournisseur + finish_registration: Terminer l'inscription name: Nom providers: Fournisseur + registration_requested: Inscription demandée registrations: confirm: Confirmer description: Vous avez reçu une souscription d'un FSAF. Rejetez-la si vous ne l'avez pas initiée. Si c'est bien votre intention, comparez le nom et l'empreinte de la clé avant de confirmer la souscription. @@ -502,6 +516,7 @@ fr: sign_in: Se connecter status: État title: Fournisseurs de Services Auxiliaire du Fedivers + title: FASP follow_recommendations: description_html: "Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée." language: Pour la langue @@ -571,6 +586,11 @@ fr: limited: Limité title: Modération moderation_notes: + create: Ajouter une note de modération + created_msg: Note de modération de l'instance créée avec succès ! + description_html: Voir et laisser des notes pour les autres modérateurs et pour référence future + destroyed_msg: Note de modération de l'instance supprimée avec succès ! + placeholder: Informations à propos de cette instance, actions entreprises ou de toute autre chose qui vous aidera à modérer cette instance à l'avenir. title: Notes de modération private_comment: Commentaire privé public_comment: Commentaire public @@ -777,6 +797,8 @@ fr: view_dashboard_description: Permet aux utilisateur⋅rice⋅s d'accéder au tableau de bord et à diverses statistiques view_devops: DevOps view_devops_description: Permet aux utilisateur⋅rice⋅s d'accéder aux tableaux de bord Sidekiq et pgHero + view_feeds: Voir les flux en direct et les fils de discussion + view_feeds_description: Permet aux utilisateur·rice·s d'accéder aux flux en direct et de discussion indépendamment des paramètres du serveur title: Rôles rules: add_new: Ajouter une règle @@ -785,9 +807,12 @@ fr: description_html: Bien que la plupart des gens prétende avoir lu les conditions d'utilisation avant de les accepter, généralement les utilisateur·rice·s ne les lisent vraiment que lorsque un problème apparaît. Pour faciliter la visualisation des règles de votre serveur en un seul coup d’œil, présentez-les sous la forme d'une liste à puces ! Essayez de garder chacune des règles simple et concise, mais faites attention à ne pas non plus les diviser en de trop nombreux éléments distincts. edit: Modifier la règle empty: Aucune règle de serveur n'a été définie pour l'instant. + move_down: Déplacer vers le bas + move_up: Déplacer vers le haut title: Règles du serveur translation: Traduction translations: Traductions + translations_explanation: Vous pouvez éventuellement ajouter des traductions pour les règles. La valeur par défaut sera affichée si aucune version traduite n'est disponible. Veuillez toujours vous assurer que toute traduction fournie est synchronisée avec la valeur par défaut. settings: about: manage_rules: Gérer les règles du serveur @@ -812,6 +837,7 @@ fr: title: Par défaut, ne pas indexer les comptes dans les moteurs de recherche discovery: follow_recommendations: Suivre les recommandations + privacy: Vie privée profile_directory: Annuaire des profils public_timelines: Fils publics publish_statistics: Publier les statistiques @@ -821,6 +847,15 @@ fr: all: À tout le monde disabled: À personne users: Aux utilisateur·rice·s connecté·e·s localement + feed_access: + modes: + authenticated: Utilisateurs authentifiés uniquement + public: Tout le monde + landing_page: + values: + about: À propos + local_feed: Fil local + trends: Tendances registrations: moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! preamble: Affecte qui peut créer un compte sur votre serveur. @@ -874,6 +909,7 @@ fr: no_status_selected: Aucun message n’a été modifié car aucun n’a été sélectionné open: Ouvrir le message original_status: Message original + quotes: Citations reblogs: Partages replied_to_html: Répondu à %{acct_link} status_changed: Message modifié @@ -881,6 +917,7 @@ fr: title: Messages du compte - @%{name} trending: Tendances view_publicly: Afficher de manière publique + view_quoted_post: Voir la publication citée visibility: Visibilité with_media: Avec médias strikes: @@ -1062,6 +1099,22 @@ fr: other: Utilisé par %{count} personnes au cours de la dernière semaine title: Recommandations et tendances trending: Tendances + username_blocks: + add_new: Ajouter un nouveau + block_registrations: Bloquer les inscriptions + comparison: + contains: Contient + equals: Est égal à + contains_html: Contient %{string} + created_msg: Règle de nom d'utilisateur créée avec succès + delete: Supprimer + edit: + title: Modifier la règle de nom d'utilisateur + new: + create: Créer une règle + title: Créer une nouvelle règle de nom d'utilisateur + no_username_block_selected: Aucune règle de nom d'utilisateur n'a été modifiée car aucune n'a été sélectionnée + title: Règles de nom d'utilisateur warning_presets: add_new: Ajouter un nouveau delete: Supprimer @@ -1134,7 +1187,9 @@ fr: hint_html: Si vous voulez déménager d’un autre compte vers celui-ci, vous pouvez créer ici un alias, qui est nécessaire avant de pouvoir migrer les abonné·e·s de l’ancien compte vers celui-ci. Cette action en soi est inoffensive et réversible. La migration du compte est initiée à partir de l’ancien compte. remove: Détacher l'alias appearance: + advanced_settings: Paramètres avancés animations_and_accessibility: Animations et accessibilité + boosting_preferences: Préférences de partage discovery: Découverte localization: body: Mastodon est traduit par des volontaires. @@ -1323,6 +1378,10 @@ fr: basic_information: Informations de base hint_html: "Personnalisez ce que les gens voient sur votre profil public et à côté de vos messages. Les autres personnes seront plus susceptibles de vous suivre et d’interagir avec vous lorsque vous avez un profil complet et une photo." other: Autre + emoji_styles: + auto: Auto + native: Natif + twemoji: Twemoji errors: '400': La demande que vous avez soumise est invalide ou mal formée. '403': Vous n’avez pas accès à cette page. @@ -1532,6 +1591,12 @@ fr: expires_at: Expire uses: Utilisations title: Inviter des gens + link_preview: + author_html: Par %{name} + potentially_sensitive_content: + confirm_visit: Voulez-vous vraiment ouvrir ce lien ? + hide_button: Masquer + label: Contenu potentiellement sensible lists: errors: limit: Vous avez atteint le nombre maximum de listes @@ -1632,6 +1697,10 @@ fr: title: Nouvelle mention poll: subject: Un sondage de %{name} est terminé + quote: + body: 'Votre message a été cité par %{name}:' + subject: "%{name} a cité votre message" + title: Nouvelle citation reblog: body: 'Votre message été partagé par %{name} :' subject: "%{name} a partagé votre message" @@ -1680,6 +1749,9 @@ fr: self_vote: Vous ne pouvez pas voter à vos propres sondages too_few_options: doit avoir plus qu’une proposition too_many_options: ne peut contenir plus de %{max} propositions + vote: Voter + posting_defaults: + explanation: Ces paramètres seront utilisés par défaut lorsque vous créez de nouveaux messages, mais vous pouvez les modifier par message dans le champs de rédaction. preferences: other: Autre posting_defaults: Paramètres de publication par défaut @@ -1835,6 +1907,9 @@ fr: other: "%{count} vidéos" boosted_from_html: Partagé depuis %{acct_link} content_warning: 'Avertissement de contenu : %{warning}' + content_warnings: + hide: Masquer le message + show: Afficher plus default_language: Même langue que celle de l’interface disallowed_hashtags: one: 'contient un hashtag désactivé : %{tags}' @@ -1842,15 +1917,29 @@ fr: edited_at_html: Modifié le %{date} errors: in_reply_not_found: Le message auquel vous essayez de répondre ne semble pas exister. + quoted_status_not_found: Le message que vous essayez de citer ne semble pas exister. over_character_limit: limite de %{max} caractères dépassée pin_errors: direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés limit: Vous avez déjà épinglé le nombre maximum de messages ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas reblog: Un partage ne peut pas être épinglé + quote_error: + not_available: Message indisponible + pending_approval: Message en attente + revoked: Message supprimé par l'auteur + quote_policies: + followers: Abonné·e·s seulement + nobody: Moi uniquement + public: Tout le monde + quote_post_author: A cité un message de %{acct} title: "%{name} : « %{quote} »" visibilities: + direct: Mention privée + private: Abonné·e·s seulement public: Publique + public_long: Tout le monde sur et en dehors de Mastodon + unlisted: Public discret statuses_cleanup: enabled: Supprimer automatiquement vos anciens messages enabled_hint: Supprime automatiquement vos messages une fois qu'ils ont atteint un seuil d'ancienneté défini, à moins qu'ils ne correspondent à l'une des exceptions ci-dessous diff --git a/config/locales/ga.yml b/config/locales/ga.yml index cb27ec1f9e6f74..e4a60a143dba9f 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -2060,6 +2060,7 @@ ga: errors: in_reply_not_found: Is cosúil nach ann don phostáil a bhfuil tú ag iarraidh freagra a thabhairt air. quoted_status_not_found: Is cosúil nach bhfuil an post atá tú ag iarraidh a lua ann. + quoted_user_not_mentioned: Ní féidir úsáideoir nach luaitear a lua i bpost Lua Príobháideach. over_character_limit: teorainn carachtar %{max} sáraithe pin_errors: direct: Ní féidir postálacha nach bhfuil le feiceáil ach ag úsáideoirí luaite a phinnáil diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 3b1f956fe12207..13f482a571c7b9 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -824,6 +824,8 @@ gd: view_dashboard_description: Leigidh seo le cleachdaichean an deas-bhòrd agus meatrachdan inntrigeadh view_devops: DevOps view_devops_description: Leigidh seo le cleachdaichean na deas-bhùird aig Sidekiq is pgHero inntrigeadh + view_feeds: Seall loidhnichean-ama beòtha ’s nan cuspairean + view_feeds_description: Leigidh seo le cleachdaichean loidhnichean-ama beòtha ’s nan cuspairean inntrigeadh ge b’ e dè roghainnean an fhrithealaiche title: Dreuchdan rules: add_new: Cuir riaghailt ris @@ -879,7 +881,13 @@ gd: feed_access: modes: authenticated: Cleachdaichean a chlàraich a-steach a-mhàin + disabled: Iarr dreuchd shònraichte a’ chleachdaiche public: A h-uile duine + landing_page: + values: + about: Mu dhèidhinn + local_feed: Loidhne-ama ionadail + trends: Treandaichean registrations: moderation_recommandation: Dèan cinnteach gu bheil sgioba maoir deiseil is deònach agad mus fhosgail thu an clàradh dhan a h-uile duine! preamble: Stiùirich cò dh’fhaodas cunntas a chruthachadh air an fhrithealaiche agad. @@ -2007,6 +2015,7 @@ gd: errors: in_reply_not_found: Tha coltas nach eil am post dhan a tha thu airson freagairt ann. quoted_status_not_found: Tha coltas nach eil am post dhan a tha thu airson luaidh ann. + quoted_user_not_mentioned: Chan urrainn dhut neach gun iomradh air a luaidh ann am post a tha ’na iomradh prìobhaideach. over_character_limit: chaidh thu thar crìoch charactaran de %{max} pin_errors: direct: Chan urrainn dhut post a phrìneachadh nach fhaic ach na cleachdaichean le iomradh orra @@ -2028,7 +2037,7 @@ gd: private: Luchd-leantainn a-mhàin public: Poblach public_long: Neach sam bith taobh a-staigh no a-muigh Mhastodon - unlisted: Poblach ach sàmhach + unlisted: Sàmhach unlisted_long: Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach statuses_cleanup: enabled: Sguab às seann-phostaichean gu fèin-obrachail diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 85d351d20e6b27..212886dd035604 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1929,6 +1929,7 @@ gl: errors: in_reply_not_found: A publicación á que tentas responder semella que non existe. quoted_status_not_found: Parece que a publicación que intentas citar non existe. + quoted_user_not_mentioned: Non se pode citar a unha usuaria non mencionada nunha Mención Privada. over_character_limit: Excedeu o límite de caracteres %{max} pin_errors: direct: As publicacións que só son visibles para as usuarias mencionadas non se poden fixar @@ -2115,7 +2116,7 @@ gl: edit_profile_action: Personalizar edit_profile_step: Aumenta as túas interaccións grazas a un perfil descriptivo. edit_profile_title: Personaliza o teu perfil - explanation: Aquí tes algunhas endereitas para ir aprendendo + explanation: Aquí tes algúns consellos para ir aprendendo feature_action: Saber máis feature_audience: Mastodon dache a oportunidade de xestionar sen intermediarios as túas relacións. Incluso se usas o teu propio servidor Mastodon poderás seguir e ser seguida desde calquera outro servidor Mastodon conectado á rede e estará baixo o teu control exclusivo. feature_audience_title: Crea a túa audiencia con tranquilidade diff --git a/config/locales/he.yml b/config/locales/he.yml index eebc9000da7a76..2670f51266fb29 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -2015,6 +2015,7 @@ he: errors: in_reply_not_found: נראה שההודעה שנסית להגיב לה לא קיימת. quoted_status_not_found: נראה שההודעה שנסית לצטט לא קיימת. + quoted_user_not_mentioned: לא ניתן לצטט משתמש שאיננו מאוזכר בהודעה פרטית. over_character_limit: חריגה מגבול התווים של %{max} pin_errors: direct: לא ניתן לקבע הודעות שנראותן מוגבלת למכותבים בלבד diff --git a/config/locales/hu.yml b/config/locales/hu.yml index a90e8a5c2ca526..ca3f337f46fc90 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -855,6 +855,11 @@ hu: authenticated: Csak hitelesített felhasználók disabled: Konkrét felhasználói szerepkör megkövetelése public: Mindenki + landing_page: + values: + about: Névjegy + local_feed: Helyi idővonal + trends: Trendek registrations: moderation_recommandation: Győződj meg arról, hogy megfelelő és gyors reagálású moderátor csapatod van, mielőtt mindenki számára megnyitod a regisztrációt! preamble: Szabályozd, hogy ki hozhat létre fiókot a kiszolgálón. diff --git a/config/locales/is.yml b/config/locales/is.yml index 104bd638941c9d..7f3b2290f5a53f 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1933,6 +1933,7 @@ is: errors: in_reply_not_found: Færslan sem þú ert að reyna að svara að er líklega ekki til. quoted_status_not_found: Færslan sem þú ert að reyna að vitna í virðist ekki vera til. + quoted_user_not_mentioned: Ekki er hægt að vitna í aðila sem ekki er minnst á í einkaspjalli. over_character_limit: hámarksfjölda stafa (%{max}) náð pin_errors: direct: Ekki er hægt að festa færslur sem einungis eru sýnilegar þeim notendum sem minnst er á diff --git a/config/locales/it.yml b/config/locales/it.yml index d1061229023e49..c85646ff680652 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -855,6 +855,11 @@ it: authenticated: Solo utenti autenticati disabled: Richiedi un ruolo utente specifico public: Tutti + landing_page: + values: + about: Info + local_feed: Feed locale + trends: Tendenze registrations: moderation_recommandation: Assicurati di avere un team di moderazione adeguato e reattivo prima di aprire le registrazioni a tutti! preamble: Controlla chi può creare un account sul tuo server. @@ -1924,6 +1929,7 @@ it: errors: in_reply_not_found: Il post a cui stai tentando di rispondere non sembra esistere. quoted_status_not_found: Il post che stai cercando di citare non sembra esistere. + quoted_user_not_mentioned: Non è possibile citare un utente non menzionato in un post di menzione privata. over_character_limit: Limite caratteri superato di %{max} pin_errors: direct: I messaggi visibili solo agli utenti citati non possono essere fissati in cima diff --git a/config/locales/ja.yml b/config/locales/ja.yml index a38baafa64305f..49db4d4ff401ab 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -663,6 +663,8 @@ ja: title: モデレーション moderation_notes: create: モデレーションノートを追加 + description_html: 他のモデレーターと将来の自分にメモを残してください + destroyed_msg: インスタンス・モデレーションノートを正常に削除しました! title: モデレーションメモ private_comment: コメント (非公開) public_comment: コメント (公開) @@ -1073,6 +1075,9 @@ ja: all: 誰にでも許可 disabled: 誰にも許可しない users: ログイン済みローカルユーザーのみ許可 + landing_page: + values: + trends: トレンド registrations: moderation_recommandation: 登録受付を開始する前に、迅速かつ適切にモデレーションを行うチームを編成しましょう! preamble: あなたのサーバー上でアカウントを作成できるユーザーを制御します。 @@ -1141,6 +1146,7 @@ ja: no_status_selected: 何も選択されていないため、変更されていません open: 投稿を開く original_status: オリジナルの投稿 + quotes: 引用 reblogs: ブースト remove: 削除 remove_history: 編集履歴を削除 @@ -1151,6 +1157,7 @@ ja: title: 投稿一覧 - @%{name} trending: トレンド view_publicly: 元の投稿を開く + view_quoted_post: 引用されている投稿を見る visibility: 公開範囲 with_media: メディアあり strikes: @@ -1346,6 +1353,7 @@ ja: matches_exactly_html: "%{string}に一致" new: create: ルールを作成 + title: ユーザー名ルールを作成 title: ユーザー名ルール warning_presets: add_new: 追加 @@ -1437,7 +1445,10 @@ ja: over_stl_limit: 所持できるSTLモード付きアンテナ数 (ホーム/リストそれぞれにつき%{limit}) を超えています too_short_keyword: キーワードが短すぎます appearance: + advanced_settings: 詳細設定 animations_and_accessibility: アニメーションとアクセシビリティー + boosting_preferences: ブースト設定 + boosting_preferences_info_html: "Tip: 設定に関係なく、Shift を押しながら %{icon} Boostアイコンをクリックすると、すぐにブーストされます。" custom_emoji_and_emoji_reactions: カスタム絵文字と絵文字リアクション discovery: 見つける localization: @@ -1833,6 +1844,9 @@ ja: expires_at: 有効期限 uses: 使用 title: 新規ユーザーの招待 + link_preview: + potentially_sensitive_content: + hide_button: 非表示 lists: errors: limit: リストの上限数に達しています @@ -2197,7 +2211,7 @@ ja: violate_rules: サーバールールに違反するため投稿できません visibilities: circle: サークル限定 - direct: ダイレクト + direct: 非公開の返信 limited: 限定投稿 login: ログインユーザーのみ login_long: ログインしたユーザーのみが見ることができます diff --git a/config/locales/kab.yml b/config/locales/kab.yml index a8fd955ee48588..62bc46143dcb00 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -285,6 +285,7 @@ kab: ip: Tansa IP providers: active: D urmid + base_url: URL n taffa delete: Kkes edit: Ẓreg asaǧǧaw finish_registration: Fakk ajerred @@ -393,6 +394,7 @@ kab: resolved: Fran status: Addad title: Ineqqisen + unknown_action_msg: 'Tigawt tarussint: %{action}' unresolved: Ur yefra ara updated_at: Yettwaleqqem view_profile: Wali amaɣnu @@ -438,6 +440,10 @@ kab: all: I medden akk disabled: Ɣef ula yiwen users: Ɣef yimseqdacen idiganen i yeqqnen + landing_page: + values: + about: Ɣef + trends: Inezzaɣ registrations: title: Ajerred registrations_mode: @@ -449,6 +455,7 @@ kab: delete: Kkes afaylu yulin software_updates: documentation_link: Issin ugar + title: Llan ileqman type: Anaw version: Lqem statuses: @@ -462,7 +469,9 @@ kab: language: Tutlayt media: title: Amidya + metadata: Iɣefisefka open: Ldi tasuffeɣt + quotes: Tinebdurin status_title: Tasuffeɣt sɣur @%{name} trending: Inezzaɣ visibility: Abani @@ -489,12 +498,16 @@ kab: terms_of_service: changelog: Amaynut create: Sqedcet ayla-nwen + current: Amiran draft: Arewway generates: action: Sirew + title: Tawila n tewtilin n useqdec history: Amazray live: Srid + notify_users: Selɣu iseqdacen publish: Asuffeɣ + published_on_html: Teffeɣ-d ass n %{date} save_draft: Sekles arewway title: Tiwtilin n useqdec title: Tadbelt @@ -504,6 +517,7 @@ kab: allow: Sireg aseɣwen title: Iseɣwan inezzaɣ statuses: + allow_account: Sireg ameskar title: Tisuffaɣ tinezzaɣ tags: dashboard: @@ -519,11 +533,13 @@ kab: new: create: Rnu alugen title: Rnu alugen n useqdac amaynut + title: Ilugan n yisem n useqdac warning_presets: add_new: Rnu amaynut delete: Kkes webhooks: delete: Kkes + disable: Kkes armad enable: Rmed enabled: D urmid admin_mailer: @@ -538,6 +554,7 @@ kab: new_trending_tags: title: Ihacṭagen inezzaɣ appearance: + advanced_settings: Iɣewwaren leqqayen discovery: Asnirem localization: body: Mastodon suqqlen-t-id yiwiziwen. @@ -545,7 +562,9 @@ kab: guide_link_text: Yal yiwen·t y·tezmer a ttekki. sensitive_content: Agbur amḥulfu application_mailer: + notification_preferences: Snifel imenyafen n imayl salutation: "%{name}," + settings: 'Snifel imenyafen n imayl: %{link}' view: 'Ẓaṛ:' view_profile: Ssken-d amaɣnu view_status: Ssken-d tasuffiɣt @@ -683,6 +702,7 @@ kab: filters: contexts: account: Imeɣna + home: Agejdan akked tebdarin notifications: Ilɣa thread: Idiwenniyen edit: @@ -722,6 +742,9 @@ kab: modes: merge: Smezdi overwrite: Semselsi + states: + finished: Immed + status: Addad types: blocking: Tabdart n yimiḍanen iweḥlen bookmarks: Ticraḍ @@ -751,6 +774,12 @@ kab: table: expires_at: Ad ifat di title: Ɛreḍ-d kra n yimdanen + link_preview: + author_html: S ɣur %{name} + potentially_sensitive_content: + action: Sit i uskan + confirm_visit: Tebɣiḍ s tidet ad teldiḍ aseɣwen-a? + hide_button: Ffer-it login_activities: authentication_methods: password: awal uffir @@ -824,6 +853,8 @@ kab: status: Addad n umiḍan rss: content_warning: 'Alɣu n ugbur :' + self_destruct: + title: Aqeddac-a ad yemdel sessions: activity: Armud aneggaru browser: Iminig @@ -862,6 +893,7 @@ kab: kai_os: KaiOS linux: Linux mac: macOS + unknown_platform: Tiɣeṛɣeṛt tarussint windows: Windows windows_mobile: Windows Mobile windows_phone: Tiliɣri Windows Phone @@ -900,6 +932,10 @@ kab: video: one: "%{count} n tbidyutt" other: "%{count} n tbidyutin" + content_warnings: + hide: Ffer tasuffeɣt + show: Sken-d ugar + default_language: Kif kif am tutlayt n wegrudem edited_at_html: Tettwaẓreg ass n %{date} pin_errors: reblog: Azuzer ur yezmir ara ad yili d unṭiḍ diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 118f7ed905d8ac..3c887104906d00 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1887,6 +1887,7 @@ ko: errors: in_reply_not_found: 답장하려는 게시물이 존재하지 않습니다. quoted_status_not_found: 인용하려는 게시물이 존재하지 않습니다. + quoted_user_not_mentioned: 개인 멘션에서 다른 사람의 게시물을 인용할 수 없습니다. over_character_limit: 최대 %{max}자까지 입력할 수 있습니다 pin_errors: direct: 멘션된 사용자들에게만 보이는 게시물은 고정될 수 없습니다 @@ -1895,7 +1896,7 @@ ko: reblog: 부스트는 고정될 수 없습니다 quote_error: not_available: 게시물 사용 불가 - pending_approval: 게시물 대기중 + pending_approval: 계류 중인 게시물 revoked: 원작성자에 의해 게시물 삭제됨 quote_policies: followers: 팔로워만 diff --git a/config/locales/nan.yml b/config/locales/nan.yml index 8127cc56791d5c..508cc46665db22 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -841,6 +841,11 @@ nan: authenticated: Kan-ta hōo登入ê用者 disabled: 愛特別ê用者角色 public: Ta̍k lâng + landing_page: + values: + about: 關係本站 + local_feed: 本地ê動態 + trends: 趨勢 registrations: moderation_recommandation: 佇開放hōo ta̍k ê lâng註冊進前,請確認lí有夠額koh主動反應ê管理團隊! preamble: 控制ē當佇lí ê服侍器註冊ê人。 @@ -1213,6 +1218,46 @@ nan: redirect_to_app_html: Lí應該受重轉kàu %{app_name}應用程式,若是iáu-buē,試 %{clicking_this_link} á是手動轉去tsit ê應用程式。 registration_complete: Lí佇 %{domain} ê註冊完成ah! welcome_title: 歡迎 %{name}! + wrong_email_hint: Nā是電子phue ê地址無正確,lí ē當tī口座設定kā改。 + delete_account: Thâi掉口座 + delete_account_html: Nā lí behthâi掉lí ê口座,lí ē當ji̍h tsia繼續。Lí著確認動作。 + description: + prefix_invited_by_user: "@%{name} 邀請lí加入tsit ê Mastodon 服侍器!" + prefix_sign_up: Tsit-má註冊Mastodon ê口座! + suffix: 有口座,lí當tuì ta̍k ê Mastodon 服侍器跟tuè lâng、PO更新kap交換訊息等等! + didnt_get_confirmation: Kám無收著確認ê連結? + dont_have_your_security_key: Lí iáu無安全鎖(security key)? + forgot_password: 密碼be記得? + invalid_reset_password_token: 重新設密碼ê token無效á是過期ah。請重頭the̍h新ê。 + link_to_otp: 請tuì lí ê手機á輸入雙因素認證(2FA)ê碼,á是恢復碼。 + link_to_webauth: 用lí ê安全鎖ê裝置 + log_in_with: 登入用 + login: 登入 + logout: 登出 + migrate_account: 轉kàu無kâng ê口座 + migrate_account_html: Nā lí ǹg望引tshuā別人tuè無kâng ê口座,請 kàutsia設定。 + or_log_in_with: Á是登入用 + progress: + confirm: 確認電子phue + details: Lí ê詳細 + review: Lán ê審查 + rules: 接受規則 + providers: + cas: CAS + saml: SAML + register: 註冊 + registration_closed: "%{instance} 無接受新ê成員" + resend_confirmation: 重送確認ê連結 + reset_password: 重設密碼 + rules: + accept: 接受 + back: Tńg去 + invited_by: Lí通用有tuì hia收著ê邀請加入 %{domain}: + preamble: Tsiah-ê hōo %{domain} ê管理員設定kap實施。 + preamble_invited: 佇lí繼續進前,請思考 %{domain} ê管理員設立ê基本規則。 + title: Tsi̍t-kuá基本規定。 + title_invited: Lí受邀請ah。 + security: 安全 scheduled_statuses: too_soon: Tio̍h用未來ê日期。 statuses: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 9179337c6f2319..ede7eb69c3c08b 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1929,6 +1929,7 @@ nl: errors: in_reply_not_found: Het bericht waarop je probeert te reageren lijkt niet te bestaan. quoted_status_not_found: Het bericht die je probeert te citeren lijkt niet te bestaan. + quoted_user_not_mentioned: Een niet-vermelde gebruiker kan niet in een privébericht worden geciteerd. over_character_limit: Limiet van %{max} tekens overschreden pin_errors: direct: Berichten die alleen zichtbaar zijn voor vermelde gebruikers, kunnen niet worden vastgezet diff --git a/config/locales/nn.yml b/config/locales/nn.yml index c3e37405c5eaa7..f9e2d55df45f91 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -796,6 +796,8 @@ nn: view_dashboard_description: Gir brukere tilgang til dashbordet og ulike metrikker view_devops: DevOps view_devops_description: Gir brukere tilgang til Sidekiq og pgHero-dashbord + view_feeds: Sjå direktestraumar og emnestraumar + view_feeds_description: La brukarar sjå direkte- og emnestraumane uansett innstillingar på tenaren title: Roller rules: add_new: Legg til regel @@ -843,7 +845,7 @@ nn: public_timelines: Offentlege tidsliner publish_statistics: Publiser statistikk title: Oppdaging - trends: Trender + trends: Populært domain_blocks: all: Til alle disabled: Til ingen @@ -851,7 +853,13 @@ nn: feed_access: modes: authenticated: Berre godkjende brukarar + disabled: Krev ei spesifikk brukarrolle public: Alle + landing_page: + values: + about: Om + local_feed: Lokal tidsline + trends: Populært registrations: moderation_recommandation: Pass på at du har mange og kjappe redaktørar og moderatorar på laget ditt før du opnar for allmenn registrering! preamble: Kontroller kven som kan oppretta konto på tenaren din. @@ -1921,6 +1929,7 @@ nn: errors: in_reply_not_found: Det ser ut til at tutet du freistar å svara ikkje finst. quoted_status_not_found: Innlegget du prøver å sitera ser ikkje ut til å finnast. + quoted_user_not_mentioned: Kan ikkje sitera ein person som ikkje er nemnd i direktemeldingar. over_character_limit: øvregrensa for teikn, %{max}, er nådd pin_errors: direct: Innlegg som bare er synlige for nevnte brukere kan ikke festes diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 44e6d18311e326..dd1a04754e0966 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -796,6 +796,8 @@ pt-BR: view_dashboard_description: Permite que os usuários acessem o painel e várias métricas view_devops: DevOps view_devops_description: Permite aos usuários acessar os painéis da Sidekiq e pgHero + view_feeds: Veja transmissões ao vivo e por tópico + view_feeds_description: Permite que os usuários acessem os feeds ao vivo e por tópico, independentemente das configurações do servidor title: Funções rules: add_new: Adicionar regra @@ -837,6 +839,7 @@ pt-BR: title: Optar por excluir usuários da indexação de mecanismos de pesquisa por padrão discovery: follow_recommendations: Seguir recomendações + preamble: A exibição de conteúdo interessante é fundamental para a integração de novos usuários que podem não conhecer ninguém no Mastodon. Controle o funcionamento de vários recursos de descoberta no seu servidor. privacy: Privacidade profile_directory: Diretório de perfis public_timelines: Timelines públicas @@ -1196,6 +1199,7 @@ pt-BR: advanced_settings: Configurações avançadas animations_and_accessibility: Animações e acessibilidade boosting_preferences: Adicionar preferências + boosting_preferences_info_html: "Dica: Independentemente das configurações, Shift + Clique no ícone %{icon} Boost irá impulsionar imediatamente." discovery: Descobrir localization: body: Mastodon é traduzido por voluntários. diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 24a21f886c51c3..d9efbf6a5ee17d 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1929,6 +1929,7 @@ pt-PT: errors: in_reply_not_found: A publicação a que estás a tentar responder parece não existir. quoted_status_not_found: A publicação que está a tentar citar parece não existir. + quoted_user_not_mentioned: Um utilizador não mencionado não pode ser citado numa publicação privada. over_character_limit: limite de caracteres %{max} excedido pin_errors: direct: As publicações que só são visíveis para os utilizadores mencionados não podem ser fixadas diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 0f79229caa9c99..58b07f787b3ee6 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -93,6 +93,7 @@ cy: content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol â'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol. custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon. favicon: WEBP, PNG, GIF neu JPG. Yn diystyru'r favicon Mastodon rhagosodedig gydag eicon cyfaddas. + landing_page: Yn dewis pa dudalen y mae ymwelwyr newydd yn ei gweld pan fyddan nhw'n cyrraedd eich gweinydd am y tro cyntaf. Os dewiswch "Trendio", yna mae angen galluogi tueddiadau yn y Gosodiadau Darganfod. Os dewiswch "Ffrydiau lleol", yna mae angen gosod "Mynediad i ffrydiau byw sy'n cynnwys postiadau lleol" i "Pawb" yn y Gosodiadau Darganfod. mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch. media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw. min_age: Mae gofyn i ddefnyddwyr gadarnhau eu dyddiad geni wrth gofrestru @@ -290,6 +291,7 @@ cy: content_cache_retention_period: Cyfnod cadw cynnwys o bell custom_css: CSS cyfaddas favicon: Favicon + landing_page: Tudalen cychwyn ar gyfer ymwelwyr newydd local_live_feed_access: Mynediad i ffrydiau byw sy'n cynnwys postiadau lleol local_topic_feed_access: Mynediad i ffrydiau hashnod a dolenni sy'n cynnwys postiadau lleol mascot: Mascot cyfaddas (hen) diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index 74b6e5d9ef2b6d..1085626e483cea 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -54,8 +54,10 @@ de: password: Verwende mindestens 8 Zeichen phrase: Wird unabhängig von der Groß- und Kleinschreibung im Text oder der Inhaltswarnung eines Beitrags abgeglichen scopes: Welche Schnittstellen der Applikation erlaubt sind. Wenn du einen Top-Level-Scope auswählst, dann musst du nicht jeden einzelnen darunter auswählen. + setting_advanced_layout: Dadurch wird Mastodon in mehrere Spalten aufgeteilt, womit du deine Timeline, Benachrichtigungen und eine dritte Spalte deiner Wahl nebeneinander siehst. Nicht bei einem kleinen Bildschirm empfohlen. setting_aggregate_reblogs: Beiträge, die erst kürzlich geteilt wurden, werden nicht noch einmal angezeigt (betrifft nur zukünftig geteilte Beiträge) setting_always_send_emails: Normalerweise werden Benachrichtigungen nicht per E-Mail versendet, wenn du gerade auf Mastodon aktiv bist + setting_boost_modal: Dadurch wird beim Teilen ein Bestätigungsdialog angezeigt, um die Sichtbarkeit anzupassen. setting_default_quote_policy_private: Beiträge, die nur für deine Follower bestimmt sind und auf Mastodon verfasst wurden, können nicht von anderen zitiert werden. setting_default_quote_policy_unlisted: Sollten dich andere zitieren, werden ihre zitierten Beiträge ebenfalls nicht in den Trends und öffentlichen Timelines angezeigt. setting_default_sensitive: Medien, die mit einer Inhaltswarnung versehen worden sind, werden – je nach Einstellung – erst nach einem zusätzlichen Klick angezeigt @@ -63,6 +65,7 @@ de: setting_display_media_hide_all: Medien immer ausblenden setting_display_media_show_all: Medien mit Inhaltswarnung immer anzeigen setting_emoji_style: 'Wie Emojis dargestellt werden: „Automatisch“ verwendet native Emojis, für veraltete Browser wird jedoch Twemoji verwendet.' + setting_quick_boosting_html: Dadurch wird der Beitrag beim Anklicken des %{boost_icon} Teilen-Symbols sofort geteilt, anstatt das Drop-down-Menü zu öffnen. Die Möglichkeit zum Zitieren wird dabei in %{options_icon} Mehr verschoben. setting_system_scrollbars_ui: Betrifft nur Desktop-Browser, die auf Chrome oder Safari basieren setting_use_blurhash: Der Farbverlauf basiert auf den Farben der ausgeblendeten Medien, verschleiert aber jegliche Details setting_use_pending_items: Neue Beiträge hinter einem Klick verstecken, anstatt automatisch zu scrollen @@ -90,6 +93,7 @@ de: content_cache_retention_period: Sämtliche Beiträge von anderen Servern (einschließlich geteilte Beiträge und Antworten) werden, unabhängig von der Interaktion der lokalen Nutzer*innen mit diesen Beiträgen, nach der festgelegten Anzahl von Tagen gelöscht. Das betrifft auch Beiträge, die von lokalen Nutzer*innen favorisiert oder als Lesezeichen gespeichert wurden. Private Erwähnungen zwischen Nutzer*innen von verschiedenen Servern werden ebenfalls verloren gehen und können nicht wiederhergestellt werden. Diese Option richtet sich ausschließlich an Server mit speziellen Zwecken und wird die allgemeine Nutzungserfahrung beeinträchtigen, wenn sie für den allgemeinen Gebrauch aktiviert ist. custom_css: Du kannst benutzerdefinierte Stile auf die Web-Version von Mastodon anwenden. favicon: WEBP, PNG, GIF oder JPG. Überschreibt das Standard-Mastodon-Favicon mit einem eigenen Symbol. + landing_page: Legt fest, welche Seite neue Besucher*innen sehen, wenn sie zum ersten Mal auf deinem Server ankommen. Für „Trends“ müssen die Trends in den Entdecken-Einstellungen aktiviert sein. Für „Lokaler Feed“ muss „Zugriff auf Live-Feeds, die lokale Beiträge beinhalten“ in den Entdecken-Einstellungen auf „Alle“ gesetzt werden. mascot: Überschreibt die Abbildung in der erweiterten Weboberfläche. media_cache_retention_period: Mediendateien aus Beiträgen von externen Nutzer*innen werden auf deinem Server zwischengespeichert. Wenn ein positiver Wert gesetzt ist, werden die Medien nach der festgelegten Anzahl von Tagen gelöscht. Sollten die Medien nach dem Löschvorgang wieder angefragt werden, werden sie erneut heruntergeladen, sofern der ursprüngliche Inhalt noch vorhanden ist. Es wird empfohlen, diesen Wert auf mindestens 14 Tage festzulegen, da die Häufigkeit der Abfrage von Linkvorschaukarten für Websites von Dritten begrenzt ist und die Linkvorschaukarten sonst nicht vor Ablauf dieser Zeit aktualisiert werden. min_age: Nutzer*innen werden bei der Registrierung aufgefordert, ihr Geburtsdatum zu bestätigen @@ -233,10 +237,12 @@ de: setting_aggregate_reblogs: Geteilte Beiträge in den Timelines gruppieren setting_always_send_emails: Benachrichtigungen immer senden setting_auto_play_gif: Animierte GIFs automatisch abspielen + setting_boost_modal: Sichtbarkeit für geteilte Beiträge anpassen setting_default_language: Beitragssprache setting_default_privacy: Beitragssichtbarkeit setting_default_quote_policy: Wer zitieren darf setting_default_sensitive: Medien immer mit einer Inhaltswarnung versehen + setting_delete_modal: Vor dem Löschen bestätigen setting_disable_hover_cards: Profilvorschau deaktivieren, wenn die Maus über das Profil bewegt wird setting_disable_swiping: Wischgesten deaktivieren setting_display_media: Darstellung von Medien @@ -246,7 +252,8 @@ de: setting_emoji_style: Emoji-Stil setting_expand_spoilers: Beiträge mit Inhaltswarnung immer ausklappen setting_hide_network: Follower und „Folge ich“ nicht anzeigen - setting_quick_boosting: Schnelles Boosten aktivieren + setting_missing_alt_text_modal: Erinnerung für Bildbeschreibung anzeigen + setting_quick_boosting: Schnelles Teilen aktivieren setting_reduce_motion: Bewegung in Animationen verringern setting_system_font_ui: Standardschriftart des Browsers verwenden setting_system_scrollbars_ui: Bildlaufleiste des Betriebssystems verwenden @@ -280,6 +287,7 @@ de: content_cache_retention_period: Aufbewahrungsfrist für externe Inhalte custom_css: Eigenes CSS favicon: Favicon + landing_page: Landingpage für neue Besucher*innen local_live_feed_access: Zugriff auf Live-Feeds, die lokale Beiträge beinhalten local_topic_feed_access: Zugriff auf Hashtags und Links, die lokale Beiträge beinhalten mascot: Benutzerdefiniertes Maskottchen (Legacy) diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index a7c318f04f3c3f..5d1425f2004faa 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -54,8 +54,10 @@ et: password: Vajalik on vähemalt 8 märki phrase: Kattub olenemata postituse teksti suurtähtedest või sisuhoiatusest scopes: Milliseid API-sid see rakendus tohib kasutada. Kui valid kõrgeima taseme, ei pea üksikuid eraldi valima. + setting_advanced_layout: Näita Mastodoni mitme veeruga paigutuses, mispuhul näed korraga nii ajajoont, teavitusi, kui sinu valitud kolmandat veergu. Ei sobi kasutamiseks väikeste ekraanide puhul. setting_aggregate_reblogs: Ära kuva uusi postituste jagamisi, mis on hiljuti jagatud (kehtib vaid uutele jagamistele) setting_always_send_emails: Mastodoni aktiivsel kasutamisel sulle tavaliselt meilile teavitusi ei saadeta + setting_boost_modal: Selle eelistuse kasutamisel hooandmise avatakse esmalt kinnitusvaade, kus saad muuta hooandmise nähtavust. setting_default_quote_policy_private: Ainult jälgijatele mõeldud Mastodoni postitusi ei saa teiste poolt tsiteerida. setting_default_quote_policy_unlisted: Kui teised kasutajad sind tsiteerivad, siis nende postitused peidetakse ajajoonelt, mis näitavad populaarsust koguvaid postitusi. setting_default_sensitive: Tundlik meedia on vaikimisi peidetud ning seda saab avada sellele klikkides @@ -63,6 +65,7 @@ et: setting_display_media_hide_all: Alati peida kõik meedia setting_display_media_show_all: Alati näita tundlikuks märgistatud meedia setting_emoji_style: See määrab emojide kuvamise viisi. Automaatse valiku puhul üritatakse kasutada platvormi või klientrakenduse oma emojisid, kuid varuvariandina jääb toimima Twemoji (näiteks vanade veebibrauserite puhul). + setting_quick_boosting_html: Selle eelistuse kasutamisel, Hooandmise ikooni %{boost_icon} teeb toimingu kohe ilma avamata Hooandmise/Tsiteerimise menüüvalikut. Sel puhul tsiteerimise link leidub %{options_icon} (Valikud) menüüs. setting_system_scrollbars_ui: Kehtib vaid Safaril ja Chrome'il põhinevatel tavaarvuti veebibrauserite puhul setting_use_blurhash: Värvid põhinevad peidetud visuaalidel, kuid hägustavad igasuguseid detaile setting_use_pending_items: Voo automaatse kerimise asemel peida ajajoone uuendused kliki taha @@ -90,6 +93,7 @@ et: content_cache_retention_period: Kõik teiste serverite postitused (sealhulgas jagamised ja vastused) kustutatakse pärast määratud arvu päevade möödumist, sõltumata, kuidas kohalik kasutaja on nende postitustega interakteerunud. Hõlmatud on ka postitused, mille kohalik kasutaja on märkinud järjehoidjaks või lemmikuks. Ka eri instantside kasutajate vahelised privaatsed mainimised kaovad ja neid on võimatu taastada. See seadistus on mõeldud eriotstarbeliste instantside jaoks ja rikub paljude kasutajate ootusi, kui seda rakendatakse üldotstarbelise kasutuse puhul. custom_css: Mastodoni veebiliideses on võimalik kasutada kohandatud stiile. favicon: WEBP, PNG, GIF või JPG. Asendab Mastodoni vaike- favicon ikooni kohandatud ikooniga. + landing_page: Sellega valid lehe, mida uued külastajad sinu serverisse tulles näevad. Kui sa valid „Trendid“, siis peavad nad olema lubatud. Kui sa valid „Kohalike postituste voog“, siis seadistuse „Ligipääs kohalike postituste voole“ väärtus peab olema „Kõik“. mascot: Asendab kohandatud veebiliidese illustratsiooni. media_cache_retention_period: Kaugkasutajate tehtud postituste meediafailid salvestatakse sinu koduserveri vahemällu. Kui see seadistus on seatud positiivsele väärtusele, kustutatakse meediumifailid määratud päevade möödumisel. Kui meediaandmeid küsitakse pärast nende kustutamist, laaditakse need uuesti alla, kui lähtesisu on veel saadaval. Kuna on olemas piirangud, kui tihti tohivad lingikaardid kolmandatelt saitidelt andmeid pärida, on soovitatav määrata väärtuseks vähemalt 14. Vastasel juhul ei uuendata linkide eelvaatekaarte nõudmise korral enne seda aega. min_age: Kasutajad peavad liitumisel kinnitama oma sünnikuupäeva @@ -249,6 +253,7 @@ et: setting_expand_spoilers: Alati näita tundlikuks märgitud postituste sisu setting_hide_network: Peida oma võrk setting_missing_alt_text_modal: Enne postitamist hoiata mind meediumi puuduva selgitusteksti puhul + setting_quick_boosting: Luba kiire hooandmine setting_reduce_motion: Vähenda animatsioonides liikumist setting_system_font_ui: Kasuta süsteemi vaikefonti setting_system_scrollbars_ui: Kasuta süsteemi vaikimisi kerimisriba @@ -282,6 +287,7 @@ et: content_cache_retention_period: Kaugsisu säilitamise aeg custom_css: Kohandatud CSS favicon: Favicon + landing_page: Avaleht uute külastajate jaoks local_live_feed_access: Ligipääs kohalike postituste voole local_topic_feed_access: Ligipääs kohalike postitustele viitavale teemaviidete ja linkide voole mascot: Kohandatud maskott (kunagine) diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index d244cb5283439c..1e146b6da393a4 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -56,6 +56,8 @@ fa: scopes: واسط‌های برنامه‌نویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطح‌های پایینی ندارید. setting_aggregate_reblogs: برای تقویت‌هایی که به تازگی برایتان نمایش داده شده‌اند، تقویت‌های بیشتر را نمایش نده (فقط روی تقویت‌های اخیر تأثیر می‌گذارد) setting_always_send_emails: در حالت عادی آگاهی‌های رایانامه‌ای هنگامی که فعّالانه از ماستودون استفاده می‌کنید فرستاده نمی‌شوند + setting_default_quote_policy_private: فرسته‌های فقط پی‌گیران روی ماستودون نمی‌توانند به دست دیگران نقل شوند. + setting_default_quote_policy_unlisted: هنگامی که کسی نقلتان می‌کند هم فرسته‌اش از خط زمانی‌های داغ پنهان خواهد بود. setting_default_sensitive: تصاویر حساس به طور پیش‌فرض پنهان هستند و می‌توانند با یک کلیک آشکار شوند setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شده‌اند پنهان کن setting_display_media_hide_all: همیشه همهٔ عکس‌ها و ویدیوها را پنهان کن @@ -231,9 +233,12 @@ fa: setting_aggregate_reblogs: تقویت‌ها را در خط‌زمانی گروه‌بندی کن setting_always_send_emails: فرستادن همیشگی آگاهی‌های رایانامه‌ای setting_auto_play_gif: پخش خودکار تصویرهای متحرک + setting_boost_modal: واپایش نمایانی توثیت setting_default_language: زبان نوشته‌های شما + setting_default_privacy: نمایانی فرسته setting_default_quote_policy: افراد مجاز به نقل setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن + setting_delete_modal: هشدار پیش از حذف کردن فرسته setting_disable_hover_cards: از کار انداختن پیش‌نمایش نمایه هنگام رفتن رویش setting_disable_swiping: از کار انداختن حرکت‌های کشیدنی setting_display_media: نمایش عکس و ویدیو @@ -243,6 +248,8 @@ fa: setting_emoji_style: سبک شکلک setting_expand_spoilers: همیشه فرسته‌هایی را که هشدار محتوا دارند کامل نشان بده setting_hide_network: نهفتن شبکهٔ ارتباطی + setting_missing_alt_text_modal: هشدار پیش از فرستادن رسانه بدون متن جایگزین + setting_quick_boosting: به کار انداختن تقویت سریع setting_reduce_motion: کاستن از حرکت در پویانمایی‌ها setting_system_font_ui: به‌کاربردن قلم پیش‌فرض سیستم setting_system_scrollbars_ui: از نوار اسکرول پیش فرض سیستم استفاده کنید @@ -276,12 +283,17 @@ fa: content_cache_retention_period: دوره نگهداری محتوا از راه دور custom_css: سبک CSS سفارشی favicon: نمادک + landing_page: صفحهٔ فرود برای بینندگان جدید + local_live_feed_access: دسترسی به خوراک‌های زندهٔ نمایانگر فرسته‌های محلی + local_topic_feed_access: دسترسی به خوراک‌های پیوند و برچسب‌های نمایانگر فرسته‌های محلی mascot: نشان سفارشی (قدیمی) media_cache_retention_period: دورهٔ نگه‌داری انبارهٔ رسانه min_age: کمینهٔ سن لازم peers_api_enabled: انتشار سیاههٔ کارسازهای کشف شده در API profile_directory: به کار انداختن شاخهٔ نمایه registrations_mode: چه کسانی می‌توانند ثبت‌نام کنند + remote_live_feed_access: دسترسی به خوراک‌های زندهٔ نمایانگر فرسته‌های دوردست + remote_topic_feed_access: دسترسی به خوراک‌های پیوند و برچسب‌های نمایانگر فرسته‌های دوردست require_invite_text: نیازمند دلیلی برای پیوستن show_domain_blocks: نمایش مسدودیت‌های دامنه show_domain_blocks_rationale: نمایش چرایی مسدودیت دامنه‌ها diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 296d5def5b63f2..048c27e9871031 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -93,7 +93,7 @@ fi: content_cache_retention_period: Kaikki muiden palvelinten julkaisut (mukaan lukien tehostukset ja vastaukset) poistuvat, kun määritetty määrä päiviä on kulunut, lukuun ottamatta paikallisen käyttäjän vuorovaikutusta näiden julkaisujen kanssa. Tämä sisältää julkaisut, jotka paikallinen käyttäjä on merkinnyt kirjanmerkiksi tai suosikiksi. Myös yksityismaininnat eri palvelinten käyttäjien välillä menetetään, eikä niitä voi palauttaa. Tämä asetus on tarkoitettu käytettäväksi erityistapauksissa ja rikkoo monia käyttäjien odotuksia, kun sitä sovelletaan yleiskäyttöön. custom_css: Voit käyttää mukautettuja tyylejä Mastodonin selainversiossa. favicon: WEBP, PNG, GIF tai JPG. Korvaa oletusarvoisen Mastodonin sivustokuvakkeen haluamallasi kuvakkeella. - landing_page: Valitsee mitä sivua uudet kävijät näkevät saapuessaan palvelimellesi. Jos valitset "Trendit", trendien tulee olla käytössä Löytöasetuksissa. Jos valitset "Paikallinen syöte", "Pääsy paikallisten julkaisujen live-syötteisiin" tulee asettaa "Kaikille" Löytöasetuksissa. + landing_page: Valitsee, minkä sivun uudet kävijät näkevät saapuessaan palvelimellesi. Jos valitset ”Trendit”, trendien tulee olla käytössä Löydettävyys-asetuksissa. Jos valitset ”Paikallinen syöte”, kohta ”Pääsy paikallisia julkaisuja esitteleviin livesyötteisiin” tulee asettaa arvoon ”Kaikki” Löydettävyys-asetuksissa. mascot: Korvaa kuvituksen edistyneessä selainkäyttöliittymässä. media_cache_retention_period: Etäkäyttäjien tekemien julkaisujen mediatiedostot ovat välimuistissa palvelimellasi. Kun kentän arvo on positiivinen, media poistuu, kun määritetty määrä päiviä on kulunut. Jos mediaa pyydetään sen poistamisen jälkeen, se ladataan uudelleen, jos lähdesisältö on vielä saatavilla. Koska linkkien esikatselun kyselyitä kolmansien osapuolien sivustoille on rajoitettu, on suositeltavaa asettaa tämä arvo vähintään 14 päivään, tai linkkien kortteja ei päivitetä pyynnöstä ennen tätä ajankohtaa. min_age: Käyttäjiä pyydetään rekisteröitymisen aikana vahvistamaan syntymäpäivänsä @@ -145,7 +145,7 @@ fi: admin_email: Oikeudellisiin ilmoituksiin kuuluvat vastailmoitukset, oikeuden määräykset, poistopyynnöt ja lainvalvontaviranomaisten pyynnöt. arbitration_address: Voi olla sama kuin edellä mainittu Fyysinen osoite tai ”N/A”, jos käytät sähköpostia. arbitration_website: Voi olla verkkolomake tai ”N/A”, jos käytät sähköpostia. - choice_of_law: Kaupunki, alue, territoriumi tai valtio, jonka sisäiset substantiiviset lait säätelevät kaikkia vaateita. + choice_of_law: Kaupunki, alue, territorio tai valtio, jonka sisäinen aineellinen oikeus säätelee kaikkia vaatimuksia. dmca_address: Yhdysvaltalaisten operaattoreiden on käytettävä DMCA Designated Agent Directory -luetteloon rekisteröityä osoitetta. Postilokeroluettelo on saatavissa suoralla pyynnöllä, joten käytä DMCA Designated Agent Post Office Box Waiver Request -lomaketta lähettääksesi sähköpostia tekijänoikeusvirastolle ja kuvaile, että olet kotona toimiva sisältömoderaattori, joka pelkää kostoa tai rangaistusta toimistaan ja tarvitsee postilokeroa pitääkseen kotiosoitteensa poissa julkisuudesta. dmca_email: Voi olla sama kuin edellä mainittu ”Sähköpostiosoite oikeudellisille ilmoituksille”. domain: Tarjoamasi verkkopalvelun yksilöllinen tunniste. @@ -174,7 +174,7 @@ fi: labels: account: attribution_domains: Verkkosivustot, jotka voivat antaa sinulle tunnustusta - discoverable: Pidä profiiliasi ja julkaisujasi esillä löytämisalgoritmeissa + discoverable: Pidä profiiliasi ja julkaisujasi esillä löydettävyysalgoritmeissa fields: name: Nimike value: Sisältö diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index b0dae17121ed48..676b7638db9038 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -56,6 +56,7 @@ fr-CA: scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez une permission générale, vous n’avez pas besoin de sélectionner les permissions plus précises. setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (n’affecte que les partages futurs) setting_always_send_emails: Normalement, les notifications par courriel ne seront pas envoyées lorsque vous utilisez Mastodon activement + setting_default_quote_policy_unlisted: Lorsque des personnes vous citent, leur message sera également masqué des fils des tendances. setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic setting_display_media_default: Masquer les médias marqués comme sensibles setting_display_media_hide_all: Toujours masquer les médias @@ -223,17 +224,23 @@ fr-CA: setting_aggregate_reblogs: Grouper les partages dans les fils d’actualités setting_always_send_emails: Toujours envoyer les notifications par courriel setting_auto_play_gif: Lire automatiquement les GIFs animés + setting_boost_modal: Configurer la visibilité du partage setting_default_language: Langue de publication + setting_default_privacy: Visibilité de la publication setting_default_quote_policy: Autoriser les citations pour setting_default_sensitive: Toujours marquer les médias comme sensibles + setting_delete_modal: M'avertir avant de supprimer un message setting_disable_hover_cards: Désactiver l'aperçu du profil au survol setting_disable_swiping: Désactiver les actions par glissement setting_display_media: Affichage des médias setting_display_media_default: Défaut setting_display_media_hide_all: Masquer tout setting_display_media_show_all: Montrer tout + setting_emoji_style: Style des émojis setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau + setting_missing_alt_text_modal: M'avertir avant de publier des médias sans texte alternatif + setting_quick_boosting: Activer le partage rapide setting_reduce_motion: Réduire la vitesse des animations setting_system_font_ui: Utiliser la police par défaut du système setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système @@ -267,6 +274,7 @@ fr-CA: content_cache_retention_period: Durée de rétention du contenu distant custom_css: CSS personnalisé favicon: Favicon + landing_page: Page d'accueil pour les nouveaux visiteurs mascot: Mascotte personnalisée (héritée) media_cache_retention_period: Durée de rétention des médias dans le cache min_age: Âge minimum requis @@ -311,6 +319,7 @@ fr-CA: follow_request: Quelqu’un demande à me suivre mention: Quelqu’un me mentionne pending_account: Nouveau compte en attente d’approbation + quote: Quelqu'un vous a cité reblog: Quelqu’un a partagé mon message report: Nouveau signalement soumis software_updates: @@ -357,6 +366,10 @@ fr-CA: name: Nom permissions_as_keys: Autorisations position: Priorité + username_block: + allow_with_approval: Autoriser les inscriptions avec approbation + comparison: Méthode de comparaison + username: Mot à faire correspondre webhook: events: Événements activés template: Modèle de charge utile diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 270a259dec1d4c..109cb4184ebfae 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -56,6 +56,7 @@ fr: scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez une permission générale, vous n’avez pas besoin de sélectionner les permissions plus précises. setting_aggregate_reblogs: Ne pas afficher les nouveaux partages pour les messages déjà récemment partagés (n’affecte que les partages futurs) setting_always_send_emails: Normalement, les notifications par courriel ne seront pas envoyées lorsque vous utilisez Mastodon activement + setting_default_quote_policy_unlisted: Lorsque des personnes vous citent, leur message sera également masqué des fils des tendances. setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic setting_display_media_default: Masquer les médias marqués comme sensibles setting_display_media_hide_all: Toujours masquer les médias @@ -223,17 +224,23 @@ fr: setting_aggregate_reblogs: Grouper les partages dans les fils d’actualités setting_always_send_emails: Toujours envoyer les notifications par courriel setting_auto_play_gif: Lire automatiquement les GIFs animés + setting_boost_modal: Configurer la visibilité du partage setting_default_language: Langue de publication + setting_default_privacy: Visibilité de la publication setting_default_quote_policy: Autoriser les citations pour setting_default_sensitive: Toujours marquer les médias comme sensibles + setting_delete_modal: M'avertir avant de supprimer un message setting_disable_hover_cards: Désactiver l'aperçu du profil au survol setting_disable_swiping: Désactiver les actions par glissement setting_display_media: Affichage des médias setting_display_media_default: Défaut setting_display_media_hide_all: Masquer tout setting_display_media_show_all: Montrer tout + setting_emoji_style: Style des émojis setting_expand_spoilers: Toujours déplier les messages marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau + setting_missing_alt_text_modal: M'avertir avant de publier des médias sans texte alternatif + setting_quick_boosting: Activer le partage rapide setting_reduce_motion: Réduire la vitesse des animations setting_system_font_ui: Utiliser la police par défaut du système setting_system_scrollbars_ui: Utiliser la barre de défilement par défaut du système @@ -267,6 +274,7 @@ fr: content_cache_retention_period: Durée de rétention du contenu distant custom_css: CSS personnalisé favicon: Favicon + landing_page: Page d'accueil pour les nouveaux visiteurs mascot: Mascotte personnalisée (héritée) media_cache_retention_period: Durée de rétention des médias dans le cache min_age: Âge minimum requis @@ -311,6 +319,7 @@ fr: follow_request: Quelqu’un demande à vous suivre mention: Quelqu’un vous a mentionné⋅e pending_account: Nouveau compte en attente d’approbation + quote: Quelqu'un vous a cité reblog: Quelqu’un a partagé votre message report: Nouveau signalement soumis software_updates: @@ -357,6 +366,10 @@ fr: name: Nom permissions_as_keys: Autorisations position: Priorité + username_block: + allow_with_approval: Autoriser les inscriptions avec approbation + comparison: Méthode de comparaison + username: Mot à faire correspondre webhook: events: Événements activés template: Modèle de payload diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index bc4c3b7f0a9c10..3f918c2eb4749e 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -65,7 +65,7 @@ gd: setting_display_media_hide_all: Falaich na meadhanan an-còmhnaidh setting_display_media_show_all: Seall na meadhanan an-còmhnaidh setting_emoji_style: An dòigh air an dèid emojis a shealltainn. Feuchaidh “Fèin-obrachail” ris na h-emojis tùsail a chleachdadh ach thèid Twemoji a chleachdadh ’nan àite air seann-bhrabhsairean. - setting_quick_boosting_html: Ma tha seo an comas, ma nì thu briogadh air ìomhaigheag %{boost_icon} a’ bhrosnachaidh, thèid a bhriosnachadh sa bhad seach a bhith a’ fosgladh clàr-taice teàrnach a’ bhrosnachaidh/luaidh. Thèid gnìomh an luaidh a ghluasad gu clàr-taice nan %{options_icon} (roghainnean). + setting_quick_boosting_html: Ma tha seo an comas, ma nì thu briogadh air ìomhaigheag %{boost_icon} a’ bhrosnachaidh, thèid a bhrosnachadh sa bhad seach a bhith a’ fosgladh clàr-taice teàrnach a’ bhrosnachaidh/luaidh. Thèid gnìomh an luaidh a ghluasad gu clàr-taice %{options_icon} nan roghainnean. setting_system_scrollbars_ui: Chan obraich seo ach air brabhsairean desktop stèidhichte air Safari ’s Chrome setting_use_blurhash: Tha caiseadan stèidhichte air dathan nan nithean lèirsinneach a chaidh fhalach ach chan fhaicear am mion-fhiosrachadh setting_use_pending_items: Falaich ùrachaidhean na loidhne-ama air cùlaibh briogaidh seach a bhith a’ sgroladh nam postaichean gu fèin-obrachail @@ -93,6 +93,7 @@ gd: content_cache_retention_period: Thèid a h-uile post o fhrithealaiche sam bith eile (a’ gabhail a-staigh brosnachaidhean is freagairtean) a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu ’s gun diù a chon air eadar-ghabhail ionadail air na postaichean ud. Gabhaidh seo a-steach na postaichean a chuir cleachdaiche ionadail ris na h-annsachdan aca no comharran-lìn riutha. Thèid iomraidhean prìobhaideach eadar cleachdaichean o ionstansan diofraichte air chall cuideachd agus cha ghabh an aiseag idir. Tha an roghainn seo do dh’ionstansan sònraichte a-mhàin agus briseadh e dùilean an luchd-cleachdaidh nuair a rachadh a chleachdadh gu coitcheann. custom_css: "’S urrainn dhut stoidhlean gnàthaichte a chur an sàs air an tionndadh-lìn de Mhastodon." favicon: WEBP, PNG, GIF no JPG. Tar-àithnidh seo favicon bunaiteach Mhastodon le ìomhaigheag ghnàthaichte. + landing_page: Taghaidh seo an duilleag a chì aoighean ùra nuair a thadhlas air an fhrithealaiche agad a’ chiad turas. ma thaghas tu “Treandaichean”, feumaidh tu na treandaichean a chur an comas ann ann roghainnean an rùrachaidh. Ma thaghas tu “Loidhne-ama ionadail”, feumaidh tu “Inntrigeadh dhan t-saoghal bheò sa bheil postaichean ionadail” a shuidheachadh air “A h-uile duine” ann an roghainnean an rùrachaidh. mascot: Tar-àithnidh seo an sgead-dhealbh san eadar-aghaidh-lìn adhartach. media_cache_retention_period: Thèid faidhlichean meadhain o phostaichean a chruthaich cleachdaichean cèine a chur ri tasgadan an fhrithealaiche agad. Nuair a shuidhicheas tu seo air luach dearbh, thèid na meadhanan a sguabadh às às dèidh na h-àireimh de làithean a shònraich thu. Ma tha dàta meadhain ga iarraidh às dèidh a sguabaidh às, thèid a luchdadh a-nuas a-rithist ma tha susbaint an tùis ri fhaighinn fhathast. Ri linn cuingeachaidhean air mar a cheasnaicheas cairtean ro-sheallaidh làraichean threas-phàrtaidhean, mholamaid gun suidhich thu an luach seo air 14 làithean ar a char as giorra no cha dèid an ùrachadh nuair a thèid an iarraidh ron àm sin. min_age: Thèid iarraidh air an luchd-cleachdaidh gun dearbh iad an là-breith rè a’ chlàraidh @@ -288,6 +289,7 @@ gd: content_cache_retention_period: Ùine glèidhidh aig susbaint chèin custom_css: CSS gnàthaichte favicon: Favicon + landing_page: An duilleag-laighe do dh’aoighean ùra local_live_feed_access: Inntrigeadh dhan t-saoghal bheò sa bheil postaichean ionadail local_topic_feed_access: Inntrigeadh dha loidhnichean-ama nan tagaichean hais is ceanglaichean sa bheil postaichean ionadail mascot: Suaichnean gnàthaichte (dìleabach) diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 0e41641d61b31f..b1e05c672f5361 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -93,6 +93,7 @@ hu: content_cache_retention_period: Minden más kiszolgálóról származó bejegyzés (megtolásokkal és válaszokkal együtt) törölve lesz a megadott számú nap elteltével, függetlenül a helyi felhasználók ezekkel a bejegyzésekkel történő interakcióitól. Ebben azok a bejegyzések is benne vannak, melyeket a helyi felhasználó könyvjelzőzött vagy kedvencnek jelölt. A különböző kiszolgálók felhasználói közötti privát üzenetek is el fognak veszni visszaállíthatatlanul. Ennek a beállításnak a használata különleges felhasználási esetekre javasolt, mert számos felhasználói elvárás fog eltörni, ha általános céllal használják. custom_css: A Mastodon webes verziójában használhatsz egyéni stílusokat. favicon: WEBP, PNG, GIF vagy JPG. Az alapértelmezett Mastodon favicont felülírja egy egyéni ikonnal. + landing_page: Kiválasztja, hogy a webhely új látogatói mit látnak, amikor először érkeznek a kiszolgálóra. Ha a „Trendek” lehetőséget választod, akkor engedélyezni kell a trendeket a Felfedezési beállításokban. Ha a „Helyi hírfolyamot” választod, akkor a „Helyi bejegyzéseket tartalmazó helyi élő idővonalak elérése” lehetőséget „Mindenki” értékre kell állítani a Felfedezési beállításokban. mascot: Felülbírálja a speciális webes felületen található illusztrációt. media_cache_retention_period: A távoli felhasználók bejegyzéseinek médiatartalmait a kiszolgálód gyorsítótárazza. Ha pozitív értékre állítják, ezek a médiatartalmak a megadott számú nap után törölve lesznek. Ha a médiát újra lekérik, miután törlődött, újra le fogjuk tölteni, ha az eredeti még elérhető. A hivatkozások előnézeti kártyáinak harmadik fél weboldalai felé történő hivatkozásaira alkalmazott megkötései miatt javasolt, hogy ezt az értéket legalább 14 napra állítsuk, ellenkező esetben a hivatkozások előnézeti kártyái szükség esetén nem fognak tudni frissülni ezen idő előtt. min_age: A felhasználók a regisztráció során arra lesznek kérve, hogy erősítsek meg a születési dátumukat @@ -286,6 +287,7 @@ hu: content_cache_retention_period: Távoli tartalmak megtartási időszaka custom_css: Egyéni CSS favicon: Könyvjelzőikon + landing_page: Kezdőoldal az új látogatóknak local_live_feed_access: Helyi bejegyzéseket bemutató élő hírfolyamok elérése local_topic_feed_access: Helyi bejegyzéseket bemutató hashtagek és hivatkozásfolyamok elérése mascot: Egyéni kabala (örökölt) diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index bc06874e3092e8..4386ba1b32af2e 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -93,6 +93,7 @@ it: content_cache_retention_period: Tutti i post da altri server (inclusi booster e risposte) verranno eliminati dopo il numero specificato di giorni, senza tener conto di eventuali interazioni con gli utenti locali con tali post. Questo include i post in cui un utente locale ha contrassegnato come segnalibri o preferiti. Anche le menzioni private tra utenti di diverse istanze andranno perse e impossibile da ripristinare. L'uso di questa impostazione è inteso per casi di scopo speciale e rompe molte aspettative dell'utente quando implementato per uso generale. custom_css: È possibile applicare stili personalizzati sulla versione web di Mastodon. favicon: WEBP, PNG, GIF o JPG. Sostituisce la favicon predefinita di Mastodon con un'icona personalizzata. + landing_page: Seleziona quale pagina vedono i nuovi visitatori al loro primo arrivo sul tuo server. Se selezioni "Tendenze", è necessario abilitare le tendenze nelle Impostazioni di scoperta. Se selezioni "Feed locale", allora è necessario impostare "Accesso ai feed in diretta con post locali" su "Tutti" nelle Impostazioni di scoperta. mascot: Sostituisce l'illustrazione nell'interfaccia web avanzata. media_cache_retention_period: I file multimediali da post fatti da utenti remoti sono memorizzati nella cache sul tuo server. Quando impostato a un valore positivo, i media verranno eliminati dopo il numero specificato di giorni. Se i dati multimediali sono richiesti dopo che sono stati eliminati, saranno nuovamente scaricati, se il contenuto sorgente è ancora disponibile. A causa di restrizioni su quanto spesso link anteprima carte sondaggio siti di terze parti, si consiglia di impostare questo valore ad almeno 14 giorni, o le schede di anteprima link non saranno aggiornate su richiesta prima di quel tempo. min_age: Agli utenti verrà chiesto di confermare la propria data di nascita durante l'iscrizione @@ -286,6 +287,7 @@ it: content_cache_retention_period: Periodo di ritenzione del contenuto remoto custom_css: Personalizza CSS favicon: Favicon + landing_page: Pagina di destinazione per i nuovi visitatori local_live_feed_access: Accesso ai feed dal vivo con post locali local_topic_feed_access: Accesso a feed di hashtag e link con post locali mascot: Personalizza mascotte (legacy) diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index cea5cd5b4357b7..06972f91d478be 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -314,6 +314,7 @@ ja: setting_hide_status_reference_unavailable_server: ひかえめな引用(Fedibirdの参照)に対応していないと思われるサーバーの投稿からメニューを隠す setting_lock_follow_from_bot: botからのフォローを承認制にする setting_public_post_to_unlisted: サードパーティから公開範囲「公開」で投稿した場合、「ローカル公開」に変更する + setting_quick_boosting: クイックブーストの有効化 setting_reduce_motion: アニメーションの動きを減らす setting_reject_public_unlisted_subscription: Misskey系サーバーに「ローカル公開」かつ検索許可「誰でも以外」の投稿を「フォロワーのみ」に変換して配送する setting_reject_send_limited_to_suspects: Misskey系サーバーに「相互のみ」投稿を配送しない diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 4e06281ece2d64..6f3acf712b71a9 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -29,6 +29,7 @@ kab: name: 'Ha-t-an kra seg ihacṭagen i tesseqdaceḍ ussan-a ineggura maḍi :' form_admin_settings: min_age: Ad ttwasutren yiseqdacen ad sentemen azemz-nsen n tlalit deg ujerred + site_contact_username: Amek i zemren ad ak·em-id-afen medden ɣef Mastodon. form_challenge: current_password: Tkecmeḍ ɣer temnaḍt taɣellsant imports: @@ -152,6 +153,7 @@ kab: tag: name: Ahacṭag terms_of_service: + changelog: Amaynut? text: Tiwtilin n useqdec terms_of_service_generator: domain: Taɣult diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 5b7c6f33e0e250..b8348032f47f6e 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -89,7 +89,7 @@ ko: backups_retention_period: 사용자들은 나중에 다운로드하기 위해 게시물 아카이브를 생성할 수 있습니다. 양수로 설정된 경우 이 아카이브들은 지정된 일수가 지난 후에 저장소에서 자동으로 삭제될 것입니다. bootstrap_timeline_accounts: 이 계정들은 팔로우 추천 목록 상단에 고정됩니다. closed_registrations_message: 새 가입을 차단했을 때 표시됩니다 - content_cache_retention_period: 다른 서버의 모든 게시물(부스트 및 답글 포함)은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 비공개 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다. + content_cache_retention_period: "(부스트 및 답글 포함) 다른 서버의 모든 게시물은 해당 게시물에 대한 로컬 사용자의 상호 작용과 관계없이 지정된 일수가 지나면 삭제됩니다. 여기에는 로컬 사용자가 북마크 또는 즐겨찾기로 표시한 게시물도 포함됩니다. 다른 인스턴스 사용자와 주고 받은 개인 멘션도 손실되며 복원할 수 없습니다. 이 설정은 특수 목적의 인스턴스를 위한 것이며 일반적인 용도의 많은 사용자의 예상이 빗나가게 됩니다." custom_css: 사용자 지정 스타일을 웹 버전의 마스토돈에 지정할 수 있습니다. favicon: WEBP, PNG, GIF 또는 JPG. 기본 파비콘을 대체합니다. mascot: 고급 웹 인터페이스의 그림을 대체합니다. diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index f6916c35475f63..d864464b5a2ddb 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -93,6 +93,7 @@ nn: content_cache_retention_period: Alle innlegg frå andre tenarar (inkludert framhevingar og svar) vil bli sletta etter talet på dagar du skriv inn, uansett om nokon har samhandla med desse innlegga. Dette inkluderer innlegg der ein lokal brukar har merka det som bokmerke eller som favoritt. Private omtalar mellom brukarar frå ulike nettstader vil gå tapt og vera umogleg å gjenskapa. Bruk av denne innstillinga er meint for spesielle nettstader og bryt med det mange forventar av ein vanleg nettstad. custom_css: Du kan bruka eigendefinerte stilar på nettversjonen av Mastodon. favicon: WEBP, PNG, GIF eller JPG. Overstyrer det standarde Mastodon-favikonet med eit eigendefinert ikon. + landing_page: Vel kva side nye lesarar ser når dei kjem til tenaren din. Viss du vel «Populært», må du ha skrudd på dette i innstillingane for oppdaging. Viss du vel «Lokalstraum», må du la alle få sjå lokale straumar i innstillingane for oppdaging. mascot: Overstyrer illustrasjonen i det avanserte webgrensesnittet. media_cache_retention_period: Mediafiler frå innlegg laga av eksterne brukarar blir bufra på serveren din. Når sett til ein positiv verdi, slettast media etter eit gitt antal dagar. Viss mediedata blir førespurt etter det er sletta, vil dei bli lasta ned på nytt viss kjelda sitt innhald framleis er tilgjengeleg. På grunn av restriksjonar på kor ofte lenkeførehandsvisningskort lastar tredjepart-nettstadar, rådast det til å setje denne verdien til minst 14 dagar, eller at førehandsvisningskort ikkje blir oppdatert på førespurnad før det tidspunktet. min_age: Brukarane vil bli bedne om å stadfesta fødselsdatoen sin når dei registrerer seg @@ -286,6 +287,7 @@ nn: content_cache_retention_period: Oppbevaringstid for eksternt innhald custom_css: Egendefinert CSS favicon: Favorittikon + landing_page: Startside for nye lesarar local_live_feed_access: Tilgang til direktestraumar med lokale innlegg local_topic_feed_access: Tilgang til merkelapp- og lenkestraumar med lokale innlegg mascot: Eigendefinert maskot (eldre funksjon) diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 605bcf8d98ca46..4ba1bae9fce515 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -54,8 +54,10 @@ pt-BR: password: Use pelo menos 8 caracteres phrase: Corresponderá independente de maiúsculas ou minúsculas, no texto ou no Aviso de Conteúdo de um toot scopes: Quais APIs o aplicativo vai ter permissão de acessar. Se você selecionar uma autorização de alto nível, você não precisa selecionar individualmente os outros. + setting_advanced_layout: Exiba o Mastodon em um layout de várias colunas, permitindo que você visualize a linha do tempo, as notificações e uma terceira coluna de sua escolha. Não recomendado para telas menores. setting_aggregate_reblogs: Não mostrar novos impulsos para publicações que já foram impulsionadas recentemente (afeta somente os impulsos mais recentes) setting_always_send_emails: Normalmente, as notificações por e-mail não serão enviadas enquanto você estiver usando ativamente o Mastodon + setting_boost_modal: Quando ativada, a função de impulsionar primeiro abrirá uma caixa de diálogo de confirmação na qual você poderá alterar a visibilidade do seu impulsionamento. setting_default_quote_policy_private: Publicações exclusivas de seguidores criadas no Mastodon não podem ser citadas por outras pessoas. setting_default_quote_policy_unlisted: Quando as pessoas citarem você, suas publicações também ficarão ocultas da linha do tempo. setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique @@ -63,6 +65,7 @@ pt-BR: setting_display_media_hide_all: Sempre ocultar todas as mídias setting_display_media_show_all: Sempre mostrar mídia sensível setting_emoji_style: Como exibir emojis. "Automáticos" tentará usar emojis nativos, mas voltará para o Twemoji para navegadores legados. + setting_quick_boosting_html: Quando ativado, clicar no ícone de impulsionamento %{boost_icon} impulsionará imediatamente o texto, em vez de abrir o menu suspenso de impulsionamento/cotação. Move a ação de cotação para o menu %{options_icon} (Opções). setting_system_scrollbars_ui: Se aplica apenas para navegadores de computador baseado no Safari e Chrome setting_use_blurhash: O blur é baseado nas cores da imagem oculta, ofusca a maioria dos detalhes setting_use_pending_items: Ocultar atualizações da linha do tempo atrás de um clique ao invés de rolar automaticamente @@ -90,6 +93,7 @@ pt-BR: content_cache_retention_period: Todas as postagens de outros servidores (incluindo boosts e respostas) serão excluídas após o número especificado de dias, sem levar a qualquer interação do usuário local com esses posts. Isto inclui postagens onde um usuário local o marcou como favorito ou favoritos. Menções privadas entre usuários de diferentes instâncias também serão perdidas e impossíveis de restaurar. O uso desta configuração destina-se a instâncias especiais de propósitos e quebra muitas expectativas dos usuários quando implementadas para uso de propósito geral. custom_css: Você pode aplicar estilos personalizados na versão da web do Mastodon. favicon: WEBP, PNG, GIF ou JPG. Sobrescreve o favicon padrão do Mastodon com um ícone personalizado. + landing_page: Seleciona a página que os novos visitantes veem ao acessar seu servidor pela primeira vez. Se você selecionar "Tendências", as tendências precisam estar ativadas nas Configurações de Descoberta. Se você selecionar "Feed local", o "Acesso a feeds ao vivo com publicações locais" precisa estar definido como "Todos" nas Configurações de Descoberta. mascot: Substitui a ilustração na interface web avançada. media_cache_retention_period: Arquivos de mídia de mensagens de usuários remotos são armazenados em cache no seu servidor. Quando definido como valor positivo, a mídia será excluída após o número especificado de dias. Se os dados da mídia forem solicitados depois de excluídos, eles serão baixados novamente, se o conteúdo fonte ainda estiver disponível. Devido a restrições de quantas vezes os cartões de visualização de links sondam sites de terceiros, é recomendado definir este valor em pelo menos 14 dias, ou pré-visualização de links não serão atualizados a pedido antes desse tempo. min_age: Os usuários precisarão confirmar sua data de nascimento no cadastro @@ -233,6 +237,7 @@ pt-BR: setting_aggregate_reblogs: Agrupar boosts nas linhas setting_always_send_emails: Sempre enviar notificações por e-mail setting_auto_play_gif: Reproduzir GIFs automaticamente + setting_boost_modal: Controle que aumenta a visibilidade setting_default_language: Idioma dos toots setting_default_privacy: Visibilidade da publicação setting_default_quote_policy: Quem pode citar @@ -248,6 +253,7 @@ pt-BR: setting_expand_spoilers: Sempre expandir toots com Aviso de Conteúdo setting_hide_network: Ocultar suas relações setting_missing_alt_text_modal: Avise-me antes de publicar mídia sem texto alternado + setting_quick_boosting: Ativar aceleração rápida setting_reduce_motion: Reduzir animações setting_system_font_ui: Usar fonte padrão do sistema setting_system_scrollbars_ui: Usar barra de rolagem padrão do sistema diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index c740aba19f62c4..d43dfbcf1ec8c4 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -26,9 +26,9 @@ zh-CN: types: disable: 禁止用户使用账号,但不会删除或隐藏账号内容。 none: 用它来向用户发送警告,不会触发其他操作。 - sensitive: 强制将此用户的所有媒体文件标记为敏感内容。 - silence: 阻止用户发送公开嘟文,除了关注者以外,其他人都无法看到他的嘟文和通知。关闭针对此账号的所有举报。 - suspend: 阻止此账号的任何交互并删除其内容。30天内可以撤销操作。关闭针对此账号的所有举报。 + sensitive: 强制将此用户的全部媒体文件标记为敏感内容。 + silence: 阻止用户发送公开嘟文,除了关注者以外,其他人都无法看到他的嘟文和通知。关闭针对此账号的全部举报。 + suspend: 阻止此账号的任何交互并删除其内容。30天内可以撤销操作。关闭针对此账号的全部举报。 warning_preset_id: 可选。你可以在预置文本末尾添加自定义文本 announcement: all_day: 如果选中,只有该时间段内的日期会显示。 @@ -54,7 +54,7 @@ zh-CN: password: 至少需要8个字符 phrase: 匹配将忽略嘟文或内容警告里的字母大小写 scopes: 哪些 API 被允许使用。如果你勾选了更高一级的范围,就不用单独选中子项目了。 - setting_advanced_layout: 将Mastodon的界面显示为多列布局,允许您同时查看时间线、通知及可自主选择的第三列。屏幕尺寸较小的情况下不推荐使用。 + setting_advanced_layout: 将 Mastodon 的界面显示为多列布局,允许你同时查看时间线、通知及可自主选择的第三列。屏幕尺寸较小的情况下不推荐使用。 setting_aggregate_reblogs: 不显示最近已经被转嘟过的嘟文(只会影响新收到的转嘟) setting_always_send_emails: 一般情况下,如果你活跃使用 Mastodon,我们不会向你发送电子邮件通知 setting_boost_modal: 如果启用,转嘟前会先打开确认对话框,以便更改转嘟的可见性。 @@ -97,7 +97,7 @@ zh-CN: mascot: 覆盖高级网页界面中的绘图形象。 media_cache_retention_period: 来自外站用户嘟文的媒体文件将被缓存到你的实例上。当该值被设为正值时,缓存的媒体文件将在指定天数后被清除。如果媒体文件在被清除后重新被请求,且源站内容仍然可用,它将被重新下载。由于链接预览卡拉取第三方站点的频率受到限制,建议将此值设置为至少 14 天,如果小于该值,链接预览卡将不会按需更新。 min_age: 用户注册时必须确认出生日期 - peers_api_enabled: 本站在联邦宇宙中遇到的站点列表。 此处不包含关于您是否与给定站点联合的数据,只是您的实例知道它。 这由收集一般意义上的联合统计信息的服务使用。 + peers_api_enabled: 本站在联邦宇宙中遇到的站点列表。 此处不包含关于你是否与给定站点联合的数据,只是你的实例知道它。 这由收集一般意义上的联合统计信息的服务使用。 profile_directory: 个人资料目录会列出所有选择可被发现的用户。 require_invite_text: 当注册需要手动批准时,将“你为什么想要加入?”设为必填项 site_contact_email: 他人需要询恰法务或支持信息时的联络方式 @@ -139,22 +139,22 @@ zh-CN: name: 你只能改变字母的大小写,让它更易读 terms_of_service: changelog: 可以使用 Markdown 语法。 - effective_date: 合理的时间范围可以是从您通知用户之日起 10 到 30 天。 + effective_date: 合理的时间范围可以是从你通知用户之日起 10 到 30 天。 text: 可以使用 Markdown 语法。 terms_of_service_generator: admin_email: 法务通知包括反通知、法院命令、内容下架要求与执法机关的要求。 arbitration_address: 可以与上面的实际地址相同,如果使用电子邮件则为“N/A”。 arbitration_website: 可以是网页表单,如果使用电子邮件则为“N/A”。 - choice_of_law: 适用内部实质法律以管辖任何及所有索赔的城市、地区、领土或州。 + choice_of_law: 适用内部实质法律以管辖任何及全部索赔的城市、地区、领土或州。 dmca_address: 如果你是位于美国的运营者,请使用在 DMCA 指定代表名录中注册的地址。如果你需要使用邮政信箱,可以直接申请。请使用 DMCA 指定代表邮政信箱豁免申请表,通过电子邮件联系版权办公室,并声明你是居家内容审核员,因担心审核操作会招致报复或打击报复,需要使用邮政信箱以避免公开家庭住址。 dmca_email: 可以与上面“法律声明的电子邮件地址”使用相同的电子邮件地址。 domain: 你所提供的在线服务的唯一标识。 jurisdiction: 请列出支付运营费用者所在的国家/地区。如果为公司或其他实体,请列出其注册的国家/地区以及相应的城市、地区、领地或州。 - min_age: 不应低于您所在地法律管辖权要求的最低年龄。 + min_age: 不应低于你所在地法律管辖权要求的最低年龄。 user: chosen_languages: 仅选中语言的嘟文会出现在公共时间线上(全不选则显示所有语言的嘟文) date_of_birth: - other: 我们必须确保您至少年满 %{count} 岁才能使用 %{domain}。我们不会存储此信息。 + other: 我们必须确保你至少年满 %{count} 岁才能使用 %{domain}。我们不会存储此信息。 role: 角色用于控制用户拥有的权限。 user_role: color: 在界面各处用于标记该角色的颜色,以十六进制 RGB 格式表示 @@ -339,7 +339,7 @@ zh-CN: reblog: 有人转嘟了我的嘟文 report: 有人提交了新举报 software_updates: - all: 通知所有更新 + all: 通知全部更新 critical: 仅在有关键更新时通知 label: 有新的 Mastodon 版本可用 none: 从不通知更新(不推荐) diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 6aa95821d467cf..819dcd555611c2 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1914,6 +1914,7 @@ sq: errors: in_reply_not_found: Gjendja të cilës po provoni t’i përgjigjeni s’duket se ekziston. quoted_status_not_found: Postimi që po rrekeni të citoni nuk duket se ekziston. + quoted_user_not_mentioned: S’mund të citohet një përdorues që s’është përmendur në një postim Përmendje Private. over_character_limit: u tejkalua kufi shenjash prej %{max} pin_errors: direct: Postimet që janë të dukshme vetëm për përdoruesit e përmendur s’mund të fiksohen diff --git a/config/locales/th.yml b/config/locales/th.yml index 202e2c0035a3f9..58fbfa65c1cc94 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -187,6 +187,7 @@ th: create_relay: สร้างรีเลย์ create_unavailable_domain: สร้างโดเมนที่ไม่พร้อมใช้งาน create_user_role: สร้างบทบาท + create_username_block: สร้างกฎชื่อผู้ใช้ demote_user: ลดขั้นผู้ใช้ destroy_announcement: ลบประกาศ destroy_canonical_email_block: ลบการปิดกั้นอีเมล @@ -200,6 +201,7 @@ th: destroy_status: ลบโพสต์ destroy_unavailable_domain: ลบโดเมนที่ไม่พร้อมใช้งาน destroy_user_role: ทำลายบทบาท + destroy_username_block: ลบกฎชื่อผู้ใช้ disable_2fa_user: ปิดใช้งาน 2FA disable_custom_emoji: ปิดใช้งานอีโมจิที่กำหนดเอง disable_relay: ปิดใช้งานรีเลย์ @@ -234,6 +236,7 @@ th: update_report: อัปเดตรายงาน update_status: อัปเดตโพสต์ update_user_role: อัปเดตบทบาท + update_username_block: อัปเดตกฎชื่อผู้ใช้ actions: approve_appeal_html: "%{name} ได้อนุมัติการอุทธรณ์การตัดสินใจในการกลั่นกรองจาก %{target}" approve_user_html: "%{name} ได้อนุมัติการลงทะเบียนจาก %{target}" @@ -481,6 +484,7 @@ th: save: บันทึก sign_in: ลงชื่อเข้า status: สถานะ + title: FASP follow_recommendations: description_html: "คำแนะนำการติดตามช่วยให้ผู้ใช้ใหม่ค้นหาเนื้อหาที่น่าสนใจได้อย่างรวดเร็ว เมื่อผู้ใช้ไม่ได้โต้ตอบกับผู้อื่นมากพอที่จะสร้างคำแนะนำการติดตามเฉพาะบุคคล จะแนะนำบัญชีเหล่านี้แทน จะคำนวณคำแนะนำใหม่เป็นประจำทุกวันจากบัญชีต่าง ๆ ที่มีการมีส่วนร่วมล่าสุดสูงสุดและจำนวนผู้ติดตามในเซิร์ฟเวอร์สูงสุดสำหรับภาษาที่กำหนด" language: สำหรับภาษา @@ -792,6 +796,9 @@ th: all: ให้กับทุกคน disabled: ให้กับไม่มีใคร users: ให้กับผู้ใช้ในเซิร์ฟเวอร์ที่เข้าสู่ระบบ + landing_page: + values: + about: เกี่ยวกับ registrations: moderation_recommandation: โปรดตรวจสอบให้แน่ใจว่าคุณมีทีมการกลั่นกรองที่เพียงพอและมีปฏิกิริยาตอบสนองก่อนที่คุณจะเปิดการลงทะเบียนให้กับทุกคน! preamble: ควบคุมผู้ที่สามารถสร้างบัญชีในเซิร์ฟเวอร์ของคุณ @@ -1019,6 +1026,14 @@ th: other: ใช้โดย %{count} คนในช่วงสัปดาห์ที่ผ่านมา title: คำแนะนำและแนวโน้ม trending: กำลังนิยม + username_blocks: + delete: ลบ + edit: + title: แก้ไขกฎชื่อผู้ใช้ + new: + create: สร้างกฎ + title: สร้างกฎชื่อผู้ใช้ใหม่ + title: กฎชื่อผู้ใช้ warning_presets: add_new: เพิ่มใหม่ delete: ลบ @@ -1090,6 +1105,7 @@ th: hint_html: หากคุณต้องการย้ายจากบัญชีอื่นไปยังบัญชีนี้ ที่นี่คุณสามารถสร้างนามแฝง ซึ่งจำเป็นก่อนที่คุณจะสามารถดำเนินการต่อด้วยการย้ายผู้ติดตามจากบัญชีเก่าไปยังบัญชีนี้ การกระทำนี้โดยตัวการกระทำเอง ไม่เป็นอันตรายและย้อนกลับได้ การโยกย้ายบัญชีเริ่มต้นจากบัญชีเก่า remove: เลิกเชื่อมโยงนามแฝง appearance: + advanced_settings: การตั้งค่าขั้นสูง animations_and_accessibility: ภาพเคลื่อนไหวและการช่วยการเข้าถึง discovery: การค้นพบ localization: @@ -1465,6 +1481,11 @@ th: expires_at: หมดอายุเมื่อ uses: การใช้งาน title: เชิญผู้คน + link_preview: + author_html: โดย %{name} + potentially_sensitive_content: + action: คลิกเพื่อแสดง + hide_button: ซ่อน lists: errors: limit: คุณมีรายการถึงจำนวนสูงสุดแล้ว @@ -1765,6 +1786,9 @@ th: other: "%{count} วิดีโอ" boosted_from_html: ดันจาก %{acct_link} content_warning: 'คำเตือนเนื้อหา: %{warning}' + content_warnings: + hide: ซ่อนโพสต์ + show: แสดงเพิ่มเติม default_language: เหมือนกับภาษาส่วนติดต่อ disallowed_hashtags: other: 'มีแฮชแท็กที่ไม่อนุญาต: %{tags}' diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 3cedf77bbe360c..2d60feec5d577d 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1929,6 +1929,7 @@ tr: errors: in_reply_not_found: Yanıtlamaya çalıştığınız durum yok gibi görünüyor. quoted_status_not_found: Alıntılamaya çalıştığınız gönderi mevcut görünmüyor. + quoted_user_not_mentioned: Özel Bahsetme gönderisinde bahsedilmeyen bir kullanıcıyı alıntılamak mümkün değildir. over_character_limit: "%{max} karakter limiti aşıldı" pin_errors: direct: Sadece değinilen kullanıcıların görebileceği gönderiler üstte tutulamaz diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 0d3866f652083c..ea21c767af204e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1886,6 +1886,7 @@ vi: errors: in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại. quoted_status_not_found: Bạn đang trích dẫn một tút không còn tồn tại. + quoted_user_not_mentioned: Không thể trích dẫn người dùng không được nhắc đến trong tút Nhắn riêng. over_character_limit: vượt quá giới hạn %{max} ký tự pin_errors: direct: Không thể ghim những tút nhắn riêng diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index e7385e392e8137..69d9d9543517b2 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -71,7 +71,7 @@ zh-CN: enable_sign_in_token_auth: 启用邮件令牌身份验证 enabled: 已启用 enabled_msg: 成功解冻 %{username} 的账号 - followers: 粉丝 + followers: 关注者 follows: 关注 header: 封面图 inbox_url: 收件箱(Inbox)URL @@ -118,7 +118,7 @@ zh-CN: reject: 拒绝 rejected_msg: 已拒绝 %{username} 的注册申请 remote_suspension_irreversible: 此账号的数据已被不可逆转地删除。 - remote_suspension_reversible_hint_html: 账号已在他们的服务器上封禁,数据将在 %{date} 完全删除。 在此之前,远程服务器仍可恢复此账号,并且没有任何不良影响。 如果你想立即移除该账号的所有数据,可以在下面进行。 + remote_suspension_reversible_hint_html: 账号已在他们的服务器上封禁,数据将在 %{date} 完全删除。 在此之前,远程服务器仍可恢复此账号,并且没有任何不良影响。 如果你想立即移除该账号的全部数据,可以在下面进行。 remove_avatar: 删除头像 remove_header: 移除封面图 removed_avatar_msg: 成功删除 %{username} 的头像 @@ -536,7 +536,7 @@ zh-CN: confirm_purge: 确定要删除此站点的全部数据吗? content_policies: comment: 内部备注 - description_html: 你可以设置应用于此域名所有账号和其所有子域名的内容策略。 + description_html: 你可以设置应用于此域名全部账号和其全部子域名的内容策略。 limited_federation_mode_description_html: 你可以选择是否允许与此实例联合。 policies: reject_media: 拒收媒体 @@ -578,12 +578,12 @@ zh-CN: created_msg: 实例管理员备注创建成功! description_html: 查看备注或向其他管理员留言 destroyed_msg: 实例管理员备注删除成功! - placeholder: 有关此实例的信息、已采取的行动,或任何能帮助您将来管理此实例的事项。 + placeholder: 有关此实例的信息、已采取的行动,或任何能帮助你将来管理此实例的事项。 title: 审核注意事项 private_comment: 私密评论 public_comment: 公开评论 purge: 清除 - purge_description_html: 如果你确认此域名已永久离线,可以从存储中删除此域名的所有账号记录和相关数据。这将会需要一段时间。 + purge_description_html: 如果你确认此域名已永久离线,可以从存储中删除此域名的全部账号记录和相关数据。这将会需要一段时间。 title: 联合 total_blocked_by_us: 被本站屏蔽的 total_followed_by_them: 被对方关注的 @@ -624,7 +624,7 @@ zh-CN: disable: 禁用 disabled: 已禁用 enable: 启用 - enable_hint: 启用此功能后,你的实例会订阅此中继站的所有公开嘟文,并同时向其推送本服务器的公开嘟文。 + enable_hint: 启用此功能后,你的实例会订阅此中继站的全部公开嘟文,并同时向其推送本服务器的公开嘟文。 enabled: 已启用 inbox_url: 中继站 URL pending: 等待中继站的确认 @@ -647,8 +647,8 @@ zh-CN: mark_as_sensitive_description_html: 被举报的嘟文将被标记为敏感,同时该账号将被标记一次处罚,以供未来同一账号再次违规时参考。 other_description_html: 查看更多控制该账号行为的选项,并自定义编写与被举报账号的通信。 resolve_description_html: 不会对被举报账号采取任何动作,举报将被关闭,也不会留下处罚记录。 - silence_description_html: 只有关注或手工搜索此账号才能查看其资料,将严重限制其触达范围。可随时撤销。关闭针对此账号的所有举报。 - suspend_description_html: 该账号及其所有内容将无法访问并最终被删除,且无法与该账号进行互动。 在 30 天内可随时撤销。关闭针对此账号的所有举报。 + silence_description_html: 只有关注或手工搜索此账号才能查看其资料,将严重限制其触达范围。可随时撤销。关闭针对此账号的全部举报。 + suspend_description_html: 该账号及其全部内容将无法访问并最终被删除,且无法与该账号进行互动。 在 30 天内可随时撤销。关闭针对此账号的全部举报。 actions_description_html: 决定采取何种措施处理此举报。如果对被举报账号采取惩罚性措施,将向其发送一封电子邮件通知。但若选中垃圾信息类别则不会发送通知。 actions_description_remote_html: 决定采取何种行动来解决此举报。 这只会影响你的服务器如何与该远程账号的通信并处理其内容。 actions_no_posts: 该举报没有相关嘟文可供删除 @@ -711,7 +711,7 @@ zh-CN: silence_html: 严格限制 @%{acct} 的影响力,方法是让他们的个人资料和内容仅对已经关注他们的人可见,或手动查找其个人资料时 suspend_html: 暂停 @%{acct},使他们的个人资料和内容无法访问,也无法与之互动 close_report: '将举报 #%{id} 标记为已解决' - close_reports_html: 将针对 @%{acct}所有举报标记为已解决 + close_reports_html: 将针对 @%{acct}全部举报标记为已解决 delete_data_html: 从现在起 30 天后删除 @%{acct} 的个人资料和内容,除非他们同时解除暂停。 preview_preamble_html: "@%{acct} 将收到包含以下内容的警告:" record_strike_html: 记录一次针对 @%{acct} 的警示,以帮助你在这个账号上的未来违规事件中得到重视。 @@ -738,7 +738,7 @@ zh-CN: description_html: 使用 用户角色,你可以自定义你的用户可以访问的 Mastodon 功能和区域。 edit: 编辑角色 '%{name}' everyone: 默认权限 - everyone_full_description_html: 该角色是基础角色,会影响所有用户,包括未指定角色的用户。 其他所有的角色都继承该角色的权限。 + everyone_full_description_html: 该角色是基础角色,会影响全部用户,包括未指定角色的用户。 其他全部的角色都继承该角色的权限。 permissions_count: other: "%{count} 个权限" privileges: @@ -782,6 +782,8 @@ zh-CN: view_dashboard_description: 允许用户访问信息面板和各种指标 view_devops: 开发运维 view_devops_description: 允许用户访问 Sidekiq 和 pgHero 控制面板 + view_feeds: 查看实时动态和话题 + view_feeds_description: 允许用户无视服务器设置访问实时动态和话题 title: 角色 rules: add_new: 添加规则 @@ -803,8 +805,8 @@ zh-CN: rules_hint: 有一个专门区域用于显示用户需要遵守的规则。 title: 关于本站 allow_referrer_origin: - desc: 当您的用户点击指向外部网站的链接时,他们的浏览器可能会将您的 Mastodon 服务器地址作为referrer发送。如果这会唯一地识别出您的用户(例如,如果这是一个私人 Mastodon 服务器),请禁用此功能。 - title: 允许外部网站将您的 Mastodon 服务器视为流量来源 + desc: 当你的用户点击指向外部网站的链接时,他们的浏览器可能会将你的 Mastodon 服务器地址作为 referrer 发送。如果这会唯一地识别出你的用户,例如,如果这是一个私人 Mastodon 服务器,请禁用此功能。 + title: 允许外部网站将你的 Mastodon 服务器视为流量来源 appearance: preamble: 自定义 Mastodon 的网页界面。 title: 外观 @@ -819,7 +821,7 @@ zh-CN: preamble: 控制用户生成的内容在 Mastodon 中如何存储。 title: 内容保留 default_noindex: - desc_html: 影响所有尚未更改此设置的用户 + desc_html: 影响全部尚未更改此设置的用户 title: 默认不让用户被搜索引擎索引 discovery: follow_recommendations: 关注推荐 @@ -831,20 +833,21 @@ zh-CN: title: 发现 trends: 热门 domain_blocks: - all: 对所有人 + all: 对每个人 disabled: 不对任何人 users: 对已登录的本站用户 feed_access: modes: authenticated: 仅已登录用户 - public: 所有人 + disabled: 需要特定的用户角色 + public: 每个人 landing_page: values: about: 关于 local_feed: 本站动态 trends: 热门 registrations: - moderation_recommandation: 在向所有人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! + moderation_recommandation: 在向每个人开放注册之前,请确保你拥有一个人手足够且反应迅速的管理团队! preamble: 控制谁可以在你的服务器上创建账号。 title: 注册 registrations_mode: @@ -959,10 +962,10 @@ zh-CN: message_html: 有一个Mastodon错误修复更新可用。 upload_check_privacy_error: action: 点击这里查看更多信息 - message_html: "您的网站服务器配置错误,您用户的隐私处于危险中。" + message_html: "你的网站服务器配置错误,你的用户的隐私处于危险中。" upload_check_privacy_error_object_storage: action: 点击这里查看更多信息 - message_html: "您的对象存储空间配置错误,您用户的隐私处于危险中。" + message_html: "你的对象存储空间配置错误,你的用户的隐私处于危险中。" tags: moderation: not_trendable: 不在热门中显示 @@ -1452,7 +1455,7 @@ zh-CN: all_items_on_page_selected_html: other: 此页面上的所有 %{count} 项目已被选中。 all_matching_items_selected_html: - other: 所有 %{count} 匹配你搜索的项目都已被选中。 + other: 全部 %{count} 匹配你搜索的项目都已被选中。 cancel: 取消 changes_saved_msg: 更改保存成功! confirm: 确认 @@ -1463,7 +1466,7 @@ zh-CN: order_by: 排序方式 save_changes: 保存更改 select_all_matching_items: - other: 选择匹配你搜索的所有 %{count} 个项目。 + other: 选择匹配你搜索的全部 %{count} 个项目。 today: 今天 validation_errors: other: 出错啦!检查一下下面 %{count} 处出错的地方吧 @@ -1490,7 +1493,7 @@ zh-CN: domain_blocking_html: other: 你即将使用来自 %{filename} 的最多 %{count} 个站点域名替换你的站点屏蔽列表。 following_html: - other: 你即将关注来自 %{filename} 的最多 %{count} 个账号,并停止关注其他所有人。 + other: 你即将关注来自 %{filename} 的最多 %{count} 个账号,并停止关注其他任何人。 lists_html: other: 你即将使用来自 %{filename} 的内容替换你的列表。最多将会有 %{count} 个账号 被添加到新列表。 muting_html: @@ -1563,7 +1566,7 @@ zh-CN: author_html: 来自 %{name} potentially_sensitive_content: action: 点击查看 - confirm_visit: 您确定要打开此链接吗? + confirm_visit: 你确定要打开此链接吗? hide_button: 隐藏 label: 可能为敏感内容 lists: @@ -1628,7 +1631,7 @@ zh-CN: before: 在继续前,请仔细阅读下列说明: cooldown: 移动后会有一个冷却期,在此期间你将无法再次移动 disabled_account: 此后,你的当前账号将无法使用。但是,你仍然有权导出数据或者重新激活。 - followers: 这步操作将把所有关注者从当前账号移动到新账号 + followers: 这步操作将把全部关注者从当前账号移动到新账号 only_redirect_html: 或者,你可以只在你的账号资料上设置一个跳转。 other_data: 不会自动移动其它数据 redirect: 在收到一个跳转通知后,你当前的账号资料将会更新,并被排除在搜索范围外 @@ -1720,7 +1723,7 @@ zh-CN: too_many_options: 不能超过 %{max} 项 vote: 投票 posting_defaults: - explanation: 这些设置会在您撰写新嘟文时作为默认值应用,但每篇嘟文的设置也可以在编辑器处单独修改。 + explanation: 这些设置会在你撰写新嘟文时作为默认值应用,但每篇嘟文的设置也可以在编辑器处单独修改。 preferences: other: 其他 posting_defaults: 发布默认值 @@ -1730,7 +1733,7 @@ zh-CN: privacy: 隐私 privacy_hint_html: 控制你愿意向他人透露多少信息。通过浏览他人的关注列表和查看他们发嘟所用的应用,人们可以发现有趣的用户和酷炫的应用,但你可能更喜欢将其隐藏起来。 reach: 范围 - reach_hint_html: 控制你是否希望被新人发现和关注。你是否希望你的嘟文出现在“探索”页面上?你是否希望其他人在关注推荐中看到你?你是想自动接受所有新粉丝,还是对每个粉丝都进行仔细的筛选? + reach_hint_html: 控制你是否希望被新人发现和关注。你是否希望你的嘟文出现在“探索”页面上?你是否希望其他人在关注推荐中看到你?你是想自动接受全部新关注者,还是对每个关注者都进行仔细的筛选? search: 搜索 search_hint_html: 控制你希望被找到的方式。你想让人们通过你公开发布的内容来找到你吗?当在网络上搜索时,你是否希望Mastodon之外的人能够找到你的个人资料?请注意,我们无法保证完全排除所有搜索引擎对公开信息的索引。 title: 隐私与可达性 @@ -1747,7 +1750,7 @@ zh-CN: activity: 账号活动 confirm_follow_selected_followers: 你确定想要关注所选的关注者吗? confirm_remove_selected_followers: 你确定想要取关所选的关注者吗? - confirm_remove_selected_follows: 您确定要删除选定的关注者吗? + confirm_remove_selected_follows: 你确定要删除选定的关注者吗? dormant: 休眠 follow_failure: 无法关注选中的部分账号。 follow_selected_followers: 关注选中的关注者 @@ -1760,7 +1763,7 @@ zh-CN: mutual: 互相关注 primary: 主要 relationship: 关系 - remove_selected_domains: 删除在选定站点中的所有关注者 + remove_selected_domains: 删除在选定站点中的全部关注者 remove_selected_followers: 移除选中的关注者 remove_selected_follows: 取消关注所选用户 status: 账号状态 @@ -1882,7 +1885,8 @@ zh-CN: edited_at_html: 编辑于 %{date} errors: in_reply_not_found: 你回复的嘟文似乎不存在 - quoted_status_not_found: 您尝试引用的嘟文似乎不存在。 + quoted_status_not_found: 你尝试引用的嘟文似乎不存在。 + quoted_user_not_mentioned: 无法在私下提及嘟文中引用未提及的用户。 over_character_limit: 超过了 %{max} 字的限制 pin_errors: direct: 仅对被提及的用户可见的帖子不能被置顶 @@ -1951,7 +1955,7 @@ zh-CN: terms_of_service: title: 服务条款 terms_of_service_interstitial: - future_preamble_html: 我们将更改部分服务条款,这些更改将在%{date}生效。我们建议您查看更新后的条款。 + future_preamble_html: 我们将更改部分服务条款,这些更改将在%{date}生效。我们建议你查看更新后的条款。 past_preamble_html: 自你上次访问起,我们更改了一些服务条款。我们建议你查看更新后的条款。 review_link: 查看服务条款 title: "%{domain} 更新了服务条款" @@ -2038,7 +2042,7 @@ zh-CN: delete_statuses: 你的一些嘟文被发现违反了一条或多条社区准则,并已被 %{instance} 的管理员删除。 disable: 你不能再使用你的账号,但你的个人资料和其他数据保持不变。你可以请求数据备份,更改账号设置或删除账号。 mark_statuses_as_sensitive: 你的一些嘟文已经被 %{instance} 管理员标记为敏感内容。这意味着别人需要在嘟文中点击媒体,才能显示媒体预览。你可以在今后发布嘟文时自行将媒体标记为敏感内容。 - sensitive: 即刻起,你上传的所有媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。 + sensitive: 即刻起,你上传的全部媒体文件都将被标记为敏感内容并隐藏,在点击警告后才能查看。 silence: 你可以继续使用你的账号,但只有已关注你的人才能在看到你在此服务器上的嘟文,并且你会被排除在各类公共列表之外。其他用户仍可以手动关注你。 suspend: 你不能再使用你的账号,并且你的个人资料和其他数据都将无法访问。在大约30天内,你仍可以登录并请求数据备份,之后相关数据将被完全删除。我们会保留一些基础数据以避免封禁失效。 reason: 理由: @@ -2100,9 +2104,9 @@ zh-CN: title: "%{name},欢迎你的加入!" users: follow_limit_reached: 你不能关注超过 %{limit} 个人 - go_to_sso_account_settings: 转到您的身份提供商进行账号设置 + go_to_sso_account_settings: 转到你的身份提供商进行账号设置 invalid_otp_token: 输入的双因素认证代码无效 - otp_lost_help_html: 如果你不慎丢失了所有的代码,请联系 %{email} 寻求帮助 + otp_lost_help_html: 如果你不慎丢失了全部的代码,请联系 %{email} 寻求帮助 rate_limited: 验证尝试次数过多,请稍后再试。 seamless_external_login: 你通过外部服务登录,因此密码和邮件设置不可用。 signed_in_as: 当前登录的账号: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 6c56aaf90f721c..7c522752a67408 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1888,6 +1888,7 @@ zh-TW: errors: in_reply_not_found: 您嘗試回覆之嘟文似乎不存在。 quoted_status_not_found: 您嘗試引用之嘟文似乎不存在。 + quoted_user_not_mentioned: 無法於私訊嘟文中引用無提及之使用者。 over_character_limit: 已超過 %{max} 字的限制 pin_errors: direct: 無法釘選只有僅提及使用者可見之嘟文 diff --git a/config/navigation.rb b/config/navigation.rb index 7fc2cc7cb630b9..ae98c945326aab 100644 --- a/config/navigation.rb +++ b/config/navigation.rb @@ -12,7 +12,8 @@ n.item :software_updates, safe_join([material_symbol('report'), t('admin.update_pendings.patch')]), admin_software_updates_path, if: -> { !SoftwareUpdate.urgent_pending? && SoftwareUpdate.patch_pending? }, html: { class: 'warning' } end - n.item :profile, safe_join([material_symbol('person'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/profile|/settings/featured_tags|/settings/verification|/settings/privacy} + n.item :profile, safe_join([material_symbol('person'), t('settings.profile')]), settings_profile_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/profile|/settings/featured_tags|/settings/verification} + n.item :privacy, safe_join([material_symbol('globe'), t('privacy.title')]), settings_privacy_path, if: -> { current_user.functional? && !self_destruct }, highlights_on: %r{/settings/privacy} n.item :preferences, safe_join([material_symbol('settings'), t('settings.preferences')]), settings_preferences_path, if: -> { current_user.functional? && !self_destruct } do |s| s.item :appearance, safe_join([material_symbol('computer'), t('settings.appearance')]), settings_preferences_appearance_path diff --git a/docker-compose.yml b/docker-compose.yml index 2cc9438a3cbcbb..c724ee24d11289 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes build: . - image: kmyblue:21.0-dev + image: kmyblue:21.0-lts restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: build: dockerfile: ./streaming/Dockerfile context: . - image: kmyblue-streaming:21.0-dev + image: kmyblue-streaming:21.0-lts restart: always env_file: .env.production command: node ./streaming/index.js @@ -101,7 +101,7 @@ services: sidekiq: build: . - image: kmyblue:21.0-dev + image: kmyblue:21.0-lts restart: always env_file: .env.production command: bundle exec sidekiq diff --git a/lib/mastodon/email_configuration_helper.rb b/lib/mastodon/email_configuration_helper.rb index af86472786ad0f..be017a4a1ff818 100644 --- a/lib/mastodon/email_configuration_helper.rb +++ b/lib/mastodon/email_configuration_helper.rb @@ -8,25 +8,23 @@ module EmailConfigurationHelper # `config/email.yml`) into the format that `ActionMailer` understands def convert_smtp_settings(config) enable_starttls = nil - enable_starttls_auto = nil case config[:enable_starttls] when 'always' - enable_starttls = true - when 'never' + enable_starttls = :always + when 'never', 'false' enable_starttls = false when 'auto' - enable_starttls_auto = true + enable_starttls = :auto else - enable_starttls_auto = config[:enable_starttls_auto] != 'false' + enable_starttls = config[:enable_starttls_auto] ? :auto : false unless config[:tls] || config[:ssl] end authentication = config[:authentication] == 'none' ? nil : (config[:authentication] || 'plain') - config.merge( + config.without(:enable_starttls_auto).merge( authentication:, - enable_starttls:, - enable_starttls_auto: + enable_starttls: ) end end diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 391d8a4b7e3aa1..0559c86e1e259a 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -17,8 +17,8 @@ def kmyblue_minor end def kmyblue_flag - # 'LTS' - 'dev' + 'lts' + # 'dev' # nil end @@ -35,7 +35,7 @@ def patch end def default_prerelease - 'rc.1' + '' end def prerelease diff --git a/package.json b/package.json index 1eefe3a4e1ae86..e112509f506062 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^2.1.1", "@optimize-lodash/rollup-plugin": "^5.0.2", - "@rails/ujs": "7.1.502", + "@rails/ujs": "7.1.600", "@react-spring/web": "^9.7.5", "@reduxjs/toolkit": "^2.0.1", "@use-gesture/react": "^10.3.1", @@ -197,6 +197,7 @@ "stylelint-config-standard-scss": "^16.0.0", "typescript": "~5.9.0", "typescript-eslint": "^8.45.0", + "typescript-plugin-css-modules": "^5.2.0", "vitest": "^3.2.4" }, "resolutions": { diff --git a/spec/lib/mastodon/email_configuration_helper_spec.rb b/spec/lib/mastodon/email_configuration_helper_spec.rb index db513672f06c0c..2894699d05711c 100644 --- a/spec/lib/mastodon/email_configuration_helper_spec.rb +++ b/spec/lib/mastodon/email_configuration_helper_spec.rb @@ -21,8 +21,9 @@ base_configuration.merge({ enable_starttls: 'always' }) end - it 'converts this to `true`' do - expect(converted_settings[:enable_starttls]).to be true + it 'converts this to `:always`' do + expect(converted_settings[:enable_starttls]).to eq :always + expect(converted_settings[:enable_starttls_auto]).to be_nil end end @@ -33,6 +34,7 @@ it 'converts this to `false`' do expect(converted_settings[:enable_starttls]).to be false + expect(converted_settings[:enable_starttls_auto]).to be_nil end end @@ -41,28 +43,43 @@ base_configuration.merge({ enable_starttls: 'auto' }) end - it 'sets `enable_starttls_auto` instead' do - expect(converted_settings[:enable_starttls]).to be_nil - expect(converted_settings[:enable_starttls_auto]).to be true + it 'sets `enable_starttls` to `:auto`' do + expect(converted_settings[:enable_starttls]).to eq :auto + expect(converted_settings[:enable_starttls_auto]).to be_nil end end context 'when `enable_starttls` is unset' do - context 'when `enable_starttls_auto` is unset' do - let(:configuration) { base_configuration } + context 'when `enable_starttls_auto` is true' do + let(:configuration) do + base_configuration.merge({ enable_starttls_auto: true }) + end + + it 'sets `enable_starttls` to `:auto`' do + expect(converted_settings[:enable_starttls]).to eq :auto + expect(converted_settings[:enable_starttls_auto]).to be_nil + end + end + + context 'when `tls` is set to true' do + let(:configuration) do + base_configuration.merge({ tls: true }) + end - it 'sets `enable_starttls_auto` to `true`' do - expect(converted_settings[:enable_starttls_auto]).to be true + it 'sets `enable_starttls` to `nil`' do + expect(converted_settings[:enable_starttls]).to be_nil + expect(converted_settings[:enable_starttls_auto]).to be_nil end end - context 'when `enable_starttls_auto` is set to "false"' do + context 'when `enable_starttls_auto` is set to false' do let(:configuration) do - base_configuration.merge({ enable_starttls_auto: 'false' }) + base_configuration.merge({ enable_starttls_auto: false }) end - it 'sets `enable_starttls_auto` to `false`' do - expect(converted_settings[:enable_starttls_auto]).to be false + it 'sets `enable_starttls` to `false`' do + expect(converted_settings[:enable_starttls]).to be false + expect(converted_settings[:enable_starttls_auto]).to be_nil end end end diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 82021cd3d02d7f..153de1ef1c8caa 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -27,6 +27,7 @@ address: 'localhost', port: 25, authentication: 'none', + enable_starttls_auto: true, } end @@ -44,8 +45,7 @@ address: 'localhost', port: 25, authentication: nil, - enable_starttls: nil, - enable_starttls_auto: true, + enable_starttls: :auto, }) end end diff --git a/spec/requests/api/v1/statuses_spec.rb b/spec/requests/api/v1/statuses_spec.rb index 5024c29043ce81..a8bb60fe5bbac2 100644 --- a/spec/requests/api/v1/statuses_spec.rb +++ b/spec/requests/api/v1/statuses_spec.rb @@ -317,7 +317,7 @@ end context 'with a self-quote post' do - let(:quoted_status) { Fabricate(:status, account: user.account) } + let!(:quoted_status) { Fabricate(:status, account: user.account) } let(:params) do { status: 'Hello world, this is a self-quote', @@ -326,7 +326,48 @@ end it 'returns a quote post, as well as rate limit headers', :aggregate_failures do - subject + expect { subject }.to change(user.account.statuses, :count).by(1) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body[:quote]).to be_present + expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s + expect(response.headers['X-RateLimit-Remaining']).to eq (RateLimiter::FAMILIES[:statuses][:limit] - 1).to_s + end + end + + context 'with a quote to a non-mentioned user in a Private Mention' do + let!(:quoted_status) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) } + let(:params) do + { + status: 'Hello, this is a quote', + quoted_status_id: quoted_status.id, + visibility: :direct, + } + end + + it 'returns an error and does not create a post', :aggregate_failures do + expect { subject }.to_not change(user.account.statuses, :count) + + expect(response).to have_http_status(422) + expect(response.content_type) + .to start_with('application/json') + end + end + + context 'with a quote to a mentioned user in a Private Mention' do + let!(:quoted_status) { Fabricate(:status, quote_approval_policy: Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) } + let(:params) do + { + status: "Hello @#{quoted_status.account.acct}, this is a quote", + quoted_status_id: quoted_status.id, + visibility: :direct, + } + end + + it 'returns a quote post, as well as rate limit headers', :aggregate_failures do + expect { subject }.to change(user.account.statuses, :count).by(1) expect(response).to have_http_status(200) expect(response.content_type) diff --git a/tsconfig.json b/tsconfig.json index 2b981b67abea9e..db727baf185d0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,8 @@ "mastodon/*": ["app/javascript/mastodon/*"], "images/*": ["app/javascript/images/*"], "styles/*": ["app/javascript/styles/*"] - } + }, + "plugins": [{ "name": "typescript-plugin-css-modules" }] }, "include": [ "vite.config.mts", diff --git a/vite.config.mts b/vite.config.mts index 30c0741aaa6d54..f2a0ec059768d5 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -27,6 +27,8 @@ import { MastodonAssetsManifest } from './config/vite/plugin-assets-manifest'; const jsRoot = path.resolve(__dirname, 'app/javascript'); +const cssAliasClasses: ReadonlyArray = ['components', 'features']; + export const config: UserConfigFnPromise = async ({ mode, command }) => { const isProdBuild = mode === 'production' && command === 'build'; @@ -49,6 +51,45 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { }, }, css: { + modules: { + generateScopedName(name, filename) { + let prefix = ''; + + // Use the top two segments of the path as the prefix. + const [parentDirName, dirName] = path + .dirname(filename) + .split(path.sep) + .slice(-2) + .map((dir) => dir.toLowerCase()); + + // If the parent directory is in the cssAliasClasses list, use + // the first four letters of it as the prefix, otherwise use the full name. + if (parentDirName) { + if (cssAliasClasses.includes(parentDirName)) { + prefix = parentDirName.slice(0, 4); + } else { + prefix = parentDirName; + } + } + + // If we have a directory name, append it to the prefix. + if (dirName) { + prefix = `${prefix}_${dirName}`; + } + + // If the file is not styles.module.scss or style.module.scss, + // append the file base name to the prefix. + const baseName = path.basename( + filename, + `.module${path.extname(filename)}`, + ); + if (baseName !== 'styles' && baseName !== 'style') { + prefix = `${prefix}_${baseName}`; + } + + return `_${prefix}__${name}`; + }, + }, postcss: { plugins: [ postcssPresetEnv({ diff --git a/yarn.lock b/yarn.lock index c6c9a2b57fc384..34dc81a13aff86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,6 +19,13 @@ __metadata: languageName: node linkType: hard +"@adobe/css-tools@npm:~4.3.1": + version: 4.3.3 + resolution: "@adobe/css-tools@npm:4.3.3" + checksum: 10c0/e76e712df713964b87cdf2aca1f0477f19bebd845484d5fcba726d3ec7782366e2f26ec8cb2dcfaf47081a5c891987d8a9f5c3f30d11e1eb3c1848adc27fcb24 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.3.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" @@ -2809,7 +2816,7 @@ __metadata: "@gamestdio/websocket": "npm:^0.3.2" "@github/webauthn-json": "npm:^2.1.1" "@optimize-lodash/rollup-plugin": "npm:^5.0.2" - "@rails/ujs": "npm:7.1.502" + "@rails/ujs": "npm:7.1.600" "@react-spring/web": "npm:^9.7.5" "@reduxjs/toolkit": "npm:^2.0.1" "@storybook/addon-a11y": "npm:^9.1.1" @@ -2937,6 +2944,7 @@ __metadata: twitter-text: "npm:3.1.0" typescript: "npm:~5.9.0" typescript-eslint: "npm:^8.45.0" + typescript-plugin-css-modules: "npm:^5.2.0" use-debounce: "npm:^10.0.0" vite: "npm:^7.1.1" vite-plugin-manifest-sri: "npm:^0.2.0" @@ -3306,10 +3314,10 @@ __metadata: languageName: node linkType: hard -"@rails/ujs@npm:7.1.502": - version: 7.1.502 - resolution: "@rails/ujs@npm:7.1.502" - checksum: 10c0/79b46e8abd03e3fc633d93cc4e4c23838c628b775802fb38c2ce68b0e609ce287a67b81db112a93cc78c07ec82ca3b4cf87e74eb556d35148ce5f64c8be9201f +"@rails/ujs@npm:7.1.600": + version: 7.1.600 + resolution: "@rails/ujs@npm:7.1.600" + checksum: 10c0/0ccaa68a08fbc7b084ab89a1fe49520a5cba6d99f4b0feaf0cb3d00334c59d8d798932d7e49b84aa388875d039ea1e17eb115ed96a80ad157e408a13eceef53e languageName: node linkType: hard @@ -4358,6 +4366,24 @@ __metadata: languageName: node linkType: hard +"@types/postcss-modules-local-by-default@npm:^4.0.2": + version: 4.0.2 + resolution: "@types/postcss-modules-local-by-default@npm:4.0.2" + dependencies: + postcss: "npm:^8.0.0" + checksum: 10c0/af13e40673abf96f1427c467bc9d96986fc0fb702f65ef702de05f70e51af2212bc0bdf177bfd817e418f2238bf210fdee3541dd2d939fde9a4df5f8972ad716 + languageName: node + linkType: hard + +"@types/postcss-modules-scope@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/postcss-modules-scope@npm:3.0.4" + dependencies: + postcss: "npm:^8.0.0" + checksum: 10c0/6364674e429143fd686e0238d071377cf9ae1780a77f99e99292a06adc93057609146aaf55c09310ae99526c37e56be5a8a843086c0ff95513bd34c6bc4c7480 + languageName: node + linkType: hard + "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.5": version: 15.7.15 resolution: "@types/prop-types@npm:15.7.15" @@ -4671,14 +4697,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.45.0, @typescript-eslint/types@npm:^8.45.0": +"@typescript-eslint/types@npm:8.45.0": version: 8.45.0 resolution: "@typescript-eslint/types@npm:8.45.0" checksum: 10c0/0213a0573c671d13bc91961a2b2e814ec7f6381ff093bce6704017bd96b2fc7fee25906c815cedb32a0601cf5071ca6c7c5f940d087c3b0d3dd7d4bc03478278 languageName: node linkType: hard -"@typescript-eslint/types@npm:^8.46.0": +"@typescript-eslint/types@npm:^8.45.0, @typescript-eslint/types@npm:^8.46.0": version: 8.46.1 resolution: "@typescript-eslint/types@npm:8.46.1" checksum: 10c0/90887acaa5b33b45af20cf7f87ec4ae098c0daa88484245473e73903fa6e542f613247c22148132167891ca06af6549a60b9d2fd14a65b22871e016901ce3756 @@ -5478,13 +5504,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0": - version: 1.13.0 - resolution: "axios@npm:1.13.0" + version: 1.13.1 + resolution: "axios@npm:1.13.1" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.4" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/2af09f8ad9db9565bf97055eb0ddd2fd4abd9a03d23157b409348c9589370a88c3ede02e11fd1268becb780a77b62bdf9488650dd7208eda57edceca1d65622e + checksum: 10c0/de9c3c6de43d3ee1146d3afe78645f19450cac6a5d7235bef8b8e8eeb705c2e47e2d231dea99cecaec4dae1897c521118ca9413b9d474063c719c4d94c5b9adc languageName: node linkType: hard @@ -6121,6 +6147,15 @@ __metadata: languageName: node linkType: hard +"copy-anything@npm:^2.0.1": + version: 2.0.6 + resolution: "copy-anything@npm:2.0.6" + dependencies: + is-what: "npm:^3.14.1" + checksum: 10c0/2702998a8cc015f9917385b7f16b0d85f1f6e5e2fd34d99f14df584838f492f49aa0c390d973684c687e895c5c58d08b308a0400ac3e1e3d6fa1e5884a5402ad + languageName: node + linkType: hard + "core-js-compat@npm:^3.43.0": version: 3.44.0 resolution: "core-js-compat@npm:3.44.0" @@ -6595,6 +6630,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^16.4.2": + version: 16.6.1 + resolution: "dotenv@npm:16.6.1" + checksum: 10c0/15ce56608326ea0d1d9414a5c8ee6dcf0fffc79d2c16422b4ac2268e7e2d76ff5a572d37ffe747c377de12005f14b3cc22361e79fc7f1061cce81f77d2c973dc + languageName: node + linkType: hard + "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -6762,6 +6804,17 @@ __metadata: languageName: node linkType: hard +"errno@npm:^0.1.1": + version: 0.1.8 + resolution: "errno@npm:0.1.8" + dependencies: + prr: "npm:~1.0.1" + bin: + errno: cli.js + checksum: 10c0/83758951967ec57bf00b5f5b7dc797e6d65a6171e57ea57adcf1bd1a0b477fd9b5b35fae5be1ff18f4090ed156bce1db749fe7e317aac19d485a5d150f6a4936 + languageName: node + linkType: hard + "error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" @@ -8051,7 +8104,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -8268,7 +8321,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -8277,6 +8330,15 @@ __metadata: languageName: node linkType: hard +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/39c92936fabd23169c8611d2b5cc39e39d10b19b0d223352f20a7579f75b39d5f786114a6b8fc62bee8c5fed59ba9e0d38f7219a4db383e324fb3061664b043d + languageName: node + linkType: hard + "idb-keyval@npm:^6.2.0": version: 6.2.1 resolution: "idb-keyval@npm:6.2.1" @@ -8312,6 +8374,15 @@ __metadata: languageName: node linkType: hard +"image-size@npm:~0.5.0": + version: 0.5.5 + resolution: "image-size@npm:0.5.5" + bin: + image-size: bin/image-size.js + checksum: 10c0/655204163af06732f483a9fe7cce9dff4a29b7b2e88f5c957a5852e8143fa750f5e54b1955a2ca83de99c5220dbd680002d0d4e09140b01433520f4d5a0b1f4c + languageName: node + linkType: hard + "immer@npm:^10.0.3": version: 10.0.3 resolution: "immer@npm:10.0.3" @@ -8789,6 +8860,13 @@ __metadata: languageName: node linkType: hard +"is-what@npm:^3.14.1": + version: 3.14.1 + resolution: "is-what@npm:3.14.1" + checksum: 10c0/4b770b85454c877b6929a84fd47c318e1f8c2ff70fd72fd625bc3fde8e0c18a6e57345b6e7aa1ee9fbd1c608d27cfe885df473036c5c2e40cd2187250804a2c7 + languageName: node + linkType: hard + "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -9179,6 +9257,41 @@ __metadata: languageName: node linkType: hard +"less@npm:^4.2.0": + version: 4.4.2 + resolution: "less@npm:4.4.2" + dependencies: + copy-anything: "npm:^2.0.1" + errno: "npm:^0.1.1" + graceful-fs: "npm:^4.1.2" + image-size: "npm:~0.5.0" + make-dir: "npm:^2.1.0" + mime: "npm:^1.4.1" + needle: "npm:^3.1.0" + parse-node-version: "npm:^1.0.1" + source-map: "npm:~0.6.0" + tslib: "npm:^2.3.0" + dependenciesMeta: + errno: + optional: true + graceful-fs: + optional: true + image-size: + optional: true + make-dir: + optional: true + mime: + optional: true + needle: + optional: true + source-map: + optional: true + bin: + lessc: bin/lessc + checksum: 10c0/f8b796e45ef171adc390b5250f3018922cd046c256181dd9d4cbcbbdc5d6de7cb88c8327741c10eff7ff76421cd826fd95a664ea1b88fbf6f31742428d4a2dab + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -9196,6 +9309,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:^2.0.5": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 10c0/64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -9252,6 +9372,13 @@ __metadata: languageName: node linkType: hard +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 + languageName: node + linkType: hard + "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -9402,6 +9529,16 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: "npm:^4.0.1" + semver: "npm:^5.6.0" + checksum: 10c0/ada869944d866229819735bee5548944caef560d7a8536ecbc6536edca28c72add47cc4f6fc39c54fb25d06b58da1f8994cf7d9df7dadea047064749efc085d8 + languageName: node + linkType: hard + "make-dir@npm:^4.0.0": version: 4.0.0 resolution: "make-dir@npm:4.0.0" @@ -9533,7 +9670,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0": +"mime@npm:1.6.0, mime@npm:^1.4.1": version: 1.6.0 resolution: "mime@npm:1.6.0" bin: @@ -9780,6 +9917,18 @@ __metadata: languageName: node linkType: hard +"needle@npm:^3.1.0": + version: 3.3.1 + resolution: "needle@npm:3.3.1" + dependencies: + iconv-lite: "npm:^0.6.3" + sax: "npm:^1.2.4" + bin: + needle: bin/needle + checksum: 10c0/233b9315d47b735867d03e7a018fb665ee6cacf3a83b991b19538019cf42b538a3e85ca745c840b4c5e9a0ffdca76472f941363bf7c166214ae8cbc650fd4d39 + languageName: node + linkType: hard + "negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -10154,6 +10303,13 @@ __metadata: languageName: node linkType: hard +"parse-node-version@npm:^1.0.1": + version: 1.0.1 + resolution: "parse-node-version@npm:1.0.1" + checksum: 10c0/999cd3d7da1425c2e182dce82b226c6dc842562d3ed79ec47f5c719c32a7f6c1a5352495b894fc25df164be7f2ede4224758255da9902ddef81f2b77ba46bb2c + languageName: node + linkType: hard + "parse-statements@npm:1.0.11": version: 1.0.11 resolution: "parse-statements@npm:1.0.11" @@ -10384,6 +10540,13 @@ __metadata: languageName: node linkType: hard +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf + languageName: node + linkType: hard + "pino-abstract-transport@npm:^2.0.0": version: 2.0.0 resolution: "pino-abstract-transport@npm:2.0.0" @@ -10682,6 +10845,24 @@ __metadata: languageName: node linkType: hard +"postcss-load-config@npm:^3.1.4": + version: 3.1.4 + resolution: "postcss-load-config@npm:3.1.4" + dependencies: + lilconfig: "npm:^2.0.5" + yaml: "npm:^1.10.2" + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + checksum: 10c0/7d2cc6695c2fc063e4538316d651a687fdb55e48db453ff699de916a6ee55ab68eac2b120c28a6b8ca7aa746a588888351b810a215b5cd090eabea62c5762ede + languageName: node + linkType: hard + "postcss-logical@npm:^8.1.0": version: 8.1.0 resolution: "postcss-logical@npm:8.1.0" @@ -10700,6 +10881,39 @@ __metadata: languageName: node linkType: hard +"postcss-modules-extract-imports@npm:^3.0.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/402084bcab376083c4b1b5111b48ec92974ef86066f366f0b2d5b2ac2b647d561066705ade4db89875a13cb175b33dd6af40d16d32b2ea5eaf8bac63bd2bf219 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.4": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" + dependencies: + icss-utils: "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/b0b83feb2a4b61f5383979d37f23116c99bc146eba1741ca3cf1acca0e4d0dbf293ac1810a6ab4eccbe1ee76440dd0a9eb2db5b3bba4f99fc1b3ded16baa6358 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.1.1": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10c0/bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b + languageName: node + linkType: hard + "postcss-nesting@npm:^13.0.2": version: 13.0.2 resolution: "postcss-nesting@npm:13.0.2" @@ -10896,14 +11110,14 @@ __metadata: languageName: node linkType: hard -"postcss-value-parser@npm:^4.2.0": +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 languageName: node linkType: hard -"postcss@npm:^8.5.6": +"postcss@npm:^8.0.0, postcss@npm:^8.4.35, postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -11057,6 +11271,13 @@ __metadata: languageName: node linkType: hard +"prr@npm:~1.0.1": + version: 1.0.1 + resolution: "prr@npm:1.0.1" + checksum: 10c0/5b9272c602e4f4472a215e58daff88f802923b84bc39c8860376bb1c0e42aaf18c25d69ad974bd06ec6db6f544b783edecd5502cd3d184748d99080d68e4be5f + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -11773,6 +11994,13 @@ __metadata: languageName: node linkType: hard +"reserved-words@npm:^0.1.2": + version: 0.1.2 + resolution: "reserved-words@npm:0.1.2" + checksum: 10c0/88360388d88f4b36c1f5d47f8d596936dbf950bddd642c04ce940f1dab1fa58ef6fec23f5fab81a1bfe5cd0f223b2b635311496fcf0ef3db93ad4dfb6d7be186 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -12082,7 +12310,7 @@ __metadata: languageName: node linkType: hard -"sass@npm:^1.62.1": +"sass@npm:^1.62.1, sass@npm:^1.70.0": version: 1.93.2 resolution: "sass@npm:1.93.2" dependencies: @@ -12099,6 +12327,20 @@ __metadata: languageName: node linkType: hard +"sax@npm:^1.2.4": + version: 1.4.1 + resolution: "sax@npm:1.4.1" + checksum: 10c0/6bf86318a254c5d898ede6bd3ded15daf68ae08a5495a2739564eb265cd13bcc64a07ab466fb204f67ce472bb534eb8612dac587435515169593f4fffa11de7c + languageName: node + linkType: hard + +"sax@npm:~1.3.0": + version: 1.3.0 + resolution: "sax@npm:1.3.0" + checksum: 10c0/599dbe0ba9d8bd55e92d920239b21d101823a6cedff71e542589303fa0fa8f3ece6cf608baca0c51be846a2e88365fac94a9101a9c341d94b98e30c4deea5bea + languageName: node + linkType: hard + "saxes@npm:^6.0.0": version: 6.0.0 resolution: "saxes@npm:6.0.0" @@ -12142,6 +12384,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^5.6.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + "semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -12431,7 +12682,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf @@ -12462,13 +12713,20 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0, source-map@npm:~0.6.1": +"source-map@npm:^0.6.0, source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard +"source-map@npm:^0.7.3": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c + languageName: node + linkType: hard + "source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" @@ -13016,6 +13274,21 @@ __metadata: languageName: node linkType: hard +"stylus@npm:^0.62.0": + version: 0.62.0 + resolution: "stylus@npm:0.62.0" + dependencies: + "@adobe/css-tools": "npm:~4.3.1" + debug: "npm:^4.3.2" + glob: "npm:^7.1.6" + sax: "npm:~1.3.0" + source-map: "npm:^0.7.3" + bin: + stylus: bin/stylus + checksum: 10c0/62afe3a6d781f66d7d283e8218dc1a15530d7d89fc2f09457a723975b2073e96e0d32c61d7f0dd1bd2686aae4ab6cc6933dc85e1b72eebab8aa30167bd16962b + languageName: node + linkType: hard + "substring-trie@npm:^1.0.2": version: 1.0.2 resolution: "substring-trie@npm:1.0.2" @@ -13391,7 +13664,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -13532,6 +13805,35 @@ __metadata: languageName: node linkType: hard +"typescript-plugin-css-modules@npm:^5.2.0": + version: 5.2.0 + resolution: "typescript-plugin-css-modules@npm:5.2.0" + dependencies: + "@types/postcss-modules-local-by-default": "npm:^4.0.2" + "@types/postcss-modules-scope": "npm:^3.0.4" + dotenv: "npm:^16.4.2" + icss-utils: "npm:^5.1.0" + less: "npm:^4.2.0" + lodash.camelcase: "npm:^4.3.0" + postcss: "npm:^8.4.35" + postcss-load-config: "npm:^3.1.4" + postcss-modules-extract-imports: "npm:^3.0.0" + postcss-modules-local-by-default: "npm:^4.0.4" + postcss-modules-scope: "npm:^3.1.1" + reserved-words: "npm:^0.1.2" + sass: "npm:^1.70.0" + source-map-js: "npm:^1.0.2" + stylus: "npm:^0.62.0" + tsconfig-paths: "npm:^4.2.0" + peerDependencies: + typescript: ">=4.0.0" + dependenciesMeta: + stylus: + optional: true + checksum: 10c0/7cd024f7145c0a29d9b78f2fb49c42cdf1747b50a43391f9993132ba42a727266f9b544fd868d905d5352e0a8676a19ae7a9aa56d516cc819c3ab39d66aa25e4 + languageName: node + linkType: hard + "typescript@npm:^5.6.0, typescript@npm:~5.9.0": version: 5.9.2 resolution: "typescript@npm:5.9.2" @@ -14621,7 +14923,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.0": +"yaml@npm:^1.10.0, yaml@npm:^1.10.2": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f