From 8ee4b3f906c52bad2e2a899e17047235376a8d83 Mon Sep 17 00:00:00 2001 From: Echo Date: Fri, 8 Aug 2025 10:44:05 +0200 Subject: [PATCH 01/64] Update Redux to handle quote posts (#35715) --- app/javascript/mastodon/actions/compose.js | 2 + .../mastodon/actions/compose_typed.ts | 34 +++++- app/javascript/mastodon/api_types/quotes.ts | 23 ++++ app/javascript/mastodon/api_types/statuses.ts | 2 + app/javascript/mastodon/reducers/compose.js | 23 +++- .../mastodon/store/typed_functions.ts | 106 ++++++++++++++++-- app/models/concerns/user/has_settings.rb | 4 + app/serializers/initial_state_serializer.rb | 1 + 8 files changed, 183 insertions(+), 12 deletions(-) create mode 100644 app/javascript/mastodon/api_types/quotes.ts diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index d70834cec6..28c90381e0 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -228,6 +228,8 @@ export function submitCompose() { visibility: getState().getIn(['compose', 'privacy']), poll: getState().getIn(['compose', 'poll'], null), language: getState().getIn(['compose', 'language']), + quoted_status_id: getState().getIn(['compose', 'quoted_status_id']), + quote_approval_policy: getState().getIn(['compose', 'quote_policy']), }, headers: { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), diff --git a/app/javascript/mastodon/actions/compose_typed.ts b/app/javascript/mastodon/actions/compose_typed.ts index 97f0d68c51..7b1f5e688c 100644 --- a/app/javascript/mastodon/actions/compose_typed.ts +++ b/app/javascript/mastodon/actions/compose_typed.ts @@ -1,9 +1,18 @@ +import { createAction } from '@reduxjs/toolkit'; import type { List as ImmutableList, Map as ImmutableMap } from 'immutable'; import { apiUpdateMedia } from 'mastodon/api/compose'; import type { ApiMediaAttachmentJSON } from 'mastodon/api_types/media_attachments'; import type { MediaAttachment } from 'mastodon/models/media_attachment'; -import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; +import { + createDataLoadingThunk, + createAppThunk, +} from 'mastodon/store/typed_functions'; + +import type { ApiQuotePolicy } from '../api_types/quotes'; +import type { Status } from '../models/status'; + +import { ensureComposeIsVisible } from './compose'; type SimulatedMediaAttachmentJSON = ApiMediaAttachmentJSON & { unattached?: boolean; @@ -68,3 +77,26 @@ export const changeUploadCompose = createDataLoadingThunk( useLoadingBar: false, }, ); + +export const quoteComposeByStatus = createAppThunk( + 'compose/quoteComposeStatus', + (status: Status, { getState }) => { + ensureComposeIsVisible(getState); + return status; + }, +); + +export const quoteComposeById = createAppThunk( + (statusId: string, { dispatch, getState }) => { + const status = getState().statuses.get(statusId); + if (status) { + dispatch(quoteComposeByStatus(status)); + } + }, +); + +export const quoteComposeCancel = createAction('compose/quoteComposeCancel'); + +export const setQuotePolicy = createAction( + 'compose/setQuotePolicy', +); diff --git a/app/javascript/mastodon/api_types/quotes.ts b/app/javascript/mastodon/api_types/quotes.ts new file mode 100644 index 0000000000..8c0ea10fc3 --- /dev/null +++ b/app/javascript/mastodon/api_types/quotes.ts @@ -0,0 +1,23 @@ +import type { ApiStatusJSON } from './statuses'; + +export type ApiQuoteState = 'accepted' | 'pending' | 'revoked' | 'unauthorized'; +export type ApiQuotePolicy = 'public' | 'followers' | 'nobody'; + +interface ApiQuoteEmptyJSON { + state: Exclude; + quoted_status: null; +} + +interface ApiNestedQuoteJSON { + state: 'accepted'; + quoted_status_id: string; +} + +interface ApiQuoteAcceptedJSON { + state: 'accepted'; + quoted_status: Omit & { + quote: ApiNestedQuoteJSON | ApiQuoteEmptyJSON; + }; +} + +export type ApiQuoteJSON = ApiQuoteAcceptedJSON | ApiQuoteEmptyJSON; diff --git a/app/javascript/mastodon/api_types/statuses.ts b/app/javascript/mastodon/api_types/statuses.ts index 09bd2349b3..cd0b1001ac 100644 --- a/app/javascript/mastodon/api_types/statuses.ts +++ b/app/javascript/mastodon/api_types/statuses.ts @@ -4,6 +4,7 @@ import type { ApiAccountJSON } from './accounts'; import type { ApiCustomEmojiJSON } from './custom_emoji'; import type { ApiMediaAttachmentJSON } from './media_attachments'; import type { ApiPollJSON } from './polls'; +import type { ApiQuoteJSON } from './quotes'; // See app/modals/status.rb export type StatusVisibility = @@ -118,6 +119,7 @@ export interface ApiStatusJSON { card?: ApiPreviewCardJSON; poll?: ApiPollJSON; + quote?: ApiQuoteJSON; } export interface ApiContextJSON { diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index 6b799a46e8..c5b3c22ec1 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -1,6 +1,11 @@ import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; -import { changeUploadCompose } from 'mastodon/actions/compose_typed'; +import { + changeUploadCompose, + quoteComposeByStatus, + quoteComposeCancel, + setQuotePolicy, +} from 'mastodon/actions/compose_typed'; import { timelineDelete } from 'mastodon/actions/timelines_typed'; import { @@ -83,6 +88,11 @@ const initialState = ImmutableMap({ resetFileKey: Math.floor((Math.random() * 0x10000)), idempotencyKey: null, tagHistory: ImmutableList(), + + // Quotes + quoted_status_id: null, + quote_policy: 'public', + default_quote_policy: 'public', // Set in hydration. }); const initialPoll = ImmutableMap({ @@ -117,6 +127,8 @@ function clearAll(state) { map.set('progress', 0); map.set('poll', null); map.set('idempotencyKey', uuid()); + map.set('quoted_status_id', null); + map.set('quote_policy', state.get('default_quote_policy')); }); } @@ -317,6 +329,15 @@ export const composeReducer = (state = initialState, action) => { return state.set('is_changing_upload', true); } else if (changeUploadCompose.rejected.match(action)) { return state.set('is_changing_upload', false); + } else if (quoteComposeByStatus.match(action)) { + const status = action.payload; + if (status.getIn(['quote_approval', 'current_user']) === 'automatic') { + return state.set('quoted_status_id', status.get('id')); + } + } else if (quoteComposeCancel.match(action)) { + return state.set('quoted_status_id', null); + } else if (setQuotePolicy.match(action)) { + return state.set('quote_policy', action.payload); } switch(action.type) { diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index f0a18a0681..69f6028be2 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -1,5 +1,12 @@ -import type { GetThunkAPI } from '@reduxjs/toolkit'; -import { createAsyncThunk, createSelector } from '@reduxjs/toolkit'; +import type { + ActionCreatorWithPreparedPayload, + GetThunkAPI, +} from '@reduxjs/toolkit'; +import { + createAsyncThunk as rtkCreateAsyncThunk, + createSelector, + createAction, +} from '@reduxjs/toolkit'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { useDispatch, useSelector } from 'react-redux'; @@ -18,7 +25,7 @@ interface AppMeta { useLoadingBar?: boolean; } -export const createAppAsyncThunk = createAsyncThunk.withTypes<{ +export const createAppAsyncThunk = rtkCreateAsyncThunk.withTypes<{ state: RootState; dispatch: AppDispatch; rejectValue: AsyncThunkRejectValue; @@ -43,9 +50,88 @@ interface AppThunkOptions { ) => boolean; } -const createBaseAsyncThunk = createAsyncThunk.withTypes(); +// Type definitions for the sync thunks. +type AppThunk = ( + arg: Arg, +) => (dispatch: AppDispatch, getState: () => RootState) => Returned; -export function createThunk( +type AppThunkCreator = ( + arg: Arg, + api: AppThunkApi, + extra?: ExtraArg, +) => Returned; + +type AppThunkActionCreator< + Arg = void, + Returned = void, +> = ActionCreatorWithPreparedPayload< + [Returned, Arg], + Returned, + string, + never, + { arg: Arg } +>; + +// Version that does not dispatch it's own action. +export function createAppThunk( + creator: AppThunkCreator, + extra?: ExtraArg, +): AppThunk; + +// Version that dispatches an named action with the result of the creator callback. +export function createAppThunk( + name: string, + creator: AppThunkCreator, + extra?: ExtraArg, +): AppThunk & AppThunkActionCreator; + +/** Creates a thunk that dispatches an action. */ +export function createAppThunk( + nameOrCreator: string | AppThunkCreator, + maybeCreatorOrExtra?: AppThunkCreator | ExtraArg, + maybeExtra?: ExtraArg, +) { + const isDispatcher = typeof nameOrCreator === 'string'; + const name = isDispatcher ? nameOrCreator : undefined; + const creator = isDispatcher + ? (maybeCreatorOrExtra as AppThunkCreator) + : nameOrCreator; + const extra = isDispatcher ? maybeExtra : (maybeCreatorOrExtra as ExtraArg); + let action: null | AppThunkActionCreator = null; + + // Creates a thunk that dispatches the action with the result of the creator. + const actionCreator: AppThunk = (arg) => { + return (dispatch, getState) => { + const result = creator(arg, { dispatch, getState }, extra); + if (action) { + // Dispatches the action with the result. + const actionObj = action(result, arg); + dispatch(actionObj); + } + return result; + }; + }; + + // No action name provided, return the thunk directly. + if (!name) { + return actionCreator; + } + + // Create the action and assign the action creator to it in order + // to have things like `toString` and `match` available. + action = createAction(name, (payload: Returned, arg: Arg) => ({ + payload, + meta: { + arg, + }, + })); + + return Object.assign({}, action, actionCreator); +} + +const createBaseAsyncThunk = rtkCreateAsyncThunk.withTypes(); + +export function createAsyncThunk( name: string, creator: (arg: Arg, api: AppThunkApi) => Returned | Promise, options: AppThunkOptions = {}, @@ -104,7 +190,7 @@ export function createDataLoadingThunk( name: string, loadData: (args: Args) => Promise, thunkOptions?: AppThunkOptions, -): ReturnType>; +): ReturnType>; // Overload when the `onData` method returns discardLoadDataInPayload, then the payload is empty export function createDataLoadingThunk( @@ -114,7 +200,7 @@ export function createDataLoadingThunk( | AppThunkOptions | OnData, thunkOptions?: AppThunkOptions, -): ReturnType>; +): ReturnType>; // Overload when the `onData` method returns nothing, then the mayload is the `onData` result export function createDataLoadingThunk( @@ -124,7 +210,7 @@ export function createDataLoadingThunk( | AppThunkOptions | OnData, thunkOptions?: AppThunkOptions, -): ReturnType>; +): ReturnType>; // Overload when there is an `onData` method returning something export function createDataLoadingThunk< @@ -138,7 +224,7 @@ export function createDataLoadingThunk< | AppThunkOptions | OnData, thunkOptions?: AppThunkOptions, -): ReturnType>; +): ReturnType>; /** * This function creates a Redux Thunk that handles loading data asynchronously (usually from the API), dispatching `pending`, `fullfilled` and `rejected` actions. @@ -189,7 +275,7 @@ export function createDataLoadingThunk< thunkOptions = maybeThunkOptions; } - return createThunk( + return createAsyncThunk( name, async (arg, { getState, dispatch }) => { const data = await loadData(arg, { diff --git a/app/models/concerns/user/has_settings.rb b/app/models/concerns/user/has_settings.rb index 14d2f22c24..04ad524c5a 100644 --- a/app/models/concerns/user/has_settings.rb +++ b/app/models/concerns/user/has_settings.rb @@ -107,6 +107,10 @@ module User::HasSettings settings['default_privacy'] || (account.locked? ? 'private' : 'public') end + def setting_default_quote_policy + settings['default_quote_policy'] || 'public' + end + def allows_report_emails? settings['notification_emails.report'] end diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index cc95d8e754..7926cc54be 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -54,6 +54,7 @@ class InitialStateSerializer < ActiveModel::Serializer store[:default_privacy] = object.visibility || object_account_user.setting_default_privacy store[:default_sensitive] = object_account_user.setting_default_sensitive store[:default_language] = object_account_user.preferred_posting_language + store[:default_quote_policy] = object_account_user.setting_default_quote_policy end store[:text] = object.text if object.text From 1fd147bf2b7ee9d996a04d94b52ed0842c604a94 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 11:00:51 +0200 Subject: [PATCH 02/64] New Crowdin Translations (automated) (#35720) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/be.json | 87 +++++++++++- app/javascript/mastodon/locales/da.json | 2 +- app/javascript/mastodon/locales/el.json | 4 + app/javascript/mastodon/locales/fi.json | 4 + app/javascript/mastodon/locales/ga.json | 4 + app/javascript/mastodon/locales/hu.json | 4 + app/javascript/mastodon/locales/kab.json | 20 ++- app/javascript/mastodon/locales/ko.json | 4 + app/javascript/mastodon/locales/si.json | 1 + config/locales/activerecord.be.yml | 10 ++ config/locales/activerecord.kab.yml | 2 + config/locales/be.yml | 173 ++++++++++++++++++++++- config/locales/doorkeeper.be.yml | 1 + config/locales/kab.yml | 4 + config/locales/simple_form.da.yml | 2 +- config/locales/simple_form.kab.yml | 13 +- 16 files changed, 322 insertions(+), 13 deletions(-) diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 706e746988..2d0842727a 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -43,7 +43,7 @@ "account.followers": "Падпісчыкі", "account.followers.empty": "Ніхто пакуль не падпісаны на гэтага карыстальніка.", "account.followers_counter": "{count, plural, one {{counter} падпісчык} few {{counter} падпісчыкі} many {{counter} падпісчыкаў} other {{counter} падпісчыка}}", - "account.followers_you_know_counter": "{count, one {{counter}, знаёмы вам} other {{counter}, знаёмых вам}}", + "account.followers_you_know_counter": "{count, plural, one {{counter}, знаёмы вам} other {{counter}, знаёмых вам}}", "account.following": "Падпіскі", "account.following_counter": "{count, plural, one {{counter} падпіска} few {{counter} падпіскі} many {{counter} падпісак} other {{counter} падпіскі}}", "account.follows.empty": "Карыстальнік ні на каго не падпісаны.", @@ -62,6 +62,7 @@ "account.mute_notifications_short": "Не апавяшчаць", "account.mute_short": "Ігнараваць", "account.muted": "Ігнаруецца", + "account.muting": "Ігнараванне", "account.mutual": "Вы падпісаны адно на аднаго", "account.no_bio": "Апісанне адсутнічае.", "account.open_original_page": "Адкрыць арыгінальную старонку", @@ -103,6 +104,8 @@ "alt_text_modal.add_text_from_image": "Дадаць тэкст з відарыса", "alt_text_modal.cancel": "Скасаваць", "alt_text_modal.change_thumbnail": "Змяніць мініяцюру", + "alt_text_modal.describe_for_people_with_hearing_impairments": "Апішыце гэта людзям з праблемамі са слыхам…", + "alt_text_modal.describe_for_people_with_visual_impairments": "Апішыце гэта людзям з праблемамі са зрокам…", "alt_text_modal.done": "Гатова", "announcement.announcement": "Аб'ява", "annual_report.summary.archetype.booster": "Паляўнічы на трэнды", @@ -216,7 +219,13 @@ "confirmations.delete_list.confirm": "Выдаліць", "confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты чарнавік?", "confirmations.delete_list.title": "Выдаліць спіс?", + "confirmations.discard_draft.confirm": "Адмовіцца і працягнуць", "confirmations.discard_draft.edit.cancel": "Працягнуць рэдагаванне", + "confirmations.discard_draft.edit.message": "Калі працягнуць, то ўсе змены, што Вы зрабілі ў гэтым допісе, будуць адмененыя.", + "confirmations.discard_draft.edit.title": "Адмовіцца ад змен у Вашым допісе?", + "confirmations.discard_draft.post.cancel": "Працягнуць чарнавік", + "confirmations.discard_draft.post.message": "Калі працягнуць, то допіс, які Вы зараз пішаце, не будзе апублікаваны.", + "confirmations.discard_draft.post.title": "Выдаліць чарнавік?", "confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", "confirmations.follow_to_list.confirm": "Падпісацца і дадаць у спіс", @@ -226,6 +235,7 @@ "confirmations.logout.message": "Вы ўпэўненыя, што хочаце выйсці?", "confirmations.logout.title": "Выйсці?", "confirmations.missing_alt_text.confirm": "Дадаць альтэрнатыўны тэкст", + "confirmations.missing_alt_text.message": "У Вашым допісе ёсць медыя без альтэрнатыўнага тэксту. Дадаванне апісання дапамагае зрабіць Ваш допіс даступным для большай колькасці людзей.", "confirmations.missing_alt_text.secondary": "Усё адно апублікаваць", "confirmations.missing_alt_text.title": "Дадаць альтэрнатыўны тэкст?", "confirmations.mute.confirm": "Ігнараваць", @@ -233,7 +243,11 @@ "confirmations.redraft.message": "Вы ўпэўнены, што хочаце выдаліць допіс і перапісаць яго? Упадабанні і пашырэнні згубяцца, а адказы да арыгінальнага допісу асірацеюць.", "confirmations.redraft.title": "Выдаліць і перапісаць допіс?", "confirmations.remove_from_followers.confirm": "Выдаліць падпісчыка", + "confirmations.remove_from_followers.message": "Карыстальнік {name} больш не будзе падпісаны на Вас. Упэўненыя, што хочаце працягнуць?", "confirmations.remove_from_followers.title": "Выдаліць падпісчыка?", + "confirmations.revoke_quote.confirm": "Выдаліць допіс", + "confirmations.revoke_quote.message": "Гэтае дзеянне немагчыма адмяніць.", + "confirmations.revoke_quote.title": "Выдаліць допіс?", "confirmations.unfollow.confirm": "Адпісацца", "confirmations.unfollow.message": "Вы ўпэўненыя, што хочаце адпісацца ад {name}?", "confirmations.unfollow.title": "Адпісацца ад карыстальніка?", @@ -295,6 +309,9 @@ "emoji_button.search_results": "Вынікі пошуку", "emoji_button.symbols": "Сімвалы", "emoji_button.travel": "Падарожжы і месцы", + "empty_column.account_featured.me": "Вы яшчэ нічога не паказалі. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якім найбольш карыстаецеся, і нават профілі сваіх сяброў?", + "empty_column.account_featured.other": "{acct} яшчэ нічога не паказаў. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якім найбольш карыстаецеся, і нават профілі сваіх сяброў?", + "empty_column.account_featured_other.unknown": "Гэты профіль яшчэ нічога не паказаў.", "empty_column.account_hides_collections": "Гэты карыстальнік вырашыў схаваць гэтую інфармацыю", "empty_column.account_suspended": "Уліковы запіс прыпынены", "empty_column.account_timeline": "Тут няма допісаў!", @@ -327,6 +344,7 @@ "explore.trending_links": "Навіны", "explore.trending_statuses": "Допісы", "explore.trending_tags": "Хэштэгі", + "featured_carousel.header": "{count, plural,one {Замацаваны допіс} other {Замацаваныя допісы}}", "featured_carousel.next": "Далей", "featured_carousel.post": "Допіс", "featured_carousel.previous": "Назад", @@ -383,6 +401,8 @@ "generic.saved": "Захавана", "getting_started.heading": "Пачатак працы", "hashtag.admin_moderation": "Адкрыць інтэрфейс мадэратара для #{name}", + "hashtag.browse": "Праглядзець допісы ў #{hashtag}", + "hashtag.browse_from_account": "Праглядзець допісы ад @{name} у #{hashtag}", "hashtag.column_header.tag_mode.all": "і {additional}", "hashtag.column_header.tag_mode.any": "або {additional}", "hashtag.column_header.tag_mode.none": "без {additional}", @@ -395,7 +415,10 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} удзельнік} few {{counter} удзельніка} many {{counter} удзельнікаў} other {{counter} удзельніка}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}} за сёння", + "hashtag.feature": "Паказваць у профілі", "hashtag.follow": "Падпісацца на хэштэг", + "hashtag.mute": "Ігнараваць #{hashtag}", + "hashtag.unfeature": "Не паказваць у профілі", "hashtag.unfollow": "Адпісацца ад хэштэга", "hashtags.and_other": "…і яшчэ {count, plural, other {#}}", "hints.profiles.followers_may_be_missing": "Падпісчыкі гэтага профілю могуць адсутнічаць.", @@ -424,8 +447,12 @@ "ignore_notifications_modal.not_following_title": "Ігнараваць апавяшчэнні ад людзей на якіх вы не падпісаны?", "ignore_notifications_modal.private_mentions_title": "Ігнараваць апавяшчэнні пра непажаданыя асабістыя згадванні?", "info_button.label": "Даведка", + "info_button.what_is_alt_text": "

Што такое альтэрнатыўны тэкст?

Альтэрнатыўны тэкст апісвае відарыс людзям з парушэннем зроку, павольным злучэннем або тым, каму патрэбны дадатковы кантэкст.

Вы можаце зрабіць відарыс больш дасяжным і зразумелым для ўсіх, напісаўшы зразумелы, сціслы і аб'ектыўны альтэрнатыўны тэкст.

  • Ахоплівайце важныя элементы
  • Тлумачце тэкст на відарысе
  • Карыстайцеся звычайнымі сказамі
  • Пазбягайце залішняй інфармацыі
  • Засяроджвайцеся на тэндэнцыях і ключавых высновах у цяжкіх для разумення візуальных матэрыялах (напрыклад, дыяграмах або картах)
", "interaction_modal.action.favourite": "Каб працягнуць, вы мусіце ўпадабаць нешта са свайго ўліковага запісу.", "interaction_modal.action.follow": "Каб працягнуць, вы мусіце падпісацца на некага са свайго ўліковага запісу.", + "interaction_modal.action.reblog": "Каб працягнуць, Вам трэба пашырыць допіс са свайго профілю.", + "interaction_modal.action.reply": "Каб працягнуць, Вам трэба адказаць са свайго профілю.", + "interaction_modal.action.vote": "Каб працягнуць, Вам трэба прагаласаваць са свайго профілю.", "interaction_modal.go": "Перайсці", "interaction_modal.no_account_yet": "Не маеце ўліковага запісу?", "interaction_modal.on_another_server": "На іншым серверы", @@ -434,6 +461,7 @@ "interaction_modal.title.follow": "Падпісацца на {name}", "interaction_modal.title.reblog": "Пашырыць допіс ад {name}", "interaction_modal.title.reply": "Адказаць на допіс {name}", + "interaction_modal.title.vote": "Прагаласуйце ў апытанні {name}", "interaction_modal.username_prompt": "Напр., {example}", "intervals.full.days": "{number, plural, one {# дзень} few {# дні} many {# дзён} other {# дня}}", "intervals.full.hours": "{number, plural, one {# гадзіна} few {# гадзіны} many {# гадзін} other {# гадзіны}}", @@ -473,6 +501,8 @@ "keyboard_shortcuts.translate": "каб перакласці допіс", "keyboard_shortcuts.unfocus": "Расфакусаваць тэкставую вобласць/пошукавы радок", "keyboard_shortcuts.up": "Перамясціцца ўверх па спісе", + "learn_more_link.got_it": "Зразумеў(-ла)", + "learn_more_link.learn_more": "Падрабязней", "lightbox.close": "Закрыць", "lightbox.next": "Далей", "lightbox.previous": "Назад", @@ -487,10 +517,15 @@ "lists.add_to_list": "Дадаць у спіс", "lists.add_to_lists": "Дадаць {name} у спісы", "lists.create": "Стварыць", + "lists.create_a_list_to_organize": "Стварыце новы спіс, каб арганізаваць сваю Галоўную старонку", "lists.create_list": "Стварыць спіс", "lists.delete": "Выдаліць спіс", "lists.done": "Гатова", "lists.edit": "Рэдагаваць спіс", + "lists.exclusive": "Схаваць карыстальнікаў на Галоўнай старонцы", + "lists.exclusive_hint": "Калі ў гэтым спісе нехта ёсць, схавайце яго на сваёй Галоўнай старонцы, каб не бачыць яго допісы двойчы.", + "lists.find_users_to_add": "Знайсці карыстальнікаў, каб дадаць", + "lists.list_members_count": "{count, plural,one {# карыстальнік}other {# карыстальнікі}}", "lists.list_name": "Назва спіса", "lists.new_list_name": "Назва новага спіса", "lists.no_lists_yet": "Пакуль няма спісаў.", @@ -502,6 +537,7 @@ "lists.replies_policy.none": "Нікога", "lists.save": "Захаваць", "lists.search": "Пошук", + "lists.show_replies_to": "Уключыць адказы ад карыстальнікаў са спіса", "load_pending": "{count, plural, one {# новы элемент} few {# новыя элементы} many {# новых элементаў} other {# новых элементаў}}", "loading_indicator.label": "Ідзе загрузка…", "media_gallery.hide": "Схаваць", @@ -544,6 +580,8 @@ "navigation_bar.search_trends": "Пошук / Трэндавае", "navigation_panel.collapse_followed_tags": "Згарнуць меню падпісак на хэштэгі", "navigation_panel.collapse_lists": "Згарнуць меню спісаў", + "navigation_panel.expand_followed_tags": "Разгарнуць меню падпісак на хэштэгі", + "navigation_panel.expand_lists": "Разгарнуць меню спіса", "not_signed_in_indicator.not_signed_in": "Вам трэба ўвайсці каб атрымаць доступ да гэтага рэсурсу.", "notification.admin.report": "{name} паскардзіўся на {target}", "notification.admin.report_account": "{name} паскардзіўся на {count, plural, one {# допіс} many {# допісаў} other {# допіса}} ад {target} з прычыны {category}", @@ -551,16 +589,21 @@ "notification.admin.report_statuses": "{name} паскардзіўся на {target} з прычыны {category}", "notification.admin.report_statuses_other": "{name} паскардзіўся на {target}", "notification.admin.sign_up": "{name} зарэгістраваўся", + "notification.admin.sign_up.name_and_others": "{name} і {count, plural, one {# іншы} other {# іншых}} зарэгістраваліся", + "notification.annual_report.message": "Вас чакае Ваш #Wrapstodon нумар {year}! Падзяліцеся сваімі галоўнымі падзеямі і запамінальнымі момантамі ў Mastodon!", "notification.annual_report.view": "Перайсці да #Wrapstodon", - "notification.favourite": "Ваш допіс упадабаны {name}", + "notification.favourite": "Карыстальнік {name} упадабаў Ваш допіс", + "notification.favourite.name_and_others_with_link": "{name} і {count, plural, one {# іншы} other {# іншыя}} ўпадабалі Ваш допіс", "notification.favourite_pm": "Ваша асабістае згадванне ўпадабана {name}", "notification.favourite_pm.name_and_others_with_link": "{name} і {count, plural, one {# іншы} few {# іншыя} many {# іншых} other {# іншых}} ўпадабалі ваша асабістае згадванне", "notification.follow": "{name} падпісаўся на вас", + "notification.follow.name_and_others": "{name} і {count, plural, one {# іншы} other {# іншыя}} падпісаліся на Вас", "notification.follow_request": "{name} адправіў запыт на падпіску", "notification.follow_request.name_and_others": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}} запыталіся падпісацца на вас", "notification.label.mention": "Згадванне", "notification.label.private_mention": "Асабістае згадванне", "notification.label.private_reply": "Асабісты адказ", + "notification.label.quote": "Карыстальнік {name} цытаваў Ваш допіс", "notification.label.reply": "Адказ", "notification.mention": "Згадванне", "notification.mentioned_you": "{name} згадаў вас", @@ -576,7 +619,7 @@ "notification.own_poll": "Ваша апытанне скончылася", "notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася", "notification.reblog": "{name} пашырыў ваш допіс", - "notification.reblog.name_and_others_with_link": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}} абагулілі ваш допіс", + "notification.reblog.name_and_others_with_link": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}} пашырылі ваш допіс", "notification.relationships_severance_event": "Страціў сувязь з {name}", "notification.relationships_severance_event.account_suspension": "Адміністратар з {from} прыпыніў працу {target}, што азначае, што вы больш не можаце атрымліваць ад іх абнаўлення ці ўзаемадзейнічаць з імі.", "notification.relationships_severance_event.domain_block": "Адміністратар з {from} заблакіраваў {target}, у тым ліку {followersCount} вашых падпісчыка(-аў) і {followingCount, plural, one {# уліковы запіс} few {# уліковыя запісы} many {# уліковых запісаў} other {# уліковых запісаў}}.", @@ -585,11 +628,19 @@ "notification.status": "Новы допіс ад {name}", "notification.update": "Допіс {name} адрэдагаваны", "notification_requests.accept": "Прыняць", + "notification_requests.accept_multiple": "{count, plural,one {Прыняць # запыт…} other {Прыняць # запытаў…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural,one {Прыняць запыт} other {Прыняць запыты}}", + "notification_requests.confirm_accept_multiple.message": "Вы збіраецеся прыняць {count, plural, one {адзін запыт на апавяшчэнне} other {# запытаў на апавяшчэнне}}. Упэўненыя, што хочаце працягнуць?", "notification_requests.confirm_accept_multiple.title": "Прыняць запыты на апавяшчэнні?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural,one {Адмовіцца ад запыту} other {Адмовіцца ад запытаў}}", + "notification_requests.confirm_dismiss_multiple.message": "Вы збіраецеся адмовіцца ад {count, plural, one {аднаго запыту на апавяшчэнне} other {# запытаў на апавяшчэнне}}. Вы не зможаце зноў лёгка атрымаць доступ да {count, plural, one {яго} other {іх}}. Упэўненыя, што хочаце працягнуць?", "notification_requests.confirm_dismiss_multiple.title": "Адхіліць запыты на апавяшчэнні?", "notification_requests.dismiss": "Адхіліць", + "notification_requests.dismiss_multiple": "{count, plural,one {Адмовіцца ад запыту…} other {Адмовіцца ад запытаў…}}", "notification_requests.edit_selection": "Рэдагаваць", "notification_requests.exit_selection": "Гатова", + "notification_requests.explainer_for_limited_account": "Апавяшчэнне з гэтага профілю было адфільтраванае, бо гэты профіль абмежаваў мадэратар.", + "notification_requests.explainer_for_limited_remote_account": "Апавяшчэнні з гэтага профілю былі адфільтраваныя, бо гэты профіль абмежаваў мадэратар.", "notification_requests.maximize": "Разгарнуць", "notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў", "notification_requests.notifications_from": "Апавяшчэнні ад {name}", @@ -610,6 +661,7 @@ "notifications.column_settings.mention": "Згадванні:", "notifications.column_settings.poll": "Вынікі апытання:", "notifications.column_settings.push": "Push-апавяшчэнні", + "notifications.column_settings.quote": "Цытаваныя допісы:", "notifications.column_settings.reblog": "Пашырэнні:", "notifications.column_settings.show": "Паказваць у слупку", "notifications.column_settings.sound": "Прайграваць гук", @@ -633,7 +685,10 @@ "notifications.policy.accept": "Прыняць", "notifications.policy.accept_hint": "Паказваць у апавяшчэннях", "notifications.policy.drop": "Iгнараваць", + "notifications.policy.drop_hint": "Адправіць у бездань, адкуль больш ніколі не ўбачыце", "notifications.policy.filter": "Фільтраваць", + "notifications.policy.filter_hint": "Адправіць у скрыню адфільтраваных апавяшчэнняў", + "notifications.policy.filter_limited_accounts_hint": "Абмежавана мадэратарамі сервера", "notifications.policy.filter_limited_accounts_title": "Уліковыя запісы пад мадэрацыяй", "notifications.policy.filter_new_accounts.hint": "Створаныя на працягу {days, plural, one {апошняга # дня} few {апошніх # дзён} many {апошніх # дзён} other {апошняй # дня}}", "notifications.policy.filter_new_accounts_title": "Новыя ўліковыя запісы", @@ -755,6 +810,7 @@ "report_notification.categories.violation": "Парушэнне правілаў", "report_notification.categories.violation_sentence": "парушэнне правілаў", "report_notification.open": "Адкрыць скаргу", + "search.clear": "Ачысціць пошук", "search.no_recent_searches": "Гісторыя пошуку пустая", "search.placeholder": "Пошук", "search.quick_action.account_search": "Супадзенне профіляў {x}", @@ -796,6 +852,8 @@ "status.bookmark": "Дадаць закладку", "status.cancel_reblog_private": "Прыбраць", "status.cannot_reblog": "Гэты пост нельга пашырыць", + "status.context.load_new_replies": "Даступныя новыя адказы", + "status.context.loading": "Правяраюцца новыя адказы", "status.continued_thread": "Працяг ланцужка", "status.copy": "Скапіраваць спасылку на допіс", "status.delete": "Выдаліць", @@ -807,7 +865,7 @@ "status.edited_x_times": "Рэдагавана {count, plural, one {{count} раз} few {{count} разы} many {{count} разоў} other {{count} разу}}", "status.embed": "Атрымаць убудаваны код", "status.favourite": "Упадабанае", - "status.favourites": "{count, plural, one {# упадабанае} few {# упадабаныя} many {# упадабаных} other {# упадабанага}}", + "status.favourites": "{count, plural, one {упадабанне} few {упадабанні} other {упадабанняў}}", "status.filter": "Фільтраваць гэты допіс", "status.history.created": "Створана {name} {date}", "status.history.edited": "Адрэдагавана {name} {date}", @@ -821,19 +879,27 @@ "status.mute_conversation": "Ігнараваць размову", "status.open": "Разгарнуць гэты допіс", "status.pin": "Замацаваць у профілі", + "status.quote_error.filtered": "Схавана адным з Вашых фільтраў", + "status.quote_error.not_available": "Допіс недаступны", + "status.quote_error.pending_approval": "Допіс чакае пацвярджэння", + "status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.", + "status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой", + "status.quote_post_author": "Цытаваў допіс @{name}", "status.read_more": "Чытаць болей", "status.reblog": "Пашырыць", "status.reblog_private": "Пашырыць з першапачатковай бачнасцю", - "status.reblogged_by": "{name} пашырыў(-ла)", - "status.reblogs": "{count, plural, one {# пашырэнне} few {# пашырэнні} many {# пашырэнняў} other {# пашырэння}}", + "status.reblogged_by": "Карыстальнік {name} пашырыў", + "status.reblogs": "{count, plural, one {пашырэнне} few {пашырэнні} many {пашырэнняў} other {пашырэння}}", "status.reblogs.empty": "Гэты допіс яшчэ ніхто не пашырыў. Калі гэта адбудзецца, гэтых людзей будзе бачна тут.", - "status.redraft": "Выдаліць і паправіць", + "status.redraft": "Выдаліць і перапісаць", "status.remove_bookmark": "Выдаліць закладку", + "status.remove_favourite": "Выдаліць з упадабаных", "status.replied_in_thread": "Адказаў у ланцужку", "status.replied_to": "Адказаў {name}", "status.reply": "Адказаць", "status.replyAll": "Адказаць у ланцугу", "status.report": "Паскардзіцца на @{name}", + "status.revoke_quote": "Выдаліць мой допіс з допісу @{name}", "status.sensitive_warning": "Уражвальны змест", "status.share": "Абагуліць", "status.show_less_all": "Згарнуць усё", @@ -853,7 +919,9 @@ "tabs_bar.notifications": "Апавяшчэнні", "tabs_bar.publish": "Новы допіс", "tabs_bar.search": "Пошук", + "terms_of_service.effective_as_of": "Дзейнічае да {date}", "terms_of_service.title": "Умовы выкарыстання", + "terms_of_service.upcoming_changes_on": "Змены, якія адбудуцца {date}", "time_remaining.days": "{number, plural, one {застаўся # дзень} few {засталося # дні} many {засталося # дзён} other {засталося # дня}}", "time_remaining.hours": "{number, plural, one {засталася # гадзіна} few {засталося # гадзіны} many {засталося # гадзін} other {засталося # гадзіны}}", "time_remaining.minutes": "{number, plural, one {засталася # хвіліна} few {засталося # хвіліны} many {засталося # хвілін} other {засталося # хвіліны}}", @@ -869,6 +937,11 @@ "upload_button.label": "Дадаць выяву, відэа- ці аўдыяфайл", "upload_error.limit": "Перавышана колькасць файлаў.", "upload_error.poll": "Немагчыма прымацаваць файл да апытання.", + "upload_form.drag_and_drop.instructions": "Каб абраць медыя далучэнне, націсніце прабел ці Enter. Падчас перасоўвання выкарыстоўвайце кнопкі са стрэлкамі, каб пасунуць медыя далучэнне ў любым напрамку. Націсніце прабел ці Enter зноў, каб перасунуць медыя далучэнне ў новае месца, або Escape для адмены.", + "upload_form.drag_and_drop.on_drag_cancel": "Перасоўванне адмененае. Медыя ўлажэнне {item} на месцы.", + "upload_form.drag_and_drop.on_drag_end": "Медыя ўлажэнне {item} на месцы.", + "upload_form.drag_and_drop.on_drag_over": "Медыя ўлажэнне {item} перасунутае.", + "upload_form.drag_and_drop.on_drag_start": "Абранае медыя ўлажэнне {item}.", "upload_form.edit": "Рэдагаваць", "upload_progress.label": "Запампоўванне...", "upload_progress.processing": "Апрацоўка…", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 96a6eecf8c..597990435b 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -899,7 +899,7 @@ "status.reply": "Besvar", "status.replyAll": "Svar alle", "status.report": "Anmeld @{name}", - "status.revoke_quote": "Fjern mit indlæg fra @{name}'s indlæg", + "status.revoke_quote": "Fjern eget indlæg fra @{name}s indlæg", "status.sensitive_warning": "Følsomt indhold", "status.share": "Del", "status.show_less_all": "Vis mindre for alle", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 58de44bce3..5632def3ea 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Αφαίρεση ακολούθου", "confirmations.remove_from_followers.message": "Ο χρήστης {name} θα σταματήσει να σε ακολουθεί. Σίγουρα θες να συνεχίσεις;", "confirmations.remove_from_followers.title": "Αφαίρεση ακολούθου;", + "confirmations.revoke_quote.confirm": "Αφαίρεση ανάρτησης", + "confirmations.revoke_quote.message": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.", + "confirmations.revoke_quote.title": "Αφαίρεση ανάρτησης;", "confirmations.unfollow.confirm": "Άρση ακολούθησης", "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", "confirmations.unfollow.title": "Άρση ακολούθησης;", @@ -896,6 +899,7 @@ "status.reply": "Απάντησε", "status.replyAll": "Απάντησε στο νήμα συζήτησης", "status.report": "Αναφορά @{name}", + "status.revoke_quote": "Αφαίρεση της ανάρτησης μου από την ανάρτηση του/της @{name}", "status.sensitive_warning": "Ευαίσθητο περιεχόμενο", "status.share": "Κοινοποίηση", "status.show_less_all": "Δείξε λιγότερο για όλες", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 2f7c13bfaf..e1b8d49e11 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Poista seuraaja", "confirmations.remove_from_followers.message": "{name} lakkaa seuraamasta sinua. Haluatko varmasti jatkaa?", "confirmations.remove_from_followers.title": "Poistetaanko seuraaja?", + "confirmations.revoke_quote.confirm": "Poista julkaisu", + "confirmations.revoke_quote.message": "Tätä toimea ei voi peruuttaa.", + "confirmations.revoke_quote.title": "Poistetaanko julkaisu?", "confirmations.unfollow.confirm": "Lopeta seuraaminen", "confirmations.unfollow.message": "Haluatko varmasti lopettaa profiilin {name} seuraamisen?", "confirmations.unfollow.title": "Lopetetaanko käyttäjän seuraaminen?", @@ -896,6 +899,7 @@ "status.reply": "Vastaa", "status.replyAll": "Vastaa ketjuun", "status.report": "Raportoi @{name}", + "status.revoke_quote": "Poista julkaisuni käyttäjän @{name} julkaisusta", "status.sensitive_warning": "Arkaluonteista sisältöä", "status.share": "Jaa", "status.show_less_all": "Näytä kaikista vähemmän", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 1f7c3845e1..4760b64626 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Bain leantóir", "confirmations.remove_from_followers.message": "Scoirfidh {name} de bheith ag leanúint leat. An bhfuil tú cinnte gur mian leat leanúint ar aghaidh?", "confirmations.remove_from_followers.title": "Bain an leantóir?", + "confirmations.revoke_quote.confirm": "Bain postáil", + "confirmations.revoke_quote.message": "Ní féidir an gníomh seo a chealú.", + "confirmations.revoke_quote.title": "Bain postáil?", "confirmations.unfollow.confirm": "Ná lean", "confirmations.unfollow.message": "An bhfuil tú cinnte gur mhaith leat {name} a dhíleanúint?", "confirmations.unfollow.title": "Dílean ​​an t-úsáideoir?", @@ -896,6 +899,7 @@ "status.reply": "Freagair", "status.replyAll": "Freagair le snáithe", "status.report": "Tuairiscigh @{name}", + "status.revoke_quote": "Bain mo phost ó phost @{name}", "status.sensitive_warning": "Ábhar íogair", "status.share": "Comhroinn", "status.show_less_all": "Taispeáin níos lú d'uile", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 60740438e1..5ba44f9c75 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Követő eltávolítása", "confirmations.remove_from_followers.message": "{name} követ téged. Biztos, hogy folytatod?", "confirmations.remove_from_followers.title": "Követő eltávolítása?", + "confirmations.revoke_quote.confirm": "Bejegyzés eltávolítása", + "confirmations.revoke_quote.message": "Ez a művelet nem vonható vissza.", + "confirmations.revoke_quote.title": "Bejegyzés eltávolítása?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos, hogy vissza szeretnéd vonni {name} követését?", "confirmations.unfollow.title": "Megszünteted a felhasználó követését?", @@ -896,6 +899,7 @@ "status.reply": "Válasz", "status.replyAll": "Válasz a beszélgetésre", "status.report": "@{name} bejelentése", + "status.revoke_quote": "Saját bejegyzés eltávolítása @{name} bejegyzéséből", "status.sensitive_warning": "Kényes tartalom", "status.share": "Megosztás", "status.show_less_all": "Kevesebbet mindenhol", diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json index b0bee442cf..e6e1bf565f 100644 --- a/app/javascript/mastodon/locales/kab.json +++ b/app/javascript/mastodon/locales/kab.json @@ -85,9 +85,11 @@ "alt_text_modal.cancel": "Semmet", "alt_text_modal.done": "Immed", "announcement.announcement": "Ulɣu", + "annual_report.summary.followers.followers": "imeḍfaṛen", "annual_report.summary.most_used_app.most_used_app": "asnas yettwasqedcen s waṭas", "annual_report.summary.most_used_hashtag.none": "Ula yiwen", "annual_report.summary.new_posts.new_posts": "tisuffaɣ timaynutin", + "annual_report.summary.percentile.we_wont_tell_bernie": "Ur as-neqqar i yiwen.", "annual_report.summary.thanks": "Tanemmirt imi i tettekkiḍ deg Mastodon!", "audio.hide": "Ffer amesli", "block_modal.show_less": "Ssken-d drus", @@ -123,6 +125,7 @@ "column.firehose": "Isuddam usriden", "column.follow_requests": "Isuturen n teḍfeṛt", "column.home": "Agejdan", + "column.list_members": "Sefrek iεeggalen n tebdart", "column.lists": "Tibdarin", "column.mutes": "Imiḍanen yettwasgugmen", "column.notifications": "Ilɣa", @@ -160,6 +163,7 @@ "compose_form.save_changes": "Leqqem", "compose_form.spoiler.marked": "Kkes aḍris yettwaffren deffir n walɣu", "compose_form.spoiler.unmarked": "Rnu aḍris yettwaffren deffir n walɣu", + "compose_form.spoiler_placeholder": "Alɣu n ugbur (afrayan)", "confirmation_modal.cancel": "Sefsex", "confirmations.block.confirm": "Sewḥel", "confirmations.delete.confirm": "Kkes", @@ -168,8 +172,10 @@ "confirmations.delete_list.confirm": "Kkes", "confirmations.delete_list.message": "Tebɣiḍ s tidet ad tekkseḍ umuɣ-agi i lebda?", "confirmations.delete_list.title": "Tukksa n tebdart?", + "confirmations.discard_draft.confirm": "Ttu-t u kemmel", "confirmations.discard_edit_media.confirm": "Sefsex", "confirmations.follow_to_list.confirm": "Ḍfeṛ-it sakin rnu-t ɣer tebdart", + "confirmations.follow_to_list.title": "Ḍfer aseqdac?", "confirmations.logout.confirm": "Ffeɣ", "confirmations.logout.message": "D tidet tebɣiḍ ad teffɣeḍ?", "confirmations.logout.title": "Tebɣiḍ ad teffɣeḍ ssya?", @@ -178,6 +184,8 @@ "confirmations.missing_alt_text.title": "Rnu aḍris amlellay?", "confirmations.mute.confirm": "Sgugem", "confirmations.redraft.confirm": "Kkes sakin ɛiwed tira", + "confirmations.remove_from_followers.confirm": "Kkes aneḍfar", + "confirmations.revoke_quote.confirm": "Kkes tasuffeɣt", "confirmations.unfollow.confirm": "Ur ḍḍafaṛ ara", "confirmations.unfollow.message": "Tetḥeqqeḍ belli tebɣiḍ ur teṭafaṛeḍ ara {name}?", "content_warning.hide": "Ffer tasuffeɣt", @@ -203,7 +211,12 @@ "domain_block_modal.you_wont_see_posts": "Ur tettuɣaleḍ ara ttwaliḍ tisuffaɣ neɣ ulɣuten n iseqdacen n uqeddac-a.", "domain_pill.activitypub_like_language": "ActivityPub am tutlayt yettmeslay Mastodon d izeḍwan inmettiyen nniḍen.", "domain_pill.server": "Aqeddac", + "domain_pill.their_handle": "Asulay-is:", "domain_pill.username": "Isem n useqdac", + "domain_pill.whats_in_a_handle": "D acu i yellan deg usulay?", + "domain_pill.who_they_are": "Imi isulayen qqaren-d anwa i d yiwen d wanda yella, tzemreḍ ad temyigweḍ d yemdanen deg web anmetti yebnan s .", + "domain_pill.who_you_are": "Imi isulay-ik·im yeqqar-d anwa i d kečč·kemmi d wanda i telliḍ, zemren medden ad myigwen yid-k·m deg web anmetti yebnan s .", + "domain_pill.your_handle": "Asulay-ik·im:", "domain_pill.your_server": "D axxam-inek·inem umḍin, anda i zedɣent akk tsuffaɣ-ik·im. Ur k·m-yeεǧib ara wa? Ssenfel-d iqeddacen melmi i ak·m-yehwa, awi-d daɣen ineḍfaren-ik·im yid-k·m.", "embed.instructions": "Ẓẓu addad-agi deg usmel-inek·inem s wenɣal n tangalt yellan sdaw-agi.", "embed.preview": "Akka ara d-iban:", @@ -264,6 +277,7 @@ "firehose.remote": "Iqeddacen nniḍen", "follow_request.authorize": "Ssireg", "follow_request.reject": "Agi", + "follow_suggestions.curated_suggestion": "Yettwafren sɣur tarbaɛt", "follow_suggestions.dismiss": "Dayen ur t-id-skan ara", "follow_suggestions.featured_longer": "Yettwafraned s ufus sɣur agraw n {domain}", "follow_suggestions.friends_of_friends_longer": "D aɣeṛfan ar wid i teṭṭafareḍ", @@ -301,6 +315,7 @@ "hashtag.follow": "Ḍfeṛ ahacṭag", "hashtag.mute": "Sgugem #{hashtag}", "hashtags.and_other": "…d {count, plural, one {}other {# nniḍen}}", + "home.column_settings.show_quotes": "Sken-d tibdarin", "home.column_settings.show_reblogs": "Ssken-d beṭṭu", "home.column_settings.show_replies": "Ssken-d tiririyin", "home.hide_announcements": "Ffer ulɣuyen", @@ -354,6 +369,7 @@ "keyboard_shortcuts.toggle_hidden": "i uskan/tuffra n uḍris deffir CW", "keyboard_shortcuts.toggle_sensitivity": "i teskent/tuffra n yimidyaten", "keyboard_shortcuts.toot": "i wakken attebdud tajewwaqt tamaynut", + "keyboard_shortcuts.translate": "i usuqel n tsuffeɣt", "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", "keyboard_shortcuts.up": "i tulin ɣer d asawen n tebdart", "learn_more_link.got_it": "Gziɣ-t", @@ -458,6 +474,7 @@ "notifications.column_settings.mention": "Abdar:", "notifications.column_settings.poll": "Igemmaḍ n usenqed:", "notifications.column_settings.push": "Ilɣa yettudemmren", + "notifications.column_settings.quote": "Yebder-d:", "notifications.column_settings.reblog": "Seǧhed:", "notifications.column_settings.show": "Ssken-d tilɣa deg ujgu", "notifications.column_settings.sound": "Rmed imesli", @@ -631,6 +648,7 @@ "status.mute_conversation": "Sgugem adiwenni", "status.open": "Semɣeṛ tasuffeɣt-ayi", "status.pin": "Senteḍ-itt deg umaɣnu", + "status.quote_post_author": "Yebder-d tasuffeɣt sɣur @{name}", "status.read_more": "Issin ugar", "status.reblog": "Bḍu", "status.reblogged_by": "Yebḍa-tt {name}", @@ -650,7 +668,7 @@ "status.show_original": "Sken aɣbalu", "status.title.with_attachments": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", "status.translate": "Suqel", - "status.translated_from_with": "Yettwasuqel seg {lang} s {provider}", + "status.translated_from_with": "Tettwasuqel seg {lang} s {provider}", "status.uncached_media_warning": "Ulac taskant", "status.unmute_conversation": "Kkes asgugem n udiwenni", "status.unpin": "Kkes asenteḍ seg umaɣnu", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index e6cdc4e780..92e3d7cafd 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "팔로워 제거", "confirmations.remove_from_followers.message": "{name} 님이 나를 팔로우하지 않게 됩니다. 계속할까요?", "confirmations.remove_from_followers.title": "팔로워를 제거할까요?", + "confirmations.revoke_quote.confirm": "게시물 삭제", + "confirmations.revoke_quote.message": "이 작업은 되돌릴 수 없습니다.", + "confirmations.revoke_quote.title": "게시물을 지울까요?", "confirmations.unfollow.confirm": "팔로우 해제", "confirmations.unfollow.message": "정말로 {name} 님을 팔로우 해제하시겠습니까?", "confirmations.unfollow.title": "사용자를 언팔로우 할까요?", @@ -885,6 +888,7 @@ "status.reply": "답장", "status.replyAll": "글타래에 답장", "status.report": "@{name} 신고하기", + "status.revoke_quote": "내 게시물을 @{name}의 게시물에서 삭제", "status.sensitive_warning": "민감한 내용", "status.share": "공유", "status.show_less_all": "모두 접기", diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json index 438ca0b735..3de45108ee 100644 --- a/app/javascript/mastodon/locales/si.json +++ b/app/javascript/mastodon/locales/si.json @@ -1,6 +1,7 @@ { "about.blocks": "මැදිහත්කරණ සේවාදායක", "about.contact": "සබඳතාව:", + "about.default_locale": "Default", "about.disclaimer": "මාස්ටඩන් යනු නිදහස් විවෘත මූලාශ්‍ර මෘදුකාංගයකි. එය මාස්ටඩන් gGmbH හි වෙළඳ නාමයකි.", "about.domain_blocks.no_reason_available": "හේතුව ලබා ගත නොහැක.", "about.domain_blocks.preamble": "Mastodon සාමාන්‍යයෙන් ඔබට fediverse හි වෙනත් ඕනෑම සේවාදායකයකින් අන්තර්ගතයන් බැලීමට සහ පරිශීලකයින් සමඟ අන්තර් ක්‍රියා කිරීමට ඉඩ සලසයි. මෙම විශේෂිත සේවාදායකයේ සිදු කර ඇති ව්‍යතිරේක මේවාය.", diff --git a/config/locales/activerecord.be.yml b/config/locales/activerecord.be.yml index 73f6f67f01..975bc1a704 100644 --- a/config/locales/activerecord.be.yml +++ b/config/locales/activerecord.be.yml @@ -18,9 +18,13 @@ be: attributes: domain: invalid: не з’яўляецца сапраўдным даменным імем + messages: + invalid_domain_on_line: "%{value} не пасуе для карэктнай назвы сервера" models: account: attributes: + fields: + fields_with_values_missing_labels: утрымлівае значэнні без апісанняў username: invalid: павінна змяшчаць толькі літары, лічбы і ніжнія падкрэсліванні reserved: зарэзервавана @@ -45,8 +49,14 @@ be: attributes: reblog: taken: гэтага допісу ўжо існуе + terms_of_service: + attributes: + effective_date: + too_soon: занадта рана, мусіць быць пасля %{date} user: attributes: + date_of_birth: + below_limit: ніжэй за дазволены ўзрост email: blocked: выкарыстоўвае забароненую крыніцу электроннай пошты unreachable: не існуе diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml index 8cdc6501cb..8eb8ff24d0 100644 --- a/config/locales/activerecord.kab.yml +++ b/config/locales/activerecord.kab.yml @@ -39,6 +39,8 @@ kab: taken: n iddaden yellan yakan user: attributes: + date_of_birth: + below_limit: ddaw n talast n leɛmeṛ email: blocked: isseqdac asaǧǧaw n yimayl ur yettusirgen ara unreachable: ur d-ttban ara d akken yella diff --git a/config/locales/be.yml b/config/locales/be.yml index 2855230b15..3cd6effdc8 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -25,6 +25,7 @@ be: one: Допіс other: Допісы posts_tab_heading: Допісы + self_follow_error: Нельга падпісацца на свой профіль admin: account_actions: action: Выканаць дзеянне @@ -51,6 +52,7 @@ be: title: Змяніць адрас эл. пошты для %{username} change_role: changed_msg: Роля паспяхова зменена! + edit_roles: Наладзіць ролі карыстальнікаў label: Змяніць ролю no_role: Няма ролі title: Змяніць ролю для %{username} @@ -194,6 +196,7 @@ be: create_relay: Стварыць рэтранслятар create_unavailable_domain: Стварыць недаступны Дамен create_user_role: Стварыць ролю + create_username_block: Стварыць правіла імя карыстальніка demote_user: Панізіць карыстальніка destroy_announcement: Выдаліць аб'яву destroy_canonical_email_block: Выдаліць блакіроўку электроннай пошты @@ -207,6 +210,7 @@ be: destroy_status: Выдаліць допіс destroy_unavailable_domain: Выдаліць недаступны дамен destroy_user_role: Выдаліць ролю + destroy_username_block: Выдаліць правіла імя карыстальніка disable_2fa_user: Адключыць двухэтапнае спраўджанне disable_custom_emoji: Адключыць адвольныя эмодзі disable_relay: Выключыць рэтранслятар @@ -241,6 +245,7 @@ be: update_report: Абнавіць скаргу update_status: Абнавіць допіс update_user_role: Абнавіць ролю + update_username_block: Абнавіць правіла імя карыстальніка actions: approve_appeal_html: Карыстальнік %{name} ухваліў запыт на мадэрацыю %{target} approve_user_html: "%{name} пацвердзіў рэгістрацыю ад %{target}" @@ -259,6 +264,7 @@ be: create_relay_html: "%{name} стварыў(-ла) рэтранслятар %{target}" create_unavailable_domain_html: "%{name} прыпыніў дастаўку да дамена %{target}" create_user_role_html: "%{name} зрабіў ролю %{target}" + create_username_block_html: Адміністратар %{name} дадаў правіла для імён карыстальнікаў, у якіх %{target} demote_user_html: "%{name} прыбраў карыстальніка %{target}" destroy_announcement_html: "%{name} выдаліў аб'яву %{target}" destroy_canonical_email_block_html: "%{name} разблакіраваў эл. пошту з хэшам %{target}" @@ -272,6 +278,7 @@ be: destroy_status_html: "%{name} выдаліў допіс %{target}" destroy_unavailable_domain_html: "%{name} дазволіў працягнуць адпраўку на дамен %{target}" destroy_user_role_html: "%{name} выдаліў ролю %{target}" + destroy_username_block_html: Адміністратар %{name} прыбраў правіла для імён карыстальнікаў, у якіх %{target} disable_2fa_user_html: "%{name} амяніў абавязковую двухфактарную верыфікацыю для карыстальніка %{target}" disable_custom_emoji_html: "%{name} заблакіраваў эмодзі %{target}" disable_relay_html: "%{name} выключыў(-ла) рэтранслятар %{target}" @@ -306,6 +313,7 @@ be: update_report_html: "%{name} абнавіў скаргу %{target}" update_status_html: "%{name} абнавіў допіс %{target}" update_user_role_html: "%{name} змяніў ролю %{target}" + update_username_block_html: Адміністратар %{name} змяніў правіла для імён карыстальнікаў, у якіх %{target} deleted_account: выдалены ўліковы запіс empty: Логі не знойдзены. filter_by_action: Фільтраваць па дзеянню @@ -313,6 +321,7 @@ be: title: Аўдыт unavailable_instance: "(імя дамена недаступнае)" announcements: + back: Вярнуцца да аб'яў destroyed_msg: Аб’ява выдалена! edit: title: Рэдагаваць абвестку @@ -321,6 +330,10 @@ be: new: create: Стварыць аб'яву title: Новая аб'ява + preview: + disclaimer: Паколькі карыстальнікі не могуць адмовіцца ад іх, апавяшчэнні па электроннай пошце мусяць выкарыстоўвацца толькі для важных аб'яў, накшталт уцечкі асабістых дадзеных ці зачынення сервера. + explanation_html: 'Ліст будзе дасланы на электронную пошту %{display_count} карыстальнікам. У ім будзе наступнае:' + title: Перадпрагляд аб'явы апавяшчэння publish: Апублікаваць published_msg: Аб'ява паспяхова апублікавана! scheduled_for: Запланавана на %{time} @@ -492,22 +505,32 @@ be: fasp: debug: callbacks: + created_at: Створана delete: Выдаліць ip: IP-адрас + request_body: Запытаць цела + title: Зрабіць дэбаг зваротных выклікаў providers: active: Актыўны base_url: Базавы URL-адрас + callback: Зваротны выклік delete: Выдаліць edit: Рэдагаваць пастаўшчыка finish_registration: Завяршыць рэгістрацыю name: Назва providers: Пастаўшчыкі public_key_fingerprint: Лічбавы адбітак публічнага ключа + registration_requested: Патрабуюцца рэгістрацыя registrations: confirm: Пацвердзіць + description: Вы запыталі рэгістрацыю ад FASP. Адмоўцеся, калі Вы не рабілі гэтага. Калі ж Вы гэта зрабілі, то ўважліва параўнайце імя і ключ перад пацвярджэннем рэгістрацыі. reject: Адхіліць + title: Пацвердзіць рэгістрацыю ў FASP save: Захаваць + select_capabilities: Выбраць здольнасці sign_in: Увайсці + status: Допіс + title: Дапаможныя серверы Fediverse title: FASP follow_recommendations: description_html: "Рэкамендацыі падпісак, дапамогаюць новым карыстальнікам хутка знайсці цікавы кантэнт. Калі карыстальнік недастаткова ўзаемадзейнічаў з іншымі, каб сфарміраваць персанальныя рэкамендацыі прытрымлівацца, замест гэтага рэкамендуюцца гэтыя ўліковыя запісы. Яны штодзённа пераразлічваюцца з сумесі ўліковых запісаў з самымі апошнімі ўзаемадзеяннямі і найбольшай колькасцю мясцовых падпісчыкаў для дадзенай мовы." @@ -586,7 +609,9 @@ be: moderation_notes: create: Дадаць нататку мадэратара created_msg: Нататка мадэратара для экзэмпляра сервера створана! + description_html: Паглядзіце і пакіньце нататкі іншым мадэратарам або сабе ў будучыні destroyed_msg: Нататка мадэратара экзэмпляра сервера выдалена! + placeholder: Інфармацыя пра гэты выпадак, прынятыя меры ці нешта яшчэ, што дапаможа Вам разабрацца з гэтым у будучыні. title: Нататкі мадэратараў private_comment: Прыватны каментарый public_comment: Публічны каментарый @@ -807,15 +832,21 @@ be: description_html: Большасць сцвярджаюць, што прачыталі ўмовы абслугоўвання і згаджаюцца з імі, але звычайна людзі не чытаюць іх да канца, пакуль не ўзнікне праблема. Таму зрабіце правілы вашага сервера простымі з першага погляду, прадставіўшы іх у выглядзе маркіраванага спісу. Старайцеся рабіць правілы кароткімі і простымі, але не разбіваць іх на шмат асобных пунктаў. edit: Рэдагаваць правіла empty: Правілы сервера яшчэ не вызначаны. + move_down: Перасунуць уніз + move_up: Перасунуць уверх title: Правілы сервера translation: Пераклад translations: Пераклады + translations_explanation: Вы можаце па жаданні дадаваць пераклады Вашых правіл. Калі перакладу няма, то пакажацца арыгінальная версія. Калі ласка, заўсёды правярайце, каб пераклад быў такім жа актуальным, як і арыгінал. settings: about: manage_rules: Кіраваць правіламі сервера preamble: Дайце падрабязную інфармацыю аб тым, як сервер працуе, мадэруецца, фінансуецца. rules_hint: Існуе спецыяльная вобласць для правілаў, якіх вашы карыстальнікі павінны прытрымлівацца. title: Пра нас + allow_referrer_origin: + desc: Калі Вашыя карыстальнікі націскаюць спасылкі на знешнія сайты, іх браўзер можа дасылаць адрас Вашага сервера Mastodon як крыніцу спасылкі. Адключыце гэту функцыю, калі яна ўнікальна ідэнтыфікуе Вашых карыстальнікаў (напрыклад, калі гэта персанальны сервер Mastodon). + title: Дазволіць знешнім сайтам бачыць Ваш сервер Mastodon як крыніцу трафіка appearance: preamble: Наладзьце вэб-інтэрфейс Mastodon. title: Выгляд @@ -922,6 +953,8 @@ be: system_checks: database_schema_check: message_html: Ёсць незавершаныя міграцыі базы даных. Запусціце іх, каб пераканацца, што праграма паводзіць сябе належным чынам + elasticsearch_analysis_index_mismatch: + message_html: Налады аналізатара індэксаў Elasticsearch пратэрмінаваныя. Калі ласка, запусціце tootctl search deploy --only-mapping --only=%{value} elasticsearch_health_red: message_html: Кластар Elasticsearch нездаровы (чырвоны статус), функцыі пошуку недаступныя elasticsearch_health_yellow: @@ -990,9 +1023,25 @@ be: generate: Выкарыстаць шаблон generates: action: Згенерыраваць + chance_to_review_html: "Аўтаматычна згенераваныя ўмовы карыстання не будуць аўтаматычна апублікаваныя. У Вас будзе магчымасць паглядзець на вынікі. Калі ласка, дайце неабходныя дэталі, каб працягнуць." + explanation_html: Узор умоў карыстання прадстаўлены выключна з інфармацыйнай мэтай і не павінен успрымацца як юрыдычная кансультацыя ні ў якім пытанні. Калі ласка, правядзіце размову з Вашым уласным юрыдычным кансультантам па Вашай сітуацыі і Вашых канкрэтных юрыдычных пытаннях. + title: Стварэнне ўмоў карыстання + going_live_on_html: Уступяць у сілу %{date} history: Гісторыя live: Дзейнічае + no_history: Пакуль не заўважана ніякіх змен ва ўмовах пагаднення. + no_terms_of_service_html: У Вас пакуль няма ніякіх умоў карыстання. Умовы карыстання ствараюцца для яснасці і абароны ад патэнцыяльных абавязкаў у спрэчках з Вашымі карыстальнікамі. + notified_on_html: Карыстальнікам паведамяць %{date} notify_users: Апавясціць карыстальнікаў + preview: + explanation_html: 'Электронны ліст будзе дасланы %{display_count} карыстальнікам, якія зарэгістраваліся да %{date}. У лісце будзе наступны тэкст:' + send_preview: Адправіць на %{email} для перадпрагляду + send_to_all: + few: Адправіць %{display_count} электронныя лісты + many: Адправіць %{display_count} электронных лістоў + one: Адправіць %{display_count} электронны ліст + other: Адправіць %{display_count} электронных лістоў + title: Перадпрагляд апавяшчэння пра ўмовы карыстання publish: Апублікаваць published_on_html: Апублікавана %{date} save_draft: Захаваць чарнавік @@ -1002,10 +1051,15 @@ be: allow: Дазволіць approved: Пацверджаны confirm_allow: Вы ўпэўнены, што хочаце дазволіць выбраныя тэгі? + confirm_disallow: Вы ўпэўненыя, што хочаце забараніць абраныя хэштэгі? disallow: Забараніць links: allow: Дазволіць спасылка allow_provider: Дазволіць выдаўца + confirm_allow: Вы ўпэўненыя, што хочаце дазволіць абраныя спасылкі? + confirm_allow_provider: Вы ўпэўненыя, што хочаце дазволіць абраныя спасылкі? + confirm_disallow: Вы ўпэўненыя, што хочаце забараніць абраныя спасылкі? + confirm_disallow_provider: Вы ўпэўненыя, што хочаце забараніць абраныя серверы? description_html: Гэта спасылкі, якія зараз часта распаўсюджваюцца ўліковымі запісамі, з якіх ваш сервер бачыць паведамленні. Гэта можа дапамагчы вашым карыстальнікам даведацца, што адбываецца ў свеце. Ніякія спасылкі не будуць паказвацца публічна, пакуль вы не зацвердзіце аўтара. Вы таксама можаце дазволіць або адхіліць асобныя спасылкі. disallow: Забараніць спасылку disallow_provider: Дазволіць выдаўца @@ -1031,6 +1085,10 @@ be: statuses: allow: Дазволіць допіс allow_account: Дазволіць аўтара + confirm_allow: Вы ўпэўненыя, што хочаце дазволіць абраныя допісы? + confirm_allow_account: Вы ўпэўненыя, што хочаце дазволіць абраныя профілі? + confirm_disallow: Вы ўпэўненыя, што хочаце забараніць абраныя допісы? + confirm_disallow_account: Вы ўпэўненыя, што хочаце забараніць абраныя профілі? description_html: Гэта допісы, пра якія ведае ваш сервер, што на дадзены момант часта абагульваюцца і падабаюцца людзям. Гэта можа дапамагчы вашым новым і пастаянным карыстальнікам знайсці больш людзей, на якіх можна падпісацца. Ніякія допісы не будуць паказвацца публічна, пакуль вы не зацвердзіце аўтара, а аўтар не дазволіць прапанаваць свой уліковы запіс іншым. Вы таксама можаце дазволіць або адхіліць асобныя допісы. disallow: Забараніць допіс disallow_account: Забараніць аўтара @@ -1069,6 +1127,25 @@ be: other: Выкарысталі %{count} чалавек за апошні тыдзень title: Рэкамендацыі і трэнды trending: Трэндавае + username_blocks: + add_new: Дадаць новае + block_registrations: Заблакіраваць рэгістрацыю + comparison: + contains: Мае + equals: Такое ж, як + contains_html: Мае %{string} + created_msg: Правіла імя карыстальніка паспяхова створанае + delete: Выдаліць + edit: + title: Змяніць правіла імя карыстальніка + matches_exactly_html: Такое ж, як %{string} + new: + create: Стварыць правіла + title: Стварыць новае правіла імя карыстальніка + no_username_block_selected: Аніводнае з правіл імён карыстальніка не было змененае, бо аніводнае не было абранае + not_permitted: Забаронена + title: Правілы імені карыстальніка + updated_msg: Правіла імя карыстальніка паспяхова абноўленае warning_presets: add_new: Дадаць новы delete: Выдаліць @@ -1227,6 +1304,7 @@ be: set_new_password: Прызначыць новы пароль setup: email_below_hint_html: Праверце папку са спамам або зрабіце новы запыт. Вы можаце выправіць свой email, калі ён няправільны. + email_settings_hint_html: Націсніце на спасылку, якую мы адправілі на %{email}, каб пачаць карыстацца Mastodon. Мы пакуль пачакаем тут. link_not_received: Не атрымалі спасылку? new_confirmation_instructions_sent: Праз некалькі хвілін вы атрымаеце новы ліст на email са спасылкай для пацверджання! title: Праверце вашу пошту @@ -1235,6 +1313,7 @@ be: title: Уваход у %{domain} sign_up: manual_review: Рэгістрацыі на %{domain} праходзяць ручную праверку нашымі мадэратарамі. Каб дапамагчы нам апрацаваць вашу рэгістрацыю, напішыце крыху пра сябе і чаму вы хочаце мець уліковы запіс на %{domain}. + preamble: З профілем на серверы Mastodon Вы зможаце падпісацца на любога чалавека ў fediverse, незалежна ад таго, на якім серверы знаходзіцца іх профіль. title: Наладзьма вас на %{domain}. status: account_status: Стан уліковага запісу @@ -1246,9 +1325,15 @@ be: view_strikes: Праглядзець мінулыя папярэджанні для вашага ўліковага запісу too_fast: Форма адпраўлена занадта хутка, паспрабуйце яшчэ раз. use_security_key: Выкарыстаеце ключ бяспекі + user_agreement_html: Я прачытаў і згаджаюся з умовамі карыстання і палітыкай прыватнасці + user_privacy_agreement_html: Я прачытаў і згаджаюся з палітыкай прыватнасці author_attribution: example_title: Прыклад тэксту + hint_html: Вы пішаце навіны ці артыкулы ў блогу па-за Mastodon? Кантралюйце, як пазначаецца Вашае аўтарства, калі імі дзеляцца ў Mastodon. + instructions: 'Упэўніцеся, што гэты код прысутнічае ў HTML-кодзе Вашага артыкула:' + more_from_html: Больш ад %{name} s_blog: Блог %{name} + then_instructions: Пасля, дадайце назву сайта публікацыі ў полі знізу. title: Пазначэнне аўтарства challenge: confirm: Працягнуць @@ -1464,6 +1549,68 @@ be: merge_long: Захаваць існуючыя запісы і дадаць новыя overwrite: Перазапісаць overwrite_long: Замяніць бягучыя запісы на новыя + overwrite_preambles: + blocking_html: + few: Вы збіраецеся замяніць свой спіс заблакіраваных карыстальнікаў %{count} карыстальнікамі з %{filename}. + many: Вы збіраецеся замяніць свой спіс заблакіраваных карыстальнікаў %{count} карыстальнікамі з %{filename}. + one: Вы збіраецеся замяніць свой спіс заблакіраваных карыстальнікаў %{count} карыстальнікам з %{filename}. + other: Вы збіраецеся замяніць свой спіс заблакіраваных карыстальнікаў %{count} карыстальнікамі з %{filename}. + bookmarks_html: + few: Вы збіраецеся замяніць свае закладкі %{count} допісамі з %{filename}. + many: Вы збіраецеся замяніць свае закладкі %{count} допісамі з %{filename}. + one: Вы збіраецеся замяніць свае закладкі %{count} допісам з %{filename}. + other: Вы збіраецеся замяніць свае закладкі %{count} допісамі з %{filename}. + domain_blocking_html: + few: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверамі з %{filename}. + many: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверамі з %{filename}. + one: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверам з %{filename}. + other: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверамі з %{filename}. + following_html: + few: Вы збіраецеся падпісацца на %{count} профілі з %{filename} і адпішацеся ад усіх астатніх. + many: Вы збіраецеся падпісацца на %{count} профіляў з %{filename} і адпішацеся ад усіх астатніх. + one: Вы збіраецеся падпісацца на %{count} профіль з %{filename} і адпішацеся ад усіх астатніх. + other: Вы збіраецеся падпісацца на %{count} профіляў з %{filename} і адпішацеся ад усіх астатніх. + lists_html: + few: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профілі будуць дададзеныя ў новыя спісы. + many: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профіляў будуць дададзеныя ў новыя спісы. + one: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профіль будзе дададзены ў новыя спісы. + other: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профіляў будуць дададзеныя ў новыя спісы. + muting_html: + few: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілямі з %{filename}. + many: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілямі з %{filename}. + one: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілем з %{filename}. + other: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілямі з %{filename}. + preambles: + blocking_html: + few: Вы збіраецеся заблакіраваць %{count} профілі з %{filename}. + many: Вы збіраецеся заблакіраваць %{count} профіляў з %{filename}. + one: Вы збіраецеся заблакіраваць %{count} профіль з %{filename}. + other: Вы збіраецеся заблакіраваць %{count} профіляў з %{filename}. + bookmarks_html: + few: Вы збіраецеся дадаць %{count} допісы з %{filename} у Вашыя закладкі. + many: Вы збіраецеся дадаць %{count} допісаў з %{filename} у Вашыя закладкі. + one: Вы збіраецеся дадаць %{count} допіс з %{filename} у Вашыя закладкі. + other: Вы збіраецеся дадаць %{count} допісаў з %{filename} у Вашыя закладкі. + domain_blocking_html: + few: Вы збіраецеся заблакіраваць %{count} серверы з %{filename}. + many: Вы збіраецеся заблакіраваць %{count} сервераў з %{filename}. + one: Вы збіраецеся заблакіраваць %{count} сервер з %{filename}. + other: Вы збіраецеся заблакіраваць %{count} сервераў з %{filename}. + following_html: + few: Вы збіраецеся падпісацца на %{count} профілі з %{filename}. + many: Вы збіраецеся падпісацца на %{count} профіляў з %{filename}. + one: Вы збіраецеся падпісацца на %{count} профіль з %{filename}. + other: Вы збіраецеся падпісацца на %{count} профіляў з %{filename}. + lists_html: + few: Вы збіраецеся дадаць %{count} профілі з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + many: Вы збіраецеся дадаць %{count} профіляў з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + one: Вы збіраецеся дадаць %{count} профіль з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + other: Вы збіраецеся дадаць %{count} профіляў з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + muting_html: + few: Вы збіраецеся пачаць ігнараваць %{count} профілі з %{filename}. + many: Вы збіраецеся пачаць ігнараваць %{count} профіляў з %{filename}. + one: Вы збіраецеся пачаць ігнараваць %{count} профіль з %{filename}. + other: Вы збіраецеся пачаць ігнараваць %{count} профіляў з %{filename}. preface: Вы можаце імпартаваць даныя, экспартаваныя вамі з іншага сервера, напрыклад, спіс людзей, на якіх вы падпісаны або якіх блакуеце. recent_imports: Нядаўнія імпарты states: @@ -1550,6 +1697,7 @@ be: media_attachments: validations: images_and_video: Немагчыма далучыць відэа да допісу, які ўжо змяшчае выявы + not_found: Файл %{ids} не знойдзены або ўжо далучаны да іншага допісу not_ready: Няможна далучыць файлы, апрацоўка якіх яшчэ не скончылася. Паспрабуйце яшчэ раз праз хвілінку! too_many: Немагчыма далучыць больш за 4 файлы migrations: @@ -1617,6 +1765,10 @@ be: title: Новае згадванне poll: subject: Апытанне ад %{name} скончылася + quote: + body: 'Ваш допіс працытаваў карыстальнік %{name}:' + subject: Карыстальнік %{name} працытаваў Ваш допіс + title: Цытаваць reblog: body: "%{name} пашырыў ваш пост:" subject: "%{name} пашырыў ваш допіс" @@ -1696,7 +1848,7 @@ be: follow_failure: Вы не можаце падпісацца на некаторыя акаўнты. follow_selected_followers: Падпісацца на выбраных падпісчыкаў followers: Падпісчыкі - following: Падпісаны + following: Падпіскі invited: Запрошаны last_active: Апошняя актыўнасць most_recent: Даўнасць @@ -1835,6 +1987,7 @@ be: edited_at_html: Адрэдагавана %{date} errors: in_reply_not_found: Здаецца, допіс, на які вы спрабуеце адказаць, не існуе. + quoted_status_not_found: Выглядае, што допісу, які Вы спрабуеце цытаваць, не існуе. over_character_limit: перавышаная колькасць сімвалаў у %{max} pin_errors: direct: Допісы, бачныя толькі згаданым карыстальнікам, нельга замацаваць @@ -1842,6 +1995,8 @@ be: ownership: Немагчыма замацаваць чужы допіс reblog: Немагчыма замацаваць пашырэнне quote_policies: + followers: Толькі Вашыя падпісчыкі + nobody: Ніхто public: Усе title: '%{name}: "%{quote}"' visibilities: @@ -1896,6 +2051,11 @@ be: does_not_match_previous_name: не супадае з папярэднім імям terms_of_service: title: Умовы выкарыстання + terms_of_service_interstitial: + future_preamble_html: Мы ўносім праўкі ў нашыя ўмовы карыстання, якія пачнуць дзейнічаць %{date}. Мы раім Вам азнаёміцца з абноўленымі ўмовамі. + past_preamble_html: Пасля Вашага апошняга наведвання мы ўнеслі праўкі ў нашыя ўмовы карыстання. Мы раім Вам азнаёміцца з абноўленымі ўмовамі. + review_link: Прачытаць умовы карыстання + title: На %{domain} змяняюцца ўмовы карыстання themes: contrast: Mastodon (высокі кантраст) default: Mastodon (цёмная) @@ -1927,6 +2087,10 @@ be: recovery_instructions_html: Калі раптам вы страціце доступ да свайго тэлефона, вы можаце скарыстаць адзін з кодаў аднаўлення ніжэй каб аднавіць доступ да свайго ўліковага запісу. Захоўвайце іх у бяспечным месцы. Напрыклад, вы можаце раздрукаваць іх і захоўваць разам з іншымі важнымі дакументамі. webauthn: Ключы бяспекі user_mailer: + announcement_published: + description: 'Аб''ява ад адміністратараў %{domain}:' + subject: Аб'ява сэрвісу + title: Аб'ява сэрвісу %{domain} appeal_approved: action: Налады ўліковага запісу explanation: Апеляцыя на папярэджанне супраць вашага ўліковага запісу ад %{strike_date}, якую вы падалі %{appeal_date}, была ўхвалена. Ваш уліковы запіс зноў на добрым рахунку. @@ -1957,7 +2121,13 @@ be: subject: У вас уліковы запіс зайшлі з новага IP-адрасу title: Новы ўваход terms_of_service_changed: + agreement: Працягваючы карыстацца %{domain}, Вы пагаджаецеся з гэтымі ўмовамі. Калі Вы не згодныя з абноўленымі ўмовамі, то можаце ў любы момант адмовіцца ад пагаднення з %{domain}, выдаліўшы свой профіль. + changelog: 'Коратка пра тое, што значыць гэтае абнаўленне:' + description: 'Вы атрымалі дадзены ліст, бо мы ўносім праўкі ў нашыя ўмовы карыстання на %{domain}. Гэтыя абнаўленні ўступяць у сілу %{date}. Мы раім Вам цалкам азнаёміцца з абноўленымі ўмовамі тут:' + description_html: Вы атрымалі дадзены ліст, бо мы ўносім праўкі ў нашыя ўмовы карыстання на %{domain}. Гэтыя абнаўленні ўступяць у сілу %{date}. Мы раім Вам цалкам азнаёміцца з абноўленымі ўмовамі тут. sign_off: Каманда %{domain} + subject: Абнаўленні ў нашых умовах карыстання + subtitle: Змяняюцца ўмовы карыстання на %{domain} title: Важнае абнаўленне warning: appeal: Падаць апеляцыю @@ -2047,6 +2217,7 @@ be: instructions_html: Скапіруйце прыведзены ніжэй код і ўстаўце ў HTML вашага сайта. Затым дадайце адрас вашага сайта ў адно з дадатковых палёў вашага профілю на ўкладцы «рэдагаваць профіль» і захавайце змены. verification: Верыфікацыя verified_links: Вашыя правераныя спасылкі + website_verification: Пацвярджэнне сайта webauthn_credentials: add: Дадаць новы ключ бяспекі create: diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml index b01f476a20..7f1dadc4cf 100644 --- a/config/locales/doorkeeper.be.yml +++ b/config/locales/doorkeeper.be.yml @@ -60,6 +60,7 @@ be: error: title: Узнікла памылка new: + prompt_html: "%{client_name} хоча атрымаць дазвол на доступ да Вашага профілю. Ухваляйце гэты запыт толькі калі Вы ведаеце гэту крыніцу і давяраеце ёй." review_permissions: Прагледзець дазволы title: Патрабуецца аўтарызацыя show: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index 4685887a96..a50b2d108a 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -567,6 +567,7 @@ kab: accept: Qbel back: Tuɣalin invited_by: 'Tzemreḍ ad tkecmeḍ ɣer %{domain} s tanemmirt i tinnubga i d-teṭṭfeḍ sɣur :' + preamble: Tiyi ttwasemmant-d yerna ttwaḍemnent sɣur imḍebbren n %{domain}. preamble_invited: Uqbel ad tkemmleḍ, ttxil-k·m ẓer ilugan i d-sbedden yimkariyen n %{domain}. title: Kra n yilugan igejdanen. title_invited: Tettwaɛerḍeḍ. @@ -578,6 +579,7 @@ kab: preamble_html: Kcem ar %{domain} s inekcam-inek n tuqqna. Ma yella yezga-d umiḍan-ik deg uqeddac-nniḍen, ur tezmireḍ ara ad tkecmeḍ sya. title: Akeččum ɣer %{domain} sign_up: + preamble: S umiḍan yellan deg uqeddac-a n Mastodon, ad tizimreḍ ad t-ḍefreḍ yal yiwen nniḍen i yellan deg fediverse, akken yebɣu yili wanda i yella umiḍan-nsen. title: Iyya ad d-nessewjed tiɣawsiwin i %{domain}. status: account_status: Addad n umiḍan @@ -744,6 +746,8 @@ kab: action: Err body: 'Yuder-ik·ikem-id %{name} deg:' subject: Yuder-ik·ikem-id %{name} + quote: + title: Tabdert tamaynut reblog: subject: "%{name} yesselha addad-ik·im" title: Azuzer amaynut diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 296ce49131..e85dd32556 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -56,7 +56,7 @@ da: scopes: De API'er, som applikationen vil kunne tilgå. Vælges en topniveaudstrækning, vil detailvalg være unødvendige. setting_aggregate_reblogs: Vis ikke nye fremhævelser for nyligt fremhævede indlæg (påvirker kun nyligt modtagne fremhævelser) setting_always_send_emails: Normalt sendes ingen e-mailnotifikationer under aktivt brug af Mastodon - setting_default_quote_policy: Denne indstilling træder kun i kraft for indlæg oprettet med den næste Mastodon-version, men egne præference kan vælges som forberedelse. + setting_default_quote_policy: Denne indstilling træder kun i kraft for indlæg oprettet med den næste Mastodon-version, men egen præference kan vælges som forberedelse. setting_default_sensitive: Sensitive medier er som standard skjult og kan vises med et klik setting_display_media_default: Skjul medier med sensitiv-markering setting_display_media_hide_all: Skjul altid medier diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index d1a288e213..16c425186b 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -27,6 +27,8 @@ kab: username: Tzemreḍ ad tesqedceḍ isekkilen, uṭṭunen akked yijerriden n wadda featured_tag: 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 form_challenge: current_password: Tkecmeḍ ɣer temnaḍt taɣellsant imports: @@ -37,15 +39,19 @@ kab: comment: D afrayan. Cfu ɣef wayɣer i terniḍ alugen-a. severities: no_access: Sewḥel anekcu ɣer akk tiɣbula + user: + date_of_birth: + one: Ilaq ad neḍmen belli tesɛiḍ ma ulac %{count} akken ad tesqedceḍ %{domain}. Ur neḥrez ara aya. + other: Ilaq ad neḍmen belli tesɛiḍ ma ulac %{count} akken ad tesqedceḍ %{domain}. Ur neḥrez ara aya. labels: account: fields: name: Tabzimt value: Agbur account_alias: - acct: Tansa n umiḍan aqbur + acct: Asulay n umiḍan aqbur account_migration: - acct: Tansa n umiḍan amaynut + acct: Asulay n umiḍan amaynut account_warning_preset: title: Azwel admin_account_action: @@ -90,12 +96,14 @@ kab: setting_always_send_emails: Dima ttazen-d ilɣa s yimayl setting_default_language: Tutlayt n usuffeɣ setting_default_privacy: Tabaḍnit n usuffeɣ + setting_default_quote_policy: Anwa i izemren ad d-yebder setting_display_media: Askanay n imidyaten setting_display_media_default: Akk-a kan setting_display_media_hide_all: Ffer-iten akk setting_display_media_show_all: Sken-iten-id akk setting_hide_network: Ffer azetta-k·m inmetti setting_theme: Asental n wesmel + setting_trends: Sken-d inezzaɣ n wass-a setting_use_pending_items: Askar aleɣwayan sign_in_token_attempt: Tangalt n tɣellist title: Azwel @@ -116,6 +124,7 @@ kab: status_page_url: URL n uusebter n waddaden theme: Asentel amezwer thumbnail: Tanfult n uqeddac + trends: Rmed inezzaɣ interactions: must_be_follower: Ssewḥel ilɣa sɣur wid akk d tid ur yellin ara d imeḍfaren-ik·im must_be_following: Ssewḥel ilɣa sɣur wid akked tid ur tettḍafareḍ ara From 868c46bc7687a8c361060078ad7d33f1e00941a6 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Fri, 8 Aug 2025 11:46:09 +0200 Subject: [PATCH 03/64] Add delivery failure handling to FASP jobs (#35723) --- app/models/fasp/provider.rb | 17 ++++ app/workers/fasp/account_search_worker.rb | 16 +-- ...announce_account_lifecycle_event_worker.rb | 10 +- ...announce_content_lifecycle_event_worker.rb | 10 +- app/workers/fasp/announce_trend_worker.rb | 10 +- app/workers/fasp/backfill_worker.rb | 12 +-- app/workers/fasp/base_worker.rb | 19 ++++ .../fasp/follow_recommendation_worker.rb | 20 ++-- ...livery_last_failed_at_to_fasp_providers.rb | 7 ++ db/schema.rb | 97 +++++++++--------- spec/models/fasp/provider_spec.rb | 98 +++++++++++++++++++ .../examples/workers/fasp/delivery_failure.rb | 57 +++++++++++ .../fasp/account_search_worker_spec.rb | 18 +++- ...nce_account_lifecycle_event_worker_spec.rb | 16 ++- ...nce_content_lifecycle_event_worker_spec.rb | 16 ++- .../fasp/announce_trend_worker_spec.rb | 18 +++- spec/workers/fasp/backfill_worker_spec.rb | 16 ++- .../fasp/follow_recommendation_worker_spec.rb | 22 +++-- 18 files changed, 373 insertions(+), 106 deletions(-) create mode 100644 app/workers/fasp/base_worker.rb create mode 100644 db/migrate/20250805075010_add_delivery_last_failed_at_to_fasp_providers.rb create mode 100644 spec/support/examples/workers/fasp/delivery_failure.rb diff --git a/app/models/fasp/provider.rb b/app/models/fasp/provider.rb index 9f7be482fe..9c9b187cca 100644 --- a/app/models/fasp/provider.rb +++ b/app/models/fasp/provider.rb @@ -9,6 +9,7 @@ # capabilities :jsonb not null # confirmed :boolean default(FALSE), not null # contact_email :string +# delivery_last_failed_at :datetime # fediverse_account :string # name :string not null # privacy_policy :jsonb @@ -22,6 +23,8 @@ class Fasp::Provider < ApplicationRecord include DebugConcern + RETRY_INTERVAL = 1.hour + has_many :fasp_backfill_requests, inverse_of: :fasp_provider, class_name: 'Fasp::BackfillRequest', dependent: :delete_all has_many :fasp_debug_callbacks, inverse_of: :fasp_provider, class_name: 'Fasp::DebugCallback', dependent: :delete_all has_many :fasp_subscriptions, inverse_of: :fasp_provider, class_name: 'Fasp::Subscription', dependent: :delete_all @@ -122,6 +125,16 @@ class Fasp::Provider < ApplicationRecord @delivery_failure_tracker ||= DeliveryFailureTracker.new(base_url, resolution: :minutes) end + def available? + delivery_failure_tracker.available? || retry_worthwile? + end + + def update_availability! + self.delivery_last_failed_at = (Time.current unless delivery_failure_tracker.available?) + + save! + end + private def create_keypair @@ -148,4 +161,8 @@ class Fasp::Provider < ApplicationRecord Fasp::Request.new(self).delete(path) end end + + def retry_worthwile? + delivery_last_failed_at && delivery_last_failed_at < RETRY_INTERVAL.ago + end end diff --git a/app/workers/fasp/account_search_worker.rb b/app/workers/fasp/account_search_worker.rb index 745285c44d..12b000fa86 100644 --- a/app/workers/fasp/account_search_worker.rb +++ b/app/workers/fasp/account_search_worker.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true -class Fasp::AccountSearchWorker - include Sidekiq::Worker - - sidekiq_options queue: 'fasp', retry: 0 +class Fasp::AccountSearchWorker < Fasp::BaseWorker + sidekiq_options retry: 0 def perform(query) return unless Mastodon::Feature.fasp_enabled? @@ -17,11 +15,13 @@ class Fasp::AccountSearchWorker fetch_service = ActivityPub::FetchRemoteActorService.new account_search_providers.each do |provider| - Fasp::Request.new(provider).get("/account_search/v0/search?#{params}").each do |uri| - next if Account.where(uri:).any? + with_provider(provider) do + Fasp::Request.new(provider).get("/account_search/v0/search?#{params}").each do |uri| + next if Account.where(uri:).any? - account = fetch_service.call(uri) - async_refresh.increment_result_count(by: 1) if account.present? + account = fetch_service.call(uri) + async_refresh.increment_result_count(by: 1) if account.present? + end end end ensure diff --git a/app/workers/fasp/announce_account_lifecycle_event_worker.rb b/app/workers/fasp/announce_account_lifecycle_event_worker.rb index ea8544c24d..fc7fb235ea 100644 --- a/app/workers/fasp/announce_account_lifecycle_event_worker.rb +++ b/app/workers/fasp/announce_account_lifecycle_event_worker.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true -class Fasp::AnnounceAccountLifecycleEventWorker - include Sidekiq::Worker - - sidekiq_options queue: 'fasp', retry: 5 +class Fasp::AnnounceAccountLifecycleEventWorker < Fasp::BaseWorker + sidekiq_options retry: 5 def perform(uri, event_type) Fasp::Subscription.includes(:fasp_provider).category_account.lifecycle.each do |subscription| - announce(subscription, uri, event_type) + with_provider(subscription.fasp_provider) do + announce(subscription, uri, event_type) + end end end diff --git a/app/workers/fasp/announce_content_lifecycle_event_worker.rb b/app/workers/fasp/announce_content_lifecycle_event_worker.rb index 744528f2d3..d4450a8aec 100644 --- a/app/workers/fasp/announce_content_lifecycle_event_worker.rb +++ b/app/workers/fasp/announce_content_lifecycle_event_worker.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true -class Fasp::AnnounceContentLifecycleEventWorker - include Sidekiq::Worker - - sidekiq_options queue: 'fasp', retry: 5 +class Fasp::AnnounceContentLifecycleEventWorker < Fasp::BaseWorker + sidekiq_options retry: 5 def perform(uri, event_type) Fasp::Subscription.includes(:fasp_provider).category_content.lifecycle.each do |subscription| - announce(subscription, uri, event_type) + with_provider(subscription.fasp_provider) do + announce(subscription, uri, event_type) + end end end diff --git a/app/workers/fasp/announce_trend_worker.rb b/app/workers/fasp/announce_trend_worker.rb index ae93c3d9f6..dc1d94a271 100644 --- a/app/workers/fasp/announce_trend_worker.rb +++ b/app/workers/fasp/announce_trend_worker.rb @@ -1,16 +1,16 @@ # frozen_string_literal: true -class Fasp::AnnounceTrendWorker - include Sidekiq::Worker - - sidekiq_options queue: 'fasp', retry: 5 +class Fasp::AnnounceTrendWorker < Fasp::BaseWorker + sidekiq_options retry: 5 def perform(status_id, trend_source) status = ::Status.includes(:account).find(status_id) return unless status.account.indexable? Fasp::Subscription.includes(:fasp_provider).category_content.trends.each do |subscription| - announce(subscription, status.uri) if trending?(subscription, status, trend_source) + with_provider(subscription.fasp_provider) do + announce(subscription, status.uri) if trending?(subscription, status, trend_source) + end end rescue ActiveRecord::RecordNotFound # status might not exist anymore, in which case there is nothing to do diff --git a/app/workers/fasp/backfill_worker.rb b/app/workers/fasp/backfill_worker.rb index 4e30b71a7d..228dcbc1d2 100644 --- a/app/workers/fasp/backfill_worker.rb +++ b/app/workers/fasp/backfill_worker.rb @@ -1,16 +1,16 @@ # frozen_string_literal: true -class Fasp::BackfillWorker - include Sidekiq::Worker - - sidekiq_options queue: 'fasp', retry: 5 +class Fasp::BackfillWorker < Fasp::BaseWorker + sidekiq_options retry: 5 def perform(backfill_request_id) backfill_request = Fasp::BackfillRequest.find(backfill_request_id) - announce(backfill_request) + with_provider(backfill_request.fasp_provider) do + announce(backfill_request) - backfill_request.advance! + backfill_request.advance! + end rescue ActiveRecord::RecordNotFound # ignore missing backfill requests end diff --git a/app/workers/fasp/base_worker.rb b/app/workers/fasp/base_worker.rb new file mode 100644 index 0000000000..fe7f0b0c00 --- /dev/null +++ b/app/workers/fasp/base_worker.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class Fasp::BaseWorker + include Sidekiq::Worker + + sidekiq_options queue: 'fasp' + + private + + def with_provider(provider) + return unless provider.available? + + yield + rescue *Mastodon::HTTP_CONNECTION_ERRORS + raise if provider.available? + ensure + provider.update_availability! + end +end diff --git a/app/workers/fasp/follow_recommendation_worker.rb b/app/workers/fasp/follow_recommendation_worker.rb index 5e760491bf..b0eb4e38bf 100644 --- a/app/workers/fasp/follow_recommendation_worker.rb +++ b/app/workers/fasp/follow_recommendation_worker.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true -class Fasp::FollowRecommendationWorker - include Sidekiq::Worker - - sidekiq_options queue: 'fasp', retry: 0 +class Fasp::FollowRecommendationWorker < Fasp::BaseWorker + sidekiq_options retry: 0 def perform(account_id) return unless Mastodon::Feature.fasp_enabled? @@ -20,14 +18,16 @@ class Fasp::FollowRecommendationWorker fetch_service = ActivityPub::FetchRemoteActorService.new follow_recommendation_providers.each do |provider| - Fasp::Request.new(provider).get("/follow_recommendation/v0/accounts?#{params}").each do |uri| - next if Account.where(uri:).any? + with_provider(provider) do + Fasp::Request.new(provider).get("/follow_recommendation/v0/accounts?#{params}").each do |uri| + next if Account.where(uri:).any? - new_account = fetch_service.call(uri) + new_account = fetch_service.call(uri) - if new_account.present? - Fasp::FollowRecommendation.find_or_create_by(requesting_account: account, recommended_account: new_account) - async_refresh.increment_result_count(by: 1) + if new_account.present? + Fasp::FollowRecommendation.find_or_create_by(requesting_account: account, recommended_account: new_account) + async_refresh.increment_result_count(by: 1) + end end end end diff --git a/db/migrate/20250805075010_add_delivery_last_failed_at_to_fasp_providers.rb b/db/migrate/20250805075010_add_delivery_last_failed_at_to_fasp_providers.rb new file mode 100644 index 0000000000..f8af1f3337 --- /dev/null +++ b/db/migrate/20250805075010_add_delivery_last_failed_at_to_fasp_providers.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddDeliveryLastFailedAtToFaspProviders < ActiveRecord::Migration[8.0] + def change + add_column :fasp_providers, :delivery_last_failed_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 272d6fac18..cf8c74c8e2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_07_17_003848) do +ActiveRecord::Schema[8.0].define(version: 2025_08_05_075010) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -488,6 +488,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_07_17_003848) do t.string "fediverse_account" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.datetime "delivery_last_failed_at" t.index ["base_url"], name: "index_fasp_providers_on_base_url", unique: true end @@ -1483,53 +1484,6 @@ ActiveRecord::Schema[8.0].define(version: 2025_07_17_003848) do add_foreign_key "web_settings", "users", name: "fk_11910667b2", on_delete: :cascade add_foreign_key "webauthn_credentials", "users", on_delete: :cascade - create_view "instances", materialized: true, sql_definition: <<-SQL - WITH domain_counts(domain, accounts_count) AS ( - SELECT accounts.domain, - count(*) AS accounts_count - FROM accounts - WHERE (accounts.domain IS NOT NULL) - GROUP BY accounts.domain - ) - SELECT domain_counts.domain, - domain_counts.accounts_count - FROM domain_counts - UNION - SELECT domain_blocks.domain, - COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count - FROM (domain_blocks - LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_blocks.domain)::text))) - UNION - SELECT domain_allows.domain, - COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count - FROM (domain_allows - LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_allows.domain)::text))); - SQL - add_index "instances", "reverse(('.'::text || (domain)::text)), domain", name: "index_instances_on_reverse_domain" - add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true - - create_view "user_ips", sql_definition: <<-SQL - SELECT user_id, - ip, - max(used_at) AS used_at - FROM ( SELECT users.id AS user_id, - users.sign_up_ip AS ip, - users.created_at AS used_at - FROM users - WHERE (users.sign_up_ip IS NOT NULL) - UNION ALL - SELECT session_activations.user_id, - session_activations.ip, - session_activations.updated_at - FROM session_activations - UNION ALL - SELECT login_activities.user_id, - login_activities.ip, - login_activities.created_at - FROM login_activities - WHERE (login_activities.success = true)) t0 - GROUP BY user_id, ip; - SQL create_view "account_summaries", materialized: true, sql_definition: <<-SQL SELECT accounts.id AS account_id, mode() WITHIN GROUP (ORDER BY t0.language) AS language, @@ -1580,4 +1534,51 @@ ActiveRecord::Schema[8.0].define(version: 2025_07_17_003848) do SQL add_index "global_follow_recommendations", ["account_id"], name: "index_global_follow_recommendations_on_account_id", unique: true + create_view "instances", materialized: true, sql_definition: <<-SQL + WITH domain_counts(domain, accounts_count) AS ( + SELECT accounts.domain, + count(*) AS accounts_count + FROM accounts + WHERE (accounts.domain IS NOT NULL) + GROUP BY accounts.domain + ) + SELECT domain_counts.domain, + domain_counts.accounts_count + FROM domain_counts + UNION + SELECT domain_blocks.domain, + COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count + FROM (domain_blocks + LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_blocks.domain)::text))) + UNION + SELECT domain_allows.domain, + COALESCE(domain_counts.accounts_count, (0)::bigint) AS accounts_count + FROM (domain_allows + LEFT JOIN domain_counts ON (((domain_counts.domain)::text = (domain_allows.domain)::text))); + SQL + add_index "instances", "reverse(('.'::text || (domain)::text)), domain", name: "index_instances_on_reverse_domain" + add_index "instances", ["domain"], name: "index_instances_on_domain", unique: true + + create_view "user_ips", sql_definition: <<-SQL + SELECT user_id, + ip, + max(used_at) AS used_at + FROM ( SELECT users.id AS user_id, + users.sign_up_ip AS ip, + users.created_at AS used_at + FROM users + WHERE (users.sign_up_ip IS NOT NULL) + UNION ALL + SELECT session_activations.user_id, + session_activations.ip, + session_activations.updated_at + FROM session_activations + UNION ALL + SELECT login_activities.user_id, + login_activities.ip, + login_activities.created_at + FROM login_activities + WHERE (login_activities.success = true)) t0 + GROUP BY user_id, ip; + SQL end diff --git a/spec/models/fasp/provider_spec.rb b/spec/models/fasp/provider_spec.rb index 9fd2c4c234..c0e6ae255a 100644 --- a/spec/models/fasp/provider_spec.rb +++ b/spec/models/fasp/provider_spec.rb @@ -214,4 +214,102 @@ RSpec.describe Fasp::Provider do expect(subject.delivery_failure_tracker).to be_a(DeliveryFailureTracker) end end + + describe '#available?' do + subject { Fabricate(:fasp_provider, delivery_last_failed_at:) } + + let(:delivery_last_failed_at) { nil } + + before do + allow(subject.delivery_failure_tracker).to receive(:available?).and_return(available) + end + + context 'when the delivery failure tracker reports it is available' do + let(:available) { true } + + it 'returns true' do + expect(subject.available?).to be true + end + end + + context 'when the delivery failure tracker reports it is unavailable' do + let(:available) { false } + + context 'when the last failure was more than one hour ago' do + let(:delivery_last_failed_at) { 61.minutes.ago } + + it 'returns true' do + expect(subject.available?).to be true + end + end + + context 'when the last failure is very recent' do + let(:delivery_last_failed_at) { 5.minutes.ago } + + it 'returns false' do + expect(subject.available?).to be false + end + end + end + end + + describe '#update_availability!' do + subject { Fabricate(:fasp_provider, delivery_last_failed_at:) } + + before do + allow(subject.delivery_failure_tracker).to receive(:available?).and_return(available) + end + + context 'when `delivery_last_failed_at` is `nil`' do + let(:delivery_last_failed_at) { nil } + + context 'when the delivery failure tracker reports it is available' do + let(:available) { true } + + it 'does not update the provider' do + subject.update_availability! + + expect(subject.saved_changes?).to be false + end + end + + context 'when the delivery failure tracker reports it is unavailable' do + let(:available) { false } + + it 'sets `delivery_last_failed_at` to the current time' do + freeze_time + + subject.update_availability! + + expect(subject.delivery_last_failed_at).to eq Time.zone.now + end + end + end + + context 'when `delivery_last_failed_at` is present' do + context 'when the delivery failure tracker reports it is available' do + let(:available) { true } + let(:delivery_last_failed_at) { 5.minutes.ago } + + it 'sets `delivery_last_failed_at` to `nil`' do + subject.update_availability! + + expect(subject.delivery_last_failed_at).to be_nil + end + end + + context 'when the delivery failure tracker reports it is unavailable' do + let(:available) { false } + let(:delivery_last_failed_at) { 5.minutes.ago } + + it 'updates `delivery_last_failed_at` to the current time' do + freeze_time + + subject.update_availability! + + expect(subject.delivery_last_failed_at).to eq Time.zone.now + end + end + end + end end diff --git a/spec/support/examples/workers/fasp/delivery_failure.rb b/spec/support/examples/workers/fasp/delivery_failure.rb new file mode 100644 index 0000000000..006d93e80d --- /dev/null +++ b/spec/support/examples/workers/fasp/delivery_failure.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'worker handling fasp delivery failures' do + context 'when provider is not available' do + before do + provider.update(delivery_last_failed_at: 1.minute.ago) + domain = Addressable::URI.parse(provider.base_url).normalized_host + UnavailableDomain.create!(domain:) + end + + it 'does not attempt connecting and does not fail the job' do + expect { subject }.to_not raise_error + expect(stubbed_request).to_not have_been_made + end + end + + context 'when connection to provider fails' do + before do + base_stubbed_request + .to_raise(HTTP::ConnectionError) + end + + context 'when provider becomes unavailable' do + before do + travel_to 5.minutes.ago + 4.times do + provider.delivery_failure_tracker.track_failure! + travel_to 1.minute.since + end + end + + it 'updates the provider and does not fail the job, so it will not be retried' do + expect { subject }.to_not raise_error + expect(provider.reload.delivery_last_failed_at).to eq Time.current + end + end + + context 'when provider is still marked as available' do + it 'fails the job so it can be retried' do + expect { subject }.to raise_error(HTTP::ConnectionError) + end + end + end + + context 'when connection to a previously unavailable provider succeeds' do + before do + provider.update(delivery_last_failed_at: 2.hours.ago) + domain = Addressable::URI.parse(provider.base_url).normalized_host + UnavailableDomain.create!(domain:) + end + + it 'marks the provider as being available again' do + expect { subject }.to_not raise_error + expect(provider).to be_available + end + end +end diff --git a/spec/workers/fasp/account_search_worker_spec.rb b/spec/workers/fasp/account_search_worker_spec.rb index a96ba0c23b..1c543b62ae 100644 --- a/spec/workers/fasp/account_search_worker_spec.rb +++ b/spec/workers/fasp/account_search_worker_spec.rb @@ -5,12 +5,14 @@ require 'rails_helper' RSpec.describe Fasp::AccountSearchWorker, feature: :fasp do include ProviderRequestHelper + subject { described_class.new.perform('cats') } + let(:provider) { Fabricate(:account_search_fasp) } let(:account) { Fabricate(:account) } let(:fetch_service) { instance_double(ActivityPub::FetchRemoteActorService, call: true) } + let(:path) { '/account_search/v0/search?term=cats&limit=10' } let!(:stubbed_request) do - path = '/account_search/v0/search?term=cats&limit=10' stub_provider_request(provider, method: :get, path:, @@ -25,7 +27,7 @@ RSpec.describe Fasp::AccountSearchWorker, feature: :fasp do end it 'requests search results and fetches received account uris' do - described_class.new.perform('cats') + subject expect(stubbed_request).to have_been_made expect(fetch_service).to have_received(:call).with('https://fedi.example.com/accounts/2') @@ -35,7 +37,7 @@ RSpec.describe Fasp::AccountSearchWorker, feature: :fasp do it 'marks a running async refresh as finished' do async_refresh = AsyncRefresh.create("fasp:account_search:#{Digest::MD5.base64digest('cats')}", count_results: true) - described_class.new.perform('cats') + subject expect(async_refresh.reload).to be_finished end @@ -43,8 +45,16 @@ RSpec.describe Fasp::AccountSearchWorker, feature: :fasp do it 'tracks the number of fetched accounts in the async refresh' do async_refresh = AsyncRefresh.create("fasp:account_search:#{Digest::MD5.base64digest('cats')}", count_results: true) - described_class.new.perform('cats') + subject expect(async_refresh.reload.result_count).to eq 2 end + + describe 'provider delivery failure handling' do + let(:base_stubbed_request) do + stub_request(:get, provider.url(path)) + end + + it_behaves_like('worker handling fasp delivery failures') + end end diff --git a/spec/workers/fasp/announce_account_lifecycle_event_worker_spec.rb b/spec/workers/fasp/announce_account_lifecycle_event_worker_spec.rb index 0d4a870875..b89d4fe658 100644 --- a/spec/workers/fasp/announce_account_lifecycle_event_worker_spec.rb +++ b/spec/workers/fasp/announce_account_lifecycle_event_worker_spec.rb @@ -5,15 +5,19 @@ require 'rails_helper' RSpec.describe Fasp::AnnounceAccountLifecycleEventWorker do include ProviderRequestHelper + subject { described_class.new.perform(account_uri, 'new') } + let(:account_uri) { 'https://masto.example.com/accounts/1' } let(:subscription) do Fabricate(:fasp_subscription, category: 'account') end let(:provider) { subscription.fasp_provider } + let(:path) { '/data_sharing/v0/announcements' } + let!(:stubbed_request) do stub_provider_request(provider, method: :post, - path: '/data_sharing/v0/announcements', + path:, response_body: { source: { subscription: { @@ -27,8 +31,16 @@ RSpec.describe Fasp::AnnounceAccountLifecycleEventWorker do end it 'sends the account uri to subscribed providers' do - described_class.new.perform(account_uri, 'new') + subject expect(stubbed_request).to have_been_made end + + describe 'provider delivery failure handling' do + let(:base_stubbed_request) do + stub_request(:post, provider.url(path)) + end + + it_behaves_like('worker handling fasp delivery failures') + end end diff --git a/spec/workers/fasp/announce_content_lifecycle_event_worker_spec.rb b/spec/workers/fasp/announce_content_lifecycle_event_worker_spec.rb index 60618607c9..6ff5a9f771 100644 --- a/spec/workers/fasp/announce_content_lifecycle_event_worker_spec.rb +++ b/spec/workers/fasp/announce_content_lifecycle_event_worker_spec.rb @@ -5,15 +5,19 @@ require 'rails_helper' RSpec.describe Fasp::AnnounceContentLifecycleEventWorker do include ProviderRequestHelper + subject { described_class.new.perform(status_uri, 'new') } + let(:status_uri) { 'https://masto.example.com/status/1' } let(:subscription) do Fabricate(:fasp_subscription) end let(:provider) { subscription.fasp_provider } + let(:path) { '/data_sharing/v0/announcements' } + let!(:stubbed_request) do stub_provider_request(provider, method: :post, - path: '/data_sharing/v0/announcements', + path:, response_body: { source: { subscription: { @@ -27,8 +31,16 @@ RSpec.describe Fasp::AnnounceContentLifecycleEventWorker do end it 'sends the status uri to subscribed providers' do - described_class.new.perform(status_uri, 'new') + subject expect(stubbed_request).to have_been_made end + + describe 'provider delivery failure handling' do + let(:base_stubbed_request) do + stub_request(:post, provider.url(path)) + end + + it_behaves_like('worker handling fasp delivery failures') + end end diff --git a/spec/workers/fasp/announce_trend_worker_spec.rb b/spec/workers/fasp/announce_trend_worker_spec.rb index 799d8a8f48..369c2f1267 100644 --- a/spec/workers/fasp/announce_trend_worker_spec.rb +++ b/spec/workers/fasp/announce_trend_worker_spec.rb @@ -5,6 +5,8 @@ require 'rails_helper' RSpec.describe Fasp::AnnounceTrendWorker do include ProviderRequestHelper + subject { described_class.new.perform(status.id, 'favourite') } + let(:status) { Fabricate(:status) } let(:subscription) do Fabricate(:fasp_subscription, @@ -14,10 +16,12 @@ RSpec.describe Fasp::AnnounceTrendWorker do threshold_likes: 2) end let(:provider) { subscription.fasp_provider } + let(:path) { '/data_sharing/v0/announcements' } + let!(:stubbed_request) do stub_provider_request(provider, method: :post, - path: '/data_sharing/v0/announcements', + path:, response_body: { source: { subscription: { @@ -36,15 +40,23 @@ RSpec.describe Fasp::AnnounceTrendWorker do end it 'sends the account uri to subscribed providers' do - described_class.new.perform(status.id, 'favourite') + subject expect(stubbed_request).to have_been_made end + + describe 'provider delivery failure handling' do + let(:base_stubbed_request) do + stub_request(:post, provider.url(path)) + end + + it_behaves_like('worker handling fasp delivery failures') + end end context 'when the configured threshold is not met' do it 'does not notify any provider' do - described_class.new.perform(status.id, 'favourite') + subject expect(stubbed_request).to_not have_been_made end diff --git a/spec/workers/fasp/backfill_worker_spec.rb b/spec/workers/fasp/backfill_worker_spec.rb index 43734e02ba..e15493ea5d 100644 --- a/spec/workers/fasp/backfill_worker_spec.rb +++ b/spec/workers/fasp/backfill_worker_spec.rb @@ -5,13 +5,17 @@ require 'rails_helper' RSpec.describe Fasp::BackfillWorker do include ProviderRequestHelper + subject { described_class.new.perform(backfill_request.id) } + let(:backfill_request) { Fabricate(:fasp_backfill_request) } let(:provider) { backfill_request.fasp_provider } let(:status) { Fabricate(:status) } + let(:path) { '/data_sharing/v0/announcements' } + let!(:stubbed_request) do stub_provider_request(provider, method: :post, - path: '/data_sharing/v0/announcements', + path:, response_body: { source: { backfillRequest: { @@ -25,8 +29,16 @@ RSpec.describe Fasp::BackfillWorker do end it 'sends status uri to provider that requested backfill' do - described_class.new.perform(backfill_request.id) + subject expect(stubbed_request).to have_been_made end + + describe 'provider delivery failure handling' do + let(:base_stubbed_request) do + stub_request(:post, provider.url(path)) + end + + it_behaves_like('worker handling fasp delivery failures') + end end diff --git a/spec/workers/fasp/follow_recommendation_worker_spec.rb b/spec/workers/fasp/follow_recommendation_worker_spec.rb index baa647aa06..895175f3f3 100644 --- a/spec/workers/fasp/follow_recommendation_worker_spec.rb +++ b/spec/workers/fasp/follow_recommendation_worker_spec.rb @@ -5,13 +5,15 @@ require 'rails_helper' RSpec.describe Fasp::FollowRecommendationWorker, feature: :fasp do include ProviderRequestHelper + subject { described_class.new.perform(account.id) } + let(:provider) { Fabricate(:follow_recommendation_fasp) } let(:account) { Fabricate(:account) } + let(:account_uri) { ActivityPub::TagManager.instance.uri_for(account) } let(:fetch_service) { instance_double(ActivityPub::FetchRemoteActorService) } + let(:path) { "/follow_recommendation/v0/accounts?accountUri=#{URI.encode_uri_component(account_uri)}" } let!(:stubbed_request) do - account_uri = ActivityPub::TagManager.instance.uri_for(account) - path = "/follow_recommendation/v0/accounts?accountUri=#{URI.encode_uri_component(account_uri)}" stub_provider_request(provider, method: :get, path:, @@ -28,7 +30,7 @@ RSpec.describe Fasp::FollowRecommendationWorker, feature: :fasp do end it "sends the requesting account's uri to provider and fetches received account uris" do - described_class.new.perform(account.id) + subject expect(stubbed_request).to have_been_made expect(fetch_service).to have_received(:call).with('https://fedi.example.com/accounts/1') @@ -38,7 +40,7 @@ RSpec.describe Fasp::FollowRecommendationWorker, feature: :fasp do it 'marks a running async refresh as finished' do async_refresh = AsyncRefresh.create("fasp:follow_recommendation:#{account.id}", count_results: true) - described_class.new.perform(account.id) + subject expect(async_refresh.reload).to be_finished end @@ -46,14 +48,22 @@ RSpec.describe Fasp::FollowRecommendationWorker, feature: :fasp do it 'tracks the number of fetched accounts in the async refresh' do async_refresh = AsyncRefresh.create("fasp:follow_recommendation:#{account.id}", count_results: true) - described_class.new.perform(account.id) + subject expect(async_refresh.reload.result_count).to eq 2 end it 'persists the results' do expect do - described_class.new.perform(account.id) + subject end.to change(Fasp::FollowRecommendation, :count).by(2) end + + describe 'provider delivery failure handling' do + let(:base_stubbed_request) do + stub_request(:get, provider.url(path)) + end + + it_behaves_like('worker handling fasp delivery failures') + end end From 5d934c283525527959537be561cc0ba86955bf46 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 12:06:23 +0200 Subject: [PATCH 04/64] Update dependency httplog to v1.7.3 (#35721) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 943334b03d..5f9259edea 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -315,7 +315,7 @@ GEM http_accept_language (2.1.1) httpclient (2.9.0) mutex_m - httplog (1.7.2) + httplog (1.7.3) rack (>= 2.0) rainbow (>= 2.0.0) i18n (1.14.7) From b8982cb881bf96ea5cb8f6ce48cf057f0ee4e520 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Fri, 8 Aug 2025 11:31:50 -0400 Subject: [PATCH 05/64] Use `around_action` to preserve stored location in `auth/sessions#destroy` (#35716) --- app/controllers/auth/sessions_controller.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index c52bda67b0..182f242ae5 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -12,6 +12,8 @@ class Auth::SessionsController < Devise::SessionsController skip_before_action :require_functional! skip_before_action :update_user_sign_in + around_action :preserve_stored_location, only: :destroy, if: :continue_after? + prepend_before_action :check_suspicious!, only: [:create] include Auth::TwoFactorAuthenticationConcern @@ -31,11 +33,9 @@ class Auth::SessionsController < Devise::SessionsController end def destroy - tmp_stored_location = stored_location_for(:user) super session.delete(:challenge_passed_at) flash.delete(:notice) - store_location_for(:user, tmp_stored_location) if continue_after? end def webauthn_options @@ -96,6 +96,12 @@ class Auth::SessionsController < Devise::SessionsController private + def preserve_stored_location + original_stored_location = stored_location_for(:user) + yield + store_location_for(:user, original_stored_location) + end + def check_suspicious! user = find_user @login_is_suspicious = suspicious_sign_in?(user) unless user.nil? From ce1680e6f979889ebd5c775353f3b82a8b2698bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 17:32:15 +0200 Subject: [PATCH 06/64] Update dependency core-js to v3.45.0 (#35667) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 26f7cd409e..b525ed6d67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6015,9 +6015,9 @@ __metadata: linkType: hard "core-js@npm:^3.30.2, core-js@npm:^3.41.0": - version: 3.44.0 - resolution: "core-js@npm:3.44.0" - checksum: 10c0/759bf3dc5f75068e9425dddf895fd5531c38794a11ea1c2b65e5ef7c527fe3652d59e8c287e574a211af9bab3c057c5c3fa6f6a773f4e142af895106efad38a4 + version: 3.45.0 + resolution: "core-js@npm:3.45.0" + checksum: 10c0/118350f9f1d81f42a1276590d6c217dca04c789fdb8074c82e53056b1a784948769a62b16b98493fd73e8a988545432f302bca798571e56ad881b9c039a5a83c languageName: node linkType: hard From b827a0a6a8aa0c2a61b8d03ca617c58b629a61b9 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 11 Aug 2025 03:33:36 -0400 Subject: [PATCH 07/64] Allow `CustomEmoji` to normalize its own domain (#35726) --- app/models/custom_emoji.rb | 2 +- app/models/custom_emoji_filter.rb | 2 +- spec/models/custom_emoji_spec.rb | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb index f1423bc2fa..25ba3d921b 100644 --- a/app/models/custom_emoji.rb +++ b/app/models/custom_emoji.rb @@ -42,7 +42,7 @@ class CustomEmoji < ApplicationRecord has_attached_file :image, styles: { static: { format: 'png', convert_options: '-coalesce +profile "!icc,*" +set date:modify +set date:create +set date:timestamp', file_geometry_parser: FastGeometryParser } }, validate_media_type: false, processors: [:lazy_thumbnail] - normalizes :domain, with: ->(domain) { domain.downcase } + normalizes :domain, with: ->(domain) { domain.downcase.strip } validates_attachment :image, content_type: { content_type: IMAGE_MIME_TYPES }, presence: true, size: { less_than: LIMIT } validates :shortcode, uniqueness: { scope: :domain }, format: { with: SHORTCODE_ONLY_RE }, length: { minimum: MINIMUM_SHORTCODE_SIZE } diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb index 870cc71974..070637fea0 100644 --- a/app/models/custom_emoji_filter.rb +++ b/app/models/custom_emoji_filter.rb @@ -35,7 +35,7 @@ class CustomEmojiFilter when 'remote' CustomEmoji.remote when 'by_domain' - CustomEmoji.where(domain: value.strip.downcase) + CustomEmoji.where(domain: value) when 'shortcode' CustomEmoji.search(value.strip) else diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb index f812cf7584..244d0d126f 100644 --- a/spec/models/custom_emoji_spec.rb +++ b/spec/models/custom_emoji_spec.rb @@ -80,6 +80,7 @@ RSpec.describe CustomEmoji, :attachment_processing do describe 'Normalizations' do describe 'domain' do + it { is_expected.to normalize(:domain).from(' www.mastodon.host ').to('www.mastodon.host') } it { is_expected.to normalize(:domain).from('wWw.MaStOdOn.CoM').to('www.mastodon.com') } it { is_expected.to normalize(:domain).from(nil).to(nil) } end From 3c6c9d650d40a8b9cea4bd46b0ed38a71d2a33e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 10:08:33 +0200 Subject: [PATCH 08/64] New Crowdin Translations (automated) (#35729) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/az.json | 151 ++++++++++++++++++- app/javascript/mastodon/locales/be.json | 156 +++++++++---------- app/javascript/mastodon/locales/ko.json | 8 + app/javascript/mastodon/locales/nan.json | 6 + config/locales/activerecord.be.yml | 10 +- config/locales/az.yml | 182 +++++++++++++++++++++++ config/locales/be.yml | 114 +++++++------- config/locales/devise.az.yml | 8 +- config/locales/devise.be.yml | 46 +++--- config/locales/doorkeeper.az.yml | 16 ++ config/locales/doorkeeper.be.yml | 22 +-- config/locales/fi.yml | 4 +- config/locales/ko.yml | 26 ++++ config/locales/nan.yml | 30 ++++ config/locales/simple_form.az.yml | 54 ++++++- config/locales/simple_form.be.yml | 52 ++++++- config/locales/simple_form.ko.yml | 9 ++ 17 files changed, 702 insertions(+), 192 deletions(-) diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index b9371f10a7..7540c8fa4b 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -49,12 +49,12 @@ "account.follows.empty": "Bu istifadəçi hələ ki, heç kimi izləmir.", "account.follows_you": "Sizi izləyir", "account.go_to_profile": "Profilə get", - "account.hide_reblogs": "@{name} istifadəçisindən olan gücləndirmələri gizlət", + "account.hide_reblogs": "@{name} - təkrar paylaşımlarını gizlət", "account.in_memoriam": "Xatirə.", "account.joined_short": "Qoşulub", "account.languages": "Abunə olunmuş dilləri dəyiş", "account.link_verified_on": "Bu linkin dəqiqliyi {date} tarixində yoxlanılıb", - "account.locked_info": "Bu hesabın məxfilik statusu kilidlənib. Hesabın sahibi onu kimin izləyə biləcəyini manual olaraq təyin edir.", + "account.locked_info": "Bu hesabın məxfilik statusu kilidlənib. Sahibi, onu kimin izləyə biləcəyini manual olaraq incələyir.", "account.media": "Media", "account.mention": "@{name} istifadəçisini teq et", "account.moved_to": "{name} onun yeni hesabının artıq bu olduğunu bildirdi:", @@ -74,7 +74,7 @@ "account.requested_follow": "{name} sizi izləmək sorğusu göndərib", "account.requests_to_follow_you": "Sizi izləmək istəyir", "account.share": "@{name} profilini paylaş", - "account.show_reblogs": "@{name} istifadəçisindən olan gücləndirmələri göstər", + "account.show_reblogs": "@{name} - təkrar paylaşımlarını göstər", "account.statuses_counter": "{count, plural, one {{counter} paylaşım} other {{counter} paylaşım}}", "account.unblock": "@{name} blokunu aç", "account.unblock_domain": "{domain} domeninin blokunu aç", @@ -117,7 +117,7 @@ "annual_report.summary.followers.total": "Cəmi {count}", "annual_report.summary.here_it_is": "{year} icmalınız:", "annual_report.summary.highlighted_post.by_favourites": "ən çox sevilən postu", - "annual_report.summary.highlighted_post.by_reblogs": "ən çox gücləndirilən paylaşımı", + "annual_report.summary.highlighted_post.by_reblogs": "ən çox təkrar paylaşılan göndəriş", "annual_report.summary.highlighted_post.by_replies": "ən çox cavabı olan paylaşımı", "annual_report.summary.highlighted_post.possessive": "{name} istifadəçisinin", "annual_report.summary.most_used_app.most_used_app": "ən çox istifadə etdiyi tətbiq", @@ -129,7 +129,7 @@ "annual_report.summary.thanks": "Mastodonun bir parçası olduğunuz üçün təşəkkür edirik!", "attachments_list.unprocessed": "(emal edilməyib)", "audio.hide": "Audionu gizlət", - "block_modal.remote_users_caveat": "Biz {domain} serverindən qərarınıza hörmət etməsini xahiş edəcəyik. Bununla belə, bəzi serverlər blokları fərqli şəkildə idarə edə bildiyi üçün uyğunluğa zəmanət verilmir. İctimai paylaşımlar hələ də daxil olmayan istifadəçilərə görünə bilər.", + "block_modal.remote_users_caveat": "{domain} serverindən qərarınıza hörmət etməsini xahiş edəcəyik. Ancaq, bəzi serverlər əngəlləmələri fərqli şəkildə idarə edə bilər deyə, qərarınıza uymağına zəmanət verilmir. Hər kəsə açıq göndərişlər, hələ də sistemə giriş etməmiş istifadəçilərə görünə bilər.", "block_modal.show_less": "Daha az göstər", "block_modal.show_more": "Daha çox göstər", "block_modal.they_cant_mention": "O səni teq edə bilməz və ya izləyə bilməz.", @@ -138,8 +138,8 @@ "block_modal.title": "İstifadəçi bloklansın?", "block_modal.you_wont_see_mentions": "Onu teq edən postları görməyəcəksən.", "boost_modal.combo": "Növbəti dəfə bunu atlamaq üçün {combo} klikləyə bilərsən", - "boost_modal.reblog": "Paylaşım gücləndirilsin?", - "boost_modal.undo_reblog": "Paylaşımın gücləndirilməsi ləğv edilsin?", + "boost_modal.reblog": "Paylaşım təkrar paylaşılsın?", + "boost_modal.undo_reblog": "Təkrar paylaşım ləğv edilsin?", "bundle_column_error.copy_stacktrace": "Xəta hesabatını kopyala", "bundle_column_error.error.body": "Tələb olunan səhifəni göstərmək mümkün olmadı. Bu, kodumuzdakı səhv və ya brauzer uyğunluğu problemi ilə bağlı ola bilər.", "bundle_column_error.error.title": "Ah, yox!", @@ -240,7 +240,7 @@ "confirmations.missing_alt_text.title": "Alternativ mətn əlavə edilsin?", "confirmations.mute.confirm": "Səssizləşdir", "confirmations.redraft.confirm": "Sil və qaralamaya köçür", - "confirmations.redraft.message": "Bu paylaşımı silmək və qaralamaya köçürmək istədiyinizə əminsiniz? Bəyənmələr və gücləndirmələr itəcək və orijinal paylaşıma olan cavablar tənha qalacaq.", + "confirmations.redraft.message": "Bu göndərişi silib yenidən qaralama kimi saxlamaq istədiyinizə əminsiniz? Sevimlilər və təkrar paylaşımlar silinəcək, orijinal göndərişə verilən cavablar isə əlaqəsiz qalacaq.", "confirmations.redraft.title": "Paylaşım silinsin & qaralamaya köçürülsün?", "confirmations.remove_from_followers.confirm": "İzləyicini çıxart", "confirmations.remove_from_followers.message": "{name} sizi izləməyəcək. Davam etmək istədiyinizə əminsiniz?", @@ -325,6 +325,12 @@ "empty_column.followed_tags": "Heç bir heşteq izləmirsiniz. İzlədikdə burada görünəcək.", "empty_column.hashtag": "Bu heşteqdə hələ ki, heç nə yoxdur.", "empty_column.notification_requests": "Hamısı hazırdır! Burada heç nə yoxdur. Yeni bildiriş aldığınız zaman, ayarlarınıza görə burada görünəcək.", + "empty_column.notifications": "Hələ heç bir bildirişiniz yoxdur. Başqaları sizinlə qarşılıqlı əlaqə qurduğu zaman, onu burada görəcəksiniz.", + "empty_column.public": "Burada hələ heç nə yoxdur! Buranı doldurmaq üçün hər kəsə açıq bir şey yazın və ya digər serverlərdəki istifadəçiləri izləyin.", + "error.unexpected_crash.explanation": "Kodumuzdakı bir xətaya, ya da brauzer uyumluluq probleminə görə, bu səhifə düzgün nümayiş etdirilə bilmədi.", + "error.unexpected_crash.explanation_addons": "Bu səhifə düzgün nümayiş etdirilə bilmədi. Bu xəta, yəqin ki, brauzer əlavəsi və ya avtomatik tərcümə alətlərindən qaynaqlanır.", + "error.unexpected_crash.next_steps": "Səhifəni təzələməyi sınayın. Bu kömək etməzsə, Mastodon-u başqa bir brauzer və ya yerli tətbiq vasitəsilə istifadə edə bilərsiniz.", + "error.unexpected_crash.next_steps_addons": "Onları sıradan çıxartmağı və səhifəni təzələməyi sınayın. Bu kömək etməzsə, Mastodon-u başqa bir brauzer və ya yerli tətbiq vasitəsilə istifadə edə bilərsiniz.", "errors.unexpected_crash.report_issue": "Problemi bildir", "explore.suggested_follows": "İnsanlar", "explore.title": "Trendlər", @@ -345,9 +351,43 @@ "filter_modal.added.settings_link": "ayarlar səhifəsi", "filter_modal.added.short_explanation": "Bu göndəriş, aşağıdakı filtr kateqoriyasına əlavə edilib: {title}.", "filter_modal.added.title": "Filtr əlavə edilib!", + "filter_modal.select_filter.expired": "müddəti bitib", + "filter_modal.select_filter.prompt_new": "Yeni kateqoriya: {name}", + "filter_modal.select_filter.search": "Axtar və ya yarat", + "filter_modal.select_filter.subtitle": "Mövcud bir kateqoriyanı istifadə et, ya da yenisini yarat", + "filter_modal.select_filter.title": "Bu göndərişi filtrlə", + "filter_modal.title.status": "Bir göndərişi filtrlə", "filter_warning.matches_filter": "“{title}” filtri ilə uyuşur", + "filtered_notifications_banner.title": "Filtrlənmiş bildirişlər", + "firehose.all": "Hamısı", + "firehose.local": "Bu server", + "firehose.remote": "Digər serverlər", + "follow_request.authorize": "Səlahiyyət ver", + "follow_request.reject": "Rədd et", + "follow_requests.unlocked_explanation": "Hesabınız kilidli olmasa da, {domain} heyəti bu hesabların izləmə tələblərini manual olaraq incələmək istəyə biləcəyinizi düşündü.", + "follow_suggestions.curated_suggestion": "Heyətin seçimi", + "follow_suggestions.dismiss": "Təkrar göstərmə", + "follow_suggestions.featured_longer": "{domain} komandası tərəfindən əllə seçildi", + "follow_suggestions.friends_of_friends_longer": "İzlədiyiniz insanlar arasında məşhur", + "follow_suggestions.hints.featured": "Bu profil {domain} komandası tərəfindən əllə seçilib.", "follow_suggestions.hints.friends_of_friends": "Bu profil izlədiyiniz insanlar arasında populyardır.", "follow_suggestions.hints.most_followed": "Bu profil {domain} serverində ən çox izlənilənlərdən biridir.", + "follow_suggestions.hints.most_interactions": "Bu profil son zamanlar {domain} üzərində çox diqqət çəkir.", + "follow_suggestions.hints.similar_to_recently_followed": "Bu profil, son vaxtlar izlədiyiniz profillərə bənzəyir.", + "follow_suggestions.personalized_suggestion": "Fərdiləşdirilmiş təklif", + "follow_suggestions.popular_suggestion": "Məşhur təklif", + "follow_suggestions.popular_suggestion_longer": "{domain} üzərində məşhur", + "follow_suggestions.similar_to_recently_followed_longer": "Son zaman izlədiyiniz profillərə oxşar", + "follow_suggestions.view_all": "Hamısına bax", + "followed_tags": "İzlənilən mövzu etiketləri", + "footer.about": "Haqqında", + "footer.directory": "Profil kataloqu", + "footer.get_app": "Tətbiqi əldə et", + "footer.keyboard_shortcuts": "Klaviatura qısayolları", + "footer.privacy_policy": "Gizlilik siyasəti", + "footer.source_code": "Mənbə koduna bax", + "footer.status": "Status", + "footer.terms_of_service": "Xidmət şərtləri", "generic.saved": "Saxlanıldı", "getting_started.heading": "Başlayaq", "hashtag.admin_moderation": "#{name} üçün moderasiya interfeysini aç", @@ -365,19 +405,31 @@ "hashtag.counter_by_accounts": "{count, plural, one {{counter} iştirakçı} other {{counter} iştirakçı}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} göndəriş} other {{counter} göndəriş}}", "hashtag.counter_by_uses_today": "Bu gün {count, plural, one {{counter} göndəriş} other {{counter} göndəriş}}", + "hashtag.feature": "Profildə önə çıxart", "hashtag.follow": "Mövzu etiketini izlə", "hashtag.mute": "#{hashtag} - səssizə al", + "hashtag.unfeature": "Profildə önə çıxarılmasın", "hashtag.unfollow": "Mövzu etiketini izləmə", "hashtags.and_other": "…və daha {count, plural, one {}other {# ədəd}}", "hints.profiles.followers_may_be_missing": "Bu profilin izləyiciləri əskik ola bilər.", "hints.profiles.follows_may_be_missing": "Bu profilin izləyənləri əskik ola bilər.", + "hints.profiles.posts_may_be_missing": "Bu profilin bəzi göndərişləri əskik ola bilər.", + "hints.profiles.see_more_followers": "{domain} üzərində daha çox izləyici gör", + "hints.profiles.see_more_follows": "{domain} üzərində izlənilən gör", + "hints.profiles.see_more_posts": "{domain} üzərində daha çox göndəriş gör", "home.column_settings.show_quotes": "Sitatları göstər", + "home.column_settings.show_reblogs": "Təkrar paylaşmaları göstər", "home.column_settings.show_replies": "Cavabları göstər", "home.hide_announcements": "Elanları gizlət", "home.pending_critical_update.body": "Lütfən Mastodon serverinizi mümkün olan ən qısa müddətdə güncəlləyin!", "home.pending_critical_update.link": "Güncəlləmələrə bax", "home.pending_critical_update.title": "Kritik güvənlik güncəlləməsi mövcuddur!", "home.show_announcements": "Elanları göstər", + "ignore_notifications_modal.disclaimer": "Mastodon, bildirişlərini yox saydığınız istifadəçiləri məlumatlandırmır. Bildirişləri yox saymaq, mesajların göndərilməsini dayandırmayacaq.", + "ignore_notifications_modal.filter_instead": "Əvəzinə filtrlə", + "ignore_notifications_modal.filter_to_act_users": "Hələ də istifadəçiləri qəbul edə, rədd edə və ya bildirə bilərsiniz", + "ignore_notifications_modal.filter_to_avoid_confusion": "Filtrləmə, mümkün çaşqınlığın qarşısını almağa kömək edir.", + "ignore_notifications_modal.filter_to_review_separately": "Filtrlənmiş bildirişləri ayrı-ayrı incələyə bilərsiniz", "ignore_notifications_modal.ignore": "Bildirişləri yox say", "ignore_notifications_modal.limited_accounts_title": "Moderasiya edilmiş hesabların bildirişləri yox sayılsın?", "ignore_notifications_modal.new_accounts_title": "Yeni hesabların bildirişləri yox sayılsın?", @@ -390,17 +442,71 @@ "interaction_modal.action.reblog": "Davam etmək üçün hesabınızdan təkrar göndərməlisiniz.", "interaction_modal.action.reply": "Davam etmək üçün hesabınızdan cavab verməlisiniz.", "interaction_modal.action.vote": "Davam etmək üçün hesabınızdan səs verməlisiniz.", + "interaction_modal.title.reblog": "{name} - göndərişini təkrar paylaş", + "keyboard_shortcuts.boost": "Göndərişi təkrar paylaş", "keyboard_shortcuts.profile": "Müəllifin profilini aç", "keyboard_shortcuts.reply": "Göndərişə cavab ver", + "keyboard_shortcuts.toot": "Yeni bir göndəriş başlat", + "keyboard_shortcuts.translate": "bir göndərişi tərcümə etmək üçün", + "keyboard_shortcuts.unfocus": "Fokusu göndəriş yazma xanasından/axtarışdan götür", + "keyboard_shortcuts.up": "Siyahıda yuxarı daşı", "learn_more_link.got_it": "Anladım", "learn_more_link.learn_more": "Daha ətraflı", "lightbox.close": "Bağla", "lightbox.next": "Növbəti", "lightbox.previous": "Əvvəlki", "lightbox.zoom_in": "Həqiqi ölçüyə qayıt", + "lightbox.zoom_out": "Sığacaq şəkildə yaxınlaşdır", "limited_account_hint.action": "Yenə də profili göstər", "limited_account_hint.title": "Bu profil, {domain} moderatorları tərəfindən gizlədildi.", + "link_preview.author": "Müəllif: {name}", + "link_preview.more_from_author": "{name} - daha çox", + "link_preview.shares": "{count, plural, one {{counter} göndəriş} other {{counter} göndəriş}}", + "lists.add_member": "Əlavə et", + "lists.add_to_list": "Siyahıya əlavə et", + "lists.add_to_lists": "{name} - siyahılara əlavə et", + "lists.create": "Yarat", + "lists.create_a_list_to_organize": "Əsas ekran lentinizi təşkil etmək üçün yeni bir siyahı yaradın", + "lists.create_list": "Siyahı yarat", + "lists.delete": "Siyahını sil", + "lists.done": "Hazırdır", + "lists.edit": "Siyahıya düzəliş et", + "lists.exclusive": "Əsas ekranda üzvləri gizlət", + "lists.exclusive_hint": "Kimsə bu siyahıdadırsa, onun göndərişləri bir dəfədən çox görünməməsi üçün Əsas ekran lentində gizlədilir.", + "lists.find_users_to_add": "Əlavə ediləcək istifadəçiləri tap", + "lists.list_members_count": "{count, plural, one {# üzv} other {# üzv}}", + "lists.list_name": "Siyahı adı", + "lists.new_list_name": "Yeni siyahı adı", + "lists.no_lists_yet": "Hələ siyahı yoxdur.", + "lists.no_members_yet": "Hələ üzv yoxdur.", + "lists.no_results_found": "Heç bir nəticə tapılmadı.", + "lists.remove_member": "Çıxart", + "lists.replies_policy.followed": "İstənilən izlənilən istifadəçi", + "lists.replies_policy.list": "Siyahıdakı üzvlər", + "lists.replies_policy.none": "Heç kim", + "lists.save": "Saxla", + "lists.search": "Axtar", + "lists.show_replies_to": "Siyahı üzvlərinin cavablarını daxil et", + "load_pending": "{count, plural, one {# yeni element} other {# yeni element}}", + "loading_indicator.label": "Yüklənir…", + "media_gallery.hide": "Gizlət", + "moved_to_account_banner.text": "{disabledAccount} hesabınız, {movedToAccount} hesabına keçdiyiniz üçün hazırda sıradan çıxarılıb.", + "mute_modal.hide_from_notifications": "Bildirişlərdə gizlət", + "mute_modal.hide_options": "Seçimləri gizlət", + "mute_modal.indefinite": "Mən səsini açana qədər", + "mute_modal.show_options": "Seçimləri göstər", + "mute_modal.they_can_mention_and_follow": "Sizin adınızı çəkə və sizi izləyə bilər, ancaq siz onları görə bilməzsiniz.", + "mute_modal.they_wont_know": "Onlar, səssizə alındıqlarını bilməyəcəklər.", + "mute_modal.title": "İstifadəçi səssizə alınsın?", + "mute_modal.you_wont_see_mentions": "Onların adı çəkilən göndərişləri görməyəcəksiniz.", + "mute_modal.you_wont_see_posts": "Onlar hələ də göndərişlərinizi görə biləcək, ancaq onların göndərişlərini görməyəcəksiniz.", + "navigation_bar.about": "Haqqında", "navigation_bar.account_settings": "Parol və təhlükəsizlik", + "navigation_bar.advanced_interface": "Qabaqcıl veb interfeysində aç", + "navigation_bar.automated_deletion": "Göndərişin avtomatik silinməsi", + "navigation_bar.blocks": "Əngəllənmiş istifadəçilər", + "navigation_bar.follows_and_followers": "İzlənilənlər və izləyicilər", + "navigation_bar.import_export": "Daxilə və xaricə köçürmə", "navigation_bar.moderation": "Moderasiya", "not_signed_in_indicator.not_signed_in": "Bu resursa erişmək üçün giriş etməlisiniz.", "notification.moderation-warning.learn_more": "Daha ətraflı", @@ -412,14 +518,36 @@ "notification.moderation_warning.action_sensitive": "Göndərişləriniz artıq həssas olaraq işarələnəcək.", "notification.moderation_warning.action_silence": "Hesabınız məhdudlaşdırılıb.", "notification.moderation_warning.action_suspend": "Hesabınızın fəaliyyəti dayandırılıb.", + "notification.reblog": "{name} göndərişinizi təkrar paylaşdı", + "notification.reblog.name_and_others_with_link": "{name} və {count, plural, one {digər # nəfər} other {digər # nəfər}} göndərişinizi təkrar paylaşdı", + "notification.relationships_severance_event.account_suspension": "{from} admini {target} fəaliyyətini dayandırıb, bu da o deməkdir ki, artıq onlardan güncəlləmələr ala və ya onlarla qarşılıqlı əlaqə qura bilməyəcəyiniz.", + "notification.relationships_severance_event.domain_block": "{target}, {from} admini tərəfindən əngəllənib, buna {followersCount} izləyiciniz və izlədiyiniz {followingCount, plural, one {# hesab} other {# hesab}} daxildir.", + "notification.relationships_severance_event.learn_more": "Daha ətraflı", + "notification.relationships_severance_event.user_domain_block": "{target} əngəlləmisiniz, bununla {followersCount} izləyiciniz və izlədiyiniz {followingCount, plural, one {# hesab} other {# hesab}} silinib.", + "notification.status": "{name} indicə paylaşdı", + "notification.update": "{name} bir göndərişə düzəliş etdi", + "notification_requests.accept": "Qəbul et", "notification_requests.confirm_dismiss_multiple.message": "{count, plural, one {bir bildiriş sorğusunu} other {# bildiriş sorğusunu}} bağlamaq üzrəsiniz. {count, plural, one {Ona} other {Onlara}} yenidən asanlıqla erişə bilməyəcəksiniz. Davam etmək istədiyinizə əminsiniz?", + "notification_requests.edit_selection": "Düzəliş et", + "notification_requests.exit_selection": "Hazırdır", "notification_requests.explainer_for_limited_account": "Hesab, bir moderator tərəfindən məhdudlaşdırıldığı üçün bu hesabın bildirişləri filtrləndi.", "notification_requests.explainer_for_limited_remote_account": "Hesab və ya onun serveri, bir moderator tərəfindən məhdudlaşdırıldığı üçün bu hesabın bildirişləri filtrləndi.", + "notifications.column_settings.follow": "Yeni izləyicilər:", + "notifications.column_settings.reblog": "Təkrar paylaşmalar:", + "notifications.filter.boosts": "Təkrar paylaşmalar", + "notifications.filter.follows": "İzlənilənlər", "notifications.filter.statuses": "İzlədiyiniz şəxslərdən güncəlləmələr", "notifications.policy.filter_limited_accounts_hint": "Server moderatorları tərəfindən məhdudlaşdırılıb", "notifications.policy.filter_limited_accounts_title": "Moderasiya edilmiş hesablar", + "onboarding.profile.discoverable": "Profilimi kəşf edilə bilən et", + "onboarding.profile.discoverable_hint": "Mastodon-da kəşf edilə bilməni aktivləşdirsəniz, göndərişləriniz axtarış nəticələrində və trendlərdə görünə bilər və profiliniz sizinlə oxşar maraqlara sahib şəxslərə təklif edilə bilər.", + "onboarding.profile.display_name": "Ekran adı", + "onboarding.profile.note_hint": "Digər insanların @adını_çəkə və ya #mövzu_etiketləri istifadə edə bilərsiniz…", + "onboarding.profile.title": "Profili ayarla", "password_confirmation.exceeds_maxlength": "Parol təsdiqi, maksimum parol uzunluğunu aşır", "password_confirmation.mismatching": "Parol təsdiqi uyuşmur", + "privacy.private.long": "Yalnız izləyiciləriniz", + "privacy.private.short": "İzləyicilər", "privacy_policy.last_updated": "Son güncəlləmə {date}", "report.category.subtitle": "Ən çox uyuşanı seçin", "report_notification.categories.spam_sentence": "spam", @@ -465,6 +593,8 @@ "status.admin_status": "Moderasiya interfeysində bu göndərişi aç", "status.block": "Əngəllə: @{name}", "status.bookmark": "Əlfəcin", + "status.cancel_reblog_private": "Təkrar paylaşımı geri al", + "status.cannot_reblog": "Bu göndəriş təkrar paylaşıla bilməz", "status.context.load_new_replies": "Yeni cavablar mövcuddur", "status.context.loading": "Daha çox cavab yoxlanılır", "status.delete": "Sil", @@ -491,6 +621,11 @@ "status.quote_error.not_available": "Göndəriş əlçatmazdır", "status.quote_error.pending_approval": "Göndəriş gözləmədədir", "status.read_more": "Daha çoxunu oxu", + "status.reblog": "Təkrar paylaş", + "status.reblog_private": "Orijinal görünmə ilə təkrar paylaş", + "status.reblogged_by": "{name} təkrar paylaşdı", + "status.reblogs": "{count, plural, one {təkrar paylaşma} other {təkrar paylaşma}}", + "status.reblogs.empty": "Hələ heç kim bu göndərişi təkrar paylaşmayıb. Kimsə paylaşdığı zaman, burada görünəcək.", "status.remove_bookmark": "Əlfəcini sil", "status.remove_favourite": "Sevimlilərdən sil", "status.replied_to": "Cavab verildi: {name}", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index 2d0842727a..a3caa5a023 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -115,25 +115,25 @@ "annual_report.summary.archetype.replier": "Душа кампаніі", "annual_report.summary.followers.followers": "падпісчыкі", "annual_report.summary.followers.total": "Агулам {count}", - "annual_report.summary.here_it_is": "Вось вашы вынікі {year} за год:", + "annual_report.summary.here_it_is": "Вось Вашы вынікі {year} за год:", "annual_report.summary.highlighted_post.by_favourites": "самы ўпадабаны допіс", "annual_report.summary.highlighted_post.by_reblogs": "самы пашыраны допіс", "annual_report.summary.highlighted_post.by_replies": "самы каментаваны допіс", "annual_report.summary.highlighted_post.possessive": "{name}", - "annual_report.summary.most_used_app.most_used_app": "праграма, якой карысталіся часцей", - "annual_report.summary.most_used_hashtag.most_used_hashtag": "хэштэг, якім карысталіся часцей", + "annual_report.summary.most_used_app.most_used_app": "праграма, якой карысталіся найчасцей", + "annual_report.summary.most_used_hashtag.most_used_hashtag": "хэштэг, якім карысталіся найчасцей", "annual_report.summary.most_used_hashtag.none": "Няма", "annual_report.summary.new_posts.new_posts": "новыя допісы", - "annual_report.summary.percentile.text": "З-за гэтага, вы знаходзіцеся ў топе карыстальнікаў {domain}.", + "annual_report.summary.percentile.text": "Гэта падымае Вас у топ карыстальнікаў {domain}.", "annual_report.summary.percentile.we_wont_tell_bernie": "КДБ пра гэта не даведаецца.", "annual_report.summary.thanks": "Дзякуй за ўдзел у Mastodon!", "attachments_list.unprocessed": "(неапрацаваны)", "audio.hide": "Схаваць аўдыя", - "block_modal.remote_users_caveat": "Мы папросім сервер {domain} паважаць ваш выбар. Аднак гэта не гарантуецца, паколькі некаторыя серверы могуць апрацоўваць блакіроўкі іншым чынам. Публічныя паведамленні могуць заставацца бачнымі для ананімных карыстальнікаў.", + "block_modal.remote_users_caveat": "Мы папросім сервер {domain} паважаць Ваш выбар. Аднак гэта не гарантуецца, паколькі некаторыя серверы могуць апрацоўваць блакіроўкі іншым чынам. Публічныя паведамленні могуць заставацца бачнымі для ананімных карыстальнікаў.", "block_modal.show_less": "Паказаць меньш", "block_modal.show_more": "Паказаць больш", "block_modal.they_cant_mention": "Карыстальнік не зможа згадваць або сачыць за вамі.", - "block_modal.they_cant_see_posts": "Карыстальнік не будзе бачыць вашых допісаў, а вы — карыстальніка.", + "block_modal.they_cant_see_posts": "Карыстальнік не будзе бачыць Вашых допісаў, а Вы — ягоных.", "block_modal.they_will_know": "Карыстальнік убачыць, што адбылася блакіроўка.", "block_modal.title": "Заблакіраваць карыстальніка?", "block_modal.you_wont_see_mentions": "Вы не ўбачыце паведамленняў са згадваннем карыстальніка.", @@ -162,7 +162,7 @@ "column.bookmarks": "Закладкі", "column.community": "Лакальная стужка", "column.create_list": "Стварыць спіс", - "column.direct": "Асабістыя згадванні", + "column.direct": "Прыватныя згадванні", "column.directory": "Праглядзець профілі", "column.domain_blocks": "Заблакіраваныя дамены", "column.edit_list": "Рэдагаваць спіс", @@ -217,7 +217,7 @@ "confirmations.delete.message": "Вы ўпэўненыя, што хочаце выдаліць гэты допіс?", "confirmations.delete.title": "Выдаліць допіс?", "confirmations.delete_list.confirm": "Выдаліць", - "confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты чарнавік?", + "confirmations.delete_list.message": "Вы ўпэўненыя, што хочаце беззваротна выдаліць гэты спіс?", "confirmations.delete_list.title": "Выдаліць спіс?", "confirmations.discard_draft.confirm": "Адмовіцца і працягнуць", "confirmations.discard_draft.edit.cancel": "Працягнуць рэдагаванне", @@ -225,7 +225,7 @@ "confirmations.discard_draft.edit.title": "Адмовіцца ад змен у Вашым допісе?", "confirmations.discard_draft.post.cancel": "Працягнуць чарнавік", "confirmations.discard_draft.post.message": "Калі працягнуць, то допіс, які Вы зараз пішаце, не будзе апублікаваны.", - "confirmations.discard_draft.post.title": "Выдаліць чарнавік?", + "confirmations.discard_draft.post.title": "Скасаваць чарнавік?", "confirmations.discard_edit_media.confirm": "Адмяніць", "confirmations.discard_edit_media.message": "У вас ёсць незахаваныя змены ў апісанні або прэв'ю, усе роўна скасаваць іх?", "confirmations.follow_to_list.confirm": "Падпісацца і дадаць у спіс", @@ -261,7 +261,7 @@ "copy_icon_button.copied": "Скапіявана ў буфер абмену", "copypaste.copied": "Скапіравана", "copypaste.copy_to_clipboard": "Скапіяваць у буфер абмену", - "directory.federated": "З вядомага федэсвету", + "directory.federated": "З вядомага федэральнага сусвету", "directory.local": "Толькі з {domain}", "directory.new_arrivals": "Новыя карыстальнікі", "directory.recently_active": "Нядаўна актыўныя", @@ -269,7 +269,7 @@ "disabled_account_banner.text": "Ваш уліковы запіс {disabledAccount} часова адключаны.", "dismissable_banner.community_timeline": "Гэта самыя апошнія допісы ад людзей, уліковыя запісы якіх размяшчаюцца на {domain}.", "dismissable_banner.dismiss": "Адхіліць", - "dismissable_banner.public_timeline": "Вось апошнія публічныя допісы ад карыстальнікаў fediverse на якіх падпісаны карыстальнікі {domain}.", + "dismissable_banner.public_timeline": "Вось апошнія публічныя допісы ад карыстальнікаў федэральнага сусвету, на якіх падпісаныя карыстальнікі {domain}.", "domain_block_modal.block": "Заблакіраваць сервер", "domain_block_modal.block_account_instead": "Заблакіраваць @{name} замест гэтага", "domain_block_modal.they_can_interact_with_old_posts": "Людзі з гэтага сервера змогуць узаемадзейнічаць з вашымі старымі допісамі.", @@ -287,12 +287,12 @@ "domain_pill.their_username": "Унікальны ідэнтыфікатар карыстальніка на серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", "domain_pill.username": "Імя карыстальніка", "domain_pill.whats_in_a_handle": "Што такое ідэнтыфікатар карыстальніка?", - "domain_pill.who_they_are": "Паколькі ідэнтыфікатары кажуць аб тым, хто гэты чалавек і якім серверам ён карыстаецца, вы можаце ўзаемадзейнічаць з карыстальнікамі .", - "domain_pill.who_you_are": "Паколькі ваш ідэнтыфікатар кажа аб тым, хто вы і дзе знаходзіцеся, людзі могуць узаемадзейнічаць з вамі ў сацыяльнай сетцы .", + "domain_pill.who_they_are": "Паколькі ідэнтыфікатары кажуць аб тым, хто гэты чалавек і якім серверам ён карыстаецца, Вы можаце ўзаемадзейнічаць з карыстальнікамі .", + "domain_pill.who_you_are": "Паколькі Ваш ідэнтыфікатар кажа аб тым, хто Вы і дзе знаходзіцеся, людзі могуць узаемадзейнічаць з вамі ў сацыяльнай сетцы .", "domain_pill.your_handle": "Ваш ідэнтыфікатар:", "domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.", "domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", - "embed.instructions": "Убудуйце гэты пост на свой сайт, скапіраваўшы прыведзены ніжэй код", + "embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.", "embed.preview": "Вось як гэта будзе выглядаць:", "emoji_button.activity": "Актыўнасць", "emoji_button.clear": "Ачысціць", @@ -304,39 +304,39 @@ "emoji_button.not_found": "Адпаведныя эмодзі не знойдзены", "emoji_button.objects": "Прадметы", "emoji_button.people": "Людзі", - "emoji_button.recent": "Чата выкарыстаныя", + "emoji_button.recent": "Часта выкарыстоўваемыя", "emoji_button.search": "Пошук...", "emoji_button.search_results": "Вынікі пошуку", "emoji_button.symbols": "Сімвалы", "emoji_button.travel": "Падарожжы і месцы", - "empty_column.account_featured.me": "Вы яшчэ нічога не паказалі. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якім найбольш карыстаецеся, і нават профілі сваіх сяброў?", - "empty_column.account_featured.other": "{acct} яшчэ нічога не паказаў. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якім найбольш карыстаецеся, і нават профілі сваіх сяброў?", - "empty_column.account_featured_other.unknown": "Гэты профіль яшчэ нічога не паказаў.", + "empty_column.account_featured.me": "Вы яшчэ нічога не паказалі. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якімі найбольш карыстаецеся, і нават профілі сваіх сяброў?", + "empty_column.account_featured.other": "{acct} яшчэ нічога не паказаў. Ці ведалі Вы, што ў сваім профілі Вы можаце паказаць свае хэштэгі, якімі найбольш карыстаецеся, і нават профілі сваіх сяброў?", + "empty_column.account_featured_other.unknown": "Гэты ўліковы запіс яшчэ нічога не паказаў.", "empty_column.account_hides_collections": "Гэты карыстальнік вырашыў схаваць гэтую інфармацыю", "empty_column.account_suspended": "Уліковы запіс прыпынены", "empty_column.account_timeline": "Тут няма допісаў!", "empty_column.account_unavailable": "Профіль недаступны", "empty_column.blocks": "Вы яшчэ нікога не заблакіравалі.", - "empty_column.bookmarked_statuses": "У вашых закладках яшчэ няма допісаў. Калі вы дадасце закладку, яна з’явіцца тут.", + "empty_column.bookmarked_statuses": "У Вашых закладках яшчэ няма допісаў. Калі Вы дадасце закладку, яна з’явіцца тут.", "empty_column.community": "Мясцовая стужка пустая. Напішыце нешта публічнае, каб разварушыць справу!", - "empty_column.direct": "Пакуль у вас няма асабістых згадванняў. Калі вы дашляце або атрымаеце штосьці, яно з’явіцца тут.", + "empty_column.direct": "Пакуль у Вас няма асабістых згадванняў. Калі Вы дашляце або атрымаеце штосьці, яно з’явіцца тут.", "empty_column.domain_blocks": "Заблакіраваных даменаў пакуль няма.", "empty_column.explore_statuses": "Зараз не ў трэндзе. Праверце пазней", - "empty_column.favourited_statuses": "Вы яшчэ не ўпадабалі ніводны допіс. Калі гэта адбудзецца, вы ўбачыце яго тут.", - "empty_column.favourites": "Ніхто яшчэ не ўпадабаў гэты допіс. Калі гэта адбудзецца, вы ўбачыце гэтых людзей тут.", - "empty_column.follow_requests": "У вас яшчэ няма запытаў на падпіску. Калі вы атрымаеце запыт, ён з’явіцца тут.", + "empty_column.favourited_statuses": "Вы яшчэ не ўпадабалі ніводны допіс. Калі гэта адбудзецца, Вы ўбачыце яго тут.", + "empty_column.favourites": "Ніхто яшчэ не ўпадабаў гэты допіс. Калі гэта адбудзецца, Вы ўбачыце гэтых людзей тут.", + "empty_column.follow_requests": "У Вас яшчэ няма запытаў на падпіску. Калі Вы атрымаеце запыт, ён з’явіцца тут.", "empty_column.followed_tags": "Вы пакуль не падпісаны ні на адзін хэштэг. Калі падпішацеся, яны з’явяцца тут.", "empty_column.hashtag": "Па гэтаму хэштэгу пакуль што нічога няма.", "empty_column.home": "Галоўная стужка пустая! Падпішыцеся на іншых людзей, каб запоўніць яе. {suggestions}", - "empty_column.list": "У гэтым спісе пакуль што нічога няма. Калі члены лісту апублікуюць новыя запісы, яны з'явяцца тут.", + "empty_column.list": "У гэтым спісе пакуль што нічога няма. Калі члены спіса апублікуюць новыя запісы, яны з'явяцца тут.", "empty_column.mutes": "Вы яшчэ нікога не ігнаруеце.", - "empty_column.notification_requests": "Чысціня! Тут нічога няма. Калі вы будзеце атрымліваць новыя апавяшчэння, яны будуць з'яўляцца тут у адпаведнасці з вашымі наладамі.", - "empty_column.notifications": "У вас няма ніякіх апавяшчэнняў. Калі іншыя людзі ўзаемадзейнічаюць з вамі, вы ўбачыце гэта тут.", + "empty_column.notification_requests": "Чысціня! Тут нічога няма. Калі Вы будзеце атрымліваць новыя апавяшчэнні, яны будуць з'яўляцца тут у адпаведнасці з Вашымі наладамі.", + "empty_column.notifications": "У Вас няма ніякіх апавяшчэнняў. Калі іншыя людзі захочуць узаемадзейнічаць з Вамі, Вы ўбачыце гэта тут.", "empty_column.public": "Тут нічога няма! Апублікуйце што-небудзь, або падпішыцеся на карыстальнікаў з другіх сервераў", "error.unexpected_crash.explanation": "Гэта старонка не можа быць адлюстравана карэктна з-за памылкі ў нашым кодзе, або праблемы з сумяшчальнасцю браўзера.", - "error.unexpected_crash.explanation_addons": "Гэтая старонка не можа быць адлюстравана карэктна. Верагодна, гэтая памылка выклікана дадатковым кампанентам браўзера або інструментамі аўтаматычнага перакладу", - "error.unexpected_crash.next_steps": "Паспрабуйце абнавіць старонку. Калі гэта не дапаможа, вы можаце паспрабаваць іншы браўзер, альбо выкарыстаць усталяваную праграму.", - "error.unexpected_crash.next_steps_addons": "Паспрабуйце выключыць іх і абнавіць старонку. Калі гэта не дапамагае, вы ўсё яшчэ можаце карыстацца Mastodon праз іншы браўзер ці натыўную праграму.", + "error.unexpected_crash.explanation_addons": "Гэтая старонка не можа быць адлюстравана карэктна. Верагодна, гэтая памылка выкліканая дадатковым кампанентам браўзера або інструментамі аўтаматычнага перакладу.", + "error.unexpected_crash.next_steps": "Паспрабуйце абнавіць старонку. Калі гэта не дапаможа, Вы можаце паспрабаваць іншы браўзер, альбо выкарыстаць усталяваную праграму.", + "error.unexpected_crash.next_steps_addons": "Паспрабуйце выключыць іх і абнавіць старонку. Калі гэта не дапамагае, Вы ўсё яшчэ можаце карыстацца Mastodon праз іншы браўзер ці асобную праграму.", "errors.unexpected_crash.copy_stacktrace": "Дадаць дыягнастычны стэк у буфер абмену", "errors.unexpected_crash.report_issue": "Паведаміць аб праблеме", "explore.suggested_follows": "Людзі", @@ -349,14 +349,14 @@ "featured_carousel.post": "Допіс", "featured_carousel.previous": "Назад", "featured_carousel.slide": "{index} з {total}", - "filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім вы адкрылі гэты пост. Калі вы хочаце, каб паведамленне таксама было адфільтравана ў гэтым кантэксце, вам трэба будзе адрэдагаваць фільтр", + "filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім Вы адкрылі гэты допіс. Калі Вы хочаце, каб паведамленне таксама было адфільтраванае ў гэтым кантэксце, Вам трэба будзе адрэдагаваць фільтр.", "filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!", "filter_modal.added.expired_explanation": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася", "filter_modal.added.expired_title": "Пратэрмінаваны фільтр!", "filter_modal.added.review_and_configure": "Для прагляду і наступнай канфігурацыі фільтра катэгорый, перайдзіце на {settings_link}.", "filter_modal.added.review_and_configure_title": "Налады фільтра", "filter_modal.added.settings_link": "старонка наладаў", - "filter_modal.added.short_explanation": "Гэты пост быў дабаўлены ў катэгорыю з наступным фільтрам: {title}.", + "filter_modal.added.short_explanation": "Гэты допіс быў дададзены ў катэгорыю з наступным фільтрам: {title}.", "filter_modal.added.title": "Фільтр дабаўлены!", "filter_modal.select_filter.context_mismatch": "Не мае дачынення да кантэксту ", "filter_modal.select_filter.expired": "пратэрмінавана", @@ -366,27 +366,27 @@ "filter_modal.select_filter.title": "Фільтраваць гэты допіс", "filter_modal.title.status": "Фільтраваць допіс", "filter_warning.matches_filter": "Адпавядае фільтру \"{title}\"", - "filtered_notifications_banner.pending_requests": "Ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} вы магчыма ведаеце", + "filtered_notifications_banner.pending_requests": "Ад {count, plural, =0 {# людзей якіх} one {# чалавека якіх} few {# чалавек якіх} many {# людзей якіх} other {# чалавека якіх}} Вы магчыма ведаеце", "filtered_notifications_banner.title": "Адфільтраваныя апавяшчэнні", "firehose.all": "Усе", "firehose.local": "Гэты сервер", "firehose.remote": "Іншыя серверы", "follow_request.authorize": "Аўтарызацыя", "follow_request.reject": "Адхіліць", - "follow_requests.unlocked_explanation": "Ваш акаўнт не схаваны, аднак прадстаўнікі {domain} палічылі, што вы можаце захацець праглядзець запыты на падпіску з гэтых профіляў уручную.", + "follow_requests.unlocked_explanation": "Ваш уліковы запіс не схаваны, аднак прадстаўнікі {domain} палічылі, што Вы можаце захацець праглядзець запыты на падпіску з гэтых уліковых запісаў уручную.", "follow_suggestions.curated_suggestion": "Выбар адміністрацыі", "follow_suggestions.dismiss": "Не паказваць зноў", "follow_suggestions.featured_longer": "Адабраныя камандай {domain} уручную", - "follow_suggestions.friends_of_friends_longer": "Папулярнае сярод людзей, на якіх Вы падпісаны", + "follow_suggestions.friends_of_friends_longer": "Папулярнае сярод людзей, на якіх Вы падпісаныя", "follow_suggestions.hints.featured": "Гэты профіль быў выбраны ўручную камандай {domain}.", - "follow_suggestions.hints.friends_of_friends": "Гэты профіль папулярны сярод людзей, на якіх вы падпісаліся.", + "follow_suggestions.hints.friends_of_friends": "Гэты профіль папулярны сярод людзей, на якіх Вы падпісаліся.", "follow_suggestions.hints.most_followed": "Гэты профіль - адзін з профіляў з самай вялікай колькасцю падпісак на {domain}.", "follow_suggestions.hints.most_interactions": "У апошні час гэты профіль прыцягвае шмат увагі на {domain}.", - "follow_suggestions.hints.similar_to_recently_followed": "Гэты профіль падобны на профілі, на якія вы нядаўна падпісаліся.", + "follow_suggestions.hints.similar_to_recently_followed": "Гэты профіль падобны на профілі, на якія Вы нядаўна падпісаліся.", "follow_suggestions.personalized_suggestion": "Персаналізаваная прапанова", "follow_suggestions.popular_suggestion": "Папулярная прапанова", "follow_suggestions.popular_suggestion_longer": "Папулярнае на {domain}", - "follow_suggestions.similar_to_recently_followed_longer": "Падобныя профілі, за якімі вы нядаўна сачылі", + "follow_suggestions.similar_to_recently_followed_longer": "Падобныя профілі, за якімі Вы нядаўна сачылі", "follow_suggestions.view_all": "Праглядзець усё", "follow_suggestions.who_to_follow": "На каго падпісацца", "followed_tags": "Падпіскі", @@ -435,7 +435,7 @@ "home.pending_critical_update.link": "Прагледзець абнаўленні", "home.pending_critical_update.title": "Даступна крытычнае абнаўленне бяспекі!", "home.show_announcements": "Паказаць аб'явы", - "ignore_notifications_modal.disclaimer": "Mastodon не можа паведамляць карыстальнікам, што вы праігнаравалі апавяшчэнні ад іх. Ігнараванне апавяшчэнняў не спыніць адпраўку саміх паведамленняў.", + "ignore_notifications_modal.disclaimer": "Mastodon не можа паведамляць карыстальнікам, што Вы праігнаравалі апавяшчэнні ад іх. Ігнараванне апавяшчэнняў не спыніць адпраўку саміх паведамленняў.", "ignore_notifications_modal.filter_instead": "Замест гэтага адфільтраваць", "ignore_notifications_modal.filter_to_act_users": "Вы па-ранейшаму зможаце прымаць, адхіляць ці скардзіцца на карыстальнікаў", "ignore_notifications_modal.filter_to_avoid_confusion": "Выкарыстанне фільтраў дапамагае пазбягаць патэнцыйнай блытаніны", @@ -444,15 +444,15 @@ "ignore_notifications_modal.limited_accounts_title": "Ігнараваць апавяшчэнні ад уліковых запісаў пад мадэрацыяй?", "ignore_notifications_modal.new_accounts_title": "Ігнараваць апавяшчэнні ад новых уліковых запісаў?", "ignore_notifications_modal.not_followers_title": "Ігнараваць апавяшчэнні ад людзей, якія не падпісаныя на вас?", - "ignore_notifications_modal.not_following_title": "Ігнараваць апавяшчэнні ад людзей на якіх вы не падпісаны?", - "ignore_notifications_modal.private_mentions_title": "Ігнараваць апавяшчэнні пра непажаданыя асабістыя згадванні?", + "ignore_notifications_modal.not_following_title": "Ігнараваць апавяшчэнні ад людзей, на якіх Вы не падпісаныя?", + "ignore_notifications_modal.private_mentions_title": "Ігнараваць апавяшчэнні пра непажаданыя прыватныя згадванні?", "info_button.label": "Даведка", "info_button.what_is_alt_text": "

Што такое альтэрнатыўны тэкст?

Альтэрнатыўны тэкст апісвае відарыс людзям з парушэннем зроку, павольным злучэннем або тым, каму патрэбны дадатковы кантэкст.

Вы можаце зрабіць відарыс больш дасяжным і зразумелым для ўсіх, напісаўшы зразумелы, сціслы і аб'ектыўны альтэрнатыўны тэкст.

  • Ахоплівайце важныя элементы
  • Тлумачце тэкст на відарысе
  • Карыстайцеся звычайнымі сказамі
  • Пазбягайце залішняй інфармацыі
  • Засяроджвайцеся на тэндэнцыях і ключавых высновах у цяжкіх для разумення візуальных матэрыялах (напрыклад, дыяграмах або картах)
", - "interaction_modal.action.favourite": "Каб працягнуць, вы мусіце ўпадабаць нешта са свайго ўліковага запісу.", - "interaction_modal.action.follow": "Каб працягнуць, вы мусіце падпісацца на некага са свайго ўліковага запісу.", - "interaction_modal.action.reblog": "Каб працягнуць, Вам трэба пашырыць допіс са свайго профілю.", - "interaction_modal.action.reply": "Каб працягнуць, Вам трэба адказаць са свайго профілю.", - "interaction_modal.action.vote": "Каб працягнуць, Вам трэба прагаласаваць са свайго профілю.", + "interaction_modal.action.favourite": "Каб працягнуць, Вы мусіце ўпадабаць нешта са свайго ўліковага запісу.", + "interaction_modal.action.follow": "Каб працягнуць, Вы мусіце падпісацца на некага са свайго ўліковага запісу.", + "interaction_modal.action.reblog": "Каб працягнуць, Вам трэба пашырыць допіс са свайго ўліковага запісу.", + "interaction_modal.action.reply": "Каб працягнуць, Вам трэба адказаць са свайго ўліковага запісу.", + "interaction_modal.action.vote": "Каб працягнуць, Вам трэба прагаласаваць са свайго ўліковага запісу.", "interaction_modal.go": "Перайсці", "interaction_modal.no_account_yet": "Не маеце ўліковага запісу?", "interaction_modal.on_another_server": "На іншым серверы", @@ -499,7 +499,7 @@ "keyboard_shortcuts.toggle_sensitivity": "Паказаць/схаваць медыя", "keyboard_shortcuts.toot": "Стварыць новы допіс", "keyboard_shortcuts.translate": "каб перакласці допіс", - "keyboard_shortcuts.unfocus": "Расфакусаваць тэкставую вобласць/пошукавы радок", + "keyboard_shortcuts.unfocus": "Расфакусіраваць тэкставую вобласць/пошукавы радок", "keyboard_shortcuts.up": "Перамясціцца ўверх па спісе", "learn_more_link.got_it": "Зразумеў(-ла)", "learn_more_link.learn_more": "Падрабязней", @@ -509,7 +509,7 @@ "lightbox.zoom_in": "Маштабаваць да фактычнага памеру", "lightbox.zoom_out": "Дапасаваць усё змесціва пад памеры экрана", "limited_account_hint.action": "Усе роўна паказваць профіль", - "limited_account_hint.title": "Гэты профіль быў схаваны мадэратарамі", + "limited_account_hint.title": "Гэты профіль быў схаваны мадэратарамі {domain}.", "link_preview.author": "Ад {name}", "link_preview.more_from_author": "Больш ад {name}", "link_preview.shares": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}", @@ -532,7 +532,7 @@ "lists.no_members_yet": "Пакуль няма ўдзельнікаў.", "lists.no_results_found": "Нічога не знойдзена.", "lists.remove_member": "Выдаліць", - "lists.replies_policy.followed": "Любы карыстальнік, на якога вы падпісаліся", + "lists.replies_policy.followed": "Любы карыстальнік, на якога Вы падпісаліся", "lists.replies_policy.list": "Удзельнікі гэтага спісу", "lists.replies_policy.none": "Нікога", "lists.save": "Захаваць", @@ -541,16 +541,16 @@ "load_pending": "{count, plural, one {# новы элемент} few {# новыя элементы} many {# новых элементаў} other {# новых элементаў}}", "loading_indicator.label": "Ідзе загрузка…", "media_gallery.hide": "Схаваць", - "moved_to_account_banner.text": "Ваш уліковы запіс {disabledAccount} зараз адключаны таму што вы перанесены на {movedToAccount}.", + "moved_to_account_banner.text": "Ваш уліковы запіс {disabledAccount} зараз адключаны, таму што Вы перайшлі на {movedToAccount}.", "mute_modal.hide_from_notifications": "Схаваць з апавяшчэнняў", "mute_modal.hide_options": "Схаваць опцыі", "mute_modal.indefinite": "Пакуль я не прыбяру ігнараванне", "mute_modal.show_options": "Паказаць опцыі", - "mute_modal.they_can_mention_and_follow": "Карыстальнік зможа згадваць вас і падпісацца на вас, але вы гэтага не ўбачыце.", + "mute_modal.they_can_mention_and_follow": "Карыстальнік зможа згадваць Вас і падпісацца на Вас, але Вы гэтага не ўбачыце.", "mute_modal.they_wont_know": "Карыстальнік не будзе ведаць пра ігнараванне.", "mute_modal.title": "Ігнараваць карыстальніка?", "mute_modal.you_wont_see_mentions": "Вы не ўбачыце паведамленняў са згадваннем карыстальніка.", - "mute_modal.you_wont_see_posts": "Карыстальнік па-ранейшаму будзе бачыць вашыя паведамленні, але вы не будзеце паведамленні карыстальніка.", + "mute_modal.you_wont_see_posts": "Карыстальнік па-ранейшаму будзе бачыць Вашыя допісы, але Вы не будзеце бачыць ягоныя.", "navigation_bar.about": "Пра нас", "navigation_bar.account_settings": "Пароль і бяспека", "navigation_bar.administration": "Адміністрацыя", @@ -558,7 +558,7 @@ "navigation_bar.automated_deletion": "Аўтаматычнае выдаленне допісаў", "navigation_bar.blocks": "Заблакіраваныя карыстальнікі", "navigation_bar.bookmarks": "Закладкі", - "navigation_bar.direct": "Асабістыя згадванні", + "navigation_bar.direct": "Прыватныя згадванні", "navigation_bar.domain_blocks": "Заблакіраваныя дамены", "navigation_bar.favourites": "Упадабанае", "navigation_bar.filters": "Ігнараваныя словы", @@ -609,22 +609,22 @@ "notification.mentioned_you": "{name} згадаў вас", "notification.moderation-warning.learn_more": "Даведацца больш", "notification.moderation_warning": "Вы атрымалі папярэджанне ад мадэратараў", - "notification.moderation_warning.action_delete_statuses": "Некаторыя вашыя допісы былі выдаленыя.", + "notification.moderation_warning.action_delete_statuses": "Некаторыя Вашыя допісы былі выдаленыя.", "notification.moderation_warning.action_disable": "Ваш уліковы запіс быў адключаны.", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Некаторыя з вашых допісаў былі пазначаныя як далікатныя.", "notification.moderation_warning.action_none": "Ваш уліковы запіс атрымаў папярэджанне ад мадэратараў.", "notification.moderation_warning.action_sensitive": "З гэтага моманту вашыя допісы будуць пазначаныя як далікатныя.", "notification.moderation_warning.action_silence": "Ваш уліковы запіс быў абмежаваны.", - "notification.moderation_warning.action_suspend": "Ваш уліковы запіс быў прыпынены.", + "notification.moderation_warning.action_suspend": "Ваш уліковы запіс быў заблакіраваны.", "notification.own_poll": "Ваша апытанне скончылася", - "notification.poll": "Апытанне, дзе вы прынялі ўдзел, скончылася", + "notification.poll": "Апытанне, дзе Вы прынялі ўдзел, скончылася", "notification.reblog": "{name} пашырыў ваш допіс", "notification.reblog.name_and_others_with_link": "{name} і {count, plural, one {# іншы} many {# іншых} other {# іншых}} пашырылі ваш допіс", "notification.relationships_severance_event": "Страціў сувязь з {name}", - "notification.relationships_severance_event.account_suspension": "Адміністратар з {from} прыпыніў працу {target}, што азначае, што вы больш не можаце атрымліваць ад іх абнаўлення ці ўзаемадзейнічаць з імі.", + "notification.relationships_severance_event.account_suspension": "Адміністратар з {from} прыпыніў працу ўліковага запісу {target}, што азначае, што Вы больш не можаце атрымліваць ад іх абнаўленні ці ўзаемадзейнічаць з імі.", "notification.relationships_severance_event.domain_block": "Адміністратар з {from} заблакіраваў {target}, у тым ліку {followersCount} вашых падпісчыка(-аў) і {followingCount, plural, one {# уліковы запіс} few {# уліковыя запісы} many {# уліковых запісаў} other {# уліковых запісаў}}.", "notification.relationships_severance_event.learn_more": "Даведацца больш", - "notification.relationships_severance_event.user_domain_block": "Вы заблакіравалі {target} выдаліўшы {followersCount} сваіх падпісчыкаў і {followingCount, plural, one {# уліковы запіс} few {# уліковыя запісы} many {# уліковых запісаў} other {# уліковых запісаў}}, за якімі вы сочыце.", + "notification.relationships_severance_event.user_domain_block": "Вы заблакіравалі {target} выдаліўшы {followersCount} сваіх падпісчыкаў і {followingCount, plural, one {# уліковы запіс} few {# уліковыя запісы} many {# уліковых запісаў} other {# уліковых запісаў}}, за якімі Вы сочыце.", "notification.status": "Новы допіс ад {name}", "notification.update": "Допіс {name} адрэдагаваны", "notification_requests.accept": "Прыняць", @@ -639,8 +639,8 @@ "notification_requests.dismiss_multiple": "{count, plural,one {Адмовіцца ад запыту…} other {Адмовіцца ад запытаў…}}", "notification_requests.edit_selection": "Рэдагаваць", "notification_requests.exit_selection": "Гатова", - "notification_requests.explainer_for_limited_account": "Апавяшчэнне з гэтага профілю было адфільтраванае, бо гэты профіль абмежаваў мадэратар.", - "notification_requests.explainer_for_limited_remote_account": "Апавяшчэнні з гэтага профілю былі адфільтраваныя, бо гэты профіль абмежаваў мадэратар.", + "notification_requests.explainer_for_limited_account": "Апавяшчэнне з гэтага ўліковага запісу было адфільтраванае, бо гэты ўліковы запіс абмежаваў мадэратар.", + "notification_requests.explainer_for_limited_remote_account": "Апавяшчэнні з гэтага ўліковага запісу былі адфільтраваныя, бо гэты ўліковы запіс абмежаваў мадэратар.", "notification_requests.maximize": "Разгарнуць", "notification_requests.minimize_banner": "Згарнуць банер адфільтраваных апавяшчэнняў", "notification_requests.notifications_from": "Апавяшчэнні ад {name}", @@ -675,7 +675,7 @@ "notifications.filter.follows": "Падпісаны на", "notifications.filter.mentions": "Згадванні", "notifications.filter.polls": "Вынікі апытання", - "notifications.filter.statuses": "Навіны ад людзей, на якіх вы падпісаны", + "notifications.filter.statuses": "Навіны ад людзей, на якіх Вы падпісаныя", "notifications.grant_permission": "Дазволіць.", "notifications.group": "{count} Апавяшчэнняў", "notifications.mark_as_read": "Пазначыць усе апавяшчэнні як прачытаныя", @@ -695,20 +695,20 @@ "notifications.policy.filter_not_followers_hint": "Уключаючы людзей, якія падпісаны на вас менш, чым {days, plural, one {# дзень} few {# дні} many {# дзён} other {# дня}}", "notifications.policy.filter_not_followers_title": "Людзі, якія не падпісаны на вас", "notifications.policy.filter_not_following_hint": "Пакуль вы не пацвердзіце іх уручную", - "notifications.policy.filter_not_following_title": "Людзі, на якіх вы не падпісаны", - "notifications.policy.filter_private_mentions_hint": "Фільтруецца за выключэннем адказу на вашае згадванне ці калі вы падпісаны на адпраўніка", - "notifications.policy.filter_private_mentions_title": "Непажаданыя асаблівыя згадванні", + "notifications.policy.filter_not_following_title": "Людзі, на якіх Вы не падпісаныя", + "notifications.policy.filter_private_mentions_hint": "Фільтруецца, за выключэннем адказу на Вашае згадванне ці калі Вы падпісаныя на адпраўніка", + "notifications.policy.filter_private_mentions_title": "Непажаданыя прыватныя згадванні", "notifications.policy.title": "Наладзіць апавяшчэнні ад…", "notifications_permission_banner.enable": "Уключыць апавяшчэнні на працоўным стале", "notifications_permission_banner.how_to_control": "Каб атрымліваць апавяшчэнні, калі Mastodon не адкрыты, уключыце апавяшчэнні працоўнага стала. Вы зможаце дакладна кантраляваць, якія падзеі будуць ствараць апавяшчэнні з дапамогай {icon} кнопкі, як толькі яны будуць уключаны.", "notifications_permission_banner.title": "Не прапусціце нічога", "onboarding.follows.back": "Назад", "onboarding.follows.done": "Гатова", - "onboarding.follows.empty": "На жаль, зараз немагчыма паказаць вынікі. Вы можаце паспрабаваць выкарыстоўваць пошук і праглядзець старонку агляду, каб знайсці людзей, на якіх можна падпісацца, або паўтарыце спробу пазней.", + "onboarding.follows.empty": "На жаль, зараз немагчыма паказаць вынікі. Вы можаце паспрабаваць выкарыстоўваць пошук і праглядзець старонку агляду, каб знайсці людзей, на якіх можна падпісацца, або паўтарыць спробу пазней.", "onboarding.follows.search": "Пошук", "onboarding.follows.title": "Падпішыцеся на некага, каб пачаць", "onboarding.profile.discoverable": "Зрабіць мой профіль бачным", - "onboarding.profile.discoverable_hint": "Калі вы звяртаецеся да адкрытасці на Mastodon, вашы паведамленні могуць з'яўляцца ў выніках пошуку і тэндэнцый, а ваш профіль можа быць прапанаваны людзям з такімі ж інтарэсамі.", + "onboarding.profile.discoverable_hint": "Калі Вы звяртаецеся да адкрытасці на Mastodon, Вашы допісы могуць з'яўляцца ў выніках пошуку і трэндах, а Ваш профіль можа быць прапанаваны людзям з такімі ж інтарэсамі.", "onboarding.profile.display_name": "Бачнае імя", "onboarding.profile.display_name_hint": "Ваша поўнае імя або ваш псеўданім…", "onboarding.profile.note": "Біяграфія", @@ -717,7 +717,7 @@ "onboarding.profile.title": "Налады профілю", "onboarding.profile.upload_avatar": "Загрузіць фота профілю", "onboarding.profile.upload_header": "Загрузіць шапку профілю", - "password_confirmation.exceeds_maxlength": "Пароль пацьверджання перавышае максімальна дапушчальную даўжыню", + "password_confirmation.exceeds_maxlength": "Пароль пацвярджэння перавышае максімальна дапушчальную даўжыню", "password_confirmation.mismatching": "Пароль пацьверджання не супадае", "picture_in_picture.restore": "Вярніце назад", "poll.closed": "Закрыта", @@ -737,7 +737,7 @@ "privacy.private.short": "Падпісчыкі", "privacy.public.long": "Усе, хто ёсць і каго няма ў Mastodon", "privacy.public.short": "Публічны", - "privacy.unlisted.additional": "Паводзіць сябе гэтак жа, як і публічны, за выключэннем таго, што пост не будзе адлюстроўвацца ў жывой стужцы, хэштэгах, аглядзе або ў пошуку Mastodon, нават калі вы ўключылі бачнасць у пошуку ў наладах.", + "privacy.unlisted.additional": "Паводзіць сябе гэтак жа, як і публічны, за выключэннем таго, што допіс не будзе адлюстроўвацца ў жывой стужцы, хэштэгах, аглядзе або ў пошуку Mastodon, нават калі Вы ўключылі бачнасць у пошуку ў наладах.", "privacy.unlisted.long": "Менш фанфар ад алгарытмаў", "privacy.unlisted.short": "Ціхі публічны", "privacy_policy.last_updated": "Адноўлена {date}", @@ -761,7 +761,7 @@ "reply_indicator.cancel": "Скасаваць", "reply_indicator.poll": "Апытанне", "report.block": "Заблакіраваць", - "report.block_explanation": "Вы перастанеце бачыць допісы гэтага карыстальніка. Ён не зможа сачыць за вамі і бачыць вашы допісы. Ён зможа зразумець, што яго заблакіравалі.", + "report.block_explanation": "Вы перастанеце бачыць допісы гэтага карыстальніка. Ён не зможа сачыць за Вамі і бачыць Вашы допісы. Ён зможа зразумець, што яго заблакіравалі.", "report.categories.legal": "Звязанае з правам", "report.categories.other": "Іншае", "report.categories.spam": "Спам", @@ -775,9 +775,9 @@ "report.forward": "Пераслаць на {target}", "report.forward_hint": "Гэты ўліковы запіс з іншага сервера. Даслаць ананімную копію скаргі і туды?", "report.mute": "Ігнараваць", - "report.mute_explanation": "Вы не будзеце бачыць допісы гэтага карыстальніка. Ён усё яшчэ зможа сачыць за вамі і бачыць вашы допісы, не ведаючы, што яго ігнаруюць.", + "report.mute_explanation": "Вы не будзеце бачыць допісы гэтага карыстальніка. Ён усё яшчэ зможа сачыць за Вамі і бачыць Вашы допісы, не ведаючы, што яго ігнаруюць.", "report.next": "Далей", - "report.placeholder": "Дадатковы каментар", + "report.placeholder": "Дадатковыя каментарыі", "report.reasons.dislike": "Мне ён не падабаецца", "report.reasons.dislike_description": "Гэта тое, што Вы не хочаце бачыць", "report.reasons.legal": "Гэта незаконна", @@ -794,9 +794,9 @@ "report.statuses.title": "Ці ёсць допісы, каб падмацаваць гэтую скаргу?", "report.submit": "Адправіць", "report.target": "Скарга на {target}", - "report.thanks.take_action": "Вось вашыя варыянты кантролю над тым, што вы бачыце в Mastodon:", - "report.thanks.take_action_actionable": "Пакуль мы разглядаем яе, вы можаце распачаць дзеянні супраць @{name}:", - "report.thanks.title": "Ці хочаце вы бачыць гэта?", + "report.thanks.take_action": "Вось Вашыя варыянты кантролю над тым, што Вы бачыце в Mastodon:", + "report.thanks.take_action_actionable": "Пакуль мы разглядаем яе, Вы можаце распачаць дзеянні супраць @{name}:", + "report.thanks.title": "Ці хочаце Вы бачыць гэта?", "report.thanks.title_actionable": "Дзякуем за зварот, мы разбяромся з гэтым.", "report.unfollow": "Адпісацца ад @{name}", "report.unfollow_explanation": "Вы падпісаныя на гэты ўліковы запіс. Каб не бачыць допісы з яго ў вашай стужцы, адпішыцеся.", @@ -838,10 +838,10 @@ "server_banner.about_active_users": "Людзі, якія карыстаюцца гэтым сервера на працягу апошніх 30 дзён (Штомесячна Актыўныя Карыстальнікі)", "server_banner.active_users": "актыўныя карыстальнікі", "server_banner.administered_by": "Адміністратар:", - "server_banner.is_one_of_many": "{domain} - гэта адзін з многіх незалежных сервераў Mastodon, якія вы можаце выкарыстоўваць для ўдзелу ў fediverse.", + "server_banner.is_one_of_many": "{domain} - гэта адзін з многіх незалежных сервераў Mastodon, які Вы можаце выкарыстоўваць для ўдзелу ў федэральным сусвеце.", "server_banner.server_stats": "Статыстыка сервера:", "sign_in_banner.create_account": "Стварыць уліковы запіс", - "sign_in_banner.follow_anyone": "Сачыце за кім заўгодна ва ўсім fediverse і глядзіце ўсё ў храналагічным парадку. Ніякіх алгарытмаў, рэкламы або клікбэйту.", + "sign_in_banner.follow_anyone": "Падпісвайцеся на каго захочаце ва ўсім федэральным сусвеце і глядзіце ўсё ў храналагічным парадку. Ніякіх алгарытмаў, рэкламы або клікбэйту.", "sign_in_banner.mastodon_is": "Mastodon - лепшы спосаб быць у курсе ўсяго, што адбываецца.", "sign_in_banner.sign_in": "Увайсці", "sign_in_banner.sso_redirect": "Уваход ці рэгістрацыя", @@ -851,7 +851,7 @@ "status.block": "Заблакаваць @{name}", "status.bookmark": "Дадаць закладку", "status.cancel_reblog_private": "Прыбраць", - "status.cannot_reblog": "Гэты пост нельга пашырыць", + "status.cannot_reblog": "Гэты допіс нельга пашырыць", "status.context.load_new_replies": "Даступныя новыя адказы", "status.context.loading": "Правяраюцца новыя адказы", "status.continued_thread": "Працяг ланцужка", @@ -929,7 +929,7 @@ "time_remaining.seconds": "{number, plural, one {засталася # секунда} few {засталося # секунды} many {засталося # секунд} other {засталося # секунды}}", "trends.counter_by_accounts": "{count, plural, one {{counter} чалавек} few {{counter} чалавекі} many {{counter} людзей} other {{counter} чалавек}} за {days, plural, one {{days} апошні дзень} few {{days} апошнія дні} many {{days} апошніх дзён} other {{days} апошніх дзён}}", "trends.trending_now": "Актуальнае", - "ui.beforeunload": "Ваш чарнавік знішчыцца калі вы пакінеце Mastodon.", + "ui.beforeunload": "Ваш чарнавік будзе страчаны, калі Вы пакінеце Mastodon.", "units.short.billion": "{count} млрд.", "units.short.million": "{count} міл.", "units.short.thousand": "{count} тыс.", @@ -937,7 +937,7 @@ "upload_button.label": "Дадаць выяву, відэа- ці аўдыяфайл", "upload_error.limit": "Перавышана колькасць файлаў.", "upload_error.poll": "Немагчыма прымацаваць файл да апытання.", - "upload_form.drag_and_drop.instructions": "Каб абраць медыя далучэнне, націсніце прабел ці Enter. Падчас перасоўвання выкарыстоўвайце кнопкі са стрэлкамі, каб пасунуць медыя далучэнне ў любым напрамку. Націсніце прабел ці Enter зноў, каб перасунуць медыя далучэнне ў новае месца, або Escape для адмены.", + "upload_form.drag_and_drop.instructions": "Каб абраць медыя ўлажэнне, націсніце прабел ці Enter. Падчас перасоўвання выкарыстоўвайце кнопкі са стрэлкамі, каб пасунуць медыя далучэнне ў любым напрамку. Націсніце прабел ці Enter зноў, каб перасунуць медыя далучэнне ў новае месца, або Escape для адмены.", "upload_form.drag_and_drop.on_drag_cancel": "Перасоўванне адмененае. Медыя ўлажэнне {item} на месцы.", "upload_form.drag_and_drop.on_drag_end": "Медыя ўлажэнне {item} на месцы.", "upload_form.drag_and_drop.on_drag_over": "Медыя ўлажэнне {item} перасунутае.", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 92e3d7cafd..310c701c71 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -501,6 +501,8 @@ "keyboard_shortcuts.translate": "게시물 번역", "keyboard_shortcuts.unfocus": "작성창에서 포커스 해제", "keyboard_shortcuts.up": "리스트에서 위로 이동", + "learn_more_link.got_it": "확인", + "learn_more_link.learn_more": "더 알아보기", "lightbox.close": "닫기", "lightbox.next": "다음", "lightbox.previous": "이전", @@ -601,6 +603,7 @@ "notification.label.mention": "멘션", "notification.label.private_mention": "개인 멘션", "notification.label.private_reply": "개인 답글", + "notification.label.quote": "{name} 님이 내 게시물을 인용했습니다", "notification.label.reply": "답글", "notification.mention": "멘션", "notification.mentioned_you": "{name} 님의 멘션", @@ -848,6 +851,8 @@ "status.bookmark": "북마크", "status.cancel_reblog_private": "부스트 취소", "status.cannot_reblog": "이 게시물은 부스트 할 수 없습니다", + "status.context.load_new_replies": "새 답글 보기", + "status.context.loading": "추가 답글 확인중", "status.continued_thread": "이어지는 글타래", "status.copy": "게시물 링크 복사", "status.delete": "삭제", @@ -874,6 +879,9 @@ "status.open": "상세 정보 표시", "status.pin": "고정", "status.quote_error.filtered": "필터에 의해 가려짐", + "status.quote_error.not_available": "게시물 사용 불가", + "status.quote_error.pending_approval": "게시물 대기중", + "status.quote_post_author": "인용된 @{name} 님의 게시물", "status.read_more": "더 보기", "status.reblog": "부스트", "status.reblog_private": "원래의 수신자들에게 부스트", diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index 40b3c06281..33cb8cac4b 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Suá掉跟tuè lí ê", "confirmations.remove_from_followers.message": "{name} ē停止跟tuè lí。Lí kám確定beh繼續?", "confirmations.remove_from_followers.title": "Kám beh suá掉跟tuè lí ê?", + "confirmations.revoke_quote.confirm": "Thâi掉PO文", + "confirmations.revoke_quote.message": "Tsit ê動作bē當復原。", + "confirmations.revoke_quote.title": "Kám beh thâi掉PO文?", "confirmations.unfollow.confirm": "取消跟tuè", "confirmations.unfollow.message": "Lí kám確定無愛跟tuè {name}?", "confirmations.unfollow.title": "Kám beh取消跟tuè tsit ê用者?", @@ -600,6 +603,7 @@ "notification.label.mention": "提起", "notification.label.private_mention": "私人ê提起", "notification.label.private_reply": "私人ê回應", + "notification.label.quote": "{name} 引用lí ê PO文", "notification.label.reply": "回應", "notification.mention": "提起", "notification.mentioned_you": "{name}kā lí提起", @@ -657,6 +661,7 @@ "notifications.column_settings.mention": "提起:", "notifications.column_settings.poll": "投票ê結果:", "notifications.column_settings.push": "Sak通知", + "notifications.column_settings.quote": "引用:", "notifications.column_settings.reblog": "轉送:", "notifications.column_settings.show": "佇欄內底顯示", "notifications.column_settings.sound": "播放聲音", @@ -893,6 +898,7 @@ "status.reply": "回應", "status.replyAll": "應討論線", "status.report": "檢舉 @{name}", + "status.revoke_quote": "Kā 我ê PO文tuì @{name} ê thâi掉", "status.sensitive_warning": "敏感ê內容", "status.share": "分享", "status.show_less_all": "Lóng收起來", diff --git a/config/locales/activerecord.be.yml b/config/locales/activerecord.be.yml index 975bc1a704..3ddb3e328e 100644 --- a/config/locales/activerecord.be.yml +++ b/config/locales/activerecord.be.yml @@ -3,7 +3,7 @@ be: activerecord: attributes: poll: - expires_at: Дэдлайн + expires_at: Скончыцца options: Выбар user: agreement: Пагадненне аб абслугоўванні @@ -19,7 +19,7 @@ be: domain: invalid: не з’яўляецца сапраўдным даменным імем messages: - invalid_domain_on_line: "%{value} не пасуе для карэктнай назвы сервера" + invalid_domain_on_line: "%{value} не пасуе для карэктнай назвы дамена" models: account: attributes: @@ -44,7 +44,7 @@ be: attributes: account_id: taken: ужо ў спісе - must_be_following: мусіць быць карыстальнікам у вашых падпісках + must_be_following: мусіць быць карыстальнікам у Вашых падпісках status: attributes: reblog: @@ -61,7 +61,7 @@ be: blocked: выкарыстоўвае забароненую крыніцу электроннай пошты unreachable: не існуе role_id: - elevated: не можа быць вышэй за вашу бягучую ролю + elevated: не можа быць вышэй за Вашу бягучую ролю user_role: attributes: permissions_as_keys: @@ -69,7 +69,7 @@ be: elevated: не можа ўключыць дазволы, якімі не валодае ваша бягучая роля own_role: не можа быць зменены з вашай бягучай роляй position: - elevated: не можа быць вышэй за вашу бягучую ролю + elevated: не можа быць вышэй за Вашу бягучую ролю own_role: не можа быць зменены з вашай бягучай роляй webhook: attributes: diff --git a/config/locales/az.yml b/config/locales/az.yml index 516f03f604..1e66e71bed 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -11,26 +11,49 @@ az: accounts: delete: Veriləri sil destroyed_msg: "%{username} - verilərinin tezliklə silinməsi növbədədir" + display_name: Ekran adı + followers: İzləyicilər + follows: İzlənilənlər moderation: title: Moderasiya moderation_notes: Moderasiya notları + most_recent_activity: Ən son fəaliyyət + most_recent_ip: Ən son IP remote_suspension_irreversible: Bu hesabın veriləri geri qaytarılmayacaq şəkildə silinib. remote_suspension_reversible_hint_html: Hesabın fəaliyyəti öz serverində dayandırılıb və verilər %{date} tarixində tamamilə silinəcək. O vaxta qədər, uzaq server hər hansısa mənfi təsir olmadan bu hesabı bərpa edə bilər. Hesabın bütün verilərini dərhal silmək istəyirsinizsə, bunu aşağıdan edə bilərsiniz. + resend_confirmation: + send: Təsdiq keçidini təkrar göndər reset_password: Parolu sıfırla + security: Təhlükəsizlik security_measures: only_password: Yalnız parol password_and_2fa: Parol və 2FA suspension_irreversible: Bu hesabın veriləri geri qaytarılmayacaq şəkildə silinib. Hesabı istifadəyə yararlı etmək üçün hesab fəaliyyətinin dayandırılma prosesini ləğv edə bilərsiniz, ancaq daha əvvəl sahib olduğunuz heç bir veri geri qaytarılmayacaq. action_logs: action_types: + resend_user: Təsdiq poçtunu təkrar göndər reset_password_user: Parolu sıfırla actions: approve_appeal_html: "%{name}, moderasiya qərarına %{target} tərəfindən verilən etirazı təsdiqlədi" reject_appeal_html: "%{name}, moderasiya qərarına %{target} tərəfindən verilən etirazı rədd etdi" reset_password_user_html: "%{name}, %{target} istifadəçisinin parolunu sıfırladı" + deleted_account: silinmiş hesab dashboard: + media_storage: Media anbarı software: Yazılım + domain_allows: + export: Xaricə köçür + domain_blocks: + export: Xaricə köçür + export_domain_blocks: + import: + title: Əngəllənən domenləri daxilə köçür + new: + title: Əngəllənən domenləri daxilə köçür instances: + dashboard: + instance_followers_measure: oradakı izləyicilərimiz + instance_follows_measure: buradakı izləyiciləri moderation: title: Moderasiya moderation_notes: @@ -61,18 +84,29 @@ az: view_dashboard_description: İstifadəçilərin idarəetmə lövhəsinə və müxtəlif metriklərə erişməsinə icazə verir view_devops_description: İstifadəçilərin Sidekiq və pgHero idarəetmə lövhələrinə erişməsinə icazə verir settings: + appearance: + title: Görünüş + discovery: + public_timelines: Ümumi zaman xətləri + title: Kəşf et registrations: moderation_recommandation: Hər kəs üçün qeydiyyatı açmazdan əvvəl lütfən əmin olun ki, adekvat və reaktiv moderasiya komandanız var! registrations_mode: warning_hint: Moderasiya komandanızın spam və zərərli qeydiyyatları vaxtında idarə edə biləcəyinə əmin deyilsinizsə, “Qeydiyyat üçün təsdiq tələb olunur”dan istifadə etməyi tövsiyə edirik. title: Server ayarları statuses: + application: Tətbiq metadata: Meta veri system_checks: elasticsearch_version_check: message_html: 'Uyumlu olmayan Elasticsearch versiyası: %{value}' tags: updated_msg: Mövzu etiketi ayarları uğurla güncəlləndi + trends: + tags: + used_by_over_week: + one: Keçən həftə bir nəfər istifadə etdi + other: Keçən həftə %{count} nəfər istifadə etdi admin_mailer: auto_close_registrations: body: Son vaxtlarda moderator fəaliyyətinin olmamasına görə, %{instance} üzərindəki qeydiyyatlar avtomatik olaraq manual yoxlanış tələb edəcək şəkildə dəyişdirilib, beləliklə %{instance} potensial zərərli aktyorlar tərəfindən istifadə edilən platforma çevrilməyəcək. İstənilən vaxt açıq qeydiyyat rejiminə qaytara bilərsiniz. @@ -81,23 +115,52 @@ az: next_steps: Moderasiya qərarını geri almaq üçün etirazı təsdiqləyə, ya da etirazı yox saya bilərsiniz. subject: "%{username}, %{instance} üzərindəki bir moderasiya qərarına etiraz edir" appearance: + advanced_web_interface: Qabaqcıl veb interfeys + advanced_web_interface_hint: 'Tam ekran enini istifadə etmək istəyirsinizsə, qabaqcıl veb interfeys, istədiyiniz qədər məlumatı eyni anda görə bilməyiniz üçün bir çox fərqli sütunu konfiqurasiya etməyinizə imkan verir: Əsas ekran, bildirişlər, birləşmiş zaman xətti, istənilən sayda siyahı və mövzu etiketləri.' animations_and_accessibility: Animasiyalar və erişiləbilənlik + confirmation_dialogs: Təsdiq dialoq pəncərələri + discovery: Kəşf et + localization: + guide_link_text: Hər kəs töhfə verə bilər. + sensitive_content: Həssas məzmun applications: + created: Tətbiq uğurla yaradıldı + destroyed: Tətbiq uğurla silindi regenerate_token: Erişim tokenini təkrar yarat token_regenerated: Erişim tokeni uğurla yaradıldı your_token: Erişim tokeniniz auth: + captcha_confirmation: + help_html: CAPTCHA-nı həll etməklə bağlı probleminiz varsa, %{email} üzərindən əlaqə saxlaya bilərsiniz, sizə kömək edə bilərik. + hint_html: Sadəcə bir şey qaldı! Sizin insan olduğunuzu təsdiqləməyimiz lazımdır (bunu spam-ları əngəlləmək üçün edirik). Aşağıdakı CAPTCHA-nı həll edib "Davam et"ə klikləyin. + title: Təhlükəsizlik yoxlanışı confirmations: wrong_email_hint: Əgər bu e-poçt ünvanı doğru deyilsə, hesab ayarlarında onu dəyişdirə bilərsiniz. + delete_account: Hesabı sil + delete_account_html: Hesabınızı silmək istəyirsinizsə, buradan davam edə bilərsiniz. Sizdən təsdiq etməyiniz soruşulacaq. forgot_password: Parolunuzu unutmusunuz? invalid_reset_password_token: Parol sıfırlama tokeni yararsızdır və ya vaxtı bitib. Lütfən yenisini tələb edin. link_to_otp: Telefonunuzdan iki faktorlu kodu və ya bir geri qaytarma kodunu daxil edin + migrate_account: Fərqli bir hesaba daşı + migrate_account_html: Bu hesabı başqa bir hesaba yönləndirmək istəyirsinizsə, burada konfiqurasiya edə bilərsiniz. + resend_confirmation: Təsdiq keçidini təkrar göndər reset_password: Parolu sıfırla rules: preamble: Bunlar, %{domain} moderatorları tərəfindən təyin edilib və tətbiq edilib. preamble_invited: Davam etməzdən əvvəl, lütfən %{domain} moderatorları tərəfindən təyin edilmiş qaydaları nəzərdən keçirin. + title: Bəzi təməl qaydalar. set_new_password: Yeni parol təyin et + setup: + email_below_hint_html: Spam qovluğunuzu yoxlayın, ya da başqasını tələb edin. Əgər yanlışdırsa, e-poçt ünvanınızı düzəldə bilərsiniz. + email_settings_hint_html: Mastodon istifadə etməyə başlamaq üçün %{email} ünvanına göndərdiyimiz keçidə klikləyin. Biz burada gözləyirik. + link_not_received: Keçidi almamısınız? + title: Gələn qutunuzu yoxlayın + sign_up: + preamble: Bu Mastodon serveri üzərindəki hesabla, hesabın yarada yerləşməsindən asılı olmayaraq fediverse-dəki istənilən şəxsi izləyə biləcəksiniz. + title: "%{domain} üzərində qeydiyyatınızı başladaq." status: + account_status: Hesab statusu + functional: Hesabınız tamamilə işləkdir. self_destruct: "%{domain} bağlandığı üçün, hesabınıza yalnız məhdud erişiminiz olacaq." challenge: hint_html: "İpucu: Sonrakı bir saat ərzində sizdən parolu soruşmayacağıq." @@ -105,45 +168,157 @@ az: prompt: Davam etmək üçün parolu təsdiqlə deletes: confirm_password: Kimliyinizi doğrulamaq üçün hazırkı parolunuzu daxil edin + proceed: Hesabı sil + success_msg: Hesabınız uğurla silindi + edit_profile: + basic_information: Təməl məlumatlar + hint_html: "İnsanların hər kəsə açıq profilinizdə və göndərişlərinizin yanında nə göstərmək istədiyinizi özəlləşdirin. Doldurulmuş bir profilə və bir profil şəklinə sahib olduğunuz zaman digər şəxslərin sizi izləmə və sizinlə əlaqə qurma ehtimalı yüksəkdir." exports: archive_takeout: hint_html: "Göndərişlərinizin və yüklədiyiniz medianın bir arxivini tələb edə bilərsiniz. Xaricə köçürülmüş verilər, istənilən uyumlu yazılım tərəfindən oxuna bilən ActivityPub formatında olacaq. Hər 7 gündə bir dəfə arxiv tələb edə bilərsiniz." + domain_blocks: Domen əngəlləmələri + storage: Media anbarı filters: + contexts: + public: Ümumi zaman xətləri edit: statuses_hint_html: Bu filtr, aşağıdakı açar sözləri ilə uyuşmasından asılı olmayaraq fərdi göndərişləri seçmək üçün tətbiq olunur. Göndərişləri incələyin və ya filtrdən silin. + index: + contexts: "%{contexts} üzrə filtrlər" + empty: Filtriniz yoxdur. + title: Filtrlər generic: all_matching_items_selected_html: one: Axtarışınızla uyuşan %{count} element seçilib. other: Axtarışınızla uyuşan %{count} element seçilib. + order_by: Sırala select_all_matching_items: one: Axtarışınızla uyuşan <0>%{count} elementi seçin. other: Axtarışınızla uyuşan <0>%{count} elementi seçin. imports: errors: incompatible_type: Seçilmiş daxilə köçürmə növü ilə uyumlu deyil + preface: Başqa serverdən xaricə köçürdüyünüz veriləri (məsələn, izlədiyiniz və ya əngəllədiyiniz insanların siyahısını) daxilə köçürə bilərsiniz. + type_groups: + constructive: İzlənilənlər və Əlfəcinlər invites: + max_uses_prompt: Limitsiz prompt: Bu serverə erişim icazəsi vermək üçün keçid yaradın və başqaları ilə paylaşın + table: + uses: İstifadə login_activities: authentication_methods: + otp: iki faktorlu kimlik doğrulama tətbiqi password: parol description_html: Əgər tanımadığınız bir fəaliyyəti görsəniz, parolunuzu dəyişdirməyi və iki faktorlu kimlik doğrulamanı fəallaşdırmağı düşünə bilərsiniz + mail_subscriptions: + unsubscribe: + emails: + notification_emails: + reblog: təkrar paylaşma bildirişi e-poçtları migrations: + incoming_migrations: Fərqli bir hesabdan daşı + incoming_migrations_html: Başqa bir hesabdan bu hesaba daşımaq üçün əvvəlcə bir hesab alias-ı yaratmalısınız. + proceed_with_move: İzləyiciləri daşı warning: disabled_account: Hazırkı hesabınız daha sonra istifadəyə yararsız olacaq. Ancaq, verilərin xaricə köçürülməsinə, həmçinin təkrar aktivləşdirmə prosesinə erişə biləcəksiniz. moderation: title: Moderasiya + notification_mailer: + reblog: + body: "%{name} göndərişinizi təkrar paylaşdı:" + subject: "%{name} göndərişinizi təkrar paylaşdı" + title: Yeni təkrar paylaşma + notifications: + administration_emails: Admin e-poçt bildirişləri + email_events: Fəaliyyətlər üçün e-poçt bildirişləri + email_events_hint: 'Bildiriş almaq istədiyiniz fəaliyyətləri seçin:' + otp_authentication: + description_html: Bir kimlik doğrulayıcı tətbiq istifadə edərək iki addımlı kimlik doğrulamanı fəallaşdırsanız, giriş etmək üçün telefonunuzun yanınızda olması tələb olunacaq, çünki daxil olmağınız üçün kodlar yaradılacaq. + preferences: + posting_defaults: Göndəriş ilkin ayarları + public_timelines: Ümumi zaman xətləri + relationships: + activity: Hesab fəaliyyəti + confirm_follow_selected_followers: Seçilmiş izləyicləri izləmək istədiyinizə əminsiniz? + confirm_remove_selected_followers: Seçilmiş izləyiciləri çıxartmaq istədiyinizə əminsiniz? + confirm_remove_selected_follows: Seçilmiş izləmələri çıxartmaq istədiyinizə əminsiniz? + dormant: Fəaliyyətsiz + follow_failure: Seçilmiş hesablardan bəziləri izlənilə bilmədi. + follow_selected_followers: Seçilmiş izləyiciləri izlə + followers: İzləyicilər + most_recent: Ən son + mutual: Ortaq + relationship: Münasibət + remove_selected_domains: Seçilmiş domenlərin bütün izləyicilərini çıxart + remove_selected_followers: Seçilmiş izləyiciləri çıxart + remove_selected_follows: Seçilmiş istifadəçiləri izləmədən çıxart + status: Hesab statusu sessions: browsers: edge: Microsoft Edge + explanation: Bunlar, hazırda Mastodon hesabınıza giriş etmiş veb brauzerlərdir. + title: Seanslar + view_authentication_history: Hesabınızın kimlik doğrulama tarixçəsinə baxın settings: account_settings: Hesab ayarları + appearance: Görünüş development: Gəlişdirmə + export: Xaricə köçür + import_and_export: Daxilə və xaricə köçürmə + notifications: E-poçt bildirişləri + relationships: İzlənilənlər və izləyicilər + severed_relationships: Kəsilmiş münasibətlər + statuses_cleanup: Göndərişin avtomatik silinməsi strikes: Moderasiya pozuntuları + two_factor_authentication: İki faktorlu kimlik doğrulama + severed_relationships: + lost_followers: İtirilən izləyicilər + preamble: Bir domeni əngəllədiyiniz zaman və ya moderatorlarınız uzaq bir serverin fəaliyyətini dayandırmağa qərar verdiyi zaman izlədiklərinizi və izləyicilərinizi itirə bilərsiniz. Bu baş verdiyi zaman, kəsilmiş münasibətlərin bir siyahısını endirə, nəzərdən keçirə və bəlkə də başqa bir serverə köçürə biləcəksiniz. + statuses: + boosted_from_html: "%{acct_link} üzərindən təkrar paylaşdı" + default_language: İnterfeys dili ilə eyni + pin_errors: + reblog: Təkrar paylaşım, sancıla bilməz + quote_policies: + followers: Yalnız izləyiciləriniz + public: Hər kəs + visibilities: + private: Yalnız izləyicilər + private_long: Yalnız izləyicilər görə bilər + public_long: Hər kəs görə bilər + unlisted_long: Hər kəs görə bilər, ancaq hər kəsə açıq zaman xətlərində sadalanmır statuses_cleanup: + enabled: Köhnə göndərişləri avtomatik sil enabled_hint: Aşağıdakı istisnalardan heç birinə uyuşmadığı müddətcə, göndərişləriniz qeyd edilmiş yaş həddinə çatdıqda avtomatik silinir + exceptions: İstisnalar + explanation: Göndərişlərin silinməsi bahalı əməliyyat olduğu üçün, server çox məşğul olmadığı zaman bu proses yavaş-yavaş icra edilir. Bu səbəbdən, bəzi göndərişləriniz yaş həddinə çatdıqdan bir müddət sonra silinə bilər. + ignore_reblogs: Təkrar paylaşımları yox say + interaction_exceptions: Qarşılıqlı əlaqələrə əsaslanan istisnalar + interaction_exceptions_explanation: Nəzərə alın ki, bir göndəriş sevimlilərə əlavə edilmə və ya təkrar paylaşma həddini keçdikdən sonra həmin həddin altına düşsə belə, onun silinəcəyinə zəmanət verilmir. + keep_direct: Birbaşa mesajları saxla + keep_direct_hint: Birbaşa yazdığınız mesajların heç biri silinməyəcək + keep_media: Media qoşmaları olan göndərişləri saxla + keep_media_hint: Media qoşması olan göndərişlərinizdən heç biri silinməyəcək + keep_pinned: Sancaqlanmış göndərişləri saxla + keep_pinned_hint: Sancaqlanmış göndərişlərinizdən heç biri silinməyəcək + keep_polls: Anketləri saxla + keep_polls_hint: Anketlərinizdən heç biri silinməyəcək + keep_self_bookmark: Əlfəcinlərə əlavə etdiyiniz göndərişləri saxla + keep_self_bookmark_hint: Öz göndərişlərinizi əlfəcinlərə əlavə etmisinizsə silinməyəcək + keep_self_fav: Sevimlilərə əlavə etdiyiniz göndərişləri saxla + keep_self_fav_hint: Öz göndərişlərinizi sevimlilərə əlavə etmisinizsə silinməyəcək + min_age_label: Yaş həddi + min_reblogs: Bu həddən çox təkrar paylaşılan göndərişləri saxla + min_reblogs_hint: Bu sayda və ya daha çox təkrar paylaşma alan göndərişləriniz silinməyəcək. Təkrar paylaşılma sayından asılı olmayaraq göndərişlərin silinməsi üçün boş buraxın. + stream_entries: + sensitive_content: Həssas məzmun tags: does_not_match_previous_name: əvvəlki adla uyuşmur two_factor_authentication: + disabled_success: İki faktorlu kimlik doğrulama uğurla sıradan çıxarıldı + enabled: İki faktorlu kimlik doğrulama fəallaşdırıldı + enabled_success: İki faktorlu kimlik doğrulama uğurla fəallaşdırıldı generate_recovery_codes: Geri qaytarma kodlarını yarat lost_recovery_codes: Geri qaytarma kodları, telefonunuzu itirdiyiniz halda hesabınıza yenidən erişməyinizə imkan verir. Geri qaytarma kodlarınızı itirsəniz, onları təkrar yarada bilərsiniz. Köhnə geri qaytarma kodlarınız yararsız sayılacaq. recovery_codes: Geri qaytarma kodlarını nüsxələ @@ -152,14 +327,21 @@ az: user_mailer: appeal_approved: action: Hesab ayarları + explanation: "%{strike_date} tarixində hesabınıza qarşı tətbiq edilən cəza ilə bağlı %{appeal_date} tarixində göndərdiyiniz etirazınız təsdiqlənib. Hesabınız yenidən normal vəziyyətdədir." + subject: "%{date} tarixli etirazınız təsdiqlənib" + subtitle: Hesabınız yenidən normal vəziyyətdədir. + title: Etiraz təsdiqlənib suspicious_sign_in: change_password: parolu dəyişdir subject: Hesabınıza yeni bir IP ünvanından erişildi + terms_of_service_changed: + title: Vacib güncəlləmə warning: explanation: disable: Artıq hesabınızı istifadə edə bilməzsiniz, ancaq profiliniz və digər veriləriniz olduğu kimi qalacaq. Verilərinizin bir nüsxəsini tələb edə, hesab ayarlarınızı dəyişdirə və ya hesabınızı silə bilərsiniz. suspend: Hesabınızı artıq istifadə edə bilməzsiniz, profiliniz və digər veriləriniz artıq əlçatmazdır. Təxminən 30 gün ərzində verilər tamamilə silinənə qədər verilərinizin bir nüsxəsini tələb etmək üçün hələ də hesabınıza giriş edə bilərsiniz, ancaq hesab fəaliyyətinin dayandırılması prosesini ləğv etməyinizi önləmək üçün bəzi təməl veriləri saxlayacağıq. welcome: + edit_profile_step: Profilinizi tam dolduraraq qarşılıqlı əlaqələrinizi artırın. feature_creativity: Mastodon özünüzü onlayn mühitdə ifadə etməyinizə kömək edəcək səs, video və şəkil göndərişləri, erişiləbilənlik açıqlamaları, anketlər, məzmun xəbərdarlıqları, animasiyalı avatarlar, özəl emojilər, kiçik şəkli kəsmə nəzarəti və daha çoxunu dəstəkləyir. Öz sənətinizi, musiqinizi və ya podkastınızı dərc edirsinizsə, Mastodon sizin üçün buradadır. feature_moderation_title: Olmalı olduğu şəkildə moderasiya users: diff --git a/config/locales/be.yml b/config/locales/be.yml index 3cd6effdc8..7bf031bf88 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -12,7 +12,7 @@ be: many: Падпісчыкаў one: Падпісчык other: Падпісчыкі - following: Падпісаны + following: Падпіскі instance_actor_flash: Гэты ўліковы запіс - лічбавы аватар, неабходны для рэпрэзентацыі самога сервера, а не якой-небудзь асобы. Ён выкарыстоўваецца для федэралізацыі і не можа быць замарожаны. last_active: апошняя актыўнасць link_verified_on: Права ўласнасці на гэтую спасылку праверана %{date} @@ -25,12 +25,12 @@ be: one: Допіс other: Допісы posts_tab_heading: Допісы - self_follow_error: Нельга падпісацца на свой профіль + self_follow_error: Нельга падпісацца на свой уліковы запіс admin: account_actions: action: Выканаць дзеянне already_silenced: Гэты ўліковы запіс ужо абмежаваны. - already_suspended: Гэты ўліковы запіс ужо прыпынены. + already_suspended: Гэты ўліковы запіс ужо прыпыніў працу. title: Мадэраваць %{acct} account_moderation_notes: create: Пакінуць нататку @@ -91,9 +91,9 @@ be: remote: Адлеглы title: Месцазнаходжанне login_status: Стан уваходу - media_attachments: Медыя далучэнні + media_attachments: Медыя ўлажэнні memorialize: Даданае да памяці - memorialized: Запомненае + memorialized: Увекавечаны memorialized_msg: Уліковы запіс %{username} ператвораны ў мемарыяльны moderation: active: Актыўны @@ -445,7 +445,7 @@ be: create: Стварыць блакіроўку hint: Блакіроўка дамена не будзе перашкаджаць стварэнню запісаў уліковых запісаў у базе даных, але будзе заднім лікам і аўтаматычна прымяняць да гэтых уліковых запісаў пэўныя метады мадэрацыі. severity: - desc_html: "Абмежаванне зробіць допісы людзей з гэтага дамену нябачнымі для тых, хто на іх не падпісаны. Выключэнне выдаліць усё змесціва, медыя і даныя профіляў дамену з вашага серверу. «Нічога» проста адхіліць медыя файлы." + desc_html: "Абмежаванне зробіць допісы людзей з гэтага дамену нябачнымі для тых, хто на іх не падпісаны. Выключэнне выдаліць усё змесціва, медыя і даныя ўліковых запісаў дамену з вашага серверу. «Нічога» проста адхіліць медыя файлы." noop: Пуста silence: Абмежаваць suspend: Прыпыніць @@ -530,7 +530,7 @@ be: select_capabilities: Выбраць здольнасці sign_in: Увайсці status: Допіс - title: Дапаможныя серверы Fediverse + title: Дапаможныя серверы федэральнага сусвету title: FASP follow_recommendations: description_html: "Рэкамендацыі падпісак, дапамогаюць новым карыстальнікам хутка знайсці цікавы кантэнт. Калі карыстальнік недастаткова ўзаемадзейнічаў з іншымі, каб сфарміраваць персанальныя рэкамендацыі прытрымлівацца, замест гэтага рэкамендуюцца гэтыя ўліковыя запісы. Яны штодзённа пераразлічваюцца з сумесі ўліковых запісаў з самымі апошнімі ўзаемадзеяннямі і найбольшай колькасцю мясцовых падпісчыкаў для дадзенай мовы." @@ -569,7 +569,7 @@ be: description_html: Вы можаце вызначыць палітыку кантэнту, якая будзе прымяняцца да ўсіх уліковых запісаў гэтага дамена і любога з яго субдаменаў. limited_federation_mode_description_html: Вы можаце выбраць ці дазволіць уваходзіць у федэрацыю з гэтым даменам. policies: - reject_media: Адхіліць мультымедыя + reject_media: Адхіліць медыя reject_reports: Адхіліць справаздачы silence: Ліміт suspend: Прыпыніць @@ -582,7 +582,7 @@ be: instance_followers_measure: нашых падпісчыкаў там instance_follows_measure: іх падпісчыкаў тут instance_languages_dimension: Папулярныя мовы - instance_media_attachments_measure: захаваныя медыя-далучэнні + instance_media_attachments_measure: захаваныя медыя ўлажэнні instance_reports_measure: справаздач пра іх instance_statuses_measure: захаваных паведамленняў delivery: @@ -622,7 +622,7 @@ be: total_followed_by_them: Іхнія падпіскі total_followed_by_us: Нашыя падпіскі total_reported: Скаргі на іх - total_storage: Медыя далучэнні + total_storage: Медыя ўлажэнні totals_time_period_hint_html: Паказаныя агульныя значэнні ніжэй уключаюць даныя за ўвесь час. unknown_instance: На дадзены момант няма запісаў аб гэтым дамене на гэтым серверы. invites: @@ -653,7 +653,7 @@ be: relays: add_new: Дадаць новы рэтранслятар delete: Выдаліць - description_html: "Федэрацыйны рэтранслятар - гэта прамежкавы сервер, які абменьваецца вялікімі аб’ёмамі публічных паведамленняў паміж серверамі, якія падпісваюцца і робяць публікацыі на ім. Гэта можа дапамагчы малым і сярэднім серверам выяўляць змесціва з fediverse, бо ў іншым выпадку лакальным карыстальнікам трэба было б уручную сачыць за іншымі людзьмі на аддаленых серверах." + description_html: "Федэрацыйны рэтранслятар - гэта прамежкавы сервер, які абменьваецца вялікімі аб’ёмамі публічных паведамленняў паміж серверамі, якія падпісваюцца і робяць публікацыі на ім. Гэта можа дапамагчы малым і сярэднім серверам выяўляць змесціва з федэральнага сусвету, бо ў іншым выпадку лакальным карыстальнікам трэба было б уручную сачыць за іншымі людзьмі на аддаленых серверах." disable: Адключыць disabled: Адключана enable: Уключыць @@ -1086,9 +1086,9 @@ be: allow: Дазволіць допіс allow_account: Дазволіць аўтара confirm_allow: Вы ўпэўненыя, што хочаце дазволіць абраныя допісы? - confirm_allow_account: Вы ўпэўненыя, што хочаце дазволіць абраныя профілі? + confirm_allow_account: Вы ўпэўненыя, што хочаце дазволіць абраныя ўліковыя запісы? confirm_disallow: Вы ўпэўненыя, што хочаце забараніць абраныя допісы? - confirm_disallow_account: Вы ўпэўненыя, што хочаце забараніць абраныя профілі? + confirm_disallow_account: Вы ўпэўненыя, што хочаце забараніць абраныя ўліковыя запісы? description_html: Гэта допісы, пра якія ведае ваш сервер, што на дадзены момант часта абагульваюцца і падабаюцца людзям. Гэта можа дапамагчы вашым новым і пастаянным карыстальнікам знайсці больш людзей, на якіх можна падпісацца. Ніякія допісы не будуць паказвацца публічна, пакуль вы не зацвердзіце аўтара, а аўтар не дазволіць прапанаваць свой уліковы запіс іншым. Вы таксама можаце дазволіць або адхіліць асобныя допісы. disallow: Забараніць допіс disallow_account: Забараніць аўтара @@ -1313,7 +1313,7 @@ be: title: Уваход у %{domain} sign_up: manual_review: Рэгістрацыі на %{domain} праходзяць ручную праверку нашымі мадэратарамі. Каб дапамагчы нам апрацаваць вашу рэгістрацыю, напішыце крыху пра сябе і чаму вы хочаце мець уліковы запіс на %{domain}. - preamble: З профілем на серверы Mastodon Вы зможаце падпісацца на любога чалавека ў fediverse, незалежна ад таго, на якім серверы знаходзіцца іх профіль. + preamble: З уліковым запісам на гэтым серверы Mastodon Вы зможаце падпісацца на любога чалавека ў федэральным сусвеце, незалежна ад таго, на якім серверы знаходзіцца яго ўліковы запіс. title: Наладзьма вас на %{domain}. status: account_status: Стан уліковага запісу @@ -1561,56 +1561,56 @@ be: one: Вы збіраецеся замяніць свае закладкі %{count} допісам з %{filename}. other: Вы збіраецеся замяніць свае закладкі %{count} допісамі з %{filename}. domain_blocking_html: - few: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверамі з %{filename}. - many: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверамі з %{filename}. - one: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверам з %{filename}. - other: Вы збіраецеся замяніць свой спіс заблакіраваных сервераў %{count} серверамі з %{filename}. + few: Вы збіраецеся замяніць свой спіс заблакіраваных даменаў %{count} даменамі з %{filename}. + many: Вы збіраецеся замяніць свой спіс заблакіраваных даменаў %{count} даменамі з %{filename}. + one: Вы збіраецеся замяніць свой спіс заблакіраваных даменаў %{count} даменам з %{filename}. + other: Вы збіраецеся замяніць свой спіс заблакіраваных даменаў %{count} дамены з %{filename}. following_html: - few: Вы збіраецеся падпісацца на %{count} профілі з %{filename} і адпішацеся ад усіх астатніх. - many: Вы збіраецеся падпісацца на %{count} профіляў з %{filename} і адпішацеся ад усіх астатніх. - one: Вы збіраецеся падпісацца на %{count} профіль з %{filename} і адпішацеся ад усіх астатніх. - other: Вы збіраецеся падпісацца на %{count} профіляў з %{filename} і адпішацеся ад усіх астатніх. + few: Вы збіраецеся падпісацца на %{count} уліковыя запісы з %{filename} і адпішацеся ад усіх астатніх. + many: Вы збіраецеся падпісацца на %{count} уліковых запісаў з %{filename} і адпішацеся ад усіх астатніх. + one: Вы збіраецеся падпісацца на %{count} уліковы запіс з %{filename} і адпішацеся ад усіх астатніх. + other: Вы збіраецеся падпісацца на %{count} уліковыя запісы з %{filename} і адпішацеся ад усіх астатніх. lists_html: - few: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профілі будуць дададзеныя ў новыя спісы. - many: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профіляў будуць дададзеныя ў новыя спісы. - one: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профіль будзе дададзены ў новыя спісы. - other: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} профіляў будуць дададзеныя ў новыя спісы. + few: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} уліковыя запісы будуць дададзеныя ў новыя спісы. + many: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} уліковых запісаў будуць дададзеныя ў новыя спісы. + one: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} уліковы запіс будзе дададзены ў новыя спісы. + other: Вы збіраецеся замяніць свае спісы змесцівам з %{filename}. %{count} уліковыя запісы будуць дададзеныя ў новыя спісы. muting_html: - few: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілямі з %{filename}. - many: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілямі з %{filename}. - one: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілем з %{filename}. - other: Вы збіраецеся замяніць свой спіс профіляў, якія Вы ігнаруеце, %{count} профілямі з %{filename}. + few: Вы збіраецеся замяніць свой спіс уліковых запісаў, якія Вы ігнаруеце, %{count} уліковымі запісамі з %{filename}. + many: Вы збіраецеся замяніць свой спіс уліковых запісаў, якія Вы ігнаруеце, %{count} уліковымі запісамі з %{filename}. + one: Вы збіраецеся замяніць свой спіс уліковых запісаў, якія Вы ігнаруеце, %{count} уліковым запісам з %{filename}. + other: Вы збіраецеся замяніць свой спіс уліковых запісаў, якія Вы ігнаруеце, %{count} уліковыя запісы з %{filename}. preambles: blocking_html: - few: Вы збіраецеся заблакіраваць %{count} профілі з %{filename}. - many: Вы збіраецеся заблакіраваць %{count} профіляў з %{filename}. - one: Вы збіраецеся заблакіраваць %{count} профіль з %{filename}. - other: Вы збіраецеся заблакіраваць %{count} профіляў з %{filename}. + few: Вы збіраецеся заблакіраваць %{count} уліковыя запісы з %{filename}. + many: Вы збіраецеся заблакіраваць %{count} уліковых запісаў з %{filename}. + one: Вы збіраецеся заблакіраваць %{count} уліковы запіс з %{filename}. + other: Вы збіраецеся заблакіраваць %{count} уліковыя запісы з %{filename}. bookmarks_html: few: Вы збіраецеся дадаць %{count} допісы з %{filename} у Вашыя закладкі. many: Вы збіраецеся дадаць %{count} допісаў з %{filename} у Вашыя закладкі. one: Вы збіраецеся дадаць %{count} допіс з %{filename} у Вашыя закладкі. other: Вы збіраецеся дадаць %{count} допісаў з %{filename} у Вашыя закладкі. domain_blocking_html: - few: Вы збіраецеся заблакіраваць %{count} серверы з %{filename}. - many: Вы збіраецеся заблакіраваць %{count} сервераў з %{filename}. - one: Вы збіраецеся заблакіраваць %{count} сервер з %{filename}. - other: Вы збіраецеся заблакіраваць %{count} сервераў з %{filename}. + few: Вы збіраецеся заблакіраваць %{count} дамены з %{filename}. + many: Вы збіраецеся заблакіраваць %{count} даменаў з %{filename}. + one: Вы збіраецеся заблакіраваць %{count} дамен з %{filename}. + other: Вы збіраецеся заблакіраваць %{count} дамены з %{filename}. following_html: - few: Вы збіраецеся падпісацца на %{count} профілі з %{filename}. - many: Вы збіраецеся падпісацца на %{count} профіляў з %{filename}. - one: Вы збіраецеся падпісацца на %{count} профіль з %{filename}. - other: Вы збіраецеся падпісацца на %{count} профіляў з %{filename}. + few: Вы збіраецеся падпісацца на %{count} уліковыя запісы з %{filename}. + many: Вы збіраецеся падпісацца на %{count} уліковых запісаў з %{filename}. + one: Вы збіраецеся падпісацца на %{count} уліковы запіс з %{filename}. + other: Вы збіраецеся падпісацца на %{count} уліковыя запісы з %{filename}. lists_html: - few: Вы збіраецеся дадаць %{count} профілі з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. - many: Вы збіраецеся дадаць %{count} профіляў з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. - one: Вы збіраецеся дадаць %{count} профіль з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. - other: Вы збіраецеся дадаць %{count} профіляў з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + few: Вы збіраецеся дадаць %{count} уліковыя запісы з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + many: Вы збіраецеся дадаць %{count} уліковых запісаў з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + one: Вы збіраецеся дадаць %{count} уліковы запіс з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. + other: Вы збіраецеся дадаць %{count} уліковыя запісы з %{filename} у Вашыя спісы. Калі спісаў няма, то будуць створаны новыя. muting_html: - few: Вы збіраецеся пачаць ігнараваць %{count} профілі з %{filename}. - many: Вы збіраецеся пачаць ігнараваць %{count} профіляў з %{filename}. - one: Вы збіраецеся пачаць ігнараваць %{count} профіль з %{filename}. - other: Вы збіраецеся пачаць ігнараваць %{count} профіляў з %{filename}. + few: Вы збіраецеся пачаць ігнараваць %{count} уліковыя запісы з %{filename}. + many: Вы збіраецеся пачаць ігнараваць %{count} уліковых запісаў з %{filename}. + one: Вы збіраецеся пачаць ігнараваць %{count} уліковы запіс з %{filename}. + other: Вы збіраецеся пачаць ігнараваць %{count} уліковыя запісы з %{filename}. preface: Вы можаце імпартаваць даныя, экспартаваныя вамі з іншага сервера, напрыклад, спіс людзей, на якіх вы падпісаны або якіх блакуеце. recent_imports: Нядаўнія імпарты states: @@ -1698,7 +1698,7 @@ be: validations: images_and_video: Немагчыма далучыць відэа да допісу, які ўжо змяшчае выявы not_found: Файл %{ids} не знойдзены або ўжо далучаны да іншага допісу - not_ready: Няможна далучыць файлы, апрацоўка якіх яшчэ не скончылася. Паспрабуйце яшчэ раз праз хвілінку! + not_ready: Немагчыма далучыць файлы, апрацоўка якіх яшчэ не скончылася. Паспрабуйце яшчэ раз праз хвілінку! too_many: Немагчыма далучыць больш за 4 файлы migrations: acct: Перамешчана ў @@ -1746,7 +1746,7 @@ be: sign_up: subject: "%{name} зарэгістраваўся" favourite: - body: "%{name} упадабаў ваш пост:" + body: "%{name} упадабаў(-ла) Ваш допіс:" subject: "%{name} упадабаў ваш допіс" title: Новае ўпадабанае follow: @@ -1770,7 +1770,7 @@ be: subject: Карыстальнік %{name} працытаваў Ваш допіс title: Цытаваць reblog: - body: "%{name} пашырыў ваш пост:" + body: "%{name} пашырыў(-ла) Ваш допіс:" subject: "%{name} пашырыў ваш допіс" title: Новае пашырэнне status: @@ -2017,9 +2017,9 @@ be: interaction_exceptions: Выключэнні, заснаваныя на ўзаемадзеянні interaction_exceptions_explanation: Звярніце ўвагу, што няма гарантыі выдалення пастоў, калі колькасць іх упадабанняў ці пашырэннняў упадзе ніжэй за ліміт, хаця некалі гэтая колькасць перавышала яго. keep_direct: Захаваць асабістыя паведамленні - keep_direct_hint: Не выдаляць асабістыя паведамленні - keep_media: Захоўваць допісы з далучаным медыя - keep_media_hint: Не выдаляць вашыя допісы, якія ўтрымліваюць медыя + keep_direct_hint: Не выдаляе асабістыя паведамленні + keep_media: Захоўваць допісы з медыя ўлажэннямі + keep_media_hint: Не выдаляць вашыя допісы, якія ўтрымліваюць медыя ўлажэнні keep_pinned: Захаваць замацаваныя допісы keep_pinned_hint: Не выдаляць вашыя замацаваныя допісы keep_polls: Працягнуць апытанне @@ -2151,7 +2151,7 @@ be: none: Папярэджанне для %{acct} sensitive: З гэтага моманту вашыя допісы на %{acct} будуць пазначаныя як далікатныя silence: Ваш уліковы запіс %{acct} быў абмежаваны - suspend: Ваш уліковы запіс %{acct} быў выключаны + suspend: Ваш уліковы запіс %{acct} быў прыпынены title: delete_statuses: Выдаленыя допісы disable: Уліковы запіс замарожаны diff --git a/config/locales/devise.az.yml b/config/locales/devise.az.yml index d472634f0a..1df8c31cd6 100644 --- a/config/locales/devise.az.yml +++ b/config/locales/devise.az.yml @@ -19,13 +19,13 @@ az: unconfirmed: Davam etmək üçün e-poçt ünvanınızı təsdiqləməlisiniz. mailer: confirmation_instructions: - action: E-poçt ünvanını təsdiqlə + action: E-poçt ünvanını doğrula action_with_app: Təsdiqlə və %{app}-a geri qayıt - explanation: Siz %{host} saytında bu e-poçt ilə hesab yaratmısınız. Onu aktivləşdirməkdən bir klik uzaqlıqdasınız. Əgər bu siz olmamısınızsa, zəhmət olmasa, bu e-məktuba məhəl qoymayın. + explanation: Bu e-poçt ünvanı ilə %{host} üzərində bir hesab yaratmısınız. Onu aktivləşdirməkdən bir klik uzaqlıqdasınız. Əgər bunu siz etməmisinizsə, lütfən e-poçtu yox sayın. explanation_when_pending: Bu e-poçt ünvanı ilə %{host} ünvanına dəvət üçün müraciət etmisiniz. E-poçt ünvanınızı təsdiqlədikdən sonra müraciətinizi nəzərdən keçirəcəyik. Hesab məlumatlarını dəyişdirmək və ya hesabınızı silmək üçün giriş edə bilərsiniz, ancaq hesabınız təsdiqlənənə qədər əksər funksiyalara erişə bilməyəcəksiniz. Müraciətinizə rədd cavabı gəlsə, veriləriniz silinəcək, sizdən heç bir əməliyyat etməyiniz istənilməyəcək. Əgər bu siz deyilsinizsə, lütfən bu e-poçtu yox sayın. extra_html: Həmçinin zəhmət olmasa, serverin qaydalarınıistifadə şərtlərini oxuyun. subject: 'Mastodon: %{instance} üçün təsdiqlənmə təlimatları' - title: E-poçt ünvanını təsdiqlə + title: E-poçt ünvanını doğrula email_changed: explanation: 'Hesabınız üçün e-poçt ünvanı buna dəyişdirilir:' extra: E-poçtunuzu dəyişməmisinizsə, çox güman ki, kimsə hesabınıza erişib. Hesabınıza giriş edə bilmirsinizsə, lütfən parolunuzu dərhal dəyişdirin və ya server admini ilə əlaqə saxlayın. @@ -40,7 +40,7 @@ az: explanation: E-poçtunuzu dəyişdirmək üçün yeni ünvanı təsdiqləyin. extra: Bu dəyişikliyi siz etməmisinizsə, lütfən bu e-poçtu yox sayın. Yuxarıdakı keçidə erişənə qədər Mastodon hesabının e-poçt ünvanı dəyişməyəcək. subject: 'Mastodon: %{instance} üçün e-poçtu təsdiqlə' - title: E-poçt ünvanını təsdiqlə + title: E-poçt ünvanını doğrula reset_password_instructions: action: Parolu dəyiş explanation: Siz hesabınız üçün yeni parol tələb etmisiniz. diff --git a/config/locales/devise.be.yml b/config/locales/devise.be.yml index b4498f7ee8..8aebd2b198 100644 --- a/config/locales/devise.be.yml +++ b/config/locales/devise.be.yml @@ -3,20 +3,20 @@ be: devise: confirmations: confirmed: Адрас вашай электроннай пошты паспяхова пацверджаны. - send_instructions: Цягам некалькіх хвілін вы атрымаеце ліст з інструкцыямі, каб пацвердзіць вашую электронную пошту. Калі ласка, зазірніце ў папку са спамам, калі не знойдзеце ліст. - send_paranoid_instructions: Калі адрас вашай электроннай пошты існуе ў нашай базе даных, на працягу некалькіх хвілін вы атрымаеце ліст з інструкцыямі, каб пацвердзіць вашу электронную пошту. Калі вы не знойдзеце ліст, праверце папку са спамам. + send_instructions: Цягам некалькіх хвілін Вы атрымаеце ліст з інструкцыямі, каб пацвердзіць вашую электронную пошту. Калі ласка, зазірніце ў папку са спамам, калі не знойдзеце ліст. + send_paranoid_instructions: Калі адрас Вашай электроннай пошты існуе ў нашай базе даных, на працягу некалькіх хвілін Вы атрымаеце ліст з інструкцыямі, каб пацвердзіць Вашу электронную пошту. Калі Вы не знойдзеце ліст, праверце папку са спамам. failure: already_authenticated: Вы ўжо ўвайшлі. inactive: Ваш уліковы запіс яшчэ не актываваны. invalid: Няправільны %{authentication_keys} або пароль. - last_attempt: У вас ёсць яшчэ адна спроба, перш чым ваш рахунак будзе заблакаваны + last_attempt: У вас ёсць яшчэ адна спроба, перш чым Ваш уліковы запіс будзе заблакіраваны. locked: Ваш уліковы запіс заблакіраваны. not_found_in_database: Няправільны %{authentication_keys} або пароль. omniauth_user_creation_failure: Памылка пры стварэнні ўліковага запісу для гэтай асобы. pending: Ваш уліковы запіс яшчэ разглядаецца. timeout: Ваш сеанс скончыўся. Каб працягнуць, увайдзіце яшчэ раз. unauthenticated: Каб працягнуць, вам трэба ўвайсці або зарэгістравацца. - unconfirmed: Вы павінны пацвердзіць свой адрас электроннай пошты, перш чым працягнуць + unconfirmed: Вы мусіце пацвердзіць свой адрас электроннай пошты, перш чым працягнуць. mailer: confirmation_instructions: action: Пацвердзіць адрас электроннай пошты @@ -27,24 +27,24 @@ be: subject: 'Mastodon: Інструкцыі па пацвярджэнні для %{instance}' title: Праверце адрас электроннай пошты email_changed: - explanation: Адрас электроннай пошты для вашага ўліковага запісу будзе зменены на - extra: Калі вы не змянялі сваю электронную пошту, хутчэй за ўсё, нехта атрымаў доступ да вашага ўліковага запісу. Неадкладна змяніце свой пароль або звярніцеся да адміністратара сервера, калі вы заблакіраваны са свайго ўліковага запісу. + explanation: 'Адрас электроннай пошты для вашага ўліковага запісу будзе зменены на:' + extra: Калі Вы не змянялі сваю электронную пошту, хутчэй за ўсё, нехта атрымаў доступ да вашага ўліковага запісу. Неадкладна змяніце свой пароль або звярніцеся да адміністратара сервера, калі Вы заблакіраваны са свайго ўліковага запісу. subject: 'Mastodon: адрас электроннай пошты зменены' title: Новы адрас электроннай пошты password_change: - explanation: Пароль для вашага ўліковага запісу быў зменены - extra: Калі вы не змянялі свой пароль, імаверна, нехта атрымаў доступ да вашага ўліковага запісу. Неадкладна змяніце свой пароль або звярніцеся да адміністратара сервера, калі вы заблакіраваны са свайго ўліковага запісу. + explanation: Пароль для вашага ўліковага запісу быў зменены. + extra: Калі Вы не змянялі свой пароль, імаверна, нехта атрымаў доступ да вашага ўліковага запісу. Неадкладна змяніце свой пароль або звярніцеся да адміністратара сервера, калі Вы заблакіраваны са свайго ўліковага запісу. subject: 'Mastodon: пароль зменены' title: Пароль зменены reconfirmation_instructions: explanation: Пацвердзіце, каб змяніць адрас вашай электроннай пошты. - extra: Калі гэтыя змены не былі зроблены вамі, ігнаруйце гэты ліст. Адрас электроннай пошты для акаўнту Mastodon не будзе зменены, пакуль вы не пяройдзеце па спасылцы вышэй. + extra: Калі гэтыя змены не былі зроблены Вамі, праігнаруйце гэты ліст. Адрас электроннай пошты для ўліковага запісу Mastodon не будзе зменены, пакуль вы не пяройдзеце па спасылцы вышэй. subject: 'Mastodon: пацвердзіце электронную пошту для %{instance}' title: Пацвердзіце адрас электроннай пошты reset_password_instructions: action: Змяніць пароль explanation: Вы запыталі новы пароль для свайго ўліковага запісу. - extra: Калі вы не рабілі такога запыту, калі ласка, ігнаруйце гэты ліст. Ваш пароль не будзе зменены, пакуль вы не пяройдзеце па спасылцы вышэй і не створыце новы. + extra: Калі Вы не рабілі такога запыту, калі ласка, праігнаруйце гэты ліст. Ваш пароль не будзе зменены, пакуль Вы не пяройдзеце па спасылцы вышэй і не створыце новы. subject: 'Mastodon: Інструкцыі па скіданню пароля' title: Скіданне пароля two_factor_disabled: @@ -58,21 +58,21 @@ be: subtitle: Для вашага ўліковага запісу была ўключаная двухфактарная аўтэнтыфікацыя. title: двухэтапнае спраўджанне уключана two_factor_recovery_codes_changed: - explanation: Папярэднія коды аднаўлення былі ануляваны і створаны новыя. - subject: 'Mastodon: створаны новыя коды аднаўлення' - subtitle: Папярэднія коды аднаўлення былі ануляваны і замест іх створаны новыя. + explanation: Папярэднія коды аднаўлення былі ануляваны і былі створаныя новыя. + subject: 'Mastodon: створаныя новыя коды аднаўлення' + subtitle: Папярэднія коды аднаўлення былі ануляваны і замест іх былі створаныя новыя. title: 2FA коды аднаўлення былі зменены unlock_instructions: subject: 'Mastodon: інструкцыя па разблакаванні' webauthn_credential: added: - explanation: Наступны ключ бяспекі быў дададзены ў ваш уліковы запіс + explanation: Наступны ключ бяспекі быў дададзены ў Ваш уліковы запіс subject: 'Mastodon: новы ключ бяспекі' title: Быў дададзены новы ключ бяспекі deleted: - explanation: Наступны ключ бяспекі быў выдалены з вашага ўліковага запісу + explanation: Наступны ключ бяспекі быў выдалены з Вашага ўліковага запісу subject: 'Mastodon: ключ бяспекі выдалены' - title: Адзін з вашых ключоў бяспекі быў выдалены + title: Адзін з Вашых ключоў бяспекі быў выдалены webauthn_disabled: explanation: Аўтэнтыфікацыя з дапамогай ключоў бяспекі была адключаная для вашага ўліковага запісу. extra: Зараз уваход у сістэму магчымы толькі з выкарыстаннем токена, згенераванага спалучанай праграмай TOTP. @@ -80,29 +80,29 @@ be: title: Ключы бяспекі адключаны webauthn_enabled: explanation: Для вашага ўліковага запісу ўключана аўтэнтыфікацыя па ключу бяспекі. - extra: Цяпер ваш ключ бяспекі можна выкарыстоўваць для ўваходу ў сістэму. + extra: Цяпер Ваш ключ бяспекі можна выкарыстоўваць для ўваходу ў сістэму. subject: 'Mastodon: Аўтэнтыфікацыя праз ключ бяспекі была ўключана' title: Ключы бяспекі ўключаны omniauth_callbacks: failure: Немагчыма аўтэнтыфікаваць вас з %{kind}, таму што “%{reason}”. success: Паспяховая аўтэнтыфікацыя з %{kind} уліковага запісу. passwords: - no_token: Вы не можаце атрымаць доступ да гэтай старонкі не з ліста аднаўлення пароля. Калі вы ўсе ж такі перайшлі па спасылцы ў лісце аднаўлення пароля, упэўніцеся, што яна поўная. - send_instructions: Калі ваш электроны адрас існуе ў нашай базе даных, вы атрымаеце спасылку для аднаўлення пароля на сваю электронную пошту праз пару хвілін. Калі вы не атрымалі гэты ліст, праверце папку са спамам. - send_paranoid_instructions: Калі ваш электроны адрас існуе ў нашай базе даных, вы атрымаеце спасылку для аднаўлення пароля на сваю электронную пошту праз пару хвілін. Калі вы не атрымалі гэты ліст, праверце папку са спамам. + no_token: Вы не можаце атрымаць доступ да гэтай старонкі не з ліста аднаўлення пароля. Калі Вы ўсе ж такі перайшлі па спасылцы ў лісце аднаўлення пароля, упэўніцеся, што яна поўная. + send_instructions: Калі Ваш электроны адрас існуе ў нашай базе даных, Вы атрымаеце спасылку для аднаўлення пароля на сваю электронную пошту праз пару хвілін. Калі Вы не атрымалі гэты ліст, праверце папку са спамам. + send_paranoid_instructions: Калі Ваш электроны адрас існуе ў нашай базе даных, Вы атрымаеце спасылку для аднаўлення пароля на сваю электронную пошту праз пару хвілін. Калі Вы не атрымалі гэты ліст, праверце папку са спамам. updated: Ваш пароль быў паспяхова зменены. Вы ўвайшлі ў сістэму. updated_not_active: Ваш пароль быў паспяхова зменены. registrations: destroyed: Пакуль! Ваш уліковы запіс быў паспяхова выдалены. Мы спадзяваемся хутка ўбачыць вас зноў. - update_needs_confirmation: Вы паспяхова абнавілі свой уліковы запіс, аднак, нам неабходна пацвердзіць ваш новы адрас электроннай пошты. Праверце вашу пошту і перайдзіце па спасылцы для пацвярджэння свайго новага адраса электроннай пошты. Калі вы не атрымалі гэты ліст, праверце папку са спамам. + update_needs_confirmation: Вы паспяхова абнавілі свой уліковы запіс, аднак, нам неабходна пацвердзіць Ваш новы адрас электроннай пошты. Праверце Вашу пошту і перайдзіце па спасылцы для пацвярджэння свайго новага адраса электроннай пошты. Калі Вы не атрымалі гэты ліст, праверце папку са спамам. updated: Ваш уліковы запіс быў паспяхова абноўлены. sessions: already_signed_out: Выхад паспяховы. signed_in: Уваход паспяховы. signed_out: Выхад паспяховы. unlocks: - send_instructions: Вы атрымаеце ліст з інструкцыямі па разблакаванні вашага ўліковага запісу цягам некалькіх хвілін. Праверце тэчку са спамам, калі вы не атрымалі такі ліст. - send_paranoid_instructions: Калі ваш уліковы запіс існуе, вы атрымаеце ліст з інструкцыямі па яго разблакаванні цягам некалькіх хвілін. Праверце тэчку са спамам, калі вы не атрымалі такі ліст. + send_instructions: Вы атрымаеце ліст з інструкцыямі па разблакіроўцы вашага ўліковага запісу цягам некалькіх хвілін. Праверце тэчку са спамам, калі Вы не атрымалі такі ліст. + send_paranoid_instructions: Калі Ваш уліковы запіс існуе, вы атрымаеце ліст з інструкцыямі па яго разблакіроўцы цягам некалькіх хвілін. Праверце тэчку са спамам, калі Вы не атрымалі такі ліст. unlocked: Ваш уліковы запіс быў разблакіраваны. Увайдзіце, каб працягнуць. errors: messages: diff --git a/config/locales/doorkeeper.az.yml b/config/locales/doorkeeper.az.yml index aac8511a1c..210506ffeb 100644 --- a/config/locales/doorkeeper.az.yml +++ b/config/locales/doorkeeper.az.yml @@ -1,6 +1,12 @@ --- az: doorkeeper: + authorized_applications: + index: + authorized_at: "%{date} tarixində səlahiyyət verilib" + description_html: Bunlar, API istifadə edərək hesabınıza erişəbilən tətbiqlərdir. Əgər burada tanımadığınız tətbiqlər və ya yanlış davranan bir tətbiq varsa, erişimini ləğv edə bilərsiniz. + last_used_at: Ən son %{date} istifadə edilib + title: Səlahiyyətli tətbiqləriniz errors: messages: invalid_token: @@ -14,13 +20,23 @@ az: write: Yalnız yazma erişimi title: all: Mastodon hesabınıza tam erişim + filters: Filtrlər + follow: İzləmələr, səsi kəsmələr və əngəlləmələr + follows: İzlənilənlər scopes: admin:read: serverdəki bütün veriləri oxuma + admin:read:domain_blocks: əngəllənən bütün domenlərin həssas məlumatlarını oxuma + admin:read:email_domain_blocks: əngəllənən bütün e-poçt domenlərinin həssas məlumatlarını oxuma admin:write: serverdəki bütün veriləri dəyişdirmə admin:write:accounts: hesablarda moderasiya əməliyyatlarını icra et admin:write:canonical_email_blocks: admin:write:domain_allows: domen icazələri üzərində moderasiya əməliyyatlarını icra et + admin:write:domain_blocks: əngəllənən domenlər üzərində moderasiya fəaliyyətlərini icra et + admin:write:email_domain_blocks: əngəllənən e-poçt domenləri üzərində moderasiya fəaliyyətlərini icra et admin:write:ip_blocks: IP əngəlləmələri üzrə moderasiya əməliyyatlarını icra et admin:write:reports: hesabatlarda moderasiya əməliyyatlarını icra et read: hesabınızın bütün verilərini oxuma + read:filters: filtrlərinizə baxın + read:follows: izlədiklərinizə baxın write: hesabınızın bütün verilərini dəyişdirmə + write:filters: filtrlər yarat diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml index 7f1dadc4cf..45fa4ba1be 100644 --- a/config/locales/doorkeeper.be.yml +++ b/config/locales/doorkeeper.be.yml @@ -4,7 +4,7 @@ be: attributes: doorkeeper/application: name: Назва праграмы - redirect_uri: перанакіравць URI + redirect_uri: Перанакіравць URI scopes: Дазволы website: Вэб-сайт праграмы errors: @@ -12,8 +12,8 @@ be: doorkeeper/application: attributes: redirect_uri: - fragment_present: не можа ўтрымліваць фрагмент - invalid_uri: URI павінен быць сапраўдным + fragment_present: не можа ўтрымліваць фрагмент. + invalid_uri: URI павінен быць сапраўдным. relative_uri: павінен быць абсалютным URI. secured_uri: павінен быць HTTPS/SSL URI. doorkeeper: @@ -60,7 +60,7 @@ be: error: title: Узнікла памылка new: - prompt_html: "%{client_name} хоча атрымаць дазвол на доступ да Вашага профілю. Ухваляйце гэты запыт толькі калі Вы ведаеце гэту крыніцу і давяраеце ёй." + prompt_html: "%{client_name} хоча атрымаць дазвол на доступ да Вашага ўліковага запісу. Ухваляйце гэты запыт толькі калі Вы ведаеце гэту крыніцу і давяраеце ёй." review_permissions: Прагледзець дазволы title: Патрабуецца аўтарызацыя show: @@ -72,7 +72,7 @@ be: revoke: Вы ўпэўнены? index: authorized_at: Аўтарызавана %{date} - description_html: Гэта прыкладанні якія могуць мець доступ да вашага акаунта з дапамогай API. Калі вы бачыце тут прыкладанні, якія вы не пазнаеце, або прыкладанне блага сябе паводзіць вы можаце прыбраць ягонны доступ. + description_html: Гэта прыкладанні якія могуць мець доступ да вашага ўліковага запісу з дапамогай API. Калі вы бачыце тут прыкладанні, якія вы не пазнаеце, або прыкладанне блага сябе паводзіць вы можаце прыбраць ягоны доступ. last_used_at: Апошні раз скарыстана %{date} never_used: Не выкарыстоўвалася scopes: Дазволы @@ -120,10 +120,10 @@ be: write: Доступ толькі для запісу title: accounts: Уліковыя запісы - admin/accounts: Кіраванне акаўнтамі + admin/accounts: Кіраванне ўліковымі запісамі admin/all: Усе кіравальныя функцыі admin/reports: Кіраванне скардамі - all: Поўны доступ да акаўнта Mastodon + all: Поўны доступ да ўліковага запісу Mastodon blocks: Блакаванні bookmarks: Закладкі conversations: Размовы @@ -150,15 +150,15 @@ be: title: Патрабуецца аўтарызацыя OAuth scopes: admin:read: чытаць усе даныя на серверы - admin:read:accounts: чытаць канфідэнцыйную інфармацыю ўсіх акаўнтаў + admin:read:accounts: чытаць канфідэнцыяльную інфармацыю ўсіх уліковых запісаў admin:read:canonical_email_blocks: чытаць канфідэнцыйную інфармацыю ўсіх кананічных блокаў электроннай пошты admin:read:domain_allows: чытаць канфідэнцыйную інфармацыю ўсіх дазволеных даменаў admin:read:domain_blocks: чытаць канфідэнцыйную інфармацыю ўсіх блакіраваных даменаў admin:read:email_domain_blocks: чытаць канфідэнцыйную інфармацыю ўсіх блакіраваных даменаў эл. пошты admin:read:ip_blocks: чытаць канфідэнцыяльную інфармацыю ўсіх блакіраваных IP - admin:read:reports: чытаць канфідэнцыйную інфармацыю ўсіх справаздач і справаздачных уліковых запісаў + admin:read:reports: чытаць канфідэнцыяльную інфармацыю ўсіх скаргаў і абскарджаных уліковых запісаў admin:write: змяняць усе даныя на серверы - admin:write:accounts: выконваць дзеянні па мадэрацыі акаўнтаў + admin:write:accounts: выконваць дзеянні па мадэрацыі ўліковых запісаў admin:write:canonical_email_blocks: выконваць дзеянні па мадэрацыі кананічных блокаў электроннай пошты admin:write:domain_allows: дазваляе праводзіць мадэрацыю ў дамене admin:write:domain_blocks: мадэраваць блакіраваныя дамены @@ -189,7 +189,7 @@ be: write:conversations: ігнараваць і выдаляць размовы write:favourites: упадабаныя допісы write:filters: ствараць фільтры - write:follows: Сачыць за людзьмі + write:follows: сачыць за людзьмі write:lists: ствараць спiсы write:media: запампоўваць медыяфайлы write:mutes: ігнараваць людзей і размовы diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 190a58b8ee..64752d5555 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -19,7 +19,7 @@ fi: following: Sinun täytyy seurata käyttäjää, jota haluat tukea posts: one: Julkaisu - other: viestiä + other: Julkaisua posts_tab_heading: Julkaisut self_follow_error: Oman tilisi seuraaminen ei ole sallittua admin: @@ -507,12 +507,14 @@ fi: registration_requested: Rekisteröintiä pyydetty registrations: confirm: Vahvista + description: Sait rekisteröinnin FASP:lta. Hylkää se, jos et aloittanut sitä. Jos aloitat tämän, vertaile huolellisesti nimeä ja sormenjälkeä ennen rekisteröinnin vahvistamista. reject: Hylkää title: Vahvista FASP-rekisteröinti save: Tallenna select_capabilities: Valitse kyvykkyydet sign_in: Kirjaudu sisään status: Tila + title: Fediversumin Tukitoimintojen Tarjoajat title: FASP follow_recommendations: description_html: "Seurantasuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä." diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 5282568501..e039358399 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -187,6 +187,7 @@ ko: create_relay: 릴레이 생성 create_unavailable_domain: 사용 불가능한 도메인 생성 create_user_role: 역할 생성 + create_username_block: 새 사용자명 규칙 만들기 demote_user: 사용자 강등 destroy_announcement: 공지사항 삭제 destroy_canonical_email_block: 이메일 차단 삭제 @@ -200,6 +201,7 @@ ko: destroy_status: 게시물 삭제 destroy_unavailable_domain: 사용 불가능한 도메인 제거 destroy_user_role: 역할 삭제 + destroy_username_block: 사용자명 규칙 삭제 disable_2fa_user: 2단계 인증 비활성화 disable_custom_emoji: 커스텀 에모지 비활성화 disable_relay: 릴레이 비활성화 @@ -234,6 +236,7 @@ ko: update_report: 신고 업데이트 update_status: 게시물 수정 update_user_role: 역할 수정 + update_username_block: 사용자명 규칙 업데이트 actions: approve_appeal_html: "%{name} 님이 %{target}의 중재 결정에 대한 이의 제기를 승인했습니다" approve_user_html: "%{name} 님이 %{target} 님의 가입을 승인했습니다" @@ -252,6 +255,7 @@ ko: create_relay_html: "%{name} 님이 릴레이 %{target}를 생성했습니다" create_unavailable_domain_html: "%{name} 님이 도메인 %{target}에 대한 전달을 중지했습니다" create_user_role_html: "%{name} 님이 %{target} 역할을 생성했습니다" + create_username_block_html: "%{name} 님이 %{target}를 포함하는 사용자명에 대한 규칙을 생성했습니다" demote_user_html: "%{name} 님이 사용자 %{target} 님을 강등했습니다" destroy_announcement_html: "%{name} 님이 공지 %{target}을 삭제했습니다" destroy_canonical_email_block_html: "%{name} 님이 %{target} 해시를 가진 이메일을 차단 해제했습니다" @@ -265,6 +269,7 @@ ko: destroy_status_html: "%{name} 님이 %{target} 님의 게시물을 삭제했습니다" destroy_unavailable_domain_html: "%{name} 님이 도메인 %{target}에 대한 전달을 재개" destroy_user_role_html: "%{name} 님이 %{target} 역할을 삭제했습니다" + destroy_username_block_html: "%{name} 님이 %{target}를 포함하는 사용자명에 대한 규칙을 삭제했습니다" disable_2fa_user_html: "%{name} 님이 사용자 %{target} 님의 2단계 인증을 비활성화 했습니다" disable_custom_emoji_html: "%{name} 님이 에모지 %{target}를 비활성화했습니다" disable_relay_html: "%{name} 님이 릴레이 %{target}를 비활성화했습니다" @@ -299,6 +304,7 @@ ko: update_report_html: "%{name} 님이 신고 %{target}를 업데이트 했습니다" update_status_html: "%{name} 님이 %{target}의 게시물을 업데이트했습니다" update_user_role_html: "%{name} 님이 %{target} 역할을 수정했습니다" + update_username_block_html: "%{name} 님이 %{target}를 포함하는 사용자명에 대한 규칙을 수정했습니다" deleted_account: 계정을 삭제했습니다 empty: 로그를 찾을 수 없습니다 filter_by_action: 동작 별 필터 @@ -1071,10 +1077,23 @@ ko: trending: 유행 중 username_blocks: add_new: 새로 추가 + block_registrations: 가입 차단 + comparison: + contains: 포함 + equals: 일치 + contains_html: "%{string} 포함" + created_msg: 사용자명 규칙을 생성했습니다 + delete: 삭제 + edit: + title: 사용자명 규칙 편집 + matches_exactly_html: "%{string}과 일치" new: create: 규칙 만들기 title: 새 유저네임 규칙 만들기 + no_username_block_selected: 아무 것도 선택 되지 않아 어떤 사용자명 규칙도 변경 되지 않았습니다 not_permitted: 허용하지 않음 + title: 사용자명 규칙 + updated_msg: 사용자명 규칙을 변경했습니다 warning_presets: add_new: 새로 추가 delete: 삭제 @@ -1631,6 +1650,10 @@ ko: title: 새 답글 poll: subject: "%{name}의 설문이 종료됨" + quote: + body: '당신의 게시물을 %{name} 님이 인용했습니다:' + subject: "%{name} 님이 내 게시물을 인용했습니다" + title: 새 인용 reblog: body: '당신의 게시물을 %{name} 님이 부스트 했습니다:' subject: "%{name} 님이 내 게시물을 부스트 했습니다" @@ -1837,6 +1860,7 @@ ko: edited_at_html: "%{date}에 편집됨" errors: in_reply_not_found: 답장하려는 게시물이 존재하지 않습니다. + quoted_status_not_found: 인용하려는 게시물이 존재하지 않습니다. over_character_limit: 최대 %{max}자까지 입력할 수 있습니다 pin_errors: direct: 멘션된 사용자들에게만 보이는 게시물은 고정될 수 없습니다 @@ -1844,6 +1868,8 @@ ko: ownership: 다른 사람의 게시물은 고정될 수 없습니다 reblog: 부스트는 고정될 수 없습니다 quote_policies: + followers: 내 팔로워만 + nobody: 없음 public: 모두 title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/nan.yml b/config/locales/nan.yml index a620358428..f6b11afc93 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -690,6 +690,36 @@ nan: remote_user_placeholder: tuì %{instance} 來ê遠距離用者 reopen: 重頭phah開檢舉 report: '檢舉 #%{id}' + reported_account: 受檢舉ê口座 + reported_by: 檢舉人 + reported_with_application: 用應用程式檢舉 + resolved: 解決ah + resolved_msg: 檢舉成功解決ah! + skip_to_actions: 跳kàu行動 + status: 狀態 + statuses: 受檢舉ê內容 + statuses_description_html: 冒犯ê內容ē引用tī kap受檢舉口座ê聯絡 + summary: + action_preambles: + delete_html: Lí teh-beh thâi掉 @%{acct} ê tsi̍t-kuá PO文。Tse ē: + mark_as_sensitive_html: Lí teh-beh @%{acct} ê tsi̍t-kuá PO文標做敏感。Tse ē: + silence_html: Lí teh-beh 限制 @%{acct} ê口座。Tse ē: + suspend_html: Lí teh-beh 停止 @%{acct} ê口座權限。Tse ē: + actions: + delete_html: Thâi掉冒犯ê PO文 + mark_as_sensitive_html: Kā冒犯êPO文ê媒體標做敏感 + silence_html: Kā in ê個人資料kap內容標做kan-ta有跟tuè ê,á是手動tshiau伊ê個人檔案ê,通看見,來嚴嚴限制 @%{acct} ê傳播範圍 + suspend_html: Kā @%{acct} 停止權限,koh kā in ê 個人資料kap內容標做bē當用,kap bē當hām in互動 + close_report: 'Kā 檢舉報告 #%{id} 標做解決ah' + close_reports_html: Kā ta̍k êtuì @%{acct} ê檢舉標做解決ah + delete_data_html: Tuì tann起30kang以後,thâi掉 @%{acct} ê個人資料kap內容,除非佇tsit ê期限進前,取消停止in ê權限 + preview_preamble_html: "@%{acct} ē收著警告,包含下kha ê內容:" + record_strike_html: 記錄tuì @%{acct}ê警告,來幫tsān lí提升佇tsit ê口座ê未來違規 + send_email_html: Kā警告電子phue寄hōo @%{acct} + warning_placeholder: 通選ê,管理行動ê補充理由 + target_origin: 受檢舉ê口座ê來源 + title: 檢舉 + unassign: 取消分配 roles: privileges: manage_announcements: 管理公告 diff --git a/config/locales/simple_form.az.yml b/config/locales/simple_form.az.yml index b03505358f..97c8eb6015 100644 --- a/config/locales/simple_form.az.yml +++ b/config/locales/simple_form.az.yml @@ -7,26 +7,78 @@ az: defaults: current_password: Təhlükəsizlik səbəblərinə görə lütfən hazırkı hesabın parolunu daxil edin phrase: Mətndəki böyük-kiçik hərfdən və ya göndərişin məzmun xəbərdarlığından asılı olmayaraq uyuşdurulacaq + setting_aggregate_reblogs: Təzəlikcə təkrar paylaşılmış göndərişlər üçün yeni təkrar paylaşımlar göstərilməsin (yalnız yeni alınan təkrar paylaşımlara təsir edir). + setting_always_send_emails: Normalda, Mastodon-u aktiv olaraq istifadə etdiyiniz zaman e-poçt bildirişləri göndərilməyəcək + setting_default_quote_policy: Bu ayar, yalnız növbəti Mastodon versiyası ilə yaradılmış göndərişlər üçün qüvvəyə minəcək, ancaq hazırlıq mərhələsində tərcihinizi edə bilərsiniz. + setting_default_sensitive: Həssas media, ilkin olaraq gizlədilir və bir kliklə göstərilə bilər + setting_display_media_default: Həssas olaraq işarələnmiş medianı gizlət + setting_display_media_hide_all: Medianı həmişə gizlət + setting_display_media_show_all: Medianı həmişə göstər + setting_system_scrollbars_ui: Yalnız Safari və Chrome əaslı masaüstü brauzerlərinə tətbiq olunur + setting_use_blurhash: Meyillər, gizli vizualların rənglərinə əsaslanır, ancaq detalları gizlədir + setting_use_pending_items: Lenti avtomatik diyirləmək əvəzinə, zaman xətti güncəlləmələrini tək bir kliklə gizlət + featured_tag: + name: 'Budur, təzəlikcə istifadə etdiyiniz mövzu etiketlərindən bəziləri:' + form_admin_settings: + content_cache_retention_period: Digər serverlərdən olan bütün göndərişlər (təkrar paylaşımlar və cavablar daxil olmaqla) göstərilən gün sayından sonra, lokal istifadəçilərin həmin göndərişlərlə qarşılıqlı əlaqəsinə baxılmadan silinəcək. Buna, lokal istifadəçinin həmin göndərişi əlfəcinlərə və ya sevimlilərə əlavə etdiyi hallar da daxildir. Fərqli instansiyalardakı istifadəçilər arasında olan şəxsi adçəkmələr də itəcək və bərpası mümkün olmayacaq. Bu ayarın istifadəsi xüsusi məqsədli instansiyalar üçün nəzərdə tutulub və ümumi məqsədli istifadəyə tətbiq edildikdə bir çox istifadəçi gözləntilərini qarşılamaya bilər. + imports: + data: Digər Mastodon serverindən xaricə köçürdüyünüz CSV faylı ip_block: severities: no_access: Bütün resurslara erişimi əngəllə sessions: otp: 'Telefon tətbiqiniz tərəfindən yaradılmış iki faktorlu kodu daxil edin və ya geri qaytarma kodlarınızdan birini istifadə edin:' + user: + chosen_languages: İşarələnsə, yalnız seçilmiş dillərdəki göndərişlər ümumi zaman xətlərində nümayiş etdiriləcək user_role: permissions_as_keys: Bu rola sahib istifadəçilər bunlara erişə biləcək... labels: + account: + show_collections: Profildə izlənilənləri və izləyiciləri göstər defaults: + autofollow: Hesabınızı izləməyə dəvət edin confirm_new_password: Yeni parolu təsdiqlə confirm_password: Parolu təsdiqlə current_password: Hazırkı parol data: Veri + display_name: Ekran adı + header: Örtük şəkli + locale: İnterfeys dili + max_uses: Maksimum istifadə sayı new_password: Yeni parol password: Parol - setting_system_scrollbars_ui: Sistemin ilkin diyircəyini istifadə edin + setting_advanced_layout: Qabaqcıl veb interfeysini fəallaşdır + setting_aggregate_reblogs: Zaman xəttindəki TP-ları qruplaşdır + setting_always_send_emails: E-poçt göndərişlərini həmişə göndər + setting_auto_play_gif: Animasiyalı GIF-ləri avto-oxut + setting_boost_modal: Bir təkrar paylaşımı silməzdən əvvəl təsdiq dialoq pəncərəsini göstər + setting_default_privacy: Göndəriş məxfiliyi + setting_default_sensitive: Medianı həmişə həssas olaraq işarələ + setting_delete_modal: Bir göndərişi silməzdən əvvəl təsdiq dialoq pəncərəsini göstər + setting_disable_hover_cards: Üzərinə gəldikdə profil önizləməsini sıradan çıxart + setting_disable_swiping: Sürüşdürmə hərəkətlərini sıradan çıxart + setting_display_media: Medianın nümayişi + setting_expand_spoilers: Məzmun xəbərdarlığı ilə işarələnmiş göndərişləri həmişə genişləndir + setting_missing_alt_text_modal: Alternativ mətni olmayan medianı göndərməzdən əvvəl təsdiq dialoq pəncərəsini göstər + setting_reduce_motion: Animasiyalarda hərəkəti azalt + setting_system_font_ui: Sistemin ilkin şriftini istifadə et + setting_system_scrollbars_ui: Sistemin ilkin sürüşdürmə çubuğunu istifadə et + setting_trends: Bugünün trendlərini göstər + setting_use_blurhash: Gizli media üçün rəngli meyilləri göstər + setting_use_pending_items: Yavaş rejim + form_admin_settings: + show_domain_blocks: Əngəllənən domenləri göstər + timeline_preview: Ümumi zaman xətlərinə səlahiyyətsiz erişimə icazə ver ip_block: severities: no_access: Erişimi əngəllə notification_emails: appeal: Kimsə, bir moderasiya qərarına etiraz edir + favourite: Kimsə göndərişinizi sevimlilərinə əlavə etdi + follow: Kimsə sizi izləyir + follow_request: Kimsə sizi izləmək üçün sorğu göndərdi + mention: Kimsə adınızı çəkdi + quote: Kimsə sizdən sitat gətirdi + reblog: Kimsə göndərişinizi təkrar paylaşdı username_block: username: Uyuşacaq söz diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index 8a5c912e20..da411075d6 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -3,12 +3,14 @@ be: simple_form: hints: account: + attribution_domains: Адзін на радок. Абараняе ад ілжывых значанняў аўтарства. discoverable: Вашы публічныя паведамленні і профіль могуць быць паказаны або рэкамендаваны ў розных раздзелах Mastodon, і ваш профіль можа быць прапанаваны іншым карыстальнікам. display_name: Ваша поўнае імя або ваш псеўданім. fields: Ваша хатняя старонка, займеннікі, узрост, усё, што заўгодна. indexable: Вашыя публічныя допісы могуць з'яўляцца ў рэзультатах пошуку Mastodon. Людзі, якія ўзаемадзейнічалі з вашымі допісамі, усё роўна маюць магчымасць іх знаходзіць. note: 'Вы можаце @згадваць іншых людзей або выкарыстоўваць #хэштэгі.' show_collections: Людзі змогуць праглядаць спіс вашых падпісак і падпісчыкаў. Людзі, на якіх вы падпісаны ў любым выпадку будуць бачыць, што вы іх чытаеце. + unlocked: Людзі змогуць падпісвацца на Вас без запыту на ўхваленне. Зніміце птушку, калі хочаце разглядаць запыты на падпіску і выбіраць, ці хочаце Вы прымаць або адмаўляць новым падпісчыкам. account_alias: acct: Прызначце карыстальнік@дамен уліковага запісу з якога вы хочаце пераехаць account_migration: @@ -43,7 +45,7 @@ be: context: Адзін ці некалькі кантэкстаў, да якіх трэба прымяніць фільтр current_password: У мэтах бяспекі, увядзіце пароль бягучага ўліковага запісу current_username: Каб пацвердзіць, увядзіце, калі ласка імя карыстальніка бягучага ўліковага запісу - digest: Будзе даслана толькі пасля доўгага перыяду неактыўнасці і толькі калі вы атрымалі асабістыя паведамленні падчас вашай адсутнасці + digest: Будзе даслана толькі пасля доўгага перыяду неактыўнасці і толькі, калі Вы атрымалі асабістыя паведамленні падчас Вашай адсутнасці email: Пацвярджэнне будзе выслана па электроннай пошце header: WEBP, PNG, GIF ці JPG. Не больш за %{size}. Будзе сціснуты да памеру %{dimensions}} пікселяў inbox_url: Капіраваць URL са старонкі рэтранслятара, якім вы хочаце карыстацца @@ -54,11 +56,13 @@ be: scopes: Абярыце, якімі API праграма зможа карыстацца. Выбар дазволу найвышэйшага ўзроўню ўключае ў сябе дазволу астатніх узроўняў. setting_aggregate_reblogs: Не паказваць новыя пашырэнні для допісаў, якія пашырылі нядаўна (закранае толькі нядаўнія пашырэнні) setting_always_send_emails: Звычайна лісты з апавяшчэннямі не будуць дасылацца, калі вы актыўна карыстаецеся Mastodon + setting_default_quote_policy: Гэтая налада будзе працаваць толькі з допісамі, створанымі ў наступнай версіі Mastodon, але Вы можаце падрыхтавацца і задаць яе. setting_default_sensitive: Далікатныя медыя прадвызначана схаваныя. Іх можна адкрыць адзіным клікам setting_display_media_default: Хаваць медыя пазначаныя як далікатныя setting_display_media_hide_all: Заўсёды хаваць медыя setting_display_media_show_all: Заўсёды паказваць медыя setting_emoji_style: Як паказваць эмодзі. "Аўтаматычны" будзе намагацца выкарыстоўваць мясцовыя эмодзі, але для састарэлых браўзераў — Twemoji. + setting_system_scrollbars_ui: Працуе толькі ў камп'ютарных браўзерах на аснове Safari і Chrome setting_use_blurhash: Градыенты заснаваны на колерах схаваных выяў, але размываюць дэталі setting_use_pending_items: Схаваць абнаўленні стужкі за клікам замест аўтаматычнага пракручвання стужкі username: Вы можаце выкарыстоўваць літары, лічбы і падкрэсліванне @@ -71,8 +75,9 @@ be: featured_tag: name: 'Вось некаторыя з хэштэгаў, якімі вы нядаўна карысталіся:' filters: - action: Абярыце, што зрабіць, калі пост падпадае пад умовы фільтру + action: Абярыце, што зрабіць, калі допіс падпадае пад умовы фільтру actions: + blur: Схавайце медыя за знакам папярэджання, не хаваючы пры гэтым тэкст hide: Поўнасцю схаваць адфільтраванае змесціва, дзейнічаць, нібы яго не існуе warn: Схаваць адфільтраваны кантэнт за папярэджаннем з назвай фільтру form_admin_settings: @@ -86,7 +91,8 @@ be: favicon: WEBP, PNG, GIF ці JPG. Замяняе прадвызначаны favicon Mastodon на ўласны значок. mascot: Замяняе ілюстрацыю ў пашыраным вэб-інтэрфейсе. media_cache_retention_period: Медыяфайлы з допісаў, зробленых выдаленымі карыстальнікамі, кэшыруюцца на вашым серверы. Пры станоўчым значэнні медыяфайлы будуць выдалены праз пазначаную колькасць дзён. Калі медыяданыя будуць запытаны пасля выдалення, яны будуць спампаваны зноў, калі зыходнае змесціва усё яшчэ даступнае. У сувязі з абмежаваннямі на частату абнаўлення картак перадпрагляду іншых сайтаў, рэкамендуецца ўсталяваць значэнне не менш за 14 дзён, інакш гэтыя карткі не будуць абнаўляцца па запыце раней за гэты тэрмін. - peers_api_enabled: Спіс даменных імён, з якімі сутыкнуўся гэты сервер у fediverse. Даныя пра тое, ці знаходзіцеся вы з дадзеным серверам у федэрацыі, не ўключаны. Уключаны толькі даныя пра тое, што ваш сервер ведае пра іншыя серверы. Гэта выкарыстоўваецца сэрвісамі, якія збіраюць статыстыку па федэрацыі ў агульным сэнсе. + min_age: Карыстальнікі будуць атрымліваць запыт на пацвярджэнне даты нараджэння падчас рэгістрацыі + peers_api_enabled: Спіс даменных імён, з якімі сутыкнуўся гэты сервер у федэральным сусвеце. Даныя пра тое, ці знаходзіцеся вы з дадзеным серверам у федэрацыі, не ўключаны. Уключаны толькі даныя пра тое, што ваш сервер ведае пра іншыя серверы. Гэта выкарыстоўваецца сэрвісамі, якія збіраюць статыстыку па федэрацыі ў агульным сэнсе. profile_directory: Дырэкторыя профіляў змяшчае спіс усіх карыстальнікаў, якія вырашылі быць бачнымі. require_invite_text: Калі рэгістрацыя патрабуе ручнога пацвержання, зрабіце поле "Чаму вы хочаце далучыцца?" абавязковым site_contact_email: Як людзі могуць звязацца з вамі па юрыдычных запытах або пытаннях падтрымкі. @@ -129,21 +135,44 @@ be: tag: name: Вы можаце змяняць толькі рэгістр літар, напрыклад для таго, каб падвысіць чытабельнасць terms_of_service: + changelog: Можна карыстацца сінтаксісам Markdown, каб структураваць тэкст. + effective_date: Дапушчальны перыяд часу можа вар'іравацца ад 10 да 30 дзён з моманту, як Вы апавясціце сваіх карыстальнікаў. text: Тэкст можна структураваць з дапамогай сінтаксісу Markdown. + terms_of_service_generator: + admin_email: Юрыдычныя абвесткі ўключаюць сустрэчныя абвесткі, судзейскія пастановы, запыты на выдаленне і запыты праваахоўных органаў. + arbitration_address: Можа быць такім жа, што і фізічны адрас вышэй, або “N/A”, калі карыстаецеся электроннай поштай. + arbitration_website: Можа быць у выглядзе электроннай формы або “N/A”, калі карыстаецеся электроннай поштай. + choice_of_law: шашашаГорад, вобласць, тэрыторыя штата (Зша), унутраныя законы якой рэгулююць усе прэтэнзіі. + dmca_address: 'Для ўладальнікаў з ЗША: выкарыстоўвайце адрас, які зарэгістраваны ў даведніку ўпаўнаважаных агентаў DMCA. Спіс паштовых адрасоў даступны па прамым запыце, выкарыстоўвайце запыт на адмову ад правоў на пошту ўпаўнаважаных агентаў DMCA, каб адправіць электронны ліст у Офіс па Аўтарскіх Правах і апішыце, што Вы мадэратар, які працуе з уласнага дому, які баіцца помсты ці пакарання за свае дзеянні і якому патрэбны выкарыстаць паштовы адрас, каб прыбраць дамашні адрас з публічнага доступу.' + dmca_email: Можа быць такім жа, што і "Электронны адрас для юрыдычных абвестак" вышэй. + domain: Унікальны ідэнтыфікатар анлайн сэрвісу, які Вы прадстаўляеце. + jurisdiction: Дадайце краіну, дзе жыве той, хто плаціць за рахункі. Калі гэта кампанія ці іншая інстанцыя, дадайце краіну, дзе яна знаходзіцца, а таксама (па меры неабходнасці) горад, вобласць, тэрыторыю штата (ЗША). + min_age: Не павінен быць ніжэй за мінімальны ўзрост, які патрабуюць законы Вашай юрысдыкцыі. user: chosen_languages: У публічных стужках будуць паказвацца допісы толькі на тых мовах, якія вы пазначыце + date_of_birth: + few: Нам трэба ўпэўніцца, што Вы як мінімум %{count} чалавекі з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. + many: Нам трэба ўпэўніцца, што Вы як мінімум %{count} людзей з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. + one: Нам трэба ўпэўніцца, што Вы як мінімум %{count} чалавек з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. + other: Нам трэба ўпэўніцца, што Вы як мінімум %{count} чалавекі з тых, хто карыстаецца %{domain}. Мы не будзем захоўваць гэту інфармацыю. + role: Роля кантралюе тое, якія дазволы мае карыстальнік. user_role: color: Колер, які будзе выкарыстоўвацца для гэтай ролі па ўсім UI, у фармаце RGB ці hex highlighted: Гэта робіць ролю публічна бачнай name: Публічная назва ролі, калі роля дэманструецца як значок у профілю permissions_as_keys: Карыстальнікі з гэтай роляй будуць мець доступ да... position: Ролі вышэйшага рангу займаюцца вырашэннем канфліктаў у пэўных сітуацыях. Некаторыя дзеянні можна выкананаць толькі над ролямі з ніжэйшым рангам + username_block: + allow_with_approval: Рэгістрацыя не будзе цалкам забараняцца. Замест гэтага на адпаведныя рэгістрацыі спатрэбіцца Ваша ўхваленне + comparison: Калі ласка, бярыце пад увагу Сканторпскую Праблему, калі блакіруеце частковыя супадзенні + username: Супадзе пры любым рэгістры літар і часта ўжывальных амогліфах, накшталт "4" у якасці "а" ці "3" у якасці "е" webhook: events: Выберыце падзеі для адпраўкі template: Стварыце сваю ўласную карысную нагрузку JSON з дапамогай інтэрпаляцыі зменных. Пакіньце пустым для стандартнага змесціва JSON. url: Куды падзеі будуць адпраўляцца labels: account: + attribution_domains: Сайтам дазволена пазначаць ваша аўтарства discoverable: Уключыць профіль і допісы ў алгарытмы рэкамендацый fields: name: Пазнака @@ -222,8 +251,10 @@ be: setting_emoji_style: Стыль эмодзі setting_expand_spoilers: Заўжды разгортваць допісы з папярэджаннем аб змесціве setting_hide_network: Схаваць вашы сувязі + setting_missing_alt_text_modal: Паказваць акно пацвярджэння перад публікацыяй медыя без альтэрнатыўнага тэксту setting_reduce_motion: Памяншэнне руху ў анімацыях setting_system_font_ui: Выкарыстоўваць прадвызначаны сістэмны шрыфт + setting_system_scrollbars_ui: Паказваць паласу пракручвання па змаўчанні setting_theme: Тэма сайта setting_trends: Паказваць трэнды дня setting_unfollow_modal: Паказваць акно пацвярджэння перад адпісваннем @@ -242,6 +273,7 @@ be: name: Хэштэг filters: actions: + blur: Хаваць медыя з папярэджаннем hide: Схаваць цалкам warn: Схаваць з папярэджаннем form_admin_settings: @@ -255,6 +287,7 @@ be: favicon: Значок сайта mascot: Уласны маскот(спадчына) media_cache_retention_period: Працягласць захавання кэшу для медыя + min_age: Патрабаванне мінімальнага ўзросту peers_api_enabled: Апублікаваць спіс знойдзеных сервераў у API profile_directory: Уключыць каталог профіляў registrations_mode: Хто можа зарэгістравацца @@ -277,7 +310,7 @@ be: interactions: must_be_follower: Заблакіраваць апавяшчэнні ад непадпісаных людзей must_be_following: Заблакіраваць апавяшчэнні ад людзей на якіх вы не падпісаны - must_be_following_dm: Заблакіраваць асабістыя паведамленні ад людзей на якіх вы не падпісаны + must_be_following_dm: Заблакіраваць асабістыя паведамленні ад людзей, на якіх Вы не падпісаныя invite: comment: Каментар invite_request: @@ -298,6 +331,7 @@ be: follow_request: Нехта даслаў вам запыт на падпіску mention: Нехта згадаў вас pending_account: Новы акаўнт патрабуе разгляду + quote: Хтосьці цытаваў Вас reblog: Нехта пашырыў ваш допіс report: Новая скарга даслана software_updates: @@ -320,9 +354,15 @@ be: usable: Дазволіць допісам выкарыстоўваць гэты хэштэг лакальна terms_of_service: changelog: Што змянілася? + effective_date: Дата пачатку дзеяння text: Умовы выкарыстання terms_of_service_generator: + admin_email: Адрас электроннай пошты для юрыдычных абвестак + arbitration_address: Фізічны адрас для арбітражных абвестак + arbitration_website: Сайт для дасылання арбітражных абвестак choice_of_law: Выбар заканадаўства + dmca_address: Фізічны адрас для абвестак DMCA/аўтарскага права + dmca_email: Адрас электроннай пошты для абвестак DMCA/аўтарскага права domain: Дамен jurisdiction: Юрысдыкцыя min_age: Мінімальны ўзрост @@ -338,6 +378,10 @@ be: name: Назва permissions_as_keys: Дазволы position: Прыярытэт + username_block: + allow_with_approval: Дазваляць рэгістрацыі з ухваленнем + comparison: Метад параўнання + username: Словы, з якімі трэба параўноўваць webhook: events: Актыўныя падзеі template: Шаблон карыснай нагрузкі diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index da8f90d189..e60ad24d78 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -56,6 +56,7 @@ ko: scopes: 애플리케이션에 허용할 API들입니다. 최상위 스코프를 선택하면 개별적인 것은 선택하지 않아도 됩니다. setting_aggregate_reblogs: 최근에 부스트 됐던 게시물은 새로 부스트 되어도 보여주지 않기 (새로 받은 부스트에만 적용됩니다) setting_always_send_emails: 기본적으로 마스토돈을 활동적으로 사용하고 있을 때에는 이메일 알림이 보내지지 않습니다 + setting_default_quote_policy: 이 설정은 다음 마스토돈 버전부터 효과가 적용되지만 미리 준비할 수 있도록 설정을 제공합니다. setting_default_sensitive: 민감한 미디어는 기본적으로 가려져 있으며 클릭해서 볼 수 있습니다 setting_display_media_default: 민감함으로 표시된 미디어 가리기 setting_display_media_hide_all: 모든 미디어를 가리기 @@ -158,6 +159,9 @@ ko: name: 역할이 배지로 표시될 경우, 그 역할에 대한 공개적인 이름입니다 permissions_as_keys: 이 역할을 가진 사용자는 다음에 접근할 수 있게 됩니다... position: 특정 상황에서 충돌이 발생할 경우 더 높은 역할이 충돌을 해결합니다. 특정 작업은 우선순위가 낮은 역할에 대해서만 수행될 수 있습니다 + username_block: + allow_with_approval: 바로 가입을 막는 대신, 일치하는 가입에 승인을 요구합니다 + username: 대소문자와 관계 없고 "4"를 "a"로, "3"을 "e"로 사용하는 등의 보편적으로 사용되는 비슷한 문자까지 매치됩니다 webhook: events: 전송할 이벤트를 선택하세요 template: 원하는 JSON 페이로드를 변수와 함께 작성하거나, 그대로 두어 기본 JSON을 사용할 수 있습니다. @@ -323,6 +327,7 @@ ko: follow_request: 누군가 나를 팔로우 하길 요청할 때 mention: 누군가 나를 언급했을 때 pending_account: 새 계정이 심사가 필요할 때 + quote: 누군가 나를 인용했을 때 reblog: 누군가 내 게시물을 부스트 했을 때 report: 새 신고가 접수되었을 때 software_updates: @@ -369,6 +374,10 @@ ko: name: 이름 permissions_as_keys: 권한 position: 우선순위 + username_block: + allow_with_approval: 승인을 통한 가입 허용 + comparison: 비교 방식 + username: 일치할 단어 webhook: events: 활성화된 이벤트 template: 페이로드 템플릿 From dbab3912bd471ab78232cf5640921fce0f7f3bf9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 10:08:40 +0200 Subject: [PATCH 09/64] Update dependency hiredis-client to v0.25.2 (#35732) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5f9259edea..0c1dfc20f3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -300,8 +300,8 @@ GEM highline (3.1.2) reline hiredis (0.6.3) - hiredis-client (0.25.1) - redis-client (= 0.25.1) + hiredis-client (0.25.2) + redis-client (= 0.25.2) hkdf (0.3.0) htmlentities (4.3.4) http (5.3.1) @@ -717,7 +717,7 @@ GEM reline redcarpet (3.6.1) redis (4.8.1) - redis-client (0.25.1) + redis-client (0.25.2) connection_pool redlock (1.3.2) redis (>= 3.0.0, < 6.0) From 0e99d428b2d61f1a2e90d5d2cd2d8bb062e39024 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 11 Aug 2025 10:55:18 +0200 Subject: [PATCH 10/64] Change serialization of `Delete` activities for `QuoteAuthorization` to inline the latter (#35725) --- .../activitypub/delete_quote_authorization_serializer.rb | 5 ++--- .../delete_quote_authorization_serializer_spec.rb | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/serializers/activitypub/delete_quote_authorization_serializer.rb b/app/serializers/activitypub/delete_quote_authorization_serializer.rb index 150f2a4554..4d09bb4649 100644 --- a/app/serializers/activitypub/delete_quote_authorization_serializer.rb +++ b/app/serializers/activitypub/delete_quote_authorization_serializer.rb @@ -3,15 +3,14 @@ class ActivityPub::DeleteQuoteAuthorizationSerializer < ActivityPub::Serializer attributes :id, :type, :actor, :to - # TODO: change the `object` to a `QuoteAuthorization` object instead of just the URI? - attribute :virtual_object, key: :object + has_one :virtual_object, key: :object, serializer: ActivityPub::QuoteAuthorizationSerializer def id [ActivityPub::TagManager.instance.approval_uri_for(object, check_approval: false), '#delete'].join end def virtual_object - ActivityPub::TagManager.instance.approval_uri_for(object, check_approval: false) + object end def type diff --git a/spec/serializers/activitypub/delete_quote_authorization_serializer_spec.rb b/spec/serializers/activitypub/delete_quote_authorization_serializer_spec.rb index 48e3a4ddf7..9fef61e9d7 100644 --- a/spec/serializers/activitypub/delete_quote_authorization_serializer_spec.rb +++ b/spec/serializers/activitypub/delete_quote_authorization_serializer_spec.rb @@ -13,7 +13,10 @@ RSpec.describe ActivityPub::DeleteQuoteAuthorizationSerializer do expect(subject.deep_symbolize_keys) .to include( actor: eq(ActivityPub::TagManager.instance.uri_for(status.account)), - object: ActivityPub::TagManager.instance.approval_uri_for(quote, check_approval: false), + object: a_hash_including( + type: 'QuoteAuthorization', + id: ActivityPub::TagManager.instance.approval_uri_for(quote, check_approval: false) + ), type: 'Delete' ) end From 8a7e84a475ba7f707153691abc1adbc692ea1cc2 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 11 Aug 2025 10:55:23 +0200 Subject: [PATCH 11/64] Add test for `Delete` of inlined `QuoteAuthorization` (#35724) --- spec/lib/activitypub/activity/delete_spec.rb | 84 ++++++++------------ 1 file changed, 35 insertions(+), 49 deletions(-) diff --git a/spec/lib/activitypub/activity/delete_spec.rb b/spec/lib/activitypub/activity/delete_spec.rb index 849c7ada90..48d2946b94 100644 --- a/spec/lib/activitypub/activity/delete_spec.rb +++ b/spec/lib/activitypub/activity/delete_spec.rb @@ -12,27 +12,22 @@ RSpec.describe ActivityPub::Activity::Delete do id: 'foo', type: 'Delete', actor: ActivityPub::TagManager.instance.uri_for(sender), - object: ActivityPub::TagManager.instance.uri_for(status), + object: object_json, signature: 'foo', - }.with_indifferent_access + }.deep_stringify_keys end + let(:object_json) { ActivityPub::TagManager.instance.uri_for(status) } + describe '#perform' do subject { described_class.new(json, sender) } - before do - subject.perform - end - it 'deletes sender\'s status' do + subject.perform expect(Status.find_by(id: status.id)).to be_nil end - end - - context 'when the status has been reblogged' do - describe '#perform' do - subject { described_class.new(json, sender) } + context 'when the status has been reblogged' do let!(:reblogger) { Fabricate(:account) } let!(:follower) { Fabricate(:account, username: 'follower', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } let!(:reblog) { Fabricate(:status, account: reblogger, reblog: status) } @@ -55,12 +50,8 @@ RSpec.describe ActivityPub::Activity::Delete do expect { reblog.reload }.to raise_error(ActiveRecord::RecordNotFound) end end - end - - context 'when the status has been reported' do - describe '#perform' do - subject { described_class.new(json, sender) } + context 'when the status has been reported' do let!(:reporter) { Fabricate(:account) } before do @@ -76,23 +67,9 @@ RSpec.describe ActivityPub::Activity::Delete do expect(Status.with_discarded.find_by(id: status.id)).to_not be_nil end end - end - - context 'when the deleted object is an account' do - let(:json) do - { - '@context': 'https://www.w3.org/ns/activitystreams', - id: 'foo', - type: 'Delete', - actor: ActivityPub::TagManager.instance.uri_for(sender), - object: ActivityPub::TagManager.instance.uri_for(sender), - signature: 'foo', - }.with_indifferent_access - end - - describe '#perform' do - subject { described_class.new(json, sender) } + context 'when the deleted object is an account' do + let(:object_json) { ActivityPub::TagManager.instance.uri_for(sender) } let(:service) { instance_double(DeleteAccountService, call: true) } before do @@ -106,27 +83,36 @@ RSpec.describe ActivityPub::Activity::Delete do .to have_received(:call).with(sender, { reserve_username: false, skip_activitypub: true }) end end - end - context 'when the deleted object is a quote authorization' do - let(:quoter) { Fabricate(:account, domain: 'b.example.com') } - let(:status) { Fabricate(:status, account: quoter) } - let(:quoted_status) { Fabricate(:status, account: sender, uri: 'https://example.com/statuses/1234') } - let!(:quote) { Fabricate(:quote, approval_uri: 'https://example.com/approvals/1234', state: :accepted, status: status, quoted_status: quoted_status) } + context 'when the deleted object is a quote authorization' do + let(:quoter) { Fabricate(:account, domain: 'b.example.com') } + let(:status) { Fabricate(:status, account: quoter) } + let(:quoted_status) { Fabricate(:status, account: sender, uri: 'https://example.com/statuses/1234') } + let!(:quote) { Fabricate(:quote, approval_uri: 'https://example.com/approvals/1234', state: :accepted, status: status, quoted_status: quoted_status) } - let(:json) do - { - '@context': 'https://www.w3.org/ns/activitystreams', - id: 'foo', - type: 'Delete', - actor: ActivityPub::TagManager.instance.uri_for(sender), - object: quote.approval_uri, - signature: 'foo', - }.with_indifferent_access + let(:object_json) { quote.approval_uri } + + it 'revokes the authorization' do + expect { subject.perform } + .to change { quote.reload.state }.to('revoked') + end end - describe '#perform' do - subject { described_class.new(json, sender) } + context 'when the deleted object is an inlined quote authorization' do + let(:quoter) { Fabricate(:account, domain: 'b.example.com') } + let(:status) { Fabricate(:status, account: quoter) } + let(:quoted_status) { Fabricate(:status, account: sender, uri: 'https://example.com/statuses/1234') } + let!(:quote) { Fabricate(:quote, approval_uri: 'https://example.com/approvals/1234', state: :accepted, status: status, quoted_status: quoted_status) } + + let(:object_json) do + { + type: 'QuoteAuthorization', + id: quote.approval_uri, + attributedTo: ActivityPub::TagManager.instance.uri_for(quoted_status.account), + interactionTarget: ActivityPub::TagManager.instance.uri_for(quoted_status), + interactingObject: ActivityPub::TagManager.instance.uri_for(status), + }.deep_stringify_keys + end it 'revokes the authorization' do expect { subject.perform } From 9c5b4b263905947b7f7569a76462cce4c465f279 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 10:57:42 +0200 Subject: [PATCH 12/64] Update dependency sass to v1.90.0 (#35695) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b525ed6d67..e7139b681f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11989,8 +11989,8 @@ __metadata: linkType: hard "sass@npm:^1.62.1": - version: 1.89.2 - resolution: "sass@npm:1.89.2" + version: 1.90.0 + resolution: "sass@npm:1.90.0" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -12001,7 +12001,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/752ccc7581b0c6395f63918116c20924e99943a86d79e94f5c4a0d41b1e981fe1f0ecd1ee82fff21496f81dbc91f68fb35a498166562ec8ec53e7aad7c3dbd9d + checksum: 10c0/cd882a61811447c079cdc78b41f3be8164f2a2ced56e0b256b33da2de383a5f10e11ed15f8080bd832e6df302238e11649b07eb5f6e7d257d9b6982a8325d269 languageName: node linkType: hard From 4cabc031e6e33f6f0f6eb26585a85cf9e6564ae2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 12:12:14 +0200 Subject: [PATCH 13/64] Update dependency rubyzip to v3 (#35576) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index ee2369921d..57ea00cc83 100644 --- a/Gemfile +++ b/Gemfile @@ -223,7 +223,7 @@ gem 'connection_pool', require: false gem 'xorcist', '~> 1.1' gem 'net-http', '~> 0.6.0' -gem 'rubyzip', '~> 2.3' +gem 'rubyzip', '~> 3.0' gem 'hcaptcha', '~> 7.1' diff --git a/Gemfile.lock b/Gemfile.lock index 0c1dfc20f3..111837de73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -811,7 +811,7 @@ GEM ruby-vips (2.2.4) ffi (~> 1.12) logger - rubyzip (2.4.1) + rubyzip (3.0.1) rufus-scheduler (3.9.2) fugit (~> 1.1, >= 1.11.1) safety_net_attestation (0.4.0) @@ -1075,7 +1075,7 @@ DEPENDENCIES ruby-prof ruby-progressbar (~> 1.13) ruby-vips (~> 2.2) - rubyzip (~> 2.3) + rubyzip (~> 3.0) sanitize (~> 7.0) scenic (~> 1.7) shoulda-matchers From bf15b1d65dc9f5391edbd57c1c26c303148cc92d Mon Sep 17 00:00:00 2001 From: Echo Date: Mon, 11 Aug 2025 14:00:35 +0200 Subject: [PATCH 14/64] Prevent props being added as HTML attributes (#35739) --- app/javascript/mastodon/features/emoji/emoji_html.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/javascript/mastodon/features/emoji/emoji_html.tsx b/app/javascript/mastodon/features/emoji/emoji_html.tsx index ed6f7a2046..60a27306dd 100644 --- a/app/javascript/mastodon/features/emoji/emoji_html.tsx +++ b/app/javascript/mastodon/features/emoji/emoji_html.tsx @@ -38,11 +38,7 @@ export const EmojiHTML = ( if (isModernEmojiEnabled()) { return ; } - const Wrapper = props.as ?? 'div'; - return ( - - ); + const { as: asElement, htmlString, extraEmojis, ...rest } = props; + const Wrapper = asElement ?? 'div'; + return ; }; From 379f12ea0083e073eab10cecb32a8d21126adcf1 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Mon, 11 Aug 2025 14:35:36 +0200 Subject: [PATCH 15/64] Update to Vite 7 (#35598) --- package.json | 47 ++- vite.config.mts | 1 + yarn.lock | 1049 ++++++++++++++++++++++++----------------------- 3 files changed, 552 insertions(+), 545 deletions(-) diff --git a/package.json b/package.json index 6109b42875..de656d33c1 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "@react-spring/web": "^9.7.5", "@reduxjs/toolkit": "^2.0.1", "@use-gesture/react": "^10.3.1", - "@vitejs/plugin-legacy": "^6.1.1", - "@vitejs/plugin-react": "^4.2.1", + "@vitejs/plugin-legacy": "^7.2.1", + "@vitejs/plugin-react": "^5.0.0", "arrow-key-navigation": "^1.2.0", "async-mutex": "^0.5.0", "axios": "^1.4.0", @@ -108,7 +108,7 @@ "regenerator-runtime": "^0.14.0", "requestidlecallback": "^0.3.0", "rollup-plugin-gzip": "^4.1.1", - "rollup-plugin-visualizer": "^6.0.0", + "rollup-plugin-visualizer": "^6.0.3", "sass": "^1.62.1", "stacktrace-js": "^2.0.2", "stringz": "^2.1.0", @@ -117,27 +117,27 @@ "tiny-queue": "^0.2.1", "twitter-text": "3.1.0", "use-debounce": "^10.0.0", - "vite": "^6.3.5", + "vite": "^7.1.1", "vite-plugin-manifest-sri": "^0.2.0", - "vite-plugin-pwa": "^1.0.0", - "vite-plugin-static-copy": "^3.1.0", + "vite-plugin-pwa": "^1.0.2", + "vite-plugin-static-copy": "^3.1.1", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", "wicg-inert": "^3.1.2", - "workbox-expiration": "^7.0.0", - "workbox-routing": "^7.0.0", - "workbox-strategies": "^7.0.0", - "workbox-window": "^7.0.0" + "workbox-expiration": "^7.3.0", + "workbox-routing": "^7.3.0", + "workbox-strategies": "^7.3.0", + "workbox-window": "^7.3.0" }, "devDependencies": { "@eslint/js": "^9.23.0", "@formatjs/cli": "^6.1.1", - "@storybook/addon-a11y": "^9.0.4", - "@storybook/addon-docs": "^9.0.4", - "@storybook/addon-vitest": "^9.0.4", - "@storybook/react-vite": "^9.0.4", - "@testing-library/dom": "^10.2.0", - "@testing-library/react": "^16.0.0", + "@storybook/addon-a11y": "^9.1.1", + "@storybook/addon-docs": "^9.1.1", + "@storybook/addon-vitest": "^9.1.1", + "@storybook/react-vite": "^9.1.1", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.0", "@types/debug": "^4", "@types/emoji-mart": "3.0.14", "@types/escape-html": "^1.0.2", @@ -162,10 +162,10 @@ "@types/react-toggle": "^4.0.3", "@types/redux-immutable": "^4.0.3", "@types/requestidlecallback": "^0.3.5", - "@vitest/browser": "^3.2.1", - "@vitest/coverage-v8": "^3.2.0", - "@vitest/ui": "^3.2.1", - "chromatic": "^13.0.0", + "@vitest/browser": "^3.2.4", + "@vitest/coverage-v8": "^3.2.4", + "@vitest/ui": "^3.2.4", + "chromatic": "^13.1.3", "eslint": "^9.23.0", "eslint-import-resolver-typescript": "^4.2.5", "eslint-plugin-formatjs": "^5.3.1", @@ -185,19 +185,18 @@ "playwright": "^1.54.1", "prettier": "^3.3.3", "react-test-renderer": "^18.2.0", - "storybook": "^9.0.4", + "storybook": "^9.1.1", "stylelint": "^16.19.1", "stylelint-config-prettier-scss": "^1.0.0", "stylelint-config-standard-scss": "^15.0.1", "typescript": "~5.7.3", "typescript-eslint": "^8.29.1", - "vitest": "^3.2.1" + "vitest": "^3.2.4" }, "resolutions": { "@types/react": "^18.2.7", "@types/react-dom": "^18.2.4", - "kind-of": "^6.0.3", - "vite": "^6.3.5" + "kind-of": "^6.0.3" }, "peerDependenciesMeta": { "react": { diff --git a/vite.config.mts b/vite.config.mts index 30c0741aaa..6876302dd9 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -73,6 +73,7 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { port: 3036, }, build: { + target: 'modules', commonjsOptions: { transformMixedEsModules: true }, chunkSizeWarningLimit: 1 * 1024 * 1024, // 1MB sourcemap: true, diff --git a/yarn.lock b/yarn.lock index e7139b681f..2795331617 100644 --- a/yarn.lock +++ b/yarn.lock @@ -66,10 +66,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/compat-data@npm:7.27.2" - checksum: 10c0/077c9e01af3b90decee384a6a44dcf353898e980cee22ec7941f9074655dbbe97ec317345536cdc7ef7391521e1497930c522a3816af473076dd524be7fccd32 +"@babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/compat-data@npm:7.28.0" + checksum: 10c0/c4e527302bcd61052423f757355a71c3bc62362bac13f7f130de16e439716f66091ff5bdecda418e8fa0271d4c725f860f0ee23ab7bf6e769f7a8bb16dfcb531 languageName: node linkType: hard @@ -109,16 +109,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/types": "npm:^7.27.1" - checksum: 10c0/fc4751b59c8f5417e1acb0455d6ffce53fa5e79b3aca690299fbbf73b1b65bfaef3d4a18abceb190024c5836bb6cfbc3711e83888648df93df54e18152a1196c + "@babel/types": "npm:^7.27.3" + checksum: 10c0/94996ce0a05b7229f956033e6dcd69393db2b0886d0db6aff41e704390402b8cdcca11f61449cb4f86cfd9e61b5ad3a73e4fa661eeed7846b125bd1c33dbc633 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: @@ -161,18 +161,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": - version: 0.6.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" +"@babel/helper-define-polyfill-provider@npm:^0.6.5": + version: 0.6.5 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + debug: "npm:^4.4.1" lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" + resolve: "npm:^1.22.10" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b74f2b46e233a178618d19432bdae16e0137d0a603497ee901155e083c4a61f26fe01d79fb95d5f4c22131ade9d958d8f587088d412cca1302633587f070919d + checksum: 10c0/4886a068d9ca1e70af395340656a9dda33c50502c67eed39ff6451785f370bdfc6e57095b90cb92678adcd4a111ca60909af53d3a741120719c5604346ae409e languageName: node linkType: hard @@ -225,7 +225,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b @@ -445,16 +445,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" +"@babel/plugin-transform-async-generator-functions@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/772e449c69ee42a466443acefb07083bd89efb1a1d95679a4dc99ea3be9d8a3c43a2b74d2da95d7c818e9dd9e0b72bfa7c03217a1feaf108f21b7e542f0943c0 + checksum: 10c0/739d577e649d7d7b9845dc309e132964327ab3eaea43ad04d04a7dcb977c63f9aa9a423d1ca39baf10939128d02f52e6fda39c834fb9f1753785b1497e72c4dc languageName: node linkType: hard @@ -482,14 +482,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.1" +"@babel/plugin-transform-block-scoping@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d3f357beeb92fbdf3045aea2ba286a60dafc9c2d2a9f89065bb3c4bea9cc48934ee6689df3db0439d9ec518eda5e684f3156cab792b7c38c33ece2f8204ddee8 + checksum: 10c0/787d85e72a92917e735aa54e23062fa777031f8a07046e67f5026eff3d91e64eb535575dd1df917b0011bee014ae51287478af14c1d4ba60bc81e326bc044cfc languageName: node linkType: hard @@ -517,19 +517,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-classes@npm:7.27.1" +"@babel/plugin-transform-classes@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-classes@npm:7.28.0" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-globals": "npm:^7.28.0" "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" - globals: "npm:^11.1.0" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1071f4cb1ed5deb5e6f8d0442f2293a540cac5caa5ab3c25ad0571aadcbf961f61e26d367a67894976165a543e02f3a19e40b63b909afbed6e710801a590635c + checksum: 10c0/3b213b43104fe99dd7e79401a86d09e545836e057a70ffe77e8196a87bf67ae167e502ae90afdf0d1a2be683be5652514aaeda743bd984e583523dd8ecfef887 languageName: node linkType: hard @@ -545,14 +545,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-destructuring@npm:7.27.1" +"@babel/plugin-transform-destructuring@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/56afda7a0b205f8d1af727daef4c529fc2e756887408affd39033ae4476e54d586d3d9dc1e72cfb15c74a2a5ca0653ab13dbaa8cbf79fbb2a3a746d0f107cb86 + checksum: 10c0/cc7ccafa952b3ff7888544d5688cfafaba78c69ce1e2f04f3233f4f78c9de5e46e9695f5ea42c085b0c0cfa39b10f366d362a2be245b6d35b66d3eb1d427ccb2 languageName: node linkType: hard @@ -602,6 +603,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3baa706af3112adf2ae0c7ec0dc61b63dd02695eb5582f3c3a2b2d05399c6aa7756f55e7bbbd5412e613a6ba1dd6b6736904074b4d7ebd6b45a1e3f9145e4094 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" @@ -788,17 +801,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.2" +"@babel/plugin-transform-object-rest-spread@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.0" dependencies: "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5e255b262dd65c8700078d9f6ed87bd45f951a905dda6b3414be28d7b2781b18e6b812e9d71421e61360c9cf51e1e619c1d48348593bb7399496f61f5f221446 + checksum: 10c0/360dc6fd5285ee5e1d3be8a1fb0decd120b2a1726800317b4ab48b7c91616247030239b7fa06ceaa1a8a586fde1e143c24d45f8d41956876099d97d664f8ef1e languageName: node linkType: hard @@ -837,14 +851,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-parameters@npm:7.27.1" +"@babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/453a9618735eeff5551d4c7f02c250606586fe1dd210ec9f69a4f15629ace180cd944339ebff2b0f11e1a40567d83a229ba1c567620e70b2ebedea576e12196a + checksum: 10c0/f2da3804e047d9f1cfb27be6c014e2c7f6cf5e1e38290d1cb3cb2607859e3d6facb4ee8c8c1e336e9fbb440091a174ce95ce156582d7e8bf9c0e735d11681f0f languageName: node linkType: hard @@ -906,14 +920,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.1" +"@babel/plugin-transform-regenerator@npm:^7.28.0": + version: 7.28.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.28.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/42395908899310bb107d9ca31ebd4c302e14c582e3ad3ebfe1498fabafc43155c8f10850265c1e686a2afcf50d1f402cc5c5218fba72e167852607a4d8d6492e + checksum: 10c0/6c9e6eb80ce9c0bde0876c80979e078fbc85dc802272cba4ee72b5b1c858472e38167c418917e4f0d4384ce888706d95544a8d266880c0e199e167e078168b67 languageName: node linkType: hard @@ -1043,11 +1057,11 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.26.9": - version: 7.27.2 - resolution: "@babel/preset-env@npm:7.27.2" +"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/preset-env@npm:7.28.0" dependencies: - "@babel/compat-data": "npm:^7.27.2" + "@babel/compat-data": "npm:^7.28.0" "@babel/helper-compilation-targets": "npm:^7.27.2" "@babel/helper-plugin-utils": "npm:^7.27.1" "@babel/helper-validator-option": "npm:^7.27.1" @@ -1061,19 +1075,20 @@ __metadata: "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.28.0" "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" - "@babel/plugin-transform-block-scoping": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.0" "@babel/plugin-transform-class-properties": "npm:^7.27.1" "@babel/plugin-transform-class-static-block": "npm:^7.27.1" - "@babel/plugin-transform-classes": "npm:^7.27.1" + "@babel/plugin-transform-classes": "npm:^7.28.0" "@babel/plugin-transform-computed-properties": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.0" "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" "@babel/plugin-transform-for-of": "npm:^7.27.1" @@ -1090,15 +1105,15 @@ __metadata: "@babel/plugin-transform-new-target": "npm:^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.27.2" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.0" "@babel/plugin-transform-object-super": "npm:^7.27.1" "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" - "@babel/plugin-transform-parameters": "npm:^7.27.1" + "@babel/plugin-transform-parameters": "npm:^7.27.7" "@babel/plugin-transform-private-methods": "npm:^7.27.1" "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" "@babel/plugin-transform-property-literals": "npm:^7.27.1" - "@babel/plugin-transform-regenerator": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.28.0" "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" "@babel/plugin-transform-reserved-words": "npm:^7.27.1" "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" @@ -1111,14 +1126,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.11.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.40.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/fd7ec310832a9ff26ed8d56bc0832cdbdb3a188e022050b74790796650649fb8373568af05b320b58b3ff922507979bad50ff95a4d504ab0081134480103504e + checksum: 10c0/f343103b8f0e8da5be4ae031aff8bf35da4764997af4af78ae9506f421b785dd45da1bc09f845b1fc308c8b7d134aead4a1f89e7fb6e213cd2f9fe1d2aa78bc9 languageName: node linkType: hard @@ -1179,13 +1194,13 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": - version: 7.28.1 - resolution: "@babel/types@npm:7.28.1" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": + version: 7.28.2 + resolution: "@babel/types@npm:7.28.2" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/5e99b346c11ee42ffb0cadc28159fe0b184d865a2cc1593df79b199772a534f6453969b4942aa5e4a55a3081863096e1cc3fc1c724d826926dc787cf229b845d + checksum: 10c0/24b11c9368e7e2c291fe3c1bcd1ed66f6593a3975f479cbb9dd7b8c8d8eab8a962b0d2fca616c043396ce82500ac7d23d594fbbbd013828182c01596370a0b10 languageName: node linkType: hard @@ -2519,20 +2534,20 @@ __metadata: languageName: node linkType: hard -"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.0": - version: 0.6.0 - resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.0" +"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.1": + version: 0.6.1 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.1" dependencies: glob: "npm:^10.0.0" magic-string: "npm:^0.30.0" react-docgen-typescript: "npm:^2.2.2" peerDependencies: typescript: ">= 4.3.x" - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10c0/cbb76545214929e628de661985f69f9b79f324ad8db0aa19b2937c52730be57eb37848a7b7d5986ccc00f09d8bc0623ec16f83c9c13aaca3ef5afd0bc322da2e + checksum: 10c0/0bcc2adbb49158018102bd9d84cd8572c770daee3d46733157933ef0330953bd5b9e102c26f2338ee7dfb8f21a7bb937134d23f8a7935d5dc88525a253557467 languageName: node linkType: hard @@ -2606,12 +2621,12 @@ __metadata: "@rails/ujs": "npm:7.1.501" "@react-spring/web": "npm:^9.7.5" "@reduxjs/toolkit": "npm:^2.0.1" - "@storybook/addon-a11y": "npm:^9.0.4" - "@storybook/addon-docs": "npm:^9.0.4" - "@storybook/addon-vitest": "npm:^9.0.4" - "@storybook/react-vite": "npm:^9.0.4" - "@testing-library/dom": "npm:^10.2.0" - "@testing-library/react": "npm:^16.0.0" + "@storybook/addon-a11y": "npm:^9.1.1" + "@storybook/addon-docs": "npm:^9.1.1" + "@storybook/addon-vitest": "npm:^9.1.1" + "@storybook/react-vite": "npm:^9.1.1" + "@testing-library/dom": "npm:^10.4.1" + "@testing-library/react": "npm:^16.3.0" "@types/debug": "npm:^4" "@types/emoji-mart": "npm:3.0.14" "@types/escape-html": "npm:^1.0.2" @@ -2637,18 +2652,18 @@ __metadata: "@types/redux-immutable": "npm:^4.0.3" "@types/requestidlecallback": "npm:^0.3.5" "@use-gesture/react": "npm:^10.3.1" - "@vitejs/plugin-legacy": "npm:^6.1.1" - "@vitejs/plugin-react": "npm:^4.2.1" - "@vitest/browser": "npm:^3.2.1" - "@vitest/coverage-v8": "npm:^3.2.0" - "@vitest/ui": "npm:^3.2.1" + "@vitejs/plugin-legacy": "npm:^7.2.1" + "@vitejs/plugin-react": "npm:^5.0.0" + "@vitest/browser": "npm:^3.2.4" + "@vitest/coverage-v8": "npm:^3.2.4" + "@vitest/ui": "npm:^3.2.4" arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" axios: "npm:^1.4.0" babel-plugin-formatjs: "npm:^10.5.37" babel-plugin-transform-react-remove-prop-types: "npm:^0.4.24" blurhash: "npm:^2.0.5" - chromatic: "npm:^13.0.0" + chromatic: "npm:^13.1.3" classnames: "npm:^2.3.2" cocoon-js-vanilla: "npm:^1.5.1" color-blend: "npm:^4.0.0" @@ -2717,10 +2732,10 @@ __metadata: regenerator-runtime: "npm:^0.14.0" requestidlecallback: "npm:^0.3.0" rollup-plugin-gzip: "npm:^4.1.1" - rollup-plugin-visualizer: "npm:^6.0.0" + rollup-plugin-visualizer: "npm:^6.0.3" sass: "npm:^1.62.1" stacktrace-js: "npm:^2.0.2" - storybook: "npm:^9.0.4" + storybook: "npm:^9.1.1" stringz: "npm:^2.1.0" stylelint: "npm:^16.19.1" stylelint-config-prettier-scss: "npm:^1.0.0" @@ -2732,18 +2747,18 @@ __metadata: typescript: "npm:~5.7.3" typescript-eslint: "npm:^8.29.1" use-debounce: "npm:^10.0.0" - vite: "npm:^6.3.5" + vite: "npm:^7.1.1" vite-plugin-manifest-sri: "npm:^0.2.0" - vite-plugin-pwa: "npm:^1.0.0" - vite-plugin-static-copy: "npm:^3.1.0" + vite-plugin-pwa: "npm:^1.0.2" + vite-plugin-static-copy: "npm:^3.1.1" vite-plugin-svgr: "npm:^4.3.0" vite-tsconfig-paths: "npm:^5.1.4" - vitest: "npm:^3.2.1" + vitest: "npm:^3.2.4" wicg-inert: "npm:^3.1.2" - workbox-expiration: "npm:^7.0.0" - workbox-routing: "npm:^7.0.0" - workbox-strategies: "npm:^7.0.0" - workbox-window: "npm:^7.0.0" + workbox-expiration: "npm:^7.3.0" + workbox-routing: "npm:^7.3.0" + workbox-strategies: "npm:^7.3.0" + workbox-window: "npm:^7.3.0" peerDependenciesMeta: react: optional: true @@ -3200,10 +3215,10 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.27": - version: 1.0.0-beta.27 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.27" - checksum: 10c0/9658f235b345201d4f6bfb1f32da9754ca164f892d1cb68154fe5f53c1df42bd675ecd409836dff46884a7847d6c00bdc38af870f7c81e05bba5c2645eb4ab9c +"@rolldown/pluginutils@npm:1.0.0-beta.30": + version: 1.0.0-beta.30 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.30" + checksum: 10c0/aff8b532cb9d82d94c9a4101fa12ecb10620ad47d52dbb9135a5c65bde1ad19895b41026b821f4d607083699239a5d0010198401b6a6a54ab6a10d0015302768 languageName: node linkType: hard @@ -3299,142 +3314,142 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.2" +"@rollup/rollup-android-arm-eabi@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.46.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-android-arm64@npm:4.40.2" +"@rollup/rollup-android-arm64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-android-arm64@npm:4.46.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.40.2" +"@rollup/rollup-darwin-arm64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.46.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.40.2" +"@rollup/rollup-darwin-x64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.46.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.2" +"@rollup/rollup-freebsd-arm64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.46.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-freebsd-x64@npm:4.40.2" +"@rollup/rollup-freebsd-x64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.46.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.2" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.46.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.2" +"@rollup/rollup-linux-arm-musleabihf@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.46.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.46.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.2" +"@rollup/rollup-linux-arm64-musl@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.46.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.2" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.46.2" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.2" +"@rollup/rollup-linux-ppc64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.46.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.2" +"@rollup/rollup-linux-riscv64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.46.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.2" +"@rollup/rollup-linux-riscv64-musl@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.46.2" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.2" +"@rollup/rollup-linux-s390x-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.46.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.2" +"@rollup/rollup-linux-x64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.46.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.2" +"@rollup/rollup-linux-x64-musl@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.46.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.2" +"@rollup/rollup-win32-arm64-msvc@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.46.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.46.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.40.2": - version: 4.40.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.2" +"@rollup/rollup-win32-x64-msvc@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.46.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3460,38 +3475,38 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:^9.0.4": - version: 9.0.4 - resolution: "@storybook/addon-a11y@npm:9.0.4" +"@storybook/addon-a11y@npm:^9.1.1": + version: 9.1.1 + resolution: "@storybook/addon-a11y@npm:9.1.1" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^9.0.4 - checksum: 10c0/558a71244ce6eb18eb08e95c47d94fa81d29f70226f37b92d1cc52a86fe6389ce978f0ad3a2e90d90dfedb6476d5c7bc7218b66201d3f94627b789783d53e808 + storybook: ^9.1.1 + checksum: 10c0/bf5eba0a51ffec20c8c4432985494295115bcf48e0807e4ca21314845d4aaaaaae9122d4be4f78a2fc4c15caa5e1207c01e118724c2cbecbd80aa8a5f6826924 languageName: node linkType: hard -"@storybook/addon-docs@npm:^9.0.4": - version: 9.0.4 - resolution: "@storybook/addon-docs@npm:9.0.4" +"@storybook/addon-docs@npm:^9.1.1": + version: 9.1.1 + resolution: "@storybook/addon-docs@npm:9.1.1" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:9.0.4" - "@storybook/icons": "npm:^1.2.12" - "@storybook/react-dom-shim": "npm:9.0.4" + "@storybook/csf-plugin": "npm:9.1.1" + "@storybook/icons": "npm:^1.4.0" + "@storybook/react-dom-shim": "npm:9.1.1" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.0.4 - checksum: 10c0/c70937abe73ec77e80017f14f459224fcefae457999be7be25cd198d49bdff31d181a99d3ec7b72fa494063e4f229c7c4e324173b416a2710208c8a12882e2bd + storybook: ^9.1.1 + checksum: 10c0/92b3ac089a38b892319de5ec02ca4ae477e38d88aef8561f6cbb1f15dd69ad856c194fca4514c783983baba063f428994a7d7f2aed98204b931f8e684e681194 languageName: node linkType: hard -"@storybook/addon-vitest@npm:^9.0.4": - version: 9.0.4 - resolution: "@storybook/addon-vitest@npm:9.0.4" +"@storybook/addon-vitest@npm:^9.1.1": + version: 9.1.1 + resolution: "@storybook/addon-vitest@npm:9.1.1" dependencies: "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.4.0" @@ -3500,7 +3515,7 @@ __metadata: peerDependencies: "@vitest/browser": ^3.0.0 "@vitest/runner": ^3.0.0 - storybook: ^9.0.4 + storybook: ^9.1.1 vitest: ^3.0.0 peerDependenciesMeta: "@vitest/browser": @@ -3509,31 +3524,31 @@ __metadata: optional: true vitest: optional: true - checksum: 10c0/7379826120c7d2aa4161abd978038161d0ffe2670d40315144ef8b8b1efa9afc793457fe9439928fc039565de2d4da4a109936bd7275518ee7f2fccfce66df21 + checksum: 10c0/a4770aad2f3e4ae10e3d7ae7083354e98287d095644aae87af62c59c9a97ec7e57cf25620c32e2e5f9261a3686a6efabea0a830061500f63e78a49a2bac6f130 languageName: node linkType: hard -"@storybook/builder-vite@npm:9.0.4": - version: 9.0.4 - resolution: "@storybook/builder-vite@npm:9.0.4" +"@storybook/builder-vite@npm:9.1.1": + version: 9.1.1 + resolution: "@storybook/builder-vite@npm:9.1.1" dependencies: - "@storybook/csf-plugin": "npm:9.0.4" + "@storybook/csf-plugin": "npm:9.1.1" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.0.4 - vite: ^5.0.0 || ^6.0.0 - checksum: 10c0/137c1b114d96f1e12f0d76b38d7d4ec10842b8d8284ead906e56d91d61dfbd9a82b84e7643be7cb226040d5829a72d580b441cb26cfa8d6634a7ebe4eff14071 + storybook: ^9.1.1 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10c0/334235a64e05d6fb1e1cdf23f41ac211d1e55429e425e1aea33d9b4469503aa328eb5d9cad24e6328b392098afb2c884943d2c304c1eb3cf55ce25dcc3ad4414 languageName: node linkType: hard -"@storybook/csf-plugin@npm:9.0.4": - version: 9.0.4 - resolution: "@storybook/csf-plugin@npm:9.0.4" +"@storybook/csf-plugin@npm:9.1.1": + version: 9.1.1 + resolution: "@storybook/csf-plugin@npm:9.1.1" dependencies: unplugin: "npm:^1.3.1" peerDependencies: - storybook: ^9.0.4 - checksum: 10c0/3988920c425b5ea8c2fd6d7148ae8d009ec4556fab2e14b6223ea6ae7422a0242a16c2e333f28218f85b7c0781c3540ecefbeaa94a492aaf9132e98a5785b254 + storybook: ^9.1.1 + checksum: 10c0/d29b5685ef79eacbcd891977f95a58238f104004b014f88ee59eab6e5995df31010435aa222a27cdf54056accc43239c44f7e8e461c263c60b09d7d2383be8b8 languageName: node linkType: hard @@ -3544,7 +3559,7 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^1.2.12, @storybook/icons@npm:^1.4.0": +"@storybook/icons@npm:^1.4.0": version: 1.4.0 resolution: "@storybook/icons@npm:1.4.0" peerDependencies: @@ -3554,26 +3569,26 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:9.0.4": - version: 9.0.4 - resolution: "@storybook/react-dom-shim@npm:9.0.4" +"@storybook/react-dom-shim@npm:9.1.1": + version: 9.1.1 + resolution: "@storybook/react-dom-shim@npm:9.1.1" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.4 - checksum: 10c0/abee05aa500c90b15a850163965f6631c1cd95f688eb12f5c629de0b2ce47f340b540e1f76b15bb84219a8961c0389316f39f5cc10cf807f76ae7e8d0c33a1c7 + storybook: ^9.1.1 + checksum: 10c0/ea2725719e04871b56c0a3755a7791034abd1d8ebb51392ed5f1eb2d21aee873444080509efe69c919e43121c299e06e2266d603478d059efe38762b0ae96ae5 languageName: node linkType: hard -"@storybook/react-vite@npm:^9.0.4": - version: 9.0.4 - resolution: "@storybook/react-vite@npm:9.0.4" +"@storybook/react-vite@npm:^9.1.1": + version: 9.1.1 + resolution: "@storybook/react-vite@npm:9.1.1" dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.0" + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:9.0.4" - "@storybook/react": "npm:9.0.4" - find-up: "npm:^5.0.0" + "@storybook/builder-vite": "npm:9.1.1" + "@storybook/react": "npm:9.1.1" + find-up: "npm:^7.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" resolve: "npm:^1.22.8" @@ -3581,27 +3596,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.4 - vite: ^5.0.0 || ^6.0.0 - checksum: 10c0/79031f1d6f07c5830fbc3d21e6483f090b75b20cbfe9ee4d26efa3c6346c70c1c462751ce1d110b100ace383a0adc0e159535d5de0d399980c07be95c21d170a + storybook: ^9.1.1 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10c0/fa79e5a9be38f229a8cc0db85452e651081740cd3f9e6951c0fc3e195437124f8a792494b90a613c673ef9410d565d5f459276e157f073367ea28f0293d10167 languageName: node linkType: hard -"@storybook/react@npm:9.0.4": - version: 9.0.4 - resolution: "@storybook/react@npm:9.0.4" +"@storybook/react@npm:9.1.1": + version: 9.1.1 + resolution: "@storybook/react@npm:9.1.1" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:9.0.4" + "@storybook/react-dom-shim": "npm:9.1.1" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.4 + storybook: ^9.1.1 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/d1b7f3c2ccd9d8eeb7fd029a74a0011fb4ddaf7b46ea8d6bbd51a4dedecf9959aed5db44725169e134fb931a3c2d7edfc29d3c6e63a0d1f1535317609bed1a97 + checksum: 10c0/343598e9c1bb2e53b7d6eaaa50b5c024c109fb825f6f4869a82da0ccd428400e5a93eba494e810f6bfbf6bff9b73810595ab8ffdd1530df8b4f2b20e617623e3 languageName: node linkType: hard @@ -3744,19 +3759,19 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^10.2.0, @testing-library/dom@npm:^10.4.0": - version: 10.4.0 - resolution: "@testing-library/dom@npm:10.4.0" +"@testing-library/dom@npm:^10.4.0, @testing-library/dom@npm:^10.4.1": + version: 10.4.1 + resolution: "@testing-library/dom@npm:10.4.1" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" "@types/aria-query": "npm:^5.0.1" aria-query: "npm:5.3.0" - chalk: "npm:^4.1.0" dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" + picocolors: "npm:1.1.1" pretty-format: "npm:^27.0.2" - checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f + checksum: 10c0/19ce048012d395ad0468b0dbcc4d0911f6f9e39464d7a8464a587b29707eed5482000dad728f5acc4ed314d2f4d54f34982999a114d2404f36d048278db815b1 languageName: node linkType: hard @@ -3775,9 +3790,9 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^16.0.0": - version: 16.1.0 - resolution: "@testing-library/react@npm:16.1.0" +"@testing-library/react@npm:^16.3.0": + version: 16.3.0 + resolution: "@testing-library/react@npm:16.3.0" dependencies: "@babel/runtime": "npm:^7.12.5" peerDependencies: @@ -3791,7 +3806,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/8451dcc76ba0d4f3504af78f2a4aacc13117691f4b7a3c279f3e047d5ea817ff686496ad53e7f65f6183112aef2be3f318af609b1f5d666eed42b1014d1c68d5 + checksum: 10c0/3a2cb1f87c9a67e1ebbbcfd99b94b01e496fc35147be8bc5d8bf07a699c7d523a09d57ef2f7b1d91afccd1a28e21eda3b00d80187fbb51b1de01e422592d845e languageName: node linkType: hard @@ -3963,7 +3978,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": +"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -3977,13 +3992,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.7": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c - languageName: node - linkType: hard - "@types/express-serve-static-core@npm:^4.17.33": version: 4.17.41 resolution: "@types/express-serve-static-core@npm:4.17.41" @@ -4685,56 +4693,60 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-legacy@npm:^6.1.1": - version: 6.1.1 - resolution: "@vitejs/plugin-legacy@npm:6.1.1" +"@vitejs/plugin-legacy@npm:^7.2.1": + version: 7.2.1 + resolution: "@vitejs/plugin-legacy@npm:7.2.1" dependencies: - "@babel/core": "npm:^7.26.10" - "@babel/preset-env": "npm:^7.26.9" - browserslist: "npm:^4.24.4" + "@babel/core": "npm:^7.28.0" + "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" + "@babel/preset-env": "npm:^7.28.0" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + browserslist: "npm:^4.25.1" browserslist-to-esbuild: "npm:^2.1.1" - core-js: "npm:^3.41.0" + core-js: "npm:^3.45.0" magic-string: "npm:^0.30.17" regenerator-runtime: "npm:^0.14.1" systemjs: "npm:^6.15.1" peerDependencies: terser: ^5.16.0 - vite: ^6.0.0 - checksum: 10c0/3a41098e422246d7ddbb6add678c1317474679a5e82e011947898cea5336fa8da9bb8fa625ab1284265f6ba123278fc2bf7c5b0b9b87febaaf865f14ac8e6ece + vite: ^7.0.0 + checksum: 10c0/bb9c14793c304ab84202a27218df4a71472ef8998c984121dcbc268b7dad8141d3c153f899794d5d62fed0e422ca756d24780e7da3f053e0ff87a37429808737 languageName: node linkType: hard -"@vitejs/plugin-react@npm:^4.2.1": - version: 4.7.0 - resolution: "@vitejs/plugin-react@npm:4.7.0" +"@vitejs/plugin-react@npm:^5.0.0": + version: 5.0.0 + resolution: "@vitejs/plugin-react@npm:5.0.0" dependencies: "@babel/core": "npm:^7.28.0" "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-beta.27" + "@rolldown/pluginutils": "npm:1.0.0-beta.30" "@types/babel__core": "npm:^7.20.5" react-refresh: "npm:^0.17.0" peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/692f23960972879485d647713663ec299c478222c96567d60285acf7c7dc5c178e71abfe9d2eefddef1eeb01514dacbc2ed68aad84628debf9c7116134734253 + checksum: 10c0/e5813839d319ab5dc1b90cab40b6c08388f26e456166ba9df10ffc3c3f4ecc594cec06715b5c93390bba56140ca5f68a18f2233f7d275d77e5bbfeb979e4fd9b languageName: node linkType: hard -"@vitest/browser@npm:^3.2.1": - version: 3.2.1 - resolution: "@vitest/browser@npm:3.2.1" +"@vitest/browser@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/browser@npm:3.2.4" dependencies: "@testing-library/dom": "npm:^10.4.0" "@testing-library/user-event": "npm:^14.6.1" - "@vitest/mocker": "npm:3.2.1" - "@vitest/utils": "npm:3.2.1" + "@vitest/mocker": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" magic-string: "npm:^0.30.17" sirv: "npm:^3.0.1" tinyrainbow: "npm:^2.0.0" ws: "npm:^8.18.2" peerDependencies: playwright: "*" - vitest: 3.2.1 + vitest: 3.2.4 webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 peerDependenciesMeta: playwright: @@ -4743,13 +4755,13 @@ __metadata: optional: true webdriverio: optional: true - checksum: 10c0/304ae5107113230cc80b0b4eedcb3167ae776036797c77d97315ce4022e6c94553c557a0db6aff6de596fe77a0808b1e79b2576bd8e01386c010ea1c4a97a52b + checksum: 10c0/0db39daad675aad187eff27d5a7f17a9f533d7abc7476ee1a0b83a9c62a7227b24395f4814e034ecb2ebe39f1a2dec0a8c6a7f79b8d5680c3ac79e408727d742 languageName: node linkType: hard -"@vitest/coverage-v8@npm:^3.2.0": - version: 3.2.2 - resolution: "@vitest/coverage-v8@npm:3.2.2" +"@vitest/coverage-v8@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/coverage-v8@npm:3.2.4" dependencies: "@ampproject/remapping": "npm:^2.3.0" "@bcoe/v8-coverage": "npm:^1.0.2" @@ -4765,45 +4777,33 @@ __metadata: test-exclude: "npm:^7.0.1" tinyrainbow: "npm:^2.0.0" peerDependencies: - "@vitest/browser": 3.2.2 - vitest: 3.2.2 + "@vitest/browser": 3.2.4 + vitest: 3.2.4 peerDependenciesMeta: "@vitest/browser": optional: true - checksum: 10c0/d807f006ab9d4d3fb78c34586ab057a8e588746430b2d3ab07cfb972b5fabe65fde7033a9718ee598d0e3001085fa83edee76ff3f03a05e50a8879beee3ae37a + checksum: 10c0/cae3e58d81d56e7e1cdecd7b5baab7edd0ad9dee8dec9353c52796e390e452377d3f04174d40b6986b17c73241a5e773e422931eaa8102dcba0605ff24b25193 languageName: node linkType: hard -"@vitest/expect@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/expect@npm:3.0.9" - dependencies: - "@vitest/spy": "npm:3.0.9" - "@vitest/utils": "npm:3.0.9" - chai: "npm:^5.2.0" - tinyrainbow: "npm:^2.0.0" - checksum: 10c0/4e5eef8fbc9c3e47f3fb69dbbd5b51aabdf1b6de2f781556d37d79731678fc83cf4a01d146226b12a27df051a4110153a6172506c9c74ae08e5b924a9c947f08 - languageName: node - linkType: hard - -"@vitest/expect@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/expect@npm:3.2.1" +"@vitest/expect@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/expect@npm:3.2.4" dependencies: "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:3.2.1" - "@vitest/utils": "npm:3.2.1" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" chai: "npm:^5.2.0" tinyrainbow: "npm:^2.0.0" - checksum: 10c0/ea02306fff2e657412ac36169621d742898d95cb2a4922f0a81e1fcfc81d755f337f176ddc2a2ed9281e0f2c1648bb6b08b09d4fd523d203d1238e62344c0385 + checksum: 10c0/7586104e3fd31dbe1e6ecaafb9a70131e4197dce2940f727b6a84131eee3decac7b10f9c7c72fa5edbdb68b6f854353bd4c0fa84779e274207fb7379563b10db languageName: node linkType: hard -"@vitest/mocker@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/mocker@npm:3.2.1" +"@vitest/mocker@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/mocker@npm:3.2.4" dependencies: - "@vitest/spy": "npm:3.2.1" + "@vitest/spy": "npm:3.2.4" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.17" peerDependencies: @@ -4814,81 +4814,55 @@ __metadata: optional: true vite: optional: true - checksum: 10c0/bcd8865e8e8f45fdf59bb817b788bebe13c509e0220eee723bc6b8ee139352b30e074e674e8f9092ae75db0a66c1ca3887ee078df27ea2d5d7889c9d45cfb675 + checksum: 10c0/f7a4aea19bbbf8f15905847ee9143b6298b2c110f8b64789224cb0ffdc2e96f9802876aa2ca83f1ec1b6e1ff45e822abb34f0054c24d57b29ab18add06536ccd languageName: node linkType: hard -"@vitest/pretty-format@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/pretty-format@npm:3.0.9" +"@vitest/pretty-format@npm:3.2.4, @vitest/pretty-format@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/pretty-format@npm:3.2.4" dependencies: tinyrainbow: "npm:^2.0.0" - checksum: 10c0/56ae7b1f14df2905b3205d4e121727631c4938ec44f76c1e9fa49923919010378f0dad70b1d277672f3ef45ddf6372140c8d1da95e45df8282f70b74328fce47 + checksum: 10c0/5ad7d4278e067390d7d633e307fee8103958806a419ca380aec0e33fae71b44a64415f7a9b4bc11635d3c13d4a9186111c581d3cef9c65cc317e68f077456887 languageName: node linkType: hard -"@vitest/pretty-format@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/pretty-format@npm:3.2.1" +"@vitest/runner@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/runner@npm:3.2.4" dependencies: - tinyrainbow: "npm:^2.0.0" - checksum: 10c0/24c9d380900d0e2c2296f7a0a86b9efdd02034f1b84a93c0fc01a17ff6aa3b7e80d6bc4fe07e8e78404e6b66d1b8dc5a7d4199e7ed4f89f1874c3f74b731e48c - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:3.2.2, @vitest/pretty-format@npm:^3.2.1": - version: 3.2.2 - resolution: "@vitest/pretty-format@npm:3.2.2" - dependencies: - tinyrainbow: "npm:^2.0.0" - checksum: 10c0/bc74488e6d56b1f86a0066cc7ea53bdd9c062886bb060c37cd4c312d674c1bc3ba9d1350b748a07d2ae9558223f817735edf920496cafadf98a214b683ea0d0e - languageName: node - linkType: hard - -"@vitest/runner@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/runner@npm:3.2.1" - dependencies: - "@vitest/utils": "npm:3.2.1" + "@vitest/utils": "npm:3.2.4" pathe: "npm:^2.0.3" - checksum: 10c0/b0c4b75627852c56a67aef10176880def0e6e785e96f6e7a1ad632d799e202528de62cab6c8c0c8e1d2afc8255c40225f2cb8ab6fa99925db8c8aca28b6bba3c + strip-literal: "npm:^3.0.0" + checksum: 10c0/e8be51666c72b3668ae3ea348b0196656a4a5adb836cb5e270720885d9517421815b0d6c98bfdf1795ed02b994b7bfb2b21566ee356a40021f5bf4f6ed4e418a languageName: node linkType: hard -"@vitest/snapshot@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/snapshot@npm:3.2.1" +"@vitest/snapshot@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/snapshot@npm:3.2.4" dependencies: - "@vitest/pretty-format": "npm:3.2.1" + "@vitest/pretty-format": "npm:3.2.4" magic-string: "npm:^0.30.17" pathe: "npm:^2.0.3" - checksum: 10c0/7428cfe239c40a146a5e6c73fdefa9167496524aeefd01db28f55dea945ec14f00c982ff4ccf47208e870b020e0edd0f17416cd8db9ae80d2332fb925d4bac94 + checksum: 10c0/f8301a3d7d1559fd3d59ed51176dd52e1ed5c2d23aa6d8d6aa18787ef46e295056bc726a021698d8454c16ed825ecba163362f42fa90258bb4a98cfd2c9424fc languageName: node linkType: hard -"@vitest/spy@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/spy@npm:3.0.9" - dependencies: - tinyspy: "npm:^3.0.2" - checksum: 10c0/993085dbaf9e651ca9516f88e440424d29279def998186628a1ebcab5558a3045fee8562630608f58303507135f6f3bf9970f65639f3b9baa8bf86cab3eb4742 - languageName: node - linkType: hard - -"@vitest/spy@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/spy@npm:3.2.1" +"@vitest/spy@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/spy@npm:3.2.4" dependencies: tinyspy: "npm:^4.0.3" - checksum: 10c0/5b6e36c5e21cb8ed4b5f8e95c24379846168a719125cc189e53ccd9717bae8a6a63e16a04a57fb8736b6523b1b870df691a27a04e86c487f388d66af669672ca + checksum: 10c0/6ebf0b4697dc238476d6b6a60c76ba9eb1dd8167a307e30f08f64149612fd50227682b876420e4c2e09a76334e73f72e3ebf0e350714dc22474258292e202024 languageName: node linkType: hard -"@vitest/ui@npm:^3.2.1": - version: 3.2.2 - resolution: "@vitest/ui@npm:3.2.2" +"@vitest/ui@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/ui@npm:3.2.4" dependencies: - "@vitest/utils": "npm:3.2.2" + "@vitest/utils": "npm:3.2.4" fflate: "npm:^0.8.2" flatted: "npm:^3.3.3" pathe: "npm:^2.0.3" @@ -4896,41 +4870,19 @@ __metadata: tinyglobby: "npm:^0.2.14" tinyrainbow: "npm:^2.0.0" peerDependencies: - vitest: 3.2.2 - checksum: 10c0/343ccf49f4ef449d7bde80eb2f815e6548e5fab25bba1923d9fc8483fae9469b477782fe1eaee61d613aca2eef2718ca880d8e6d2135c6f4b09fe653921bf119 + vitest: 3.2.4 + checksum: 10c0/c3de1b757905d050706c7ab0199185dd8c7e115f2f348b8d5a7468528c6bf90c2c46096e8901602349ac04f5ba83ac23cd98c38827b104d5151cf8ba21739a0c languageName: node linkType: hard -"@vitest/utils@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/utils@npm:3.0.9" +"@vitest/utils@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/utils@npm:3.2.4" dependencies: - "@vitest/pretty-format": "npm:3.0.9" - loupe: "npm:^3.1.3" + "@vitest/pretty-format": "npm:3.2.4" + loupe: "npm:^3.1.4" tinyrainbow: "npm:^2.0.0" - checksum: 10c0/b966dfb3b926ee9bea59c1fb297abc67adaa23a8a582453ee81167b238446394693617a5e0523eb2791d6983173ef1c07bf28a76bd5a63b49a100610ed6b6a6c - languageName: node - linkType: hard - -"@vitest/utils@npm:3.2.1": - version: 3.2.1 - resolution: "@vitest/utils@npm:3.2.1" - dependencies: - "@vitest/pretty-format": "npm:3.2.1" - loupe: "npm:^3.1.3" - tinyrainbow: "npm:^2.0.0" - checksum: 10c0/a1fbdf1f16f7df2aabda9a96516481f5ef52eff38b69cbf3d11725fb30351dd1c3d480678c040cf25d4a01238f8f8d5650b554c5790078f8770f54acbc54411a - languageName: node - linkType: hard - -"@vitest/utils@npm:3.2.2": - version: 3.2.2 - resolution: "@vitest/utils@npm:3.2.2" - dependencies: - "@vitest/pretty-format": "npm:3.2.2" - loupe: "npm:^3.1.3" - tinyrainbow: "npm:^2.0.0" - checksum: 10c0/0274a1f060006616a8dad7ef11fb13d81ca00df8104eb015d4832cc6fc2217c37d0eec083afa2eb5118a8879942c6e055aec7f23325ce8f791b3b4b2c7fa16c3 + checksum: 10c0/024a9b8c8bcc12cf40183c246c244b52ecff861c6deb3477cbf487ac8781ad44c68a9c5fd69f8c1361878e55b97c10d99d511f2597f1f7244b5e5101d028ba64 languageName: node linkType: hard @@ -5393,39 +5345,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.13 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" +"babel-plugin-polyfill-corejs2@npm:^0.4.14": + version: 0.4.14 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + "@babel/compat-data": "npm:^7.27.7" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b4a54561606d388e6f9499f39f03171af4be7f9ce2355e737135e40afa7086cf6790fdd706c2e59f488c8fa1f76123d28783708e07ddc84647dca8ed8fb98e06 + checksum: 10c0/d74cba0600a6508e86d220bde7164eb528755d91be58020e5ea92ea7fbb12c9d8d2c29246525485adfe7f68ae02618ec428f9a589cac6cbedf53cc3972ad7fbe languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.11.0": - version: 0.11.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.3" - core-js-compat: "npm:^3.40.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/025f754b6296d84b20200aff63a3c1acdd85e8c621781f2bd27fe2512d0060526192d02329326947c6b29c27cf475fbcfaaff8c51eab1d2bfc7b79086bb64229 + checksum: 10c0/5d8e228da425edc040d8c868486fd01ba10b0440f841156a30d9f8986f330f723e2ee61553c180929519563ef5b64acce2caac36a5a847f095d708dda5d8206d languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" +"babel-plugin-polyfill-regenerator@npm:^0.6.5": + version: 0.6.5 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/ebaaf9e4e53201c02f496d3f686d815e94177b3e55b35f11223b99c60d197a29f907a2e87bbcccced8b7aff22a807fccc1adaf04722864a8e1862c8845ab830a + checksum: 10c0/63aa8ed716df6a9277c6ab42b887858fa9f57a70cc1d0ae2b91bdf081e45d4502848cba306fb60b02f59f99b32fd02ff4753b373cac48ccdac9b7d19dd56f06d languageName: node linkType: hard @@ -5555,17 +5507,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.25.0": - version: 4.25.0 - resolution: "browserslist@npm:4.25.0" +"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.25.0, browserslist@npm:^4.25.1": + version: 4.25.1 + resolution: "browserslist@npm:4.25.1" dependencies: - caniuse-lite: "npm:^1.0.30001718" - electron-to-chromium: "npm:^1.5.160" + caniuse-lite: "npm:^1.0.30001726" + electron-to-chromium: "npm:^1.5.173" node-releases: "npm:^2.0.19" update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/cc16c55b4468b18684a0e1ca303592b38635b1155d6724f172407192737a2f405b8030d87a05813729592793445b3d15e737b0055f901cdecccb29b1e580a1c5 + checksum: 10c0/acba5f0bdbd5e72dafae1e6ec79235b7bad305ed104e082ed07c34c38c7cb8ea1bc0f6be1496958c40482e40166084458fc3aee15111f15faa79212ad9081b2a languageName: node linkType: hard @@ -5686,10 +5638,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001718": - version: 1.0.30001721 - resolution: "caniuse-lite@npm:1.0.30001721" - checksum: 10c0/fa3a8926899824b385279f1f886fe34c5efb1321c9ece1b9df25c8d567a2706db8450cc5b4d969e769e641593e08ea644909324aba93636a43e4949a75f81c4c +"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001726": + version: 1.0.30001731 + resolution: "caniuse-lite@npm:1.0.30001731" + checksum: 10c0/d8cddf817d5bec8e7c2106affdbf1bfc3923463ca16697c992b2efeb043e6a5d9dcb70cda913bc6acf9112fd66f9e80279316c08e7800359116925066a63fdfa languageName: node linkType: hard @@ -5716,7 +5668,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -5782,9 +5734,9 @@ __metadata: languageName: node linkType: hard -"chromatic@npm:^13.0.0": - version: 13.0.0 - resolution: "chromatic@npm:13.0.0" +"chromatic@npm:^13.1.3": + version: 13.1.3 + resolution: "chromatic@npm:13.1.3" peerDependencies: "@chromatic-com/cypress": ^0.*.* || ^1.0.0 "@chromatic-com/playwright": ^0.*.* || ^1.0.0 @@ -5797,7 +5749,7 @@ __metadata: chroma: dist/bin.js chromatic: dist/bin.js chromatic-cli: dist/bin.js - checksum: 10c0/30c697eb84d5b3b8cdab989df0e4fed0bf51f4bfefb616873f68fc00337978b9b38b84e52af22861769176181bd98525d467baeb22daa712a0f7a58bd61bf336 + checksum: 10c0/5fa2d381e06d1b089ecb790247844cfb510b063c4d8f8c0d2a3d0620ff94864003158e34338246bb1d07504d554e73dc8d5b639dc3e176ce3c88816fdc853285 languageName: node linkType: hard @@ -5998,12 +5950,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.40.0": - version: 3.41.0 - resolution: "core-js-compat@npm:3.41.0" +"core-js-compat@npm:^3.43.0": + version: 3.44.0 + resolution: "core-js-compat@npm:3.44.0" dependencies: - browserslist: "npm:^4.24.4" - checksum: 10c0/92d2c748d3dd1c4e3b6cee6b6683b9212db9bc0a6574d933781210daf3baaeb76334ed4636eb8935b45802aa8d9235ab604c9a262694e02a2fa17ad0f6976829 + browserslist: "npm:^4.25.1" + checksum: 10c0/5de4b042b8bb232b8390be3079030de5c7354610f136ed3eb91310a44455a78df02cfcf49b2fd05d5a5aa2695460620abf1b400784715f7482ed4770d40a68b2 languageName: node linkType: hard @@ -6014,7 +5966,7 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.30.2, core-js@npm:^3.41.0": +"core-js@npm:^3.30.2, core-js@npm:^3.45.0": version: 3.45.0 resolution: "core-js@npm:3.45.0" checksum: 10c0/118350f9f1d81f42a1276590d6c217dca04c789fdb8074c82e53056b1a784948769a62b16b98493fd73e8a988545432f302bca798571e56ad881b9c039a5a83c @@ -6516,10 +6468,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.160": - version: 1.5.165 - resolution: "electron-to-chromium@npm:1.5.165" - checksum: 10c0/20b91e67e7a8829a358c4a488e9b59b0e5f8d4cb075a70b9757bb21acf0fc751ca58ca7d9c6018bec74ac4bd42f7859e4ef37421c252a2275f642e12a32271d6 +"electron-to-chromium@npm:^1.5.173": + version: 1.5.192 + resolution: "electron-to-chromium@npm:1.5.192" + checksum: 10c0/7993350fdd3c12d9667a42370ce3202bf3012fd6fed13ac1393eeb3fdda51347e805f340ae06939192f37b00a3d0856034b69b1bf6696ba96848fd42267a6f8b languageName: node linkType: hard @@ -7441,15 +7393,15 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.4": - version: 6.4.4 - resolution: "fdir@npm:6.4.4" +"fdir@npm:^6.4.4, fdir@npm:^6.4.6": + version: 6.4.6 + resolution: "fdir@npm:6.4.6" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/6ccc33be16945ee7bc841e1b4178c0b4cf18d3804894cb482aa514651c962a162f96da7ffc6ebfaf0df311689fb70091b04dd6caffe28d56b9ebdc0e7ccadfdd + checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 languageName: node linkType: hard @@ -7528,6 +7480,17 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^7.0.0": + version: 7.0.0 + resolution: "find-up@npm:7.0.0" + dependencies: + locate-path: "npm:^7.2.0" + path-exists: "npm:^5.0.0" + unicorn-magic: "npm:^0.1.0" + checksum: 10c0/e6ee3e6154560bc0ab3bc3b7d1348b31513f9bdf49a5dd2e952495427d559fa48cdf33953e85a309a323898b43fa1bfbc8b80c880dfc16068384783034030008 + languageName: node + linkType: hard + "flat-cache@npm:^4.0.0": version: 4.0.1 resolution: "flat-cache@npm:4.0.1" @@ -7884,13 +7847,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -9159,6 +9115,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.2.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -9232,10 +9197,10 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0, loupe@npm:^3.1.3": - version: 3.1.3 - resolution: "loupe@npm:3.1.3" - checksum: 10c0/f5dab4144254677de83a35285be1b8aba58b3861439ce4ba65875d0d5f3445a4a496daef63100ccf02b2dbc25bf58c6db84c9cb0b96d6435331e9d0a33b48541 +"loupe@npm:^3.1.0, loupe@npm:^3.1.4": + version: 3.2.0 + resolution: "loupe@npm:3.2.0" + checksum: 10c0/f572fd9e38db8d36ae9eede305480686e310d69bc40394b6842838ebc6c3860a0e35ab30182f33606ab2d8a685d9ff6436649269f8218a1c3385ca329973cb2c languageName: node linkType: hard @@ -9669,12 +9634,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.8": - version: 3.3.8 - resolution: "nanoid@npm:3.3.8" +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b languageName: node linkType: hard @@ -9981,6 +9946,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -9990,6 +9964,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -10080,6 +10063,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -10236,17 +10226,17 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"picomatch@npm:2 || 3 || 4, picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc +"picomatch@npm:2 || 3 || 4, picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 languageName: node linkType: hard @@ -10782,14 +10772,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.5.3": - version: 8.5.3 - resolution: "postcss@npm:8.5.3" +"postcss@npm:^8.5.3, postcss@npm:^8.5.6": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: - nanoid: "npm:^3.3.8" + nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 languageName: node linkType: hard @@ -11714,7 +11704,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.14.2, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": +"resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.10, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -11740,7 +11730,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -11806,7 +11796,7 @@ __metadata: languageName: node linkType: hard -"rollup-plugin-visualizer@npm:^6.0.0": +"rollup-plugin-visualizer@npm:^6.0.3": version: 6.0.3 resolution: "rollup-plugin-visualizer@npm:6.0.3" dependencies: @@ -11842,31 +11832,31 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.34.9": - version: 4.40.2 - resolution: "rollup@npm:4.40.2" +"rollup@npm:^4.43.0": + version: 4.46.2 + resolution: "rollup@npm:4.46.2" dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.40.2" - "@rollup/rollup-android-arm64": "npm:4.40.2" - "@rollup/rollup-darwin-arm64": "npm:4.40.2" - "@rollup/rollup-darwin-x64": "npm:4.40.2" - "@rollup/rollup-freebsd-arm64": "npm:4.40.2" - "@rollup/rollup-freebsd-x64": "npm:4.40.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.40.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.40.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.40.2" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.40.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-riscv64-musl": "npm:4.40.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.40.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.40.2" - "@rollup/rollup-linux-x64-musl": "npm:4.40.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.40.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.40.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.40.2" - "@types/estree": "npm:1.0.7" + "@rollup/rollup-android-arm-eabi": "npm:4.46.2" + "@rollup/rollup-android-arm64": "npm:4.46.2" + "@rollup/rollup-darwin-arm64": "npm:4.46.2" + "@rollup/rollup-darwin-x64": "npm:4.46.2" + "@rollup/rollup-freebsd-arm64": "npm:4.46.2" + "@rollup/rollup-freebsd-x64": "npm:4.46.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.46.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.46.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.46.2" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.46.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.46.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-x64-musl": "npm:4.46.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.46.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.46.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.46.2" + "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -11891,7 +11881,7 @@ __metadata: optional: true "@rollup/rollup-linux-loongarch64-gnu": optional: true - "@rollup/rollup-linux-powerpc64le-gnu": + "@rollup/rollup-linux-ppc64-gnu": optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true @@ -11913,7 +11903,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/cbe9b766891da74fbf7c3b50420bb75102e5c59afc0ea45751f7e43a581d2cd93367763f521f820b72e341cf1f6b9951fbdcd3be67a1b0aa774b754525a8b9c7 + checksum: 10c0/f428497fe119fe7c4e34f1020d45ba13e99b94c9aa36958d88823d932b155c9df3d84f53166f3ee913ff68ea6c7599a9ab34861d88562ad9d8420f64ca5dad4c languageName: node linkType: hard @@ -12536,15 +12526,16 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^9.0.4": - version: 9.0.4 - resolution: "storybook@npm:9.0.4" +"storybook@npm:^9.1.1": + version: 9.1.1 + resolution: "storybook@npm:9.1.1" dependencies: "@storybook/global": "npm:^5.0.0" "@testing-library/jest-dom": "npm:^6.6.3" "@testing-library/user-event": "npm:^14.6.1" - "@vitest/expect": "npm:3.0.9" - "@vitest/spy": "npm:3.0.9" + "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" + "@vitest/spy": "npm:3.2.4" better-opn: "npm:^3.0.2" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" esbuild-register: "npm:^3.5.0" @@ -12558,7 +12549,7 @@ __metadata: optional: true bin: storybook: ./bin/index.cjs - checksum: 10c0/52aa44ac9ba73bf3ab2718669faa02c515ef91243f7d39bcac815efc1b72ac2f2c3b1ea4586ec37beb8f6044c8c5b1c9e2d46405a8832974f3cee37f4b3c3821 + checksum: 10c0/efd2665547dc6bfd4cabd00ee1a6368c7cec27a3e4c16bc875ae06bb5d9ee74120c11102699165530f31fe8becb47212d80632b1fefcafa60fef94b3cd0bf50f languageName: node linkType: hard @@ -12766,6 +12757,15 @@ __metadata: languageName: node linkType: hard +"strip-literal@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-literal@npm:3.0.0" + dependencies: + js-tokens: "npm:^9.0.1" + checksum: 10c0/d81657f84aba42d4bbaf2a677f7e7f34c1f3de5a6726db8bc1797f9c0b303ba54d4660383a74bde43df401cf37cce1dff2c842c55b077a4ceee11f9e31fba828 + languageName: node + linkType: hard + "stylelint-config-prettier-scss@npm:^1.0.0": version: 1.0.0 resolution: "stylelint-config-prettier-scss@npm:1.0.0" @@ -13113,7 +13113,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.14": +"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.14": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" dependencies: @@ -13123,10 +13123,10 @@ __metadata: languageName: node linkType: hard -"tinypool@npm:^1.1.0": - version: 1.1.0 - resolution: "tinypool@npm:1.1.0" - checksum: 10c0/deb6bde5e3d85d4ba043806c66f43fb5b649716312a47b52761a83668ffc71cd0ea4e24254c1b02a3702e5c27e02605f0189a1460f6284a5930a08bd0c06435c +"tinypool@npm:^1.1.1": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 10c0/bf26727d01443061b04fa863f571016950888ea994ba0cd8cba3a1c51e2458d84574341ab8dbc3664f1c3ab20885c8cf9ff1cc4b18201f04c2cde7d317fff69b languageName: node linkType: hard @@ -13137,13 +13137,6 @@ __metadata: languageName: node linkType: hard -"tinyspy@npm:^3.0.2": - version: 3.0.2 - resolution: "tinyspy@npm:3.0.2" - checksum: 10c0/55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 - languageName: node - linkType: hard - "tinyspy@npm:^4.0.3": version: 4.0.3 resolution: "tinyspy@npm:4.0.3" @@ -13545,6 +13538,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 10c0/e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -13810,9 +13810,9 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:3.2.1": - version: 3.2.1 - resolution: "vite-node@npm:3.2.1" +"vite-node@npm:3.2.4": + version: 3.2.4 + resolution: "vite-node@npm:3.2.4" dependencies: cac: "npm:^6.7.14" debug: "npm:^4.4.1" @@ -13821,7 +13821,7 @@ __metadata: vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0" bin: vite-node: vite-node.mjs - checksum: 10c0/e196bc4660baed4f18530b43ce896017adbe480c329f03ac72d2237788ddeaca50904e9e9a4fb8e65300d088ff2737227a00c0e3bae697067acebcd8f08f7faa + checksum: 10c0/6ceca67c002f8ef6397d58b9539f80f2b5d79e103a18367288b3f00a8ab55affa3d711d86d9112fce5a7fa658a212a087a005a045eb8f4758947dd99af2a6c6b languageName: node linkType: hard @@ -13832,7 +13832,7 @@ __metadata: languageName: node linkType: hard -"vite-plugin-pwa@npm:^1.0.0": +"vite-plugin-pwa@npm:^1.0.2": version: 1.0.2 resolution: "vite-plugin-pwa@npm:1.0.2" dependencies: @@ -13853,7 +13853,7 @@ __metadata: languageName: node linkType: hard -"vite-plugin-static-copy@npm:^3.1.0": +"vite-plugin-static-copy@npm:^3.1.1": version: 3.1.1 resolution: "vite-plugin-static-copy@npm:3.1.1" dependencies: @@ -13897,26 +13897,26 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.3.5": - version: 6.3.5 - resolution: "vite@npm:6.3.5" +"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1": + version: 7.1.1 + resolution: "vite@npm:7.1.1" dependencies: esbuild: "npm:^0.25.0" - fdir: "npm:^6.4.4" + fdir: "npm:^6.4.6" fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.2" - postcss: "npm:^8.5.3" - rollup: "npm:^4.34.9" - tinyglobby: "npm:^0.2.13" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.14" peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@types/node": ^20.19.0 || >=22.12.0 jiti: ">=1.21.0" - less: "*" + less: ^4.0.0 lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -13948,22 +13948,22 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/df70201659085133abffc6b88dcdb8a57ef35f742a01311fc56a4cfcda6a404202860729cc65a2c401a724f6e25f9ab40ce4339ed4946f550541531ced6fe41c + checksum: 10c0/391a5c8b8f287b7b1653dedbe952fb4cb93bf7c99b19dab915cf63497892427198fef637e943a3391eacfecf7f2e8f55c40d0fa065fabdd885641430d0b74af7 languageName: node linkType: hard -"vitest@npm:^3.2.1": - version: 3.2.1 - resolution: "vitest@npm:3.2.1" +"vitest@npm:^3.2.4": + version: 3.2.4 + resolution: "vitest@npm:3.2.4" dependencies: "@types/chai": "npm:^5.2.2" - "@vitest/expect": "npm:3.2.1" - "@vitest/mocker": "npm:3.2.1" - "@vitest/pretty-format": "npm:^3.2.1" - "@vitest/runner": "npm:3.2.1" - "@vitest/snapshot": "npm:3.2.1" - "@vitest/spy": "npm:3.2.1" - "@vitest/utils": "npm:3.2.1" + "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" + "@vitest/pretty-format": "npm:^3.2.4" + "@vitest/runner": "npm:3.2.4" + "@vitest/snapshot": "npm:3.2.4" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" chai: "npm:^5.2.0" debug: "npm:^4.4.1" expect-type: "npm:^1.2.1" @@ -13974,17 +13974,17 @@ __metadata: tinybench: "npm:^2.9.0" tinyexec: "npm:^0.3.2" tinyglobby: "npm:^0.2.14" - tinypool: "npm:^1.1.0" + tinypool: "npm:^1.1.1" tinyrainbow: "npm:^2.0.0" vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0" - vite-node: "npm:3.2.1" + vite-node: "npm:3.2.4" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/debug": ^4.1.12 "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 3.2.1 - "@vitest/ui": 3.2.1 + "@vitest/browser": 3.2.4 + "@vitest/ui": 3.2.4 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -14004,7 +14004,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10c0/1f4128f93fff708fa5bd7d1547a0877c4266466f0f91f5e1dd5d7f09267a0c171cf87c83acd86ebd53e561aa2bcef1311e984b8205370c7f596e6ff5a9c8cd6b + checksum: 10c0/5bf53ede3ae6a0e08956d72dab279ae90503f6b5a05298a6a5e6ef47d2fd1ab386aaf48fafa61ed07a0ebfe9e371772f1ccbe5c258dd765206a8218bf2eb79eb languageName: node linkType: hard @@ -14310,7 +14310,7 @@ __metadata: languageName: node linkType: hard -"workbox-expiration@npm:7.3.0, workbox-expiration@npm:^7.0.0": +"workbox-expiration@npm:7.3.0, workbox-expiration@npm:^7.3.0": version: 7.3.0 resolution: "workbox-expiration@npm:7.3.0" dependencies: @@ -14375,7 +14375,7 @@ __metadata: languageName: node linkType: hard -"workbox-routing@npm:7.3.0, workbox-routing@npm:^7.0.0": +"workbox-routing@npm:7.3.0, workbox-routing@npm:^7.3.0": version: 7.3.0 resolution: "workbox-routing@npm:7.3.0" dependencies: @@ -14384,7 +14384,7 @@ __metadata: languageName: node linkType: hard -"workbox-strategies@npm:7.3.0, workbox-strategies@npm:^7.0.0": +"workbox-strategies@npm:7.3.0, workbox-strategies@npm:^7.3.0": version: 7.3.0 resolution: "workbox-strategies@npm:7.3.0" dependencies: @@ -14410,7 +14410,7 @@ __metadata: languageName: node linkType: hard -"workbox-window@npm:7.3.0, workbox-window@npm:^7.0.0, workbox-window@npm:^7.3.0": +"workbox-window@npm:7.3.0, workbox-window@npm:^7.3.0": version: 7.3.0 resolution: "workbox-window@npm:7.3.0" dependencies: @@ -14583,6 +14583,13 @@ __metadata: languageName: node linkType: hard +"yocto-queue@npm:^1.0.0": + version: 1.2.1 + resolution: "yocto-queue@npm:1.2.1" + checksum: 10c0/5762caa3d0b421f4bdb7a1926b2ae2189fc6e4a14469258f183600028eb16db3e9e0306f46e8ebf5a52ff4b81a881f22637afefbef5399d6ad440824e9b27f9f + languageName: node + linkType: hard + "yoctocolors-cjs@npm:^2.1.2": version: 2.1.2 resolution: "yoctocolors-cjs@npm:2.1.2" From 61f0ce654f5e0a3f5b61e5dd350d41e64d5582e0 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Aug 2025 03:29:02 -0400 Subject: [PATCH 16/64] Update `rubocop-rails` to version 2.33.0 (#35741) --- Gemfile.lock | 2 +- app/controllers/auth/registrations_controller.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 111837de73..db58971b6e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -789,7 +789,7 @@ GEM lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.32.0) + rubocop-rails (2.33.0) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 3b42dc48ba..fc430544fb 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -23,11 +23,11 @@ class Auth::RegistrationsController < Devise::RegistrationsController super(&:build_invite_request) end - def edit # rubocop:disable Lint/UselessMethodDefinition + def edit super end - def create # rubocop:disable Lint/UselessMethodDefinition + def create super end From ca3d67e88d3dc46eb59122dc7c24dba3194fa279 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 07:40:37 +0000 Subject: [PATCH 17/64] New Crowdin Translations (automated) (#35745) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/pl.json | 14 +++++++ app/javascript/mastodon/locales/ru.json | 8 ++++ config/locales/pl.yml | 8 ++++ config/locales/ru.yml | 49 +++++++++++++++++++++++++ config/locales/simple_form.pl.yml | 15 ++++++++ config/locales/simple_form.ru.yml | 5 +++ 6 files changed, 99 insertions(+) diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 58c3f1fa57..26417dc0eb 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -224,6 +224,7 @@ "confirmations.discard_draft.edit.message": "Kontynuowanie spowoduje utratę wszystkich zmian wprowadzonych przez Ciebie w aktualnie edytowanym poście.", "confirmations.discard_draft.edit.title": "Odrzucić zmiany w poście?", "confirmations.discard_draft.post.cancel": "Wznów wersję roboczą", + "confirmations.discard_draft.post.message": "Kontynuacja odrzuci aktualnie tworzony post.", "confirmations.discard_draft.post.title": "Anulować wersję roboczą?", "confirmations.discard_edit_media.confirm": "Odrzuć", "confirmations.discard_edit_media.message": "Masz niezapisane zmiany w opisie lub podglądzie, odrzucić je mimo to?", @@ -244,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Usuń obserwującego", "confirmations.remove_from_followers.message": "{name} przestanie Cię obserwować. Czy na pewno chcesz kontynuować?", "confirmations.remove_from_followers.title": "Usunąć obserwującego?", + "confirmations.revoke_quote.confirm": "Usuń post", + "confirmations.revoke_quote.message": "Tej akcji nie można cofnąć.", + "confirmations.revoke_quote.title": "Usuń post?", "confirmations.unfollow.confirm": "Nie obserwuj", "confirmations.unfollow.message": "Czy na pewno nie chcesz obserwować {name}?", "confirmations.unfollow.title": "Cofnąć obserwację?", @@ -305,6 +309,9 @@ "emoji_button.search_results": "Wyniki wyszukiwania", "emoji_button.symbols": "Symbole", "emoji_button.travel": "Podróże i miejsca", + "empty_column.account_featured.me": "Niczego jeszcze nie poleciłeś. Czy wiesz, że możesz wyświetlać swoje hashtagi, z których korzystasz najbardziej, a nawet konta znajomego na swoim profilu?", + "empty_column.account_featured.other": "{acct} nie wyróżnił jeszcze nic. Czy wiesz, że możesz wyświetlać swoje hashtagi, z których korzystasz najbardziej, a nawet konta znajomego na swoim profilu?", + "empty_column.account_featured_other.unknown": "To konto nie zostało jeszcze wyróżnione.", "empty_column.account_hides_collections": "Ta osoba postanowiła nie udostępniać tych informacji", "empty_column.account_suspended": "Konto zawieszone", "empty_column.account_timeline": "Brak wpisów!", @@ -560,6 +567,8 @@ "navigation_bar.follows_and_followers": "Obserwowani i obserwujący", "navigation_bar.import_export": "Import i eksport", "navigation_bar.lists": "Listy", + "navigation_bar.live_feed_local": "Kanał na żywo (lokalny)", + "navigation_bar.live_feed_public": "Kanał na żywo (publiczny)", "navigation_bar.logout": "Wyloguj", "navigation_bar.moderation": "Moderacja", "navigation_bar.more": "Więcej", @@ -594,6 +603,7 @@ "notification.label.mention": "Wzmianka", "notification.label.private_mention": "Wzmianka bezpośrednia", "notification.label.private_reply": "Komentarz bezpośredni", + "notification.label.quote": "{name} cytował twój post", "notification.label.reply": "Komentarz", "notification.mention": "Wzmianka", "notification.mentioned_you": "{name} wzmiankuje cię", @@ -651,6 +661,7 @@ "notifications.column_settings.mention": "Wzmianki:", "notifications.column_settings.poll": "Wyniki ankiety:", "notifications.column_settings.push": "Powiadomienia push", + "notifications.column_settings.quote": "Cytaty:", "notifications.column_settings.reblog": "Podbicia:", "notifications.column_settings.show": "Pokaż w kolumnie", "notifications.column_settings.sound": "Odtwarzaj dźwięk", @@ -871,6 +882,8 @@ "status.quote_error.filtered": "Ukryte z powodu jednego z Twoich filtrów", "status.quote_error.not_available": "Post niedostępny", "status.quote_error.pending_approval": "Post oczekujący", + "status.quote_error.pending_approval_popout.body": "Oferty współdzielone przez Fediverse mogą wymagać czasu, ponieważ różne serwery mają różne protokoły.", + "status.quote_error.pending_approval_popout.title": "Oczekujący cytat? Spokojnie, bądź cierpliwy :)", "status.quote_post_author": "Zacytowano post @{name}", "status.read_more": "Czytaj dalej", "status.reblog": "Podbij", @@ -886,6 +899,7 @@ "status.reply": "Odpowiedz", "status.replyAll": "Odpowiedz na wątek", "status.report": "Zgłoś @{name}", + "status.revoke_quote": "Usuń mój wpis z postu @{name}", "status.sensitive_warning": "Wrażliwa zawartość", "status.share": "Udostępnij", "status.show_less_all": "Zwiń wszystkie", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index ada27cea5f..219149239a 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Убрать подписчика", "confirmations.remove_from_followers.message": "Пользователь {name} перестанет быть подписан на вас. Продолжить?", "confirmations.remove_from_followers.title": "Убрать подписчика?", + "confirmations.revoke_quote.confirm": "Убрать пост", + "confirmations.revoke_quote.message": "Это действие невозможно отменить.", + "confirmations.revoke_quote.title": "Убрать пост?", "confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", "confirmations.unfollow.title": "Отписаться?", @@ -498,6 +501,8 @@ "keyboard_shortcuts.translate": "перевести пост", "keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска", "keyboard_shortcuts.up": "вверх по списку", + "learn_more_link.got_it": "Понятно", + "learn_more_link.learn_more": "Узнать больше", "lightbox.close": "Закрыть", "lightbox.next": "Далее", "lightbox.previous": "Назад", @@ -845,6 +850,8 @@ "status.bookmark": "Добавить в закладки", "status.cancel_reblog_private": "Отменить продвижение", "status.cannot_reblog": "Этот пост не может быть продвинут", + "status.context.load_new_replies": "Доступны новые ответы", + "status.context.loading": "Проверяем, есть ли еще ответы", "status.continued_thread": "Продолжение предыдущего поста", "status.copy": "Скопировать ссылку на пост", "status.delete": "Удалить", @@ -871,6 +878,7 @@ "status.open": "Открыть пост", "status.pin": "Закрепить в профиле", "status.quote_error.filtered": "Скрыто одним из ваших фильтров", + "status.quote_error.not_available": "Пост недоступен", "status.read_more": "Читать далее", "status.reblog": "Продвинуть", "status.reblog_private": "Продвинуть для своей аудитории", diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 29de53637c..32ea9f26c3 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -599,6 +599,7 @@ pl: limited: Ograniczone title: Moderacja moderation_notes: + create: Dodaj notatkę moderacyjną title: Notatki moderacyjne private_comment: Prywatny komentarz public_comment: Publiczny komentarz @@ -1109,6 +1110,7 @@ pl: trending: Popularne username_blocks: add_new: Dodaj nową + block_registrations: Zablokuj rejestracje comparison: contains: Zawiera equals: Równa się @@ -1742,6 +1744,9 @@ pl: title: Nowe wspomnienie o Tobie poll: subject: Ankieta %{name} zakończyła się + quote: + subject: "%{name} cytował twój post" + title: Nowy cytat reblog: body: 'Twój wpis został podbity przez %{name}:' subject: Twój wpis został podbity przez %{name} @@ -2024,6 +2029,9 @@ pl: does_not_match_previous_name: nie pasuje do poprzedniej nazwy terms_of_service: title: Regulamin + terms_of_service_interstitial: + review_link: Przeglądnij Warunki Korzystania + title: Warunki korzystania z %{domain} zmieniają się themes: contrast: Mastodon (Wysoki kontrast) default: Mastodon (Ciemny) diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 001e48c650..58f71bb454 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -196,6 +196,7 @@ ru: create_relay: Создание ретранслятора create_unavailable_domain: Добавление домена в список недоступных create_user_role: Создание ролей + create_username_block: Создать правило имени пользователя demote_user: Разжалование пользователей destroy_announcement: Удаление объявлений destroy_canonical_email_block: Удаление блокировок e-mail @@ -209,6 +210,7 @@ ru: destroy_status: Удаление постов destroy_unavailable_domain: Исключение доменов из списка недоступных destroy_user_role: Удаление ролей + destroy_username_block: Удалить правило имени пользователя disable_2fa_user: Отключение 2FA disable_custom_emoji: Отключение эмодзи disable_relay: Отключение ретранслятора @@ -243,6 +245,7 @@ ru: update_report: Изменение жалоб update_status: Изменение постов update_user_role: Изменение ролей + update_username_block: Обновить правило имени пользователя actions: approve_appeal_html: "%{name} одобрил(а) обжалование действий модерации от %{target}" approve_user_html: "%{name} утвердил(а) регистрацию %{target}" @@ -261,6 +264,7 @@ ru: create_relay_html: "%{name} создал(а) ретранслятор %{target}" create_unavailable_domain_html: "%{name} приостановил доставку на узел %{target}" create_user_role_html: "%{name} создал(а) роль %{target}" + create_username_block_html: "%{name} создал(а) правило для имён пользователей, содержащих %{target}" demote_user_html: "%{name} разжаловал(а) пользователя %{target}" destroy_announcement_html: "%{name} удалил(а) объявление %{target}" destroy_canonical_email_block_html: "%{name} снял(а) блокировку e-mail с хэшем %{target}" @@ -274,6 +278,7 @@ ru: destroy_status_html: "%{name} удалил(а) пост пользователя %{target}" destroy_unavailable_domain_html: "%{name} возобновил доставку на узел %{target}" destroy_user_role_html: "%{name} удалил(а) роль %{target}" + destroy_username_block_html: "%{name} удалил(а) правило для имён пользователей, содержащих %{target}" disable_2fa_user_html: "%{name} отключил(а) требование двухэтапной авторизации для пользователя %{target}" disable_custom_emoji_html: "%{name} отключил(а) эмодзи %{target}" disable_relay_html: "%{name} отключил(а) ретранслятор %{target}" @@ -308,6 +313,7 @@ ru: update_report_html: "%{name} изменил(а) жалобу %{target}" update_status_html: "%{name} изменил(а) пост пользователя %{target}" update_user_role_html: "%{name} изменил(а) роль %{target}" + update_username_block_html: "%{name} обновил(а) правило для имён пользователей, содержащих %{target}" deleted_account: удалённая учётная запись empty: Журнал пуст. filter_by_action: Фильтр по действию @@ -499,15 +505,24 @@ ru: fasp: debug: callbacks: + created_at: Создано в delete: Удалить ip: IP-адрес + request_body: Тело запроса providers: + active: Активен base_url: Основной URL delete: Удалить + edit: Редактировать поставщика + finish_registration: Завершить регистрацию + name: Имя + providers: Поставщики + registration_requested: Требуется регистрация registrations: confirm: Подтвердить reject: Отклонить save: Сохранить + select_capabilities: Выберите возможности sign_in: status: Пост title: FASP @@ -585,6 +600,9 @@ ru: all: Все limited: Ограниченные title: Модерация + moderation_notes: + create: Добавить заметку модератора + title: Заметки модератора private_comment: Приватный комментарий public_comment: Публичный комментарий purge: Удалить данные @@ -799,11 +817,16 @@ ru: title: Роли rules: add_new: Добавить правило + add_translation: Добавить перевод delete: Удалить description_html: Хотя большинство утверждает, что прочитали и согласны с условиями обслуживания, обычно люди не читают их до тех пор, пока не возникнет проблема. Упростите просмотр правил вашего сервера с первого взгляда, предоставив их в виде простого маркированного списка. Старайтесь, чтобы отдельные правила были краткими и простыми, но старайтесь не разбивать их на множество отдельных элементов. edit: Редактировать правило empty: Правила сервера еще не определены. + move_down: Переместить вниз + move_up: Переместить вверх title: Правила сервера + translation: Перевод + translations: Переводы settings: about: manage_rules: Управление правилами на сервере @@ -829,6 +852,7 @@ ru: discovery: follow_recommendations: Рекомендации подписок preamble: Наблюдение интересного контента играет важную роль при открытии новых пользователей, которые могут не знать ни одного Mastodon. Контролируйте как работают различные функции обнаружения на вашем сервере. + privacy: Конфиденциальность profile_directory: Каталог профилей public_timelines: Публичные ленты publish_statistics: Опубликовать стаитстику @@ -1087,6 +1111,23 @@ ru: other: За последнюю неделю использовал %{count} человек title: Рекомендации и тренды trending: Популярное + username_blocks: + add_new: Добавить новое + block_registrations: Блокировать регистрации + comparison: + contains: Содержит + equals: Равен + contains_html: Содержит %{string} + created_msg: Успешно создано правило имени пользователя + delete: Удалить + edit: + title: Редактировать правило имени пользователя + matches_exactly_html: Равен %{string} + new: + create: Создать правило + title: Создать новое правило имени пользователя + not_permitted: Не разрешено + title: Правила имени пользователя warning_presets: add_new: Добавить delete: Удалить @@ -1705,6 +1746,10 @@ ru: title: Новое упоминание poll: subject: Опрос %{name} завершился + quote: + body: 'Ваш пост был процитирован %{name}:' + subject: "%{name} процитировал(а) ваш пост" + title: Новая цитата reblog: body: "%{name} продвинул(а) ваш пост:" subject: "%{name} продвинул(а) ваш пост" @@ -1987,6 +2032,10 @@ ru: does_not_match_previous_name: не совпадает с предыдущим именем terms_of_service: title: Пользовательское соглашение + terms_of_service_interstitial: + past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением. + review_link: Посмотреть пользовательское соглашение + title: Изменяется пользовательское соглашение %{domain} themes: contrast: Mastodon (высококонтрастная) default: Mastodon (тёмная) diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 6faef6aa9c..23204dea2d 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -56,10 +56,12 @@ pl: scopes: Wybór API, do których aplikacja będzie miała dostęp. Jeżeli wybierzesz nadrzędny zakres, nie musisz wybierać jego elementów. setting_aggregate_reblogs: Nie pokazuj nowych podbić dla wpisów, które zostały niedawno podbite (dotyczy tylko nowo otrzymanych podbić) setting_always_send_emails: Powiadomienia e-mail zwykle nie będą wysyłane, gdy używasz Mastodon + setting_default_quote_policy: To ustawienie będzie skuteczne tylko dla postów utworzonych z następną wersją Mastodon, ale możesz wybrać swoje preferencje w przygotowaniu. setting_default_sensitive: Wrażliwe multimedia są domyślnie schowane i mogą być odkryte kliknięciem setting_display_media_default: Ukrywaj zawartość multimedialną oznaczoną jako wrażliwa setting_display_media_hide_all: Zawsze ukrywaj zawartość multimedialną setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną + setting_emoji_style: Jak wyświetlić emotikony. "Auto" spróbuje użyć natywnych emoji, ale wróci do Twemoji dla starszych przeglądarek. setting_system_scrollbars_ui: Stosuje się tylko do przeglądarek komputerowych opartych na Safari i Chrome setting_use_blurhash: Gradienty są oparte na kolorach ukrywanej zawartości, ale uniewidaczniają wszystkie szczegóły setting_use_pending_items: Ukryj aktualizacje osi czasu za kliknięciem, zamiast automatycznego przewijania strumienia @@ -75,6 +77,7 @@ pl: filters: action: Wybierz akcję do wykonania, gdy post pasuje do filtra actions: + blur: Ukryj media za ostrzeżeniem, bez ukrywania samego tekstu hide: Całkowicie ukryj przefiltrowaną zawartość, jakby nie istniała warn: Ukryj filtrowaną zawartość za ostrzeżeniem wskazującym tytuł filtra form_admin_settings: @@ -88,6 +91,7 @@ pl: favicon: WEBP, PNG, GIF, albo JPEG. Nadpisuje domyślną faviconę Mastodona. mascot: Nadpisuje ilustrację w zaawansowanym interfejsie internetowym. media_cache_retention_period: Media z wpisów od obcych użytkowników są cache'owane na twoim serwerze. Kiedy dana wartość jest dodatnia, media te będą usunięte po tylu dniach. Jeżeli usunięte media zostaną potem zażądane, oryginał zostanie ponownie pobrany (o ile jest dalej dostępny). Z powodu ograniczeń dot. częstotliwości z jaką karty podglądu linków dopytują się o dane od stron trzecich, zalecana wartość to min. 14 dni, bo karty podglądu linków nie będą wcześniej odświeżane na żądane. + min_age: Użytkownicy zostaną poproszeni o potwierdzenie daty urodzenia podczas rejestracji peers_api_enabled: Lista nazw domen, z którymi ten serwer spotkał się w fediverse. Nie są tu zawarte żadne dane o tym, czy użytkownik dokonuje federacji z danym serwerem, a jedynie, że jego serwer o tym wie. Jest to wykorzystywane przez serwisy, które zbierają statystyki dotyczące federacji w ogólnym sensie. profile_directory: Katalog profili zawiera listę wszystkich użytkowników, którzy zgodzili się na bycie znalezionymi. require_invite_text: Kiedy rejestracje wymagają ręcznego zatwierdzenia, ustaw pole "Dlaczego chcesz dołączyć?" jako obowiązkowe, a nie opcjonalne @@ -132,13 +136,18 @@ pl: name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne terms_of_service: changelog: Może być stworzony przy pomocy składni Markdown. + effective_date: Uzasadnione ramy czasowe mogą być różne w dowolnym miejscu od 10 do 30 dni od daty powiadomienia użytkowników. text: Może być stworzony przy pomocy składni Markdown. terms_of_service_generator: admin_email: Zawiadomienia prawne obejmują środki zapobiegawcze, nakazy sądowe, wnioski o popełnienie sprawy oraz wnioski organów ścigania. + arbitration_address: Czy może być taki sam jak adres fizyczny powyżej lub „N/A” jeśli używasz adresu e-mail. + arbitration_website: Może być formularzem internetowym lub „N/A”, jeśli używasz adresu e-mail. choice_of_law: Miasto, region, terytorium lub stan, którego wewnętrzne prawo będzie regulowało wszelkie roszczenia. dmca_address: W przypadku operatorów z USA należy użyć adresu zarejestrowanego w DMCA Designated Agent Directory. Lista skrytek pocztowych dostępna jest na bezpośrednią prośbę użytkownika. Użyj DMCA Agent Post Office Box Waiver Request, aby wysłać email do Copyright Office z informacją, że jesteś domowym administratorm treści i z powodu obawy o zemstę lub odwetu za swoje działania, musisz użyć skrytki pocztowej, żeby usunąć swój adres domowy z dostępu publicznego. + dmca_email: Czy może ten sam adres e-mail używany dla powyższego "Adres e-mail dla prawnych zawiadomień"? domain: Unikalny numer identyfikacji świadczonej przez Ciebie usługi online. jurisdiction: Wymień państwo, w którym mieszkają osoby płacące rachunki. Jeżeli jest to spółka lub inny zarejestrowany podmiot, w zależności od przypadku podaj państwo, w którym jest zarejestrowany, a także miasto, region czy województwo. + min_age: Nie powinien być niższy niż minimalny wiek wymagany przez prawo twojego państwa. user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu role: Rola kontroluje uprawnienia użytkownika. @@ -148,6 +157,10 @@ pl: name: Publiczna nazwa roli, jeśli włączone jest wyświetlanie odznaki permissions_as_keys: Użytkownicy z tą rolą będą mieli dostęp do... position: Wyższa rola decyduje o rozwiązywaniu konfliktów w pewnych sytuacjach. Niektóre działania mogą być wykonywane tylko na rolach z niższym priorytetem + username_block: + allow_with_approval: Zamiast bezwzględnie uniemożliwiać rejestrację, pasujące rejestracje będą wymagały Twojej zgody + comparison: Proszę pamiętać o problemie Scunthorpe podczas blokowania częściowych dopasowań + username: Będą dopasowane niezależnie od otoczki i zwykłych homoglików, takich jak "4" dla "a" lub "3" dla "e" webhook: events: Wybierz zdarzenia do wysłania template: Poskładaj zawartość JSON, podstawiając zmienne. Użyjemy domyślnej wartości, jeżeli pole zostawisz pustym. @@ -255,6 +268,7 @@ pl: name: Hasztag filters: actions: + blur: Ukryj media z ostrzeżeniem hide: Ukryj całkowicie warn: Ukryj z ostrzeżeniem form_admin_settings: @@ -312,6 +326,7 @@ pl: follow_request: Powiadamiaj mnie e-mailem, gdy ktoś poprosi o pozwolenie na obserwowanie mnie mention: Powiadamiaj mnie e-mailem, gdy ktoś o mnie wspomni pending_account: Wyślij e-mail kiedy nowe konto potrzebuje recenzji + quote: Ktoś Cię cytował reblog: Powiadamiaj mnie e-mailem, gdy ktoś podbije mój wpis report: Nowe zgłoszenie zostało wysłane software_updates: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 5c48d751b5..3979d9c6de 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -237,6 +237,7 @@ ru: setting_display_media_default: По умолчанию setting_display_media_hide_all: Скрывать все setting_display_media_show_all: Показывать все + setting_emoji_style: Стиль эмодзи setting_expand_spoilers: Разворачивать все посты с предупреждением о содержании setting_hide_network: Скрыть мои связи setting_missing_alt_text_modal: Запрашивать подтверждение при публикации медиа без альтернативного текста @@ -319,6 +320,7 @@ ru: follow_request: Мне пришёл запрос на подписку mention: Меня упомянули в посте pending_account: Новая заявка на создание аккаунта + quote: Кто-то процитировал вас reblog: Мой пост продвинули report: Новое обращение отправлено software_updates: @@ -365,6 +367,9 @@ ru: name: Название permissions_as_keys: Разрешения position: Приоритет + username_block: + allow_with_approval: Разрешить регистрацию с одобрением + comparison: Метод сравнения webhook: events: Включенные события template: Шаблон полезной нагрузки From d9d7914a8dc03e55741d51cb37615137443205ec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 07:44:48 +0000 Subject: [PATCH 18/64] Update dependency vite to v7.1.2 (#35746) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2795331617..da1ac62ba9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13898,8 +13898,8 @@ __metadata: linkType: hard "vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1": - version: 7.1.1 - resolution: "vite@npm:7.1.1" + version: 7.1.2 + resolution: "vite@npm:7.1.2" dependencies: esbuild: "npm:^0.25.0" fdir: "npm:^6.4.6" @@ -13948,7 +13948,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/391a5c8b8f287b7b1653dedbe952fb4cb93bf7c99b19dab915cf63497892427198fef637e943a3391eacfecf7f2e8f55c40d0fa065fabdd885641430d0b74af7 + checksum: 10c0/4ed825b20bc0f49db99cd382de9506b2721ccd47dcebd4a68e0ef65e3cdd2347fded52b306c34178308e0fd7fe78fd5ff517623002cb00710182ad3012c92ced languageName: node linkType: hard From 5ee83a680bc133d69b56784a86bfcd4304132463 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Tue, 12 Aug 2025 04:15:22 -0400 Subject: [PATCH 19/64] Update stoplight to version 5.3.1 (#35129) --- Gemfile | 2 +- Gemfile.lock | 8 +++---- .../concerns/signature_verification.rb | 12 ++++++---- app/services/bulk_import_row_service.rb | 22 +++++++++++++------ app/workers/activitypub/delivery_worker.rb | 10 +++++---- config/initializers/stoplight.rb | 6 +++-- lib/paperclip/attachment_extensions.rb | 13 ++++++----- 7 files changed, 44 insertions(+), 29 deletions(-) diff --git a/Gemfile b/Gemfile index 57ea00cc83..c5d6f55824 100644 --- a/Gemfile +++ b/Gemfile @@ -88,7 +88,7 @@ gem 'sidekiq-scheduler', '~> 6.0' gem 'sidekiq-unique-jobs', '> 8' gem 'simple_form', '~> 5.2' gem 'simple-navigation', '~> 4.4' -gem 'stoplight', '~> 4.1' +gem 'stoplight' gem 'strong_migrations' gem 'tty-prompt', '~> 0.23', require: false gem 'twitter-text', '~> 3.1.0' diff --git a/Gemfile.lock b/Gemfile.lock index db58971b6e..077ed68f55 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -719,8 +719,6 @@ GEM redis (4.8.1) redis-client (0.25.2) connection_pool - redlock (1.3.2) - redis (>= 3.0.0, < 6.0) regexp_parser (2.11.0) reline (0.6.2) io-console (~> 0.5) @@ -855,8 +853,8 @@ GEM stackprof (0.2.27) starry (0.2.0) base64 - stoplight (4.1.1) - redlock (~> 1.0) + stoplight (5.3.1) + zeitwerk stringio (3.1.7) strong_migrations (2.5.0) activerecord (>= 7.1) @@ -1088,7 +1086,7 @@ DEPENDENCIES simplecov (~> 0.22) simplecov-lcov (~> 0.8) stackprof - stoplight (~> 4.1) + stoplight strong_migrations test-prof thor (~> 1.2) diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index b61a569860..2bdd355864 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -9,6 +9,8 @@ module SignatureVerification EXPIRATION_WINDOW_LIMIT = 12.hours CLOCK_SKEW_MARGIN = 1.hour + STOPLIGHT_COOL_OFF_TIME = 5.minutes.seconds + STOPLIGHT_THRESHOLD = 1 def require_account_signature! render json: signature_verification_failure_reason, status: signature_verification_failure_code unless signed_request_account @@ -107,10 +109,12 @@ module SignatureVerification end def stoplight_wrapper - Stoplight("source:#{request.remote_ip}") - .with_threshold(1) - .with_cool_off_time(5.minutes.seconds) - .with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) } + Stoplight( + "source:#{request.remote_ip}", + cool_off_time: STOPLIGHT_COOL_OFF_TIME, + threshold: STOPLIGHT_THRESHOLD, + tracked_errors: [HTTP::Error, OpenSSL::SSL::SSLError] + ) end def actor_refresh_key!(actor) diff --git a/app/services/bulk_import_row_service.rb b/app/services/bulk_import_row_service.rb index 26909dfe04..ac5080f0ba 100644 --- a/app/services/bulk_import_row_service.rb +++ b/app/services/bulk_import_row_service.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true class BulkImportRowService + STOPLIGHT_COOL_OFF_TIME = 5.minutes.seconds + STOPLIGHT_THRESHOLD = 1 + def call(row) @account = row.bulk_import.account @data = row.data @@ -10,7 +13,7 @@ class BulkImportRowService when :following, :blocking, :muting, :lists target_acct = @data['acct'] target_domain = domain(target_acct) - @target_account = stoplight_wrapper(target_domain).run { ResolveAccountService.new.call(target_acct, { check_delivery_availability: true }) } + @target_account = stoplight_wrapper(target_domain).run(stoplight_fallback) { ResolveAccountService.new.call(target_acct, { check_delivery_availability: true }) } return false if @target_account.nil? when :bookmarks target_uri = @data['uri'] @@ -18,7 +21,7 @@ class BulkImportRowService @target_status = ActivityPub::TagManager.instance.uri_to_resource(target_uri, Status) return false if @target_status.nil? && ActivityPub::TagManager.instance.local_uri?(target_uri) - @target_status ||= stoplight_wrapper(target_domain).run { ActivityPub::FetchRemoteStatusService.new.call(target_uri) } + @target_status ||= stoplight_wrapper(target_domain).run(stoplight_fallback) { ActivityPub::FetchRemoteStatusService.new.call(target_uri) } return false if @target_status.nil? end @@ -51,13 +54,18 @@ class BulkImportRowService TagManager.instance.local_domain?(domain) ? nil : TagManager.instance.normalize_domain(domain) end + def stoplight_fallback + ->(error) {} + end + def stoplight_wrapper(domain) if domain.present? - Stoplight("source:#{domain}") - .with_fallback { nil } - .with_threshold(1) - .with_cool_off_time(5.minutes.seconds) - .with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) } + Stoplight( + "source:#{domain}", + cool_off_time: STOPLIGHT_COOL_OFF_TIME, + threshold: STOPLIGHT_THRESHOLD, + tracked_errors: [HTTP::Error, OpenSSL::SSL::SSLError] + ) else Stoplight('domain-blank') end diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb index 7a1440ed15..40b5c42404 100644 --- a/app/workers/activitypub/delivery_worker.rb +++ b/app/workers/activitypub/delivery_worker.rb @@ -5,8 +5,8 @@ class ActivityPub::DeliveryWorker include RoutingHelper include JsonLdHelper + STOPLIGHT_COOL_OFF_TIME = 60 STOPLIGHT_FAILURE_THRESHOLD = 10 - STOPLIGHT_COOLDOWN = 60 sidekiq_options queue: 'push', retry: 16, dead: false @@ -75,9 +75,11 @@ class ActivityPub::DeliveryWorker end def stoplight_wrapper - Stoplight(@inbox_url) - .with_threshold(STOPLIGHT_FAILURE_THRESHOLD) - .with_cool_off_time(STOPLIGHT_COOLDOWN) + Stoplight( + @inbox_url, + cool_off_time: STOPLIGHT_COOL_OFF_TIME, + threshold: STOPLIGHT_FAILURE_THRESHOLD + ) end def failure_tracker diff --git a/config/initializers/stoplight.rb b/config/initializers/stoplight.rb index 0ade504f67..c92a469303 100644 --- a/config/initializers/stoplight.rb +++ b/config/initializers/stoplight.rb @@ -3,6 +3,8 @@ require 'stoplight' Rails.application.reloader.to_prepare do - Stoplight.default_data_store = Stoplight::DataStore::Redis.new(RedisConnection.new.connection) - Stoplight.default_notifiers = [Stoplight::Notifier::Logger.new(Rails.logger)] + Stoplight.configure do |config| + config.data_store = Stoplight::DataStore::Redis.new(RedisConnection.new.connection) + config.notifiers = [Stoplight::Notifier::Logger.new(Rails.logger)] + end end diff --git a/lib/paperclip/attachment_extensions.rb b/lib/paperclip/attachment_extensions.rb index 401da11290..011e165ed7 100644 --- a/lib/paperclip/attachment_extensions.rb +++ b/lib/paperclip/attachment_extensions.rb @@ -73,8 +73,8 @@ module Paperclip @url_generator.for_as_default(style_name) end + STOPLIGHT_COOL_OFF_TIME = 30 STOPLIGHT_THRESHOLD = 10 - STOPLIGHT_COOLDOWN = 30 # We overwrite this method to put a circuit breaker around # calls to object storage, to stop hitting APIs that are slow @@ -84,11 +84,12 @@ module Paperclip # Don't go through Stoplight if we don't have anything object-storage-oriented to do return super if @queued_for_delete.empty? && @queued_for_write.empty? && !dirty? - Stoplight('object-storage') - .with_threshold(STOPLIGHT_THRESHOLD) - .with_cool_off_time(STOPLIGHT_COOLDOWN) - .with_error_handler { |error, handle| error.is_a?(Seahorse::Client::NetworkingError) ? handle.call(error) : raise(error) } - .run { super } + Stoplight( + 'object-storage', + cool_off_time: STOPLIGHT_COOL_OFF_TIME, + threshold: STOPLIGHT_THRESHOLD, + tracked_errors: [Seahorse::Client::NetworkingError] + ).run { super } end end end From 28b5477c6f73f2a136f3fe31942f69211e15df5a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:27:07 +0200 Subject: [PATCH 20/64] Update dependency rubocop-rails to v2.33.1 (#35747) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 077ed68f55..c9c1b7349d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -719,7 +719,7 @@ GEM redis (4.8.1) redis-client (0.25.2) connection_pool - regexp_parser (2.11.0) + regexp_parser (2.11.1) reline (0.6.2) io-console (~> 0.5) request_store (1.7.0) @@ -787,7 +787,7 @@ GEM lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.33.0) + rubocop-rails (2.33.1) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) From 69ee043f9d4c6be578d5785c1ec311893c83d30c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 11:53:52 +0200 Subject: [PATCH 21/64] Update dependency rspec-rails to v8.0.2 (#35750) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c9c1b7349d..009cd1aa9b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -749,7 +749,7 @@ GEM rspec-mocks (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (8.0.1) + rspec-rails (8.0.2) actionpack (>= 7.2) activesupport (>= 7.2) railties (>= 7.2) From 258e5c4938e88183fec010dd0af1e358dc482a2d Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 12 Aug 2025 14:19:29 +0200 Subject: [PATCH 22/64] Fix interaction policy changes in implicit updates not being saved (#35751) --- .../process_status_update_service.rb | 2 +- .../fetch_remote_status_service_spec.rb | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index 023eef19a0..0da1335b5c 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -74,7 +74,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService end def update_interaction_policies! - @status.quote_approval_policy = @status_parser.quote_policy + @status.update(quote_approval_policy: @status_parser.quote_policy) end def update_media_attachments! diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb index 2503a58ac2..07d05d762f 100644 --- a/spec/services/activitypub/fetch_remote_status_service_spec.rb +++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb @@ -316,6 +316,23 @@ RSpec.describe ActivityPub::FetchRemoteStatusService do expect(existing_status.edits).to_not be_empty end end + + context 'with an implicit update to quoting policy' do + let(:object) do + note.merge({ + 'content' => existing_status.text, + 'interactionPolicy' => { + 'canQuote' => { + 'automaticApproval' => ['https://www.w3.org/ns/activitystreams#Public'], + }, + }, + }) + end + + it 'updates status' do + expect(existing_status.reload.quote_approval_policy).to eq(Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16) + end + end end end From 5847117573aff7c793141ee8963376c75c439955 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:54:22 +0200 Subject: [PATCH 23/64] Update dependency eslint-plugin-jsdoc to v53 (#35742) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index de656d33c1..6922dd435d 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "eslint-import-resolver-typescript": "^4.2.5", "eslint-plugin-formatjs": "^5.3.1", "eslint-plugin-import": "~2.32.0", - "eslint-plugin-jsdoc": "^52.0.0", + "eslint-plugin-jsdoc": "^53.0.0", "eslint-plugin-jsx-a11y": "~6.10.2", "eslint-plugin-promise": "~7.2.1", "eslint-plugin-react": "^7.37.4", diff --git a/yarn.lock b/yarn.lock index da1ac62ba9..e07b8741a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2680,7 +2680,7 @@ __metadata: eslint-import-resolver-typescript: "npm:^4.2.5" eslint-plugin-formatjs: "npm:^5.3.1" eslint-plugin-import: "npm:~2.32.0" - eslint-plugin-jsdoc: "npm:^52.0.0" + eslint-plugin-jsdoc: "npm:^53.0.0" eslint-plugin-jsx-a11y: "npm:~6.10.2" eslint-plugin-promise: "npm:~7.2.1" eslint-plugin-react: "npm:^7.37.4" @@ -6986,9 +6986,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^52.0.0": - version: 52.0.2 - resolution: "eslint-plugin-jsdoc@npm:52.0.2" +"eslint-plugin-jsdoc@npm:^53.0.0": + version: 53.0.1 + resolution: "eslint-plugin-jsdoc@npm:53.0.1" dependencies: "@es-joy/jsdoccomment": "npm:~0.52.0" are-docs-informative: "npm:^0.0.2" @@ -7002,7 +7002,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/e36d8c75a5a100f71f4f5287ce12ffdf15474194b2877dbe1e06c3c24a1c0c0c7f13c2d92cb289a80515b6fe1e43c4c0b19814b5c5b22a46ac2ca7df23ab55ad + checksum: 10c0/d629863faa98026edc09535e8095669d97be4e77173bfe6cbe7ea0fcd641cd2537bec58e25db433cc6f4103d9a2a13c1bbb3916a8ed4ff05b18c566971dec472 languageName: node linkType: hard From 783b33e2da7a7ff4b36a4ec5c0fc47d253886a13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:54:40 +0200 Subject: [PATCH 24/64] Update dependency pino to v9.8.0 (#35722) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e07b8741a5..b6115435b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10308,8 +10308,8 @@ __metadata: linkType: hard "pino@npm:^9.0.0": - version: 9.7.0 - resolution: "pino@npm:9.7.0" + version: 9.8.0 + resolution: "pino@npm:9.8.0" dependencies: atomic-sleep: "npm:^1.0.0" fast-redact: "npm:^3.1.1" @@ -10324,7 +10324,7 @@ __metadata: thread-stream: "npm:^3.0.0" bin: pino: bin.js - checksum: 10c0/c7f8a83a9a9d728b4eff6d0f4b9367f031c91bcaa5806fbf0eedcc8e77faba593d59baf11a8fba0dd1c778bb17ca7ed01418ac1df4ec129faeedd4f3ecaff66f + checksum: 10c0/a6de40d8c777520a0f2bdd1727512db2dba51d0d8098500ec8326f1f95412e4e704ee4301287ccbbafbf7a7ab07999d5659333a7079d1b70341d0d69e4d40b29 languageName: node linkType: hard From 63d3f28b2033f5ecef55760505d385fea47ac254 Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 12 Aug 2025 18:16:03 +0200 Subject: [PATCH 25/64] Fix reply indicator displaying wrong avatar in rare cases (#35756) --- .../mastodon/features/compose/components/reply_indicator.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/features/compose/components/reply_indicator.jsx b/app/javascript/mastodon/features/compose/components/reply_indicator.jsx index cf5bae2e07..35733ac23b 100644 --- a/app/javascript/mastodon/features/compose/components/reply_indicator.jsx +++ b/app/javascript/mastodon/features/compose/components/reply_indicator.jsx @@ -25,7 +25,7 @@ export const ReplyIndicator = () => {
- +
From eda8ddddd6ecfcf455495774ba47297ec2e678e0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:38:54 +0200 Subject: [PATCH 26/64] Update dependency json-schema to v6 (#35754) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index c5d6f55824..9b9bd40f2f 100644 --- a/Gemfile +++ b/Gemfile @@ -146,7 +146,7 @@ group :test do gem 'climate_control' # Validate schemas in specs - gem 'json-schema', '~> 5.0' + gem 'json-schema', '~> 6.0' # Test harness fo rack components gem 'rack-test', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 009cd1aa9b..098168f006 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -365,7 +365,7 @@ GEM json-ld-preloaded (3.3.2) json-ld (~> 3.3) rdf (~> 3.3) - json-schema (5.2.1) + json-schema (6.0.0) addressable (~> 2.8) bigdecimal (~> 3.1) jsonapi-renderer (0.2.2) @@ -1003,7 +1003,7 @@ DEPENDENCIES jd-paperclip-azure (~> 3.0) json-ld json-ld-preloaded (~> 3.2) - json-schema (~> 5.0) + json-schema (~> 6.0) kaminari (~> 1.2) kt-paperclip (~> 7.2) letter_opener (~> 1.8) From c893b82ace8b2f6e2b7b7ae3954dce1393d5d881 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Aug 2025 09:12:11 +0200 Subject: [PATCH 27/64] Remove unnecessary limitation on manual build-security workflow (#35752) --- .github/workflows/build-security.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build-security.yml b/.github/workflows/build-security.yml index d3cb4e5e0a..72729b544b 100644 --- a/.github/workflows/build-security.yml +++ b/.github/workflows/build-security.yml @@ -9,7 +9,6 @@ permissions: jobs: compute-suffix: runs-on: ubuntu-latest - if: github.repository == 'mastodon/mastodon' steps: - id: version_vars env: From bce4a572cdc78b8f3d3c5cb8c1afa72f73394b68 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:26:03 +0200 Subject: [PATCH 28/64] New Crowdin Translations (automated) (#35759) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/cs.json | 2 +- app/javascript/mastodon/locales/nn.json | 15 +++++++++++ config/locales/nn.yml | 36 +++++++++++++++++++++++++ config/locales/simple_form.nn.yml | 15 +++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index a6e8288295..bd8d5a5d8b 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -510,7 +510,7 @@ "lightbox.zoom_out": "Přizpůsobit velikost", "limited_account_hint.action": "Přesto profil zobrazit", "limited_account_hint.title": "Tento profil byl skryt moderátory {domain}.", - "link_preview.author": "Podle {name}", + "link_preview.author": "Od {name}", "link_preview.more_from_author": "Více od {name}", "link_preview.shares": "{count, plural, one {{counter} příspěvek} few {{counter} příspěvky} many {{counter} příspěvků} other {{counter} příspěvků}}", "lists.add_member": "Přidat", diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json index 4d7b6d401f..213e89fc44 100644 --- a/app/javascript/mastodon/locales/nn.json +++ b/app/javascript/mastodon/locales/nn.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Fjern fylgjar", "confirmations.remove_from_followers.message": "{name} vil ikkje fylgja deg meir. Vil du halda fram?", "confirmations.remove_from_followers.title": "Fjern fylgjar?", + "confirmations.revoke_quote.confirm": "Fjern innlegget", + "confirmations.revoke_quote.message": "Du kan ikkje angra denne handlinga.", + "confirmations.revoke_quote.title": "Fjern innlegget?", "confirmations.unfollow.confirm": "Slutt å fylgja", "confirmations.unfollow.message": "Er du sikker på at du vil slutta å fylgja {name}?", "confirmations.unfollow.title": "Slutt å fylgja brukaren?", @@ -498,6 +501,8 @@ "keyboard_shortcuts.translate": "å omsetje eit innlegg", "keyboard_shortcuts.unfocus": "for å fokusere vekk skrive-/søkefeltet", "keyboard_shortcuts.up": "Flytt opp på lista", + "learn_more_link.got_it": "Forstått", + "learn_more_link.learn_more": "Lær meir", "lightbox.close": "Lukk", "lightbox.next": "Neste", "lightbox.previous": "Førre", @@ -598,6 +603,7 @@ "notification.label.mention": "Omtale", "notification.label.private_mention": "Privat omtale", "notification.label.private_reply": "Privat svar", + "notification.label.quote": "{name} siterte innlegget ditt", "notification.label.reply": "Svar", "notification.mention": "Omtale", "notification.mentioned_you": "{name} nemnde deg", @@ -655,6 +661,7 @@ "notifications.column_settings.mention": "Omtaler:", "notifications.column_settings.poll": "Røysteresultat:", "notifications.column_settings.push": "Pushvarsel", + "notifications.column_settings.quote": "Sitat:", "notifications.column_settings.reblog": "Framhevingar:", "notifications.column_settings.show": "Vis i kolonne", "notifications.column_settings.sound": "Spel av lyd", @@ -845,6 +852,8 @@ "status.bookmark": "Set bokmerke", "status.cancel_reblog_private": "Opphev framheving", "status.cannot_reblog": "Du kan ikkje framheva dette innlegget", + "status.context.load_new_replies": "Nye svar finst", + "status.context.loading": "Ser etter fleire svar", "status.continued_thread": "Framhald til tråden", "status.copy": "Kopier lenke til status", "status.delete": "Slett", @@ -871,6 +880,11 @@ "status.open": "Utvid denne statusen", "status.pin": "Fest på profil", "status.quote_error.filtered": "Gøymt på grunn av eitt av filtra dine", + "status.quote_error.not_available": "Innlegget er ikkje tilgjengeleg", + "status.quote_error.pending_approval": "Innlegget ventar", + "status.quote_error.pending_approval_popout.body": "Sitat frå rundt om i allheimen kan ta tid å visa, fordi ulike tenarar har ulike protokollar.", + "status.quote_error.pending_approval_popout.title": "Ventande sitat? Ikkje stress", + "status.quote_post_author": "Siterte eit innlegg av @{name}", "status.read_more": "Les meir", "status.reblog": "Framhev", "status.reblog_private": "Framhev til dei originale mottakarane", @@ -885,6 +899,7 @@ "status.reply": "Svar", "status.replyAll": "Svar til tråd", "status.report": "Rapporter @{name}", + "status.revoke_quote": "Fjern innlegget mitt frå @{name} sitt innlegg", "status.sensitive_warning": "Ømtolig innhald", "status.share": "Del", "status.show_less_all": "Vis mindre for alle", diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 14c26ea74a..0ae6bf0223 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -190,6 +190,7 @@ nn: create_relay: Opprett eit relé create_unavailable_domain: Opprett utilgjengeleg domene create_user_role: Opprett rolle + create_username_block: Lag regel for brukarnamn demote_user: Degrader brukar destroy_announcement: Slett lysinga destroy_canonical_email_block: Fjern e-postblokkering @@ -203,6 +204,7 @@ nn: destroy_status: Slett status destroy_unavailable_domain: Slett utilgjengeleg domene destroy_user_role: Øydelegg rolle + destroy_username_block: Slett regel for brukarnamn disable_2fa_user: Skruv av 2FA disable_custom_emoji: Skruv av tilpassa emoji disable_relay: Skru av reléet @@ -237,6 +239,7 @@ nn: update_report: Oppdater rapport update_status: Oppdater tut update_user_role: Oppdater rolla + update_username_block: Oppdater regel for brukarnamn actions: approve_appeal_html: "%{name} godkjende klagen frå %{target} på modereringa" approve_user_html: "%{name} godkjende registreringa til %{target}" @@ -255,6 +258,7 @@ nn: create_relay_html: "%{name} laga reléet %{target}" create_unavailable_domain_html: "%{name} stogga levering til domenet %{target}" create_user_role_html: "%{name} oppretta rolla %{target}" + create_username_block_html: "%{name} laga ein regel for brukarnamn som inneheld %{target}" demote_user_html: "%{name} degraderte brukaren %{target}" destroy_announcement_html: "%{name} sletta kunngjeringa %{target}" destroy_canonical_email_block_html: "%{name} avblokkerte e-post med hash %{target}" @@ -268,6 +272,7 @@ nn: destroy_status_html: "%{name} fjerna innlegget frå %{target}" destroy_unavailable_domain_html: "%{name} tok opp att levering til domenet %{target}" destroy_user_role_html: "%{name} sletta rolla %{target}" + destroy_username_block_html: "%{name} fjerna regelen for brukarnamn som inneheld %{target}" disable_2fa_user_html: "%{name} tok vekk krav om tofaktorautentisering for brukaren %{target}" disable_custom_emoji_html: "%{name} deaktiverte emojien %{target}" disable_relay_html: "%{name} skrudde av reléet %{target}" @@ -302,6 +307,7 @@ nn: update_report_html: "%{name} oppdaterte rapporten %{target}" update_status_html: "%{name} oppdaterte innlegg av %{target}" update_user_role_html: "%{name} endret %{target} -rolle" + update_username_block_html: "%{name} oppdaterte regelen for brukarnamn som inneheld %{target}" deleted_account: sletta konto empty: Ingen loggar funne. filter_by_action: Sorter etter handling @@ -1085,6 +1091,25 @@ nn: other: Brukt av %{count} personer i løpet av den seneste uken title: Anbefalingar og trendar trending: Trender + username_blocks: + add_new: Lag ny + block_registrations: Blokker registreringar + comparison: + contains: Inneheld + equals: Er lik + contains_html: Inneheld %{string} + created_msg: Laga regelen for brukarnamn + delete: Slett + edit: + title: Rediger regelen for brukarnamn + matches_exactly_html: Er lik %{string} + new: + create: Lag regel + title: Lag ein ny regel for brukarnamn + no_username_block_selected: Ingen brukarnamnreglar vart endra fordi du ikkje valde nokon + not_permitted: Ikkje tillate + title: Reglar for brukarnamn + updated_msg: Oppdaterte regelen for brukarnamn warning_presets: add_new: Legg til ny delete: Slett @@ -1349,6 +1374,10 @@ nn: basic_information: Grunnleggande informasjon hint_html: "Tilpass kva folk ser på den offentlege profilen din og ved sida av innlegga dine. Andre vil i større grad fylgja og samhandla med deg når du har eit profilbilete og har fyllt ut profilen din." other: Anna + emoji_styles: + auto: Auto + native: Innebygd + twemoji: Twemoji errors: '400': Søknaden du sende var ugyldig eller sett opp feil. '403': Du har ikkje løyve til å sjå denne sida. @@ -1658,6 +1687,10 @@ nn: title: Ny omtale poll: subject: Meiningsmålinga frå %{name} er avslutta + quote: + body: 'Innlegget ditt vart sitert av %{name}:' + subject: "%{name} siterte innlegget ditt" + title: Nytt sitat reblog: body: 'Statusen din vart framheva av %{name}:' subject: "%{name} framheva statusen din" @@ -1868,6 +1901,7 @@ nn: edited_at_html: Redigert %{date} 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. over_character_limit: øvregrensa for teikn, %{max}, er nådd pin_errors: direct: Innlegg som bare er synlige for nevnte brukere kan ikke festes @@ -1875,6 +1909,8 @@ nn: ownership: Du kan ikkje festa andre sine tut reblog: Ei framheving kan ikkje festast quote_policies: + followers: Berre dei som fylgjer deg + nobody: Ingen public: Alle title: "%{name}: «%{quote}»" visibilities: diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 12ae70ffa4..54e45d29e4 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -56,10 +56,12 @@ nn: scopes: API-ane som programmet vil få tilgjenge til. Ettersom du vel eit toppnivåomfang tarv du ikkje velja einskilde API-ar. setting_aggregate_reblogs: Ikkje vis nye framhevingar for tut som nyleg har vorte heva fram (Påverkar berre nylege framhevingar) setting_always_send_emails: Vanlegvis vil ikkje e-postvarsel bli sendt når du brukar Mastodon aktivt + setting_default_quote_policy: Denne innstillinga har berre verknad for innlegg som er laga med den neste utgåva av Mastodon, men du kan velja kva du vil ha i førebuingane. setting_default_sensitive: Sensitive media vert gøymde som standard, og du syner dei ved å klikka på dei setting_display_media_default: Gøym media som er merka som sensitive setting_display_media_hide_all: Alltid skjul alt media setting_display_media_show_all: Vis alltid media + setting_emoji_style: Korleis du skal visa smilefjes. «Auto» prøver å visa innebygde smilefjes, men bruker Twemoji som reserveløysing for eldre nettlesarar. setting_system_scrollbars_ui: Gjeld berre skrivebordsnettlesarar som er bygde på Safari og Chrome setting_use_blurhash: Overgangar er basert på fargane til skjulte grafikkelement, men gjer detaljar utydelege setting_use_pending_items: Gøym tidslineoppdateringar bak eit klikk, i staden for å rulla ned automatisk @@ -148,6 +150,9 @@ nn: min_age: Skal ikkje vere under minstealder som krevst av lover i jurisdiksjonen din. user: chosen_languages: Når merka vil berre tuta på dei valde språka synast på offentlege tidsliner + date_of_birth: + one: Me må sikra oss at du er minst %{count} for å bruka %{domain}. Me lagrar ikkje dette. + other: Me må sikra oss at du er minst %{count} for å bruka %{domain}. Me lagrar ikkje dette. role: Rolla kontrollerer kva løyve brukaren har. user_role: color: Fargen som skal nyttast for denne rolla i heile brukargrensesnittet, som RGB i hex-format @@ -155,6 +160,10 @@ nn: name: Offentleg namn på rolla, dersom rolla skal visast som eit emblem permissions_as_keys: Brukarar med denne rolla vil ha tilgang til... position: Høgare rolle avgjer konfliktløysing i visse situasjonar. Visse handlingar kan berre utførast på roller med lågare prioritet + username_block: + allow_with_approval: I staden for å hindra registreringar i det heile, må du godkjenna registreringar som passar + comparison: Ver merksam på Scunthorpe-problemet når du blokkerer delvise treff + username: Vil passa uansett store og små bokstavar og vanlege homoglyfar som «4» for «a» eller «3» for «e» webhook: events: Vel hendingar å senda template: Skriv di eiga JSON nyttelast ved å bruka variabel interpolering. La stå tom for standard JSON. @@ -237,6 +246,7 @@ nn: setting_display_media_default: Standard setting_display_media_hide_all: Gøym alle setting_display_media_show_all: Vis alle + setting_emoji_style: Stil for smilefjes setting_expand_spoilers: Vid alltid ut tut som er merka med innhaldsåtvaringar setting_hide_network: Gøym nettverket ditt setting_missing_alt_text_modal: Vis stadfestingsdialog før du legg ut media utan alt-tekst @@ -319,6 +329,7 @@ nn: follow_request: Send e-post når nokon spør om å fylgja deg mention: Send e-post når nokon nemner deg pending_account: Send e-post når ein ny konto treng gjennomgang + quote: Nokon siterte deg reblog: Send e-post når nokon framhevar statusen din report: Ny rapport er sendt software_updates: @@ -365,6 +376,10 @@ nn: name: Namn permissions_as_keys: Løyve position: Prioritet + username_block: + allow_with_approval: Tillat registreringar med godkjenning + comparison: Samanlikningsmetode + username: Ord som skal passa webhook: events: Aktiverte hendingar template: Nyttelastmal From 613cbf720c221dc51af95c2a13235e37ca49012b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 07:28:21 +0000 Subject: [PATCH 29/64] Update dependency eslint-plugin-jsdoc to v54 (#35760) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 6922dd435d..10de8458f1 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "eslint-import-resolver-typescript": "^4.2.5", "eslint-plugin-formatjs": "^5.3.1", "eslint-plugin-import": "~2.32.0", - "eslint-plugin-jsdoc": "^53.0.0", + "eslint-plugin-jsdoc": "^54.0.0", "eslint-plugin-jsx-a11y": "~6.10.2", "eslint-plugin-promise": "~7.2.1", "eslint-plugin-react": "^7.37.4", diff --git a/yarn.lock b/yarn.lock index b6115435b5..4ff3c9afc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2680,7 +2680,7 @@ __metadata: eslint-import-resolver-typescript: "npm:^4.2.5" eslint-plugin-formatjs: "npm:^5.3.1" eslint-plugin-import: "npm:~2.32.0" - eslint-plugin-jsdoc: "npm:^53.0.0" + eslint-plugin-jsdoc: "npm:^54.0.0" eslint-plugin-jsx-a11y: "npm:~6.10.2" eslint-plugin-promise: "npm:~7.2.1" eslint-plugin-react: "npm:^7.37.4" @@ -6986,9 +6986,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^53.0.0": - version: 53.0.1 - resolution: "eslint-plugin-jsdoc@npm:53.0.1" +"eslint-plugin-jsdoc@npm:^54.0.0": + version: 54.0.0 + resolution: "eslint-plugin-jsdoc@npm:54.0.0" dependencies: "@es-joy/jsdoccomment": "npm:~0.52.0" are-docs-informative: "npm:^0.0.2" @@ -7002,7 +7002,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/d629863faa98026edc09535e8095669d97be4e77173bfe6cbe7ea0fcd641cd2537bec58e25db433cc6f4103d9a2a13c1bbb3916a8ed4ff05b18c566971dec472 + checksum: 10c0/cf0a388fc670ababe26f9584c467bc8c1592aa83affcf16118d8181c186a6d8f02a8ea65250766b45168fca5cb879a6af66e8457cdb98f0f923bd927572e2de5 languageName: node linkType: hard From 7cf53dbf639aeb7c01a4d367226be667ed1dc7a2 Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 13 Aug 2025 15:52:29 +0200 Subject: [PATCH 30/64] Redirect on success for standalone compose (#35763) --- app/javascript/mastodon/actions/compose.js | 5 ++++- .../mastodon/features/compose/components/compose_form.jsx | 3 ++- .../features/compose/containers/compose_form_container.js | 8 ++++++-- .../mastodon/features/standalone/compose/index.jsx | 2 +- spec/system/share_entrypoint_spec.rb | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 28c90381e0..9dfa4041bd 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -183,7 +183,7 @@ export function directCompose(account) { }; } -export function submitCompose() { +export function submitCompose(successCallback) { return function (dispatch, getState) { const status = getState().getIn(['compose', 'text'], ''); const media = getState().getIn(['compose', 'media_attachments']); @@ -241,6 +241,9 @@ export function submitCompose() { dispatch(insertIntoTagHistory(response.data.tags, status)); dispatch(submitComposeSuccess({ ...response.data })); + if (typeof successCallback === 'function') { + successCallback(response.data); + } // To make the app more responsive, immediately push the status // into the columns diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index 5bc77c4bcd..9fbaa3450c 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -73,6 +73,7 @@ class ComposeForm extends ImmutablePureComponent { singleColumn: PropTypes.bool, lang: PropTypes.string, maxChars: PropTypes.number, + redirectOnSuccess: PropTypes.bool, }; static defaultProps = { @@ -329,7 +330,7 @@ class ComposeForm extends ImmutablePureComponent { > {intl.formatMessage( this.props.isEditing ? - messages.saveChanges : + messages.saveChanges : (this.props.isInReply ? messages.reply : messages.publish) )} diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index 15ccabf748..5f86426c4d 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -34,7 +34,7 @@ const mapStateToProps = state => ({ maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 500), }); -const mapDispatchToProps = (dispatch) => ({ +const mapDispatchToProps = (dispatch, props) => ({ onChange (text) { dispatch(changeCompose(text)); @@ -47,7 +47,11 @@ const mapDispatchToProps = (dispatch) => ({ modalProps: {}, })); } else { - dispatch(submitCompose()); + dispatch(submitCompose((status) => { + if (props.redirectOnSuccess) { + window.location.assign(status.url); + } + })); } }, diff --git a/app/javascript/mastodon/features/standalone/compose/index.jsx b/app/javascript/mastodon/features/standalone/compose/index.jsx index 3aff78ffee..5d336275d4 100644 --- a/app/javascript/mastodon/features/standalone/compose/index.jsx +++ b/app/javascript/mastodon/features/standalone/compose/index.jsx @@ -5,7 +5,7 @@ import ModalContainer from 'mastodon/features/ui/containers/modal_container'; const Compose = () => ( <> - + diff --git a/spec/system/share_entrypoint_spec.rb b/spec/system/share_entrypoint_spec.rb index b55ea31657..0f07d96efe 100644 --- a/spec/system/share_entrypoint_spec.rb +++ b/spec/system/share_entrypoint_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'Share page', :js, :streaming do fill_in_form expect(page) - .to have_css('.notification-bar-message', text: frontend_translations('compose.published.body')) + .to have_current_path(%r{/@bob/[0-9]+}) end def fill_in_form From 49a6e4cbb5f0a30a52162b65b1046b99d29faccc Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 13 Aug 2025 16:09:45 +0200 Subject: [PATCH 31/64] Move composer buttons to top (#35749) --- .../compose/components/compose_form.jsx | 90 +++++++++---------- .../compose/components/language_dropdown.tsx | 2 +- .../styles/mastodon/components.scss | 11 ++- 3 files changed, 50 insertions(+), 53 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index 9fbaa3450c..aa086d4aa6 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -256,62 +256,60 @@ class ComposeForm extends ImmutablePureComponent {
-
- + - {this.props.spoiler && ( -
-
+ {this.props.spoiler && ( +
+
- + -
-
- )} +
+
+ )} - +
+ +
+ +
-
- - -
-
diff --git a/app/javascript/mastodon/features/compose/components/language_dropdown.tsx b/app/javascript/mastodon/features/compose/components/language_dropdown.tsx index d11891308f..72742153b1 100644 --- a/app/javascript/mastodon/features/compose/components/language_dropdown.tsx +++ b/app/javascript/mastodon/features/compose/components/language_dropdown.tsx @@ -396,7 +396,7 @@ export const LanguageDropdown: React.FC = () => { warning: guess !== '' && guess !== value, })} > - + {current[2] ?? value} diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index d6f0087cc6..cca92a46d9 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -602,15 +602,12 @@ body > [data-popper-placement] { &__highlightable { display: flex; flex-direction: column; - gap: 16px; flex: 0 1 auto; border-radius: 4px; border: 1px solid var(--background-border-color); transition: border-color 300ms linear; - min-height: 0; position: relative; background: var(--input-background-color); - overflow-y: auto; &.active { transition: none; @@ -705,6 +702,8 @@ body > [data-popper-placement] { display: flex; align-items: center; gap: 8px; + margin: 8px; + flex-wrap: wrap; & > div { overflow: hidden; @@ -715,6 +714,7 @@ body > [data-popper-placement] { &__uploads { padding: 0 12px; aspect-ratio: 3/2; + flex-shrink: 0; } .media-gallery { @@ -813,7 +813,6 @@ body > [data-popper-placement] { flex-direction: column; gap: 12px; padding: 12px; - padding-top: 0; } &__submit { @@ -874,6 +873,7 @@ body > [data-popper-placement] { } &__poll { + margin-top: 8px; display: flex; flex-direction: column; align-self: stretch; @@ -3518,11 +3518,10 @@ a.account__display-name { display: flex; flex-direction: column; height: calc(100% - 10px); - overflow-y: hidden; + overflow-y: auto; .compose-form { flex: 1 1 auto; - min-height: 0; } } From 2648bbdc51ad42eae889ee44033566bffe141d3a Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Aug 2025 17:51:16 +0200 Subject: [PATCH 32/64] Add `PUT /api/v1/statuses/:status_id/interaction_policy` (#35769) --- .../interaction_policies_controller.rb | 33 +++++++ app/controllers/api/v1/statuses_controller.rb | 18 +--- .../api/interaction_policies_concern.rb | 22 +++++ config/routes/api.rb | 2 + .../v1/statuses/interaction_policies_spec.rb | 94 +++++++++++++++++++ 5 files changed, 152 insertions(+), 17 deletions(-) create mode 100644 app/controllers/api/v1/statuses/interaction_policies_controller.rb create mode 100644 app/controllers/concerns/api/interaction_policies_concern.rb create mode 100644 spec/requests/api/v1/statuses/interaction_policies_spec.rb diff --git a/app/controllers/api/v1/statuses/interaction_policies_controller.rb b/app/controllers/api/v1/statuses/interaction_policies_controller.rb new file mode 100644 index 0000000000..8b822185f6 --- /dev/null +++ b/app/controllers/api/v1/statuses/interaction_policies_controller.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class Api::V1::Statuses::InteractionPoliciesController < Api::V1::Statuses::BaseController + include Api::InteractionPoliciesConcern + + before_action -> { doorkeeper_authorize! :write, :'write:statuses' } + before_action -> { check_feature_enabled } + + def update + authorize @status, :update? + + @status.update!(quote_approval_policy: quote_approval_policy) + + broadcast_updates! if @status.quote_approval_policy_previously_changed? + + render json: @status, serializer: REST::StatusSerializer + end + + private + + def status_params + params.permit(:quote_approval_policy) + end + + def check_feature_enabled + raise ActionController::RoutingError unless Mastodon::Feature.outgoing_quotes_enabled? + end + + def broadcast_updates! + DistributionWorker.perform_async(@status.id, { 'update' => true }) + ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id) + end +end diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index fdf1e7a468..93dbd8f9d1 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -3,6 +3,7 @@ class Api::V1::StatusesController < Api::BaseController include Authorization include AsyncRefreshesConcern + include Api::InteractionPoliciesConcern before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy] before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :update, :destroy] @@ -205,23 +206,6 @@ class Api::V1::StatusesController < Api::BaseController ) end - def quote_approval_policy - # TODO: handle `nil` separately - return nil unless Mastodon::Feature.outgoing_quotes_enabled? && status_params[:quote_approval_policy].present? - - case status_params[:quote_approval_policy] - when 'public' - Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16 - when 'followers' - Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] << 16 - when 'nobody' - 0 - else - # TODO: raise more useful message - raise ActiveRecord::RecordInvalid - end - end - def serializer_for_status @status.is_a?(ScheduledStatus) ? REST::ScheduledStatusSerializer : REST::StatusSerializer end diff --git a/app/controllers/concerns/api/interaction_policies_concern.rb b/app/controllers/concerns/api/interaction_policies_concern.rb new file mode 100644 index 0000000000..21a4cf6c56 --- /dev/null +++ b/app/controllers/concerns/api/interaction_policies_concern.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Api::InteractionPoliciesConcern + extend ActiveSupport::Concern + + def quote_approval_policy + # TODO: handle `nil` separately + return nil unless Mastodon::Feature.outgoing_quotes_enabled? && status_params[:quote_approval_policy].present? + + case status_params[:quote_approval_policy] + when 'public' + Status::QUOTE_APPROVAL_POLICY_FLAGS[:public] << 16 + when 'followers' + Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] << 16 + when 'nobody' + 0 + else + # TODO: raise more useful message + raise ActiveRecord::RecordInvalid + end + end +end diff --git a/config/routes/api.rb b/config/routes/api.rb index 83190610d0..f8b903c7b9 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -39,6 +39,8 @@ namespace :api, format: false do resource :history, only: :show resource :source, only: :show + resource :interaction_policy, only: :update + post :translate, to: 'translations#create' end diff --git a/spec/requests/api/v1/statuses/interaction_policies_spec.rb b/spec/requests/api/v1/statuses/interaction_policies_spec.rb new file mode 100644 index 0000000000..f2d7eb856e --- /dev/null +++ b/spec/requests/api/v1/statuses/interaction_policies_spec.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Interaction policies', feature: :outgoing_quotes do + let(:user) { Fabricate(:user) } + let(:scopes) { 'write:statuses' } + let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) } + let(:headers) { { 'Authorization' => "Bearer #{token.token}" } } + let(:status) { Fabricate(:status, account: user.account) } + let(:params) { { quote_approval_policy: 'followers' } } + + describe 'PUT /api/v1/statuses/:status_id/interaction_policy' do + subject do + put "/api/v1/statuses/#{status.id}/interaction_policy", headers: headers, params: params + end + + it_behaves_like 'forbidden for wrong scope', 'read read:statuses' + + context 'without an authorization header' do + let(:headers) { {} } + + it 'returns http unauthorized' do + expect { subject } + .to_not(change { status.reload.quote_approval_policy }) + + expect(response).to have_http_status(401) + expect(response.content_type) + .to start_with('application/json') + end + end + + context 'with a status from a different user' do + let(:status) { Fabricate(:status) } + + it 'returns http unauthorized' do + expect { subject } + .to_not(change { status.reload.quote_approval_policy }) + + expect(response).to have_http_status(403) + expect(response.content_type) + .to start_with('application/json') + end + end + + context 'when changing the interaction policy' do + it 'changes the interaction policy, returns the updated status, and schedules distribution jobs' do + expect { subject } + .to change { status.reload.quote_approval_policy }.to(Status::QUOTE_APPROVAL_POLICY_FLAGS[:followers] << 16) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body).to include( + 'quote_approval' => match( + 'automatic' => ['followers'], + 'manual' => [], + 'current_user' => 'automatic' + ) + ) + + expect(DistributionWorker) + .to have_enqueued_sidekiq_job(status.id, { 'update' => true }) + expect(ActivityPub::StatusUpdateDistributionWorker) + .to have_enqueued_sidekiq_job(status.id) + end + end + + context 'when not changing the interaction policy' do + let(:params) { { quote_approval_policy: 'nobody' } } + + it 'keeps the interaction policy, returns the status, and does not schedule distribution jobs' do + expect { subject } + .to_not(change { status.reload.quote_approval_policy }.from(0)) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body).to include( + 'quote_approval' => match( + 'automatic' => [], + 'manual' => [], + 'current_user' => 'automatic' + ) + ) + + expect(DistributionWorker) + .to_not have_enqueued_sidekiq_job + expect(ActivityPub::StatusUpdateDistributionWorker) + .to_not have_enqueued_sidekiq_job + end + end + end +end From e2e19544ae16ea3a0af4cedec678a031a78779ed Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 13 Aug 2025 22:45:10 +0200 Subject: [PATCH 33/64] Update Vagrantfile (#35765) --- Vagrantfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index ce456060cd..0a34367024 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -54,6 +54,7 @@ sudo apt-get install \ pkg-config \ protobuf-compiler \ zlib1g-dev \ + libvips42t64 \ -y # Install rvm @@ -134,7 +135,7 @@ VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - config.vm.box = "ubuntu/focal64" + config.vm.box = "bento/ubuntu-24.04" config.vm.provider :virtualbox do |vb| vb.name = "mastodon" From c0f64a6603d57095ff1e9748d42a82fc7d2718d5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 09:34:27 +0200 Subject: [PATCH 34/64] Update dependency rails to v8.0.2.1 (#35776) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 106 +++++++++++++++++++++++++-------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 098168f006..a8374c0417 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,29 +10,29 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (8.0.2) - actionpack (= 8.0.2) - activesupport (= 8.0.2) + actioncable (8.0.2.1) + actionpack (= 8.0.2.1) + activesupport (= 8.0.2.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.2) - actionpack (= 8.0.2) - activejob (= 8.0.2) - activerecord (= 8.0.2) - activestorage (= 8.0.2) - activesupport (= 8.0.2) + actionmailbox (8.0.2.1) + actionpack (= 8.0.2.1) + activejob (= 8.0.2.1) + activerecord (= 8.0.2.1) + activestorage (= 8.0.2.1) + activesupport (= 8.0.2.1) mail (>= 2.8.0) - actionmailer (8.0.2) - actionpack (= 8.0.2) - actionview (= 8.0.2) - activejob (= 8.0.2) - activesupport (= 8.0.2) + actionmailer (8.0.2.1) + actionpack (= 8.0.2.1) + actionview (= 8.0.2.1) + activejob (= 8.0.2.1) + activesupport (= 8.0.2.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.2) - actionview (= 8.0.2) - activesupport (= 8.0.2) + actionpack (8.0.2.1) + actionview (= 8.0.2.1) + activesupport (= 8.0.2.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -40,15 +40,15 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.2) - actionpack (= 8.0.2) - activerecord (= 8.0.2) - activestorage (= 8.0.2) - activesupport (= 8.0.2) + actiontext (8.0.2.1) + actionpack (= 8.0.2.1) + activerecord (= 8.0.2.1) + activestorage (= 8.0.2.1) + activesupport (= 8.0.2.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.2) - activesupport (= 8.0.2) + actionview (8.0.2.1) + activesupport (= 8.0.2.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -58,22 +58,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (8.0.2) - activesupport (= 8.0.2) + activejob (8.0.2.1) + activesupport (= 8.0.2.1) globalid (>= 0.3.6) - activemodel (8.0.2) - activesupport (= 8.0.2) - activerecord (8.0.2) - activemodel (= 8.0.2) - activesupport (= 8.0.2) + activemodel (8.0.2.1) + activesupport (= 8.0.2.1) + activerecord (8.0.2.1) + activemodel (= 8.0.2.1) + activesupport (= 8.0.2.1) timeout (>= 0.4.0) - activestorage (8.0.2) - actionpack (= 8.0.2) - activejob (= 8.0.2) - activerecord (= 8.0.2) - activesupport (= 8.0.2) + activestorage (8.0.2.1) + actionpack (= 8.0.2.1) + activejob (= 8.0.2.1) + activerecord (= 8.0.2.1) + activesupport (= 8.0.2.1) marcel (~> 1.0) - activesupport (8.0.2) + activesupport (8.0.2.1) base64 benchmark (>= 0.3) bigdecimal @@ -667,20 +667,20 @@ GEM rack (>= 1.3) rackup (2.2.1) rack (>= 3) - rails (8.0.2) - actioncable (= 8.0.2) - actionmailbox (= 8.0.2) - actionmailer (= 8.0.2) - actionpack (= 8.0.2) - actiontext (= 8.0.2) - actionview (= 8.0.2) - activejob (= 8.0.2) - activemodel (= 8.0.2) - activerecord (= 8.0.2) - activestorage (= 8.0.2) - activesupport (= 8.0.2) + rails (8.0.2.1) + actioncable (= 8.0.2.1) + actionmailbox (= 8.0.2.1) + actionmailer (= 8.0.2.1) + actionpack (= 8.0.2.1) + actiontext (= 8.0.2.1) + actionview (= 8.0.2.1) + activejob (= 8.0.2.1) + activemodel (= 8.0.2.1) + activerecord (= 8.0.2.1) + activestorage (= 8.0.2.1) + activesupport (= 8.0.2.1) bundler (>= 1.15.0) - railties (= 8.0.2) + railties (= 8.0.2.1) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -691,9 +691,9 @@ GEM rails-i18n (8.0.1) i18n (>= 0.7, < 2) railties (>= 8.0.0, < 9) - railties (8.0.2) - actionpack (= 8.0.2) - activesupport (= 8.0.2) + railties (8.0.2.1) + actionpack (= 8.0.2.1) + activesupport (= 8.0.2.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) From 2112416761e4592d7fa5bdfa92b104953afe5dfa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 09:34:30 +0200 Subject: [PATCH 35/64] Update dependency @rails/ujs to v7.1.502 (#35772) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 10de8458f1..d7fbcf09ef 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^2.1.1", "@optimize-lodash/rollup-plugin": "^5.0.2", - "@rails/ujs": "7.1.501", + "@rails/ujs": "7.1.502", "@react-spring/web": "^9.7.5", "@reduxjs/toolkit": "^2.0.1", "@use-gesture/react": "^10.3.1", diff --git a/yarn.lock b/yarn.lock index 4ff3c9afc2..2c9c9c2366 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2618,7 +2618,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.501" + "@rails/ujs": "npm:7.1.502" "@react-spring/web": "npm:^9.7.5" "@reduxjs/toolkit": "npm:^2.0.1" "@storybook/addon-a11y": "npm:^9.1.1" @@ -3109,10 +3109,10 @@ __metadata: languageName: node linkType: hard -"@rails/ujs@npm:7.1.501": - version: 7.1.501 - resolution: "@rails/ujs@npm:7.1.501" - checksum: 10c0/b75a30f36ff219264e0926da1ffcd14c2a5d6aee5be29da4dc81f9a45843875da79ac19cf7ed9a3f11a39084398d0ae4a75a8edb28ba94907db3081572af62b0 +"@rails/ujs@npm:7.1.502": + version: 7.1.502 + resolution: "@rails/ujs@npm:7.1.502" + checksum: 10c0/79b46e8abd03e3fc633d93cc4e4c23838c628b775802fb38c2ce68b0e609ce287a67b81db112a93cc78c07ec82ca3b4cf87e74eb556d35148ce5f64c8be9201f languageName: node linkType: hard From 734dbbcb14b9483f67c43d467a4324f554edf5b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 07:35:12 +0000 Subject: [PATCH 36/64] Update dependency rubocop-rails to v2.33.3 (#35766) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a8374c0417..5015fb527b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -719,7 +719,7 @@ GEM redis (4.8.1) redis-client (0.25.2) connection_pool - regexp_parser (2.11.1) + regexp_parser (2.11.2) reline (0.6.2) io-console (~> 0.5) request_store (1.7.0) @@ -787,7 +787,7 @@ GEM lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.33.1) + rubocop-rails (2.33.3) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) From 9fc81adc7b931472042585cc75a3e67e6ac99925 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 09:51:51 +0200 Subject: [PATCH 37/64] Update opentelemetry-ruby (non-major) (#35777) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile | 6 +++--- Gemfile.lock | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 9b9bd40f2f..b3d0a818d5 100644 --- a/Gemfile +++ b/Gemfile @@ -109,10 +109,10 @@ group :opentelemetry do gem 'opentelemetry-instrumentation-active_job', '~> 0.8.0', require: false gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.22.0', require: false gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.22.0', require: false - gem 'opentelemetry-instrumentation-excon', '~> 0.23.0', require: false - gem 'opentelemetry-instrumentation-faraday', '~> 0.27.0', require: false + gem 'opentelemetry-instrumentation-excon', '~> 0.24.0', require: false + gem 'opentelemetry-instrumentation-faraday', '~> 0.28.0', require: false gem 'opentelemetry-instrumentation-http', '~> 0.25.0', require: false - gem 'opentelemetry-instrumentation-http_client', '~> 0.23.0', require: false + gem 'opentelemetry-instrumentation-http_client', '~> 0.24.0', require: false gem 'opentelemetry-instrumentation-net_http', '~> 0.23.0', require: false gem 'opentelemetry-instrumentation-pg', '~> 0.30.0', require: false gem 'opentelemetry-instrumentation-rack', '~> 0.26.0', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 5015fb527b..464d5bd2c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -547,19 +547,19 @@ GEM opentelemetry-instrumentation-concurrent_ruby (0.22.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-excon (0.23.0) + opentelemetry-instrumentation-excon (0.24.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-faraday (0.27.0) + opentelemetry-instrumentation-faraday (0.28.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-http (0.25.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-http_client (0.23.0) + opentelemetry-instrumentation-http_client (0.24.0) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) - opentelemetry-instrumentation-net_http (0.23.0) + opentelemetry-instrumentation-net_http (0.23.1) opentelemetry-api (~> 1.0) opentelemetry-instrumentation-base (~> 0.23.0) opentelemetry-instrumentation-pg (0.30.1) @@ -1030,10 +1030,10 @@ DEPENDENCIES opentelemetry-instrumentation-active_job (~> 0.8.0) opentelemetry-instrumentation-active_model_serializers (~> 0.22.0) opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) - opentelemetry-instrumentation-excon (~> 0.23.0) - opentelemetry-instrumentation-faraday (~> 0.27.0) + opentelemetry-instrumentation-excon (~> 0.24.0) + opentelemetry-instrumentation-faraday (~> 0.28.0) opentelemetry-instrumentation-http (~> 0.25.0) - opentelemetry-instrumentation-http_client (~> 0.23.0) + opentelemetry-instrumentation-http_client (~> 0.24.0) opentelemetry-instrumentation-net_http (~> 0.23.0) opentelemetry-instrumentation-pg (~> 0.30.0) opentelemetry-instrumentation-rack (~> 0.26.0) From 93923a4af2d188cf5bf9cfba7695c2eb8b46289b Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Aug 2025 03:57:18 -0400 Subject: [PATCH 38/64] First pass coverage addition for antispam class (#35771) --- app/lib/antispam.rb | 12 ++++++++-- spec/lib/antispam_spec.rb | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 spec/lib/antispam_spec.rb diff --git a/app/lib/antispam.rb b/app/lib/antispam.rb index 69c862a5c1..7d8ed84d0e 100644 --- a/app/lib/antispam.rb +++ b/app/lib/antispam.rb @@ -71,8 +71,16 @@ class Antispam end def report_if_needed!(account) - return if Report.unresolved.exists?(account: Account.representative, target_account: account) + return if system_reports.unresolved.exists?(target_account: account) - Report.create!(account: Account.representative, target_account: account, category: :spam, comment: 'Account automatically reported for posting a banned URL') + system_reports.create!( + category: :spam, + comment: 'Account automatically reported for posting a banned URL', + target_account: account + ) + end + + def system_reports + Account.representative.reports end end diff --git a/spec/lib/antispam_spec.rb b/spec/lib/antispam_spec.rb new file mode 100644 index 0000000000..869fd4c211 --- /dev/null +++ b/spec/lib/antispam_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Antispam do + describe '#local_preflight_check!' do + subject { described_class.new.local_preflight_check!(status) } + + let(:status) { Fabricate :status } + + context 'when there is no spammy text registered' do + it { is_expected.to be_nil } + end + + context 'with spammy text' do + before { redis.sadd 'antispam:spammy_texts', 'https://banned.example' } + + context 'when status matches' do + let(:status) { Fabricate :status, text: 'I use https://banned.example urls in my text' } + + it 'raises error and reports' do + expect { subject } + .to raise_error(described_class::SilentlyDrop) + .and change(spam_reports, :count).by(1) + end + + context 'when report already exists' do + before { Fabricate :report, account: Account.representative, target_account: status.account } + + it 'raises error and does not report' do + expect { subject } + .to raise_error(described_class::SilentlyDrop) + .and not_change(spam_reports, :count) + end + end + + def spam_reports + Account.representative.reports.where(target_account: status.account).spam + end + end + + context 'when status does not match' do + it { is_expected.to be_nil } + end + end + end +end From ac0581fd220b0c67d887de21773c78361dcbdf8a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:36:38 +0200 Subject: [PATCH 39/64] Update devDependencies (non-major) (#35660) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput --- .storybook/static/mockServiceWorker.js | 2 +- CHANGELOG.md | 2 - .../styles/mastodon/css_variables.scss | 3 +- yarn.lock | 349 +++++++++--------- 4 files changed, 170 insertions(+), 186 deletions(-) diff --git a/.storybook/static/mockServiceWorker.js b/.storybook/static/mockServiceWorker.js index de7bc0f292..be4527c7ee 100644 --- a/.storybook/static/mockServiceWorker.js +++ b/.storybook/static/mockServiceWorker.js @@ -7,7 +7,7 @@ * - Please do NOT modify this file. */ -const PACKAGE_VERSION = '2.10.2' +const PACKAGE_VERSION = '2.10.4' const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() diff --git a/CHANGELOG.md b/CHANGELOG.md index b3af469bb3..a6684e2067 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -583,7 +583,6 @@ The following changelog entries focus on changes visible to users, administrator You can now separately filter or drop notifications from people you don't follow, people who don't follow you, accounts created within the past 30 days, as well as unsolicited private mentions, and accounts limited by the moderation.\ Instead of being outright dropped, notifications that you chose to filter are put in a separate “Filtered notifications” box that you can review separately without it clogging your main notifications.\ This adds the following REST API endpoints: - - `GET /api/v2/notifications/policy`: https://docs.joinmastodon.org/methods/notifications/#get-policy - `PATCH /api/v2/notifications/policy`: https://docs.joinmastodon.org/methods/notifications/#update-the-filtering-policy-for-notifications - `GET /api/v1/notifications/requests`: https://docs.joinmastodon.org/methods/notifications/#get-requests @@ -595,7 +594,6 @@ The following changelog entries focus on changes visible to users, administrator - `GET /api/v1/notifications/requests/merged`: https://docs.joinmastodon.org/methods/notifications/#requests-merged In addition, accepting one or more notification requests generates a new streaming event: - - `notifications_merged`: an event of this type indicates accepted notification requests have finished merging, and the notifications list should be refreshed - **Add notifications of severed relationships** (#27511, #29665, #29668, #29670, #29700, #29714, #29712, and #29731 by @ClearlyClaire and @Gargron)\ diff --git a/app/javascript/styles/mastodon/css_variables.scss b/app/javascript/styles/mastodon/css_variables.scss index 16ed033b96..7f27c12f77 100644 --- a/app/javascript/styles/mastodon/css_variables.scss +++ b/app/javascript/styles/mastodon/css_variables.scss @@ -5,7 +5,8 @@ :root { --dropdown-border-color: #{lighten($ui-base-color, 4%)}; --dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)}; - --dropdown-shadow: 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)}, + --dropdown-shadow: + 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)}, 0 8px 10px -6px #{rgba($base-shadow-color, 0.25)}; --modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)}; --modal-background-variant-color: #{rgba($ui-base-color, 0.7)}; diff --git a/yarn.lock b/yarn.lock index 2c9c9c2366..0293865ca2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1295,7 +1295,7 @@ __metadata: languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^4.0.2, @csstools/media-query-list-parser@npm:^4.0.3": +"@csstools/media-query-list-parser@npm:^4.0.3": version: 4.0.3 resolution: "@csstools/media-query-list-parser@npm:4.0.3" peerDependencies: @@ -2262,17 +2262,14 @@ __metadata: linkType: hard "@formatjs/cli@npm:^6.1.1": - version: 6.3.14 - resolution: "@formatjs/cli@npm:6.3.14" + version: 6.7.2 + resolution: "@formatjs/cli@npm:6.7.2" peerDependencies: - "@glimmer/env": ^0.1.7 - "@glimmer/reference": ^0.91.1 || ^0.92.0 || ^0.93.0 - "@glimmer/syntax": ^0.92.0 || ^0.93.0 - "@glimmer/validator": ^0.92.0 || ^0.93.0 - "@vue/compiler-core": ^3.4.0 - content-tag: ^2.0.1 || ^3.0.0 - ember-template-recast: ^6.1.4 - vue: ^3.4.0 + "@glimmer/syntax": ^0.94.9 + "@vue/compiler-core": ^3.5.12 + content-tag: ^3.0.0 + ember-template-recast: ^6.1.5 + vue: ^3.5.12 peerDependenciesMeta: "@glimmer/env": optional: true @@ -2292,7 +2289,7 @@ __metadata: optional: true bin: formatjs: bin/formatjs - checksum: 10c0/b4c83ed7fdc8dcd48b2f48fa9cca65b52472fb096eb028517a872f8a71ed3964f4b0a6bbc607f821a9504f396fe7341ef4d9ad44a381a37f280ed7547de66f41 + checksum: 10c0/fbcb1d35915a5b1542e4fa3f3f79e23fa5988681e6c238d7e8a3d4d32e18df3e5c36cebe01b04e011bb5c91f96f4d08d36af750259aa799d3e81943084e2f0c2 languageName: node linkType: hard @@ -2595,12 +2592,10 @@ __metadata: languageName: node linkType: hard -"@keyv/serialize@npm:^1.0.3": - version: 1.0.3 - resolution: "@keyv/serialize@npm:1.0.3" - dependencies: - buffer: "npm:^6.0.3" - checksum: 10c0/24a257870b0548cfe430680c2ae1641751e6a6ec90c573eaf51bfe956839b6cfa462b4d2827157363b6d620872d32d69fa2f37210a864ba488f8ec7158436398 +"@keyv/serialize@npm:^1.1.0": + version: 1.1.0 + resolution: "@keyv/serialize@npm:1.1.0" + checksum: 10c0/30e34adf4fff52374c2c531e3ff215eed6414350ee56eebcb98c422feaff171b4900c73082a72399a6bfbc5ce60fbb6f968594110c960521923499146bc68c20 languageName: node linkType: hard @@ -3476,37 +3471,37 @@ __metadata: linkType: hard "@storybook/addon-a11y@npm:^9.1.1": - version: 9.1.1 - resolution: "@storybook/addon-a11y@npm:9.1.1" + version: 9.1.2 + resolution: "@storybook/addon-a11y@npm:9.1.2" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^9.1.1 - checksum: 10c0/bf5eba0a51ffec20c8c4432985494295115bcf48e0807e4ca21314845d4aaaaaae9122d4be4f78a2fc4c15caa5e1207c01e118724c2cbecbd80aa8a5f6826924 + storybook: ^9.1.2 + checksum: 10c0/36fc399db0af0acff6542c7e2aa54ef715dcff0e8a7f12fec3468dfdee2d83651c1d02c7226a420269d18f522dbaa96fa6faacb9c647c2a65518cece9d38582b languageName: node linkType: hard "@storybook/addon-docs@npm:^9.1.1": - version: 9.1.1 - resolution: "@storybook/addon-docs@npm:9.1.1" + version: 9.1.2 + resolution: "@storybook/addon-docs@npm:9.1.2" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:9.1.1" + "@storybook/csf-plugin": "npm:9.1.2" "@storybook/icons": "npm:^1.4.0" - "@storybook/react-dom-shim": "npm:9.1.1" + "@storybook/react-dom-shim": "npm:9.1.2" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.1 - checksum: 10c0/92b3ac089a38b892319de5ec02ca4ae477e38d88aef8561f6cbb1f15dd69ad856c194fca4514c783983baba063f428994a7d7f2aed98204b931f8e684e681194 + storybook: ^9.1.2 + checksum: 10c0/b17a3a8d3b9ad70f7cd8f8295f8cf7a10a6c39ab69e752f3acfb2260809055f85088a6382a2fc729b48860854b94a67faca239ff00bbe0e7e9553113cb2542fb languageName: node linkType: hard "@storybook/addon-vitest@npm:^9.1.1": - version: 9.1.1 - resolution: "@storybook/addon-vitest@npm:9.1.1" + version: 9.1.2 + resolution: "@storybook/addon-vitest@npm:9.1.2" dependencies: "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^1.4.0" @@ -3515,7 +3510,7 @@ __metadata: peerDependencies: "@vitest/browser": ^3.0.0 "@vitest/runner": ^3.0.0 - storybook: ^9.1.1 + storybook: ^9.1.2 vitest: ^3.0.0 peerDependenciesMeta: "@vitest/browser": @@ -3524,31 +3519,31 @@ __metadata: optional: true vitest: optional: true - checksum: 10c0/a4770aad2f3e4ae10e3d7ae7083354e98287d095644aae87af62c59c9a97ec7e57cf25620c32e2e5f9261a3686a6efabea0a830061500f63e78a49a2bac6f130 + checksum: 10c0/75eacf6757d9ab6d0ad8c496d55a1548ab67f098a7ceb431900e8b6eb98ac8ac2235382a44a26765607be07e1b09c0e2a34ee9b846c234da6073d38aabc0ea4d languageName: node linkType: hard -"@storybook/builder-vite@npm:9.1.1": - version: 9.1.1 - resolution: "@storybook/builder-vite@npm:9.1.1" +"@storybook/builder-vite@npm:9.1.2": + version: 9.1.2 + resolution: "@storybook/builder-vite@npm:9.1.2" dependencies: - "@storybook/csf-plugin": "npm:9.1.1" + "@storybook/csf-plugin": "npm:9.1.2" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.1 + storybook: ^9.1.2 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/334235a64e05d6fb1e1cdf23f41ac211d1e55429e425e1aea33d9b4469503aa328eb5d9cad24e6328b392098afb2c884943d2c304c1eb3cf55ce25dcc3ad4414 + checksum: 10c0/2411e593903bc61336f2a2c6f48e7314dcc8c776346eff0f6fec28e9fc8e3a90d3f8d6561f30d1caf490349d34c7690f8addf4c56fa1fd778f0dfda49cf3aa97 languageName: node linkType: hard -"@storybook/csf-plugin@npm:9.1.1": - version: 9.1.1 - resolution: "@storybook/csf-plugin@npm:9.1.1" +"@storybook/csf-plugin@npm:9.1.2": + version: 9.1.2 + resolution: "@storybook/csf-plugin@npm:9.1.2" dependencies: unplugin: "npm:^1.3.1" peerDependencies: - storybook: ^9.1.1 - checksum: 10c0/d29b5685ef79eacbcd891977f95a58238f104004b014f88ee59eab6e5995df31010435aa222a27cdf54056accc43239c44f7e8e461c263c60b09d7d2383be8b8 + storybook: ^9.1.2 + checksum: 10c0/a145da545844b9b2af345d43d8f2c035dd801bd6414b4a9a2037dfa950250d08133a956226c49c36a79ffda171ad9388a0f1621c04cfed77e5c342817f4a275e languageName: node linkType: hard @@ -3569,25 +3564,25 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:9.1.1": - version: 9.1.1 - resolution: "@storybook/react-dom-shim@npm:9.1.1" +"@storybook/react-dom-shim@npm:9.1.2": + version: 9.1.2 + resolution: "@storybook/react-dom-shim@npm:9.1.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.1 - checksum: 10c0/ea2725719e04871b56c0a3755a7791034abd1d8ebb51392ed5f1eb2d21aee873444080509efe69c919e43121c299e06e2266d603478d059efe38762b0ae96ae5 + storybook: ^9.1.2 + checksum: 10c0/7547cb0fdcf8098c00017cbfb501f11a34ae73b9e13984520b8143e709b4b8ec1acf7fed9ce51dbb5b5af5dcd657396da17ef1f262f60efdd4956f3e26b3c704 languageName: node linkType: hard "@storybook/react-vite@npm:^9.1.1": - version: 9.1.1 - resolution: "@storybook/react-vite@npm:9.1.1" + version: 9.1.2 + resolution: "@storybook/react-vite@npm:9.1.2" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:9.1.1" - "@storybook/react": "npm:9.1.1" + "@storybook/builder-vite": "npm:9.1.2" + "@storybook/react": "npm:9.1.2" find-up: "npm:^7.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -3596,27 +3591,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.1 + storybook: ^9.1.2 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/fa79e5a9be38f229a8cc0db85452e651081740cd3f9e6951c0fc3e195437124f8a792494b90a613c673ef9410d565d5f459276e157f073367ea28f0293d10167 + checksum: 10c0/afed36a0219599577b255042a9c9ac1af0106003ac37e2e9b5846a42b4e8729ff0e8b7ae6018d3ac85b69e918c2a20d554cd484de7345e5fb4974df92914e059 languageName: node linkType: hard -"@storybook/react@npm:9.1.1": - version: 9.1.1 - resolution: "@storybook/react@npm:9.1.1" +"@storybook/react@npm:9.1.2": + version: 9.1.2 + resolution: "@storybook/react@npm:9.1.2" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:9.1.1" + "@storybook/react-dom-shim": "npm:9.1.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.1 + storybook: ^9.1.2 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/343598e9c1bb2e53b7d6eaaa50b5c024c109fb825f6f4869a82da0ccd428400e5a93eba494e810f6bfbf6bff9b73810595ab8ffdd1530df8b4f2b20e617623e3 + checksum: 10c0/ea3d9fa25825fde5022942579db9a57154e57cb37244b0d54bb189679a37f20c20906041898f5fcfd4867043ea789384c2d968f334f9d0c55958add0b18fb6ea languageName: node linkType: hard @@ -5402,13 +5397,6 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - "better-opn@npm:^3.0.2": version: 3.0.2 resolution: "better-opn@npm:3.0.2" @@ -5528,16 +5516,6 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.2.1" - checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 - languageName: node - linkType: hard - "bufferutil@npm:^4.0.7": version: 4.0.9 resolution: "bufferutil@npm:4.0.9" @@ -5582,13 +5560,13 @@ __metadata: languageName: node linkType: hard -"cacheable@npm:^1.9.0": - version: 1.9.0 - resolution: "cacheable@npm:1.9.0" +"cacheable@npm:^1.10.3": + version: 1.10.3 + resolution: "cacheable@npm:1.10.3" dependencies: - hookified: "npm:^1.8.2" - keyv: "npm:^5.3.3" - checksum: 10c0/1ca171dd2f7c3a929d84b3f94e712cb8fbbfb7c636f19ba01657cf89c6ea4316f21f2beb6c696fa5c87d42f52620f4a7c2dfecb41bf71ee3b249d539895256c4 + hookified: "npm:^1.10.0" + keyv: "npm:^5.4.0" + checksum: 10c0/eaa483140133b58dbd5c9811688137016c263a874886ce98f9590d252fb92859633929b36aa4c05ec67aee70cc1c9ba9aa1be02e53365604dd0202a88e44fef8 languageName: node linkType: hard @@ -5678,10 +5656,10 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.4.1": - version: 5.4.1 - resolution: "chalk@npm:5.4.1" - checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef +"chalk@npm:^5.5.0": + version: 5.5.0 + resolution: "chalk@npm:5.5.0" + checksum: 10c0/23063b544f7c2fe57d25ff814807de561f8adfff72e4f0051051eaa606f772586470507ccd38d89166300eeaadb0164acde8bb8a0716a0f2d56ccdf3761d5e4f languageName: node linkType: hard @@ -5864,10 +5842,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:^13.1.0": - version: 13.1.0 - resolution: "commander@npm:13.1.0" - checksum: 10c0/7b8c5544bba704fbe84b7cab2e043df8586d5c114a4c5b607f83ae5060708940ed0b5bd5838cf8ce27539cde265c1cbd59ce3c8c6b017ed3eec8943e3a415164 +"commander@npm:^14.0.0": + version: 14.0.0 + resolution: "commander@npm:14.0.0" + checksum: 10c0/73c4babfa558077868d84522b11ef56834165d472b9e86a634cd4c3ae7fc72d59af6377d8878e06bd570fe8f3161eced3cbe383c38f7093272bb65bd242b595b languageName: node linkType: hard @@ -6217,7 +6195,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.1": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -7309,9 +7287,9 @@ __metadata: linkType: hard "fake-indexeddb@npm:^6.0.1": - version: 6.0.1 - resolution: "fake-indexeddb@npm:6.0.1" - checksum: 10c0/60f4ccdfd5ecb37bb98019056c688366847840cce7146e0005c5ca54823238455403b0a8803b898a11cf80f6147b1bb553457c6af427a644a6e64566cdbe42ec + version: 6.1.0 + resolution: "fake-indexeddb@npm:6.1.0" + checksum: 10c0/f2bae6cf3ed38619ccc536ee1c0d72a1ba721da24d840e9c0993800c031a5c1d8e61adc00ea31f0c2a2380447c57bc953bd4128b08dabf559c7cdf03c8893239 languageName: node linkType: hard @@ -7412,12 +7390,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^10.0.8": - version: 10.1.0 - resolution: "file-entry-cache@npm:10.1.0" +"file-entry-cache@npm:^10.1.3": + version: 10.1.3 + resolution: "file-entry-cache@npm:10.1.3" dependencies: - flat-cache: "npm:^6.1.9" - checksum: 10c0/9464848577f68809237ffdf11c09a285d930ed4cda8cf392ee44ac8fa70658e41bbe60d08d883285d6af798a26f008dd8dfa94a31d42ecf1ba5a7bcd6dd8b07d + flat-cache: "npm:^6.1.12" + checksum: 10c0/7365c3358698f5ccf085c164989ad48f1d9341157895577d7c34bf4f9c258d2410f4d2c749c73232111aab9e2fdd632ef6941f2c2d3acdd3a7f3daf2c840bd54 languageName: node linkType: hard @@ -7501,14 +7479,14 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^6.1.9": - version: 6.1.9 - resolution: "flat-cache@npm:6.1.9" +"flat-cache@npm:^6.1.12": + version: 6.1.12 + resolution: "flat-cache@npm:6.1.12" dependencies: - cacheable: "npm:^1.9.0" + cacheable: "npm:^1.10.3" flatted: "npm:^3.3.3" - hookified: "npm:^1.8.2" - checksum: 10c0/ca9241fab68154e9a4efe8875beff43cb7b2de65628d15dcf8488dc69bca3f8e98085a707c3395d03b1022f586364b0f37aa5dd5cc085a8cf7481516757ac864 + hookified: "npm:^1.10.0" + checksum: 10c0/9c7e22ebc68edef373170a2171fe4d7d68eecd18953fbd16f5f3e9c32c36491b61ab0468e07242a5bbed58b36d139a41d3c33b23fc013fc535a41b00546c14f0 languageName: node linkType: hard @@ -8021,10 +7999,10 @@ __metadata: languageName: node linkType: hard -"hookified@npm:^1.8.2": - version: 1.9.0 - resolution: "hookified@npm:1.9.0" - checksum: 10c0/28145882504e40ef58f328554966520c56dc2aaca92457996a5cd68fda6f92e38d3ca283e7ebbf3d71f36cda887234ce580abfa6532ade906be7810a812f15fa +"hookified@npm:^1.10.0": + version: 1.11.0 + resolution: "hookified@npm:1.11.0" + checksum: 10c0/c74d28e90c55247ffc036a5cabd0681e715f50db8c6b1f47e10253b577e355f3dcd71bb96565a23467f72a8695ec2d482e5801e2d9d99ac24bdc179fef635ba0 languageName: node linkType: hard @@ -8146,13 +8124,6 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - "ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -8160,7 +8131,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0, ignore@npm:^7.0.3": +"ignore@npm:^7.0.0, ignore@npm:^7.0.5": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d @@ -8986,12 +8957,12 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^5.3.3": - version: 5.3.3 - resolution: "keyv@npm:5.3.3" +"keyv@npm:^5.4.0": + version: 5.5.0 + resolution: "keyv@npm:5.5.0" dependencies: - "@keyv/serialize": "npm:^1.0.3" - checksum: 10c0/6b9064d061784e80a5dc500453b03cacb099f06fddd0346063519371d563a66771237e04467f3387b60d8a33a3c99864288991274921fb1338c6adf638574924 + "@keyv/serialize": "npm:^1.1.0" + checksum: 10c0/2db63fd2abcdf71929f032569673b6edd0de111edb012411658e2589dc5f49793a98aecd56c67fafda3f90a31f32e35555a97f8621040728260c66ad8daeea48 languageName: node linkType: hard @@ -9016,6 +8987,13 @@ __metadata: languageName: node linkType: hard +"known-css-properties@npm:^0.37.0": + version: 0.37.0 + resolution: "known-css-properties@npm:0.37.0" + checksum: 10c0/e0ec08cae580e8833254b690971f73ec6f78ac461820a3c755b4a0b62c5b871501753b4aa60b30576a0f621ba44b231235cf9f35ab89e2e7de5448dfe0600241 + languageName: node + linkType: hard + "lande@npm:^1.0.10": version: 1.0.10 resolution: "lande@npm:1.0.10" @@ -9073,28 +9051,28 @@ __metadata: linkType: hard "lint-staged@npm:^16.0.0": - version: 16.0.0 - resolution: "lint-staged@npm:16.0.0" + version: 16.1.5 + resolution: "lint-staged@npm:16.1.5" dependencies: - chalk: "npm:^5.4.1" - commander: "npm:^13.1.0" - debug: "npm:^4.4.0" + chalk: "npm:^5.5.0" + commander: "npm:^14.0.0" + debug: "npm:^4.4.1" lilconfig: "npm:^3.1.3" - listr2: "npm:^8.3.3" + listr2: "npm:^9.0.1" micromatch: "npm:^4.0.8" - nano-spawn: "npm:^1.0.0" + nano-spawn: "npm:^1.0.2" pidtree: "npm:^0.6.0" string-argv: "npm:^0.3.2" - yaml: "npm:^2.7.1" + yaml: "npm:^2.8.1" bin: lint-staged: bin/lint-staged.js - checksum: 10c0/8778dbe7892bbf14e378d612d1649c1e3df38a8ddf14cf35962b6e8a962be72efb1ebb48a697e38366be97d25b8d2599cad3c26ac5afc0d0460452484e27924d + checksum: 10c0/771e7be871f1d74ed09ef4e4eae5f835ed962965db7709be26cccf71bef8fed34f8d5d92f193b2a6fad32c12d955850aa74008e6180fabea8a7a6666cba2ac39 languageName: node linkType: hard -"listr2@npm:^8.3.3": - version: 8.3.3 - resolution: "listr2@npm:8.3.3" +"listr2@npm:^9.0.1": + version: 9.0.1 + resolution: "listr2@npm:9.0.1" dependencies: cli-truncate: "npm:^4.0.0" colorette: "npm:^2.0.20" @@ -9102,7 +9080,7 @@ __metadata: log-update: "npm:^6.1.0" rfdc: "npm:^1.4.1" wrap-ansi: "npm:^9.0.0" - checksum: 10c0/0792f8a7fd482fa516e21689e012e07081cab3653172ca606090622cfa0024c784a1eba8095a17948a0e9a4aa98a80f7c9c90f78a0dd35173d6802f9cc123a82 + checksum: 10c0/73462e84a3c4f05de5a3cdea5eaa0209c6ab04a2fdb4046545049806e9ba17b6ee84a097ebf7ffc0e903b0f2a9094c0c480cd2f2bb21d7d21e20969e17a3c32b languageName: node linkType: hard @@ -9588,8 +9566,8 @@ __metadata: linkType: hard "msw@npm:^2.10.2": - version: 2.10.2 - resolution: "msw@npm:2.10.2" + version: 2.10.4 + resolution: "msw@npm:2.10.4" dependencies: "@bundled-es-modules/cookie": "npm:^2.0.1" "@bundled-es-modules/statuses": "npm:^1.0.1" @@ -9616,7 +9594,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: 10c0/fb44961e17e12864b4764b4c015f6ce7c907081f8dcd237ecd635eab00b787847406fbd36a2bcf2ef4c21114a3610ac03c7f93f3080f509a69b0c1c5285fd683 + checksum: 10c0/48dff36c7cf8ad504bb8f8a2ff6946cf5727752c140681eb68da00991d9fe56224bace970476771a9fffae136256c389c591d71368a6967d053dbad6b6df3346 languageName: node linkType: hard @@ -9627,10 +9605,10 @@ __metadata: languageName: node linkType: hard -"nano-spawn@npm:^1.0.0": - version: 1.0.1 - resolution: "nano-spawn@npm:1.0.1" - checksum: 10c0/e03edc6971f653bc4651f2413b2011772a7c18797c0a4e986ff8eaea3adf4f017697d4d494ffb4ba6bce907b42abbeb0f7f681dbf336c84a324c940fb64c1dec +"nano-spawn@npm:^1.0.2": + version: 1.0.2 + resolution: "nano-spawn@npm:1.0.2" + checksum: 10c0/d8cec78f127a44aa5e38be01746b3d963a8dcf8b00b4a05bf259b5369af2225b8c7dc9d12517050b90234e5c3eeea4ece5d18a5f9c6c3462b56f9f595f07e632 languageName: node linkType: hard @@ -10278,8 +10256,8 @@ __metadata: linkType: hard "pino-pretty@npm:^13.0.0": - version: 13.0.0 - resolution: "pino-pretty@npm:13.0.0" + version: 13.1.1 + resolution: "pino-pretty@npm:13.1.1" dependencies: colorette: "npm:^2.0.7" dateformat: "npm:^4.6.3" @@ -10291,12 +10269,12 @@ __metadata: on-exit-leak-free: "npm:^2.1.0" pino-abstract-transport: "npm:^2.0.0" pump: "npm:^3.0.0" - secure-json-parse: "npm:^2.4.0" + secure-json-parse: "npm:^4.0.0" sonic-boom: "npm:^4.0.1" - strip-json-comments: "npm:^3.1.1" + strip-json-comments: "npm:^5.0.2" bin: pino-pretty: bin.js - checksum: 10c0/015dac25006c1b9820b9e01fccb8a392a019e12b30e6bfc3f3f61ecca8dbabcd000a8f3f64410b620b7f5d08579ba85e6ef137f7fbeaad70d46397a97a5f75ea + checksum: 10c0/845c07afd3d73cb96ad2049cfa7fca12b8280a51e30d6db8b490857690637556bb8e7f05b2fa640b3e4a7edd9b1369110042d670fda743ef98fe3be29876c8c7 languageName: node linkType: hard @@ -10328,27 +10306,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.54.1": - version: 1.54.1 - resolution: "playwright-core@npm:1.54.1" +"playwright-core@npm:1.54.2": + version: 1.54.2 + resolution: "playwright-core@npm:1.54.2" bin: playwright-core: cli.js - checksum: 10c0/b821262b024d7753b1bfa71eb2bc99f2dda12a869d175b2e1bc6ac2764bd661baf36d9d42f45caf622854ad7e4a6077b9b57014c74bb5a78fe339c9edf1c9019 + checksum: 10c0/44850e20bf35237c8c3dedf1096c655f8af939dde53c5469f72cae3dd744966858a302419b909a73d7a2093323123e7ebcc0fdd55151b4193afb7812c1fd2c88 languageName: node linkType: hard "playwright@npm:^1.54.1": - version: 1.54.1 - resolution: "playwright@npm:1.54.1" + version: 1.54.2 + resolution: "playwright@npm:1.54.2" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.54.1" + playwright-core: "npm:1.54.2" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/c5fedae31a03a1f4c4846569aef3ffb98da23000a4d255abfc8c2ede15b43cc7cd87b80f6fa078666c030373de8103787cf77ef7653ae9458aabbbd4320c2599 + checksum: 10c0/6f642fa70179eee5d5bf8a90df2a6147c9638ff926f4f3ad0a0517396b8a3fe00ccebf13377e032a75b3f0b2610ec1562293e0cfc3bde234181c7a50af8af80a languageName: node linkType: hard @@ -10772,7 +10750,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.5.3, postcss@npm:^8.5.6": +"postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -10821,11 +10799,11 @@ __metadata: linkType: hard "prettier@npm:^3.3.3": - version: 3.4.2 - resolution: "prettier@npm:3.4.2" + version: 3.6.2 + resolution: "prettier@npm:3.6.2" bin: prettier: bin/prettier.cjs - checksum: 10c0/99e076a26ed0aba4ebc043880d0f08bbb8c59a4c6641cdee6cdadf2205bdd87aa1d7823f50c3aea41e015e99878d37c58d7b5f0e663bba0ef047f94e36b96446 + checksum: 10c0/488cb2f2b99ec13da1e50074912870217c11edaddedeadc649b1244c749d15ba94e846423d062e2c4c9ae683e2d65f754de28889ba06e697ac4f988d44f45812 languageName: node linkType: hard @@ -12030,10 +12008,10 @@ __metadata: languageName: node linkType: hard -"secure-json-parse@npm:^2.4.0": - version: 2.7.0 - resolution: "secure-json-parse@npm:2.7.0" - checksum: 10c0/f57eb6a44a38a3eeaf3548228585d769d788f59007454214fab9ed7f01fbf2e0f1929111da6db28cf0bcc1a2e89db5219a59e83eeaec3a54e413a0197ce879e4 +"secure-json-parse@npm:^4.0.0": + version: 4.0.0 + resolution: "secure-json-parse@npm:4.0.0" + checksum: 10c0/1a298cf00e1de91e833cee5eb406d6e77fb2f7eca9bef3902047d49e7f5d3e6c21b5de61ff73466c831e716430bfe87d732a6e645a7dabb5f1e8a8e4d3e15eb4 languageName: node linkType: hard @@ -12527,8 +12505,8 @@ __metadata: linkType: hard "storybook@npm:^9.1.1": - version: 9.1.1 - resolution: "storybook@npm:9.1.1" + version: 9.1.2 + resolution: "storybook@npm:9.1.2" dependencies: "@storybook/global": "npm:^5.0.0" "@testing-library/jest-dom": "npm:^6.6.3" @@ -12549,7 +12527,7 @@ __metadata: optional: true bin: storybook: ./bin/index.cjs - checksum: 10c0/efd2665547dc6bfd4cabd00ee1a6368c7cec27a3e4c16bc875ae06bb5d9ee74120c11102699165530f31fe8becb47212d80632b1fefcafa60fef94b3cd0bf50f + checksum: 10c0/3a575f94913f9000a3591e5c685f4eabf75fa78ce306f8b0d48e9c72e46028df31f6d15955b8a338be2bf48dadca6550b65782783d8b3cb4b737ba9f3887d007 languageName: node linkType: hard @@ -12757,6 +12735,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:^5.0.2": + version: 5.0.3 + resolution: "strip-json-comments@npm:5.0.3" + checksum: 10c0/daaf20b29f69fb51112698f4a9a662490dbb78d5baf6127c75a0a83c2ac6c078a8c0f74b389ad5e0519d6fc359c4a57cb9971b1ae201aef62ce45a13247791e0 + languageName: node + linkType: hard + "strip-literal@npm:^3.0.0": version: 3.0.0 resolution: "strip-literal@npm:3.0.0" @@ -12850,12 +12835,12 @@ __metadata: linkType: hard "stylelint@npm:^16.19.1": - version: 16.19.1 - resolution: "stylelint@npm:16.19.1" + version: 16.23.1 + resolution: "stylelint@npm:16.23.1" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - "@csstools/media-query-list-parser": "npm:^4.0.2" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" "@csstools/selector-specificity": "npm:^5.0.0" "@dual-bundle/import-meta-resolve": "npm:^4.1.0" balanced-match: "npm:^2.0.0" @@ -12863,24 +12848,24 @@ __metadata: cosmiconfig: "npm:^9.0.0" css-functions-list: "npm:^3.2.3" css-tree: "npm:^3.1.0" - debug: "npm:^4.3.7" + debug: "npm:^4.4.1" fast-glob: "npm:^3.3.3" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^10.0.8" + file-entry-cache: "npm:^10.1.3" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" html-tags: "npm:^3.3.1" - ignore: "npm:^7.0.3" + ignore: "npm:^7.0.5" imurmurhash: "npm:^0.1.4" is-plain-object: "npm:^5.0.0" - known-css-properties: "npm:^0.36.0" + known-css-properties: "npm:^0.37.0" mathml-tag-names: "npm:^2.1.3" meow: "npm:^13.2.0" micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.1.1" - postcss: "npm:^8.5.3" + postcss: "npm:^8.5.6" postcss-resolve-nested-selector: "npm:^0.1.6" postcss-safe-parser: "npm:^7.0.1" postcss-selector-parser: "npm:^7.1.0" @@ -12893,7 +12878,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/e633f323ff730e8f2ac982067e4caa9a6c98b81a519e7adff96fa7a7d047f68a24c0dd2d81f3511b0943d99c915f20f19da911d16d47336705ea70d46e960c89 + checksum: 10c0/18d01587396cce68b59e4a89a7c89d5eb7e76ee7cc27dd109b0f8f241625eb0ffe87763f67b2d20df0f23a243443591fa2514300311a48a945bd6a3bc14db36b languageName: node linkType: hard @@ -14545,12 +14530,12 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.7.1": - version: 2.8.0 - resolution: "yaml@npm:2.8.0" +"yaml@npm:^2.8.1": + version: 2.8.1 + resolution: "yaml@npm:2.8.1" bin: yaml: bin.mjs - checksum: 10c0/f6f7310cf7264a8107e72c1376f4de37389945d2fb4656f8060eca83f01d2d703f9d1b925dd8f39852a57034fafefde6225409ddd9f22aebfda16c6141b71858 + checksum: 10c0/7c587be00d9303d2ae1566e03bc5bc7fe978ba0d9bf39cc418c3139d37929dfcb93a230d9749f2cb578b6aa5d9ebebc322415e4b653cb83acd8bc0bc321707f3 languageName: node linkType: hard From b0ce1ce49dd48a47439a3127bbf12b44d7c30cf1 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Aug 2025 15:35:19 +0200 Subject: [PATCH 40/64] Fix `tootctl admin create` not bypassing reserved username checks (#35779) --- app/models/account.rb | 2 +- spec/lib/mastodon/cli/accounts_spec.rb | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/models/account.rb b/app/models/account.rb index c23549c22d..5fa1f0cebf 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -116,7 +116,7 @@ class Account < ApplicationRecord # Local user validations validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: USERNAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_username? && !actor_type_application? } - validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && !actor_type_application? } + validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? && !actor_type_application? && !user&.bypass_registration_checks } validates :display_name, length: { maximum: DISPLAY_NAME_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_display_name? } validates :note, note_length: { maximum: NOTE_LENGTH_LIMIT }, if: -> { local? && will_save_change_to_note? } validates :fields, length: { maximum: DEFAULT_FIELDS_SIZE }, if: -> { local? && will_save_change_to_fields? } diff --git a/spec/lib/mastodon/cli/accounts_spec.rb b/spec/lib/mastodon/cli/accounts_spec.rb index e60f5a0cf7..111703a18b 100644 --- a/spec/lib/mastodon/cli/accounts_spec.rb +++ b/spec/lib/mastodon/cli/accounts_spec.rb @@ -32,6 +32,7 @@ RSpec.describe Mastodon::CLI::Accounts do describe '#create' do let(:action) { :create } + let(:username) { 'tootctl_username' } shared_examples 'a new user with given email address and username' do it 'creates user and accounts from options and displays success message' do @@ -48,18 +49,24 @@ RSpec.describe Mastodon::CLI::Accounts do end def account_from_options - Account.find_local('tootctl_username') + Account.find_local(username) end end context 'when required USERNAME and --email are provided' do - let(:arguments) { ['tootctl_username'] } + let(:arguments) { [username] } context 'with USERNAME and --email only' do let(:options) { { email: 'tootctl@example.com' } } it_behaves_like 'a new user with given email address and username' + context 'with a reserved username' do + let(:username) { 'security' } + + it_behaves_like 'a new user with given email address and username' + end + context 'with invalid --email value' do let(:options) { { email: 'invalid' } } From a2cddb9eac8e654edb504c2f6ce9599b337d706d Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 14 Aug 2025 15:58:25 +0200 Subject: [PATCH 41/64] Disallow making private posts quotable (#35780) --- .../status/interaction_policy_concern.rb | 8 ++++++ .../v1/statuses/interaction_policies_spec.rb | 26 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/app/models/concerns/status/interaction_policy_concern.rb b/app/models/concerns/status/interaction_policy_concern.rb index 6ad047fd8d..1f57ccd6bb 100644 --- a/app/models/concerns/status/interaction_policy_concern.rb +++ b/app/models/concerns/status/interaction_policy_concern.rb @@ -10,6 +10,10 @@ module Status::InteractionPolicyConcern followed: (1 << 3), }.freeze + included do + before_validation :downgrade_quote_policy, if: -> { local? && !distributable? } + end + def quote_policy_as_keys(kind) case kind when :automatic @@ -52,4 +56,8 @@ module Status::InteractionPolicyConcern :denied end + + def downgrade_quote_policy + self.quote_approval_policy = 0 + end end diff --git a/spec/requests/api/v1/statuses/interaction_policies_spec.rb b/spec/requests/api/v1/statuses/interaction_policies_spec.rb index f2d7eb856e..6b988bb523 100644 --- a/spec/requests/api/v1/statuses/interaction_policies_spec.rb +++ b/spec/requests/api/v1/statuses/interaction_policies_spec.rb @@ -90,5 +90,31 @@ RSpec.describe 'Interaction policies', feature: :outgoing_quotes do .to_not have_enqueued_sidekiq_job end end + + context 'when trying to change the interaction policy of a private post' do + let(:status) { Fabricate(:status, account: user.account, visibility: :private) } + let(:params) { { quote_approval_policy: 'public' } } + + it 'keeps the interaction policy, returns the status, and does not schedule distribution jobs' do + expect { subject } + .to_not(change { status.reload.quote_approval_policy }.from(0)) + + expect(response).to have_http_status(200) + expect(response.content_type) + .to start_with('application/json') + expect(response.parsed_body).to include( + 'quote_approval' => match( + 'automatic' => [], + 'manual' => [], + 'current_user' => 'automatic' + ) + ) + + expect(DistributionWorker) + .to_not have_enqueued_sidekiq_job + expect(ActivityPub::StatusUpdateDistributionWorker) + .to_not have_enqueued_sidekiq_job + end + end end end From 651e51a82eba542c4d8c3fec5edd16420ea1ff3e Mon Sep 17 00:00:00 2001 From: Echo Date: Thu, 14 Aug 2025 17:04:32 +0200 Subject: [PATCH 42/64] Allow editing status quote policy (#35762) --- .../mastodon/actions/statuses_typed.ts | 11 +- app/javascript/mastodon/api/statuses.ts | 21 +- app/javascript/mastodon/api_types/quotes.ts | 12 +- app/javascript/mastodon/api_types/statuses.ts | 9 +- .../mastodon/components/dropdown/index.tsx | 114 +++++++ .../mastodon/components/dropdown_selector.tsx | 6 +- .../mastodon/components/status_action_bar.jsx | 12 +- .../mastodon/containers/status_container.jsx | 4 + .../compose/components/privacy_dropdown.jsx | 2 +- .../features/status/components/action_bar.jsx | 12 +- .../mastodon/features/status/index.jsx | 6 + .../features/ui/components/modal_root.jsx | 2 + .../ui/components/visibility_modal.tsx | 293 ++++++++++++++++++ app/javascript/mastodon/locales/en.json | 16 +- app/javascript/mastodon/reducers/statuses.js | 17 + .../mastodon/store/typed_functions.ts | 5 +- app/javascript/mastodon/utils/environment.ts | 6 +- .../styles/mastodon/components.scss | 59 +++- 18 files changed, 591 insertions(+), 16 deletions(-) create mode 100644 app/javascript/mastodon/components/dropdown/index.tsx create mode 100644 app/javascript/mastodon/features/ui/components/visibility_modal.tsx diff --git a/app/javascript/mastodon/actions/statuses_typed.ts b/app/javascript/mastodon/actions/statuses_typed.ts index cc9c389cda..f34d9f2bc3 100644 --- a/app/javascript/mastodon/actions/statuses_typed.ts +++ b/app/javascript/mastodon/actions/statuses_typed.ts @@ -1,8 +1,10 @@ import { createAction } from '@reduxjs/toolkit'; -import { apiGetContext } from 'mastodon/api/statuses'; +import { apiGetContext, apiSetQuotePolicy } from 'mastodon/api/statuses'; import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; +import type { ApiQuotePolicy } from '../api_types/quotes'; + import { importFetchedStatuses } from './importer'; export const fetchContext = createDataLoadingThunk( @@ -23,3 +25,10 @@ export const fetchContext = createDataLoadingThunk( export const completeContextRefresh = createAction<{ statusId: string }>( 'status/context/complete', ); + +export const setStatusQuotePolicy = createDataLoadingThunk( + 'status/setQuotePolicy', + ({ statusId, policy }: { statusId: string; policy: ApiQuotePolicy }) => { + return apiSetQuotePolicy(statusId, policy); + }, +); diff --git a/app/javascript/mastodon/api/statuses.ts b/app/javascript/mastodon/api/statuses.ts index 48eff2a692..123f2759d0 100644 --- a/app/javascript/mastodon/api/statuses.ts +++ b/app/javascript/mastodon/api/statuses.ts @@ -1,5 +1,10 @@ -import api, { getAsyncRefreshHeader } from 'mastodon/api'; -import type { ApiContextJSON } from 'mastodon/api_types/statuses'; +import api, { apiRequestPut, getAsyncRefreshHeader } from 'mastodon/api'; +import type { + ApiContextJSON, + ApiStatusJSON, +} from 'mastodon/api_types/statuses'; + +import type { ApiQuotePolicy } from '../api_types/quotes'; export const apiGetContext = async (statusId: string) => { const response = await api().request({ @@ -12,3 +17,15 @@ export const apiGetContext = async (statusId: string) => { refresh: getAsyncRefreshHeader(response), }; }; + +export const apiSetQuotePolicy = async ( + statusId: string, + policy: ApiQuotePolicy, +) => { + return apiRequestPut( + `v1/statuses/${statusId}/interaction_policy`, + { + quote_approval_policy: policy, + }, + ); +}; diff --git a/app/javascript/mastodon/api_types/quotes.ts b/app/javascript/mastodon/api_types/quotes.ts index 8c0ea10fc3..981c047c13 100644 --- a/app/javascript/mastodon/api_types/quotes.ts +++ b/app/javascript/mastodon/api_types/quotes.ts @@ -1,7 +1,7 @@ import type { ApiStatusJSON } from './statuses'; export type ApiQuoteState = 'accepted' | 'pending' | 'revoked' | 'unauthorized'; -export type ApiQuotePolicy = 'public' | 'followers' | 'nobody'; +export type ApiQuotePolicy = 'public' | 'followers' | 'nobody' | 'unknown'; interface ApiQuoteEmptyJSON { state: Exclude; @@ -21,3 +21,13 @@ interface ApiQuoteAcceptedJSON { } export type ApiQuoteJSON = ApiQuoteAcceptedJSON | ApiQuoteEmptyJSON; + +export interface ApiQuotePolicyJSON { + automatic: ApiQuotePolicy[]; + manual: ApiQuotePolicy[]; + current_user: ApiQuotePolicy; +} + +export function isQuotePolicy(policy: string): policy is ApiQuotePolicy { + return ['public', 'followers', 'nobody'].includes(policy); +} diff --git a/app/javascript/mastodon/api_types/statuses.ts b/app/javascript/mastodon/api_types/statuses.ts index cd0b1001ac..0127f6334b 100644 --- a/app/javascript/mastodon/api_types/statuses.ts +++ b/app/javascript/mastodon/api_types/statuses.ts @@ -4,7 +4,7 @@ import type { ApiAccountJSON } from './accounts'; import type { ApiCustomEmojiJSON } from './custom_emoji'; import type { ApiMediaAttachmentJSON } from './media_attachments'; import type { ApiPollJSON } from './polls'; -import type { ApiQuoteJSON } from './quotes'; +import type { ApiQuoteJSON, ApiQuotePolicyJSON } from './quotes'; // See app/modals/status.rb export type StatusVisibility = @@ -120,9 +120,16 @@ export interface ApiStatusJSON { card?: ApiPreviewCardJSON; poll?: ApiPollJSON; quote?: ApiQuoteJSON; + quote_approval?: ApiQuotePolicyJSON; } export interface ApiContextJSON { ancestors: ApiStatusJSON[]; descendants: ApiStatusJSON[]; } + +export interface ApiStatusSourceJSON { + id: string; + text: string; + spoiler_text: string; +} diff --git a/app/javascript/mastodon/components/dropdown/index.tsx b/app/javascript/mastodon/components/dropdown/index.tsx new file mode 100644 index 0000000000..1e442f8159 --- /dev/null +++ b/app/javascript/mastodon/components/dropdown/index.tsx @@ -0,0 +1,114 @@ +import { useCallback, useId, useMemo, useRef, useState } from 'react'; +import type { ComponentPropsWithoutRef, FC } from 'react'; + +import { FormattedMessage } from 'react-intl'; +import type { MessageDescriptor } from 'react-intl'; + +import classNames from 'classnames'; + +import Overlay from 'react-overlays/Overlay'; + +import type { SelectItem } from '../dropdown_selector'; +import { DropdownSelector } from '../dropdown_selector'; + +interface DropdownProps { + title: string; + disabled?: boolean; + items: SelectItem[]; + onChange: (value: string) => void; + current: string; + emptyText?: MessageDescriptor; + classPrefix: string; +} + +export const Dropdown: FC< + DropdownProps & Omit, keyof DropdownProps> +> = ({ + title, + disabled, + items, + current, + onChange, + classPrefix, + className, + ...buttonProps +}) => { + const buttonRef = useRef(null); + const accessibilityId = useId(); + + const [open, setOpen] = useState(false); + const handleToggle = useCallback(() => { + if (!disabled) { + setOpen((prevOpen) => !prevOpen); + } + }, [disabled]); + const handleClose = useCallback(() => { + setOpen(false); + }, []); + const currentText = useMemo( + () => items.find((i) => i.value === current)?.text, + [current, items], + ); + return ( + <> + + + + {({ props, placement }) => ( +
+
+ +
+
+ )} +
+ + ); +}; diff --git a/app/javascript/mastodon/components/dropdown_selector.tsx b/app/javascript/mastodon/components/dropdown_selector.tsx index 99bbd182e5..9299e7d6bd 100644 --- a/app/javascript/mastodon/components/dropdown_selector.tsx +++ b/app/javascript/mastodon/components/dropdown_selector.tsx @@ -13,8 +13,8 @@ const listenerOptions = supportsPassiveEvents ? { passive: true, capture: true } : true; -export interface SelectItem { - value: string; +export interface SelectItem { + value: Value; icon?: string; iconComponent?: IconProp; text: string; @@ -24,7 +24,7 @@ export interface SelectItem { interface Props { value: string; - classNamePrefix: string; + classNamePrefix?: string; style?: React.CSSProperties; items: SelectItem[]; onChange: (value: string) => void; diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx index 663fc53407..69ca9817a2 100644 --- a/app/javascript/mastodon/components/status_action_bar.jsx +++ b/app/javascript/mastodon/components/status_action_bar.jsx @@ -29,6 +29,7 @@ import { Dropdown } from 'mastodon/components/dropdown_menu'; import { me } from '../initial_state'; import { IconButton } from './icon_button'; +import { isFeatureEnabled } from '../utils/environment'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -68,6 +69,7 @@ const messages = defineMessages({ filter: { id: 'status.filter', defaultMessage: 'Filter this post' }, openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' }, revokeQuote: { id: 'status.revoke_quote', defaultMessage: 'Remove my post from @{name}’s post' }, + quotePolicyChange: { id: 'status.quote_policy_change', defaultMessage: 'Change who can quote' }, }); const mapStateToProps = (state, { status }) => { @@ -89,6 +91,7 @@ class StatusActionBar extends ImmutablePureComponent { onReblog: PropTypes.func, onDelete: PropTypes.func, onRevokeQuote: PropTypes.func, + onQuotePolicyChange: PropTypes.func, onDirect: PropTypes.func, onMention: PropTypes.func, onMute: PropTypes.func, @@ -200,7 +203,11 @@ class StatusActionBar extends ImmutablePureComponent { handleRevokeQuoteClick = () => { this.props.onRevokeQuote(this.props.status); - } + }; + + handleQuotePolicyChange = () => { + this.props.onQuotePolicyChange(this.props.status); + }; handleBlockClick = () => { const { status, relationship, onBlock, onUnblock } = this.props; @@ -291,6 +298,9 @@ class StatusActionBar extends ImmutablePureComponent { if (writtenByMe || withDismiss) { menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); + if (writtenByMe && isFeatureEnabled('outgoing_quotes') && !['private', 'direct'].includes(status.get('visibility'))) { + menu.push({ text: intl.formatMessage(messages.quotePolicyChange), action: this.handleQuotePolicyChange }); + } menu.push(null); } diff --git a/app/javascript/mastodon/containers/status_container.jsx b/app/javascript/mastodon/containers/status_container.jsx index f3bc8fe5ff..7d5c6e4f2f 100644 --- a/app/javascript/mastodon/containers/status_container.jsx +++ b/app/javascript/mastodon/containers/status_container.jsx @@ -115,6 +115,10 @@ const mapDispatchToProps = (dispatch, { contextType }) => ({ dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_status']) }})); }, + onQuotePolicyChange(status) { + dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId: status.get('id') } })); + }, + onEdit (status) { dispatch((_, getState) => { let state = getState(); diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx b/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx index 15df5ab729..258291ae49 100644 --- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx @@ -14,7 +14,7 @@ import QuietTimeIcon from '@/material-icons/400-24px/quiet_time.svg?react'; import { DropdownSelector } from 'mastodon/components/dropdown_selector'; import { Icon } from 'mastodon/components/icon'; -const messages = defineMessages({ +export const messages = defineMessages({ public_short: { id: 'privacy.public.short', defaultMessage: 'Public' }, public_long: { id: 'privacy.public.long', defaultMessage: 'Anyone on and off Mastodon' }, unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Quiet public' }, diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index 5d6625fc10..15f193510d 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -26,6 +26,7 @@ import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/ import { IconButton } from '../../../components/icon_button'; import { Dropdown } from 'mastodon/components/dropdown_menu'; import { me } from '../../../initial_state'; +import { isFeatureEnabled } from '@/mastodon/utils/environment'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, @@ -62,6 +63,7 @@ const messages = defineMessages({ unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' }, revokeQuote: { id: 'status.revoke_quote', defaultMessage: 'Remove my post from @{name}’s post' }, + quotePolicyChange: { id: 'status.quote_policy_change', defaultMessage: 'Change who can quote' }, }); const mapStateToProps = (state, { status }) => { @@ -84,6 +86,7 @@ class ActionBar extends PureComponent { onBookmark: PropTypes.func.isRequired, onDelete: PropTypes.func.isRequired, onRevokeQuote: PropTypes.func, + onQuotePolicyChange: PropTypes.func, onEdit: PropTypes.func.isRequired, onDirect: PropTypes.func.isRequired, onMention: PropTypes.func.isRequired, @@ -122,7 +125,11 @@ class ActionBar extends PureComponent { handleRevokeQuoteClick = () => { this.props.onRevokeQuote(this.props.status); - } + }; + + handleQuotePolicyChange = () => { + this.props.onQuotePolicyChange(this.props.status); + }; handleRedraftClick = () => { this.props.onDelete(this.props.status, true); @@ -240,6 +247,9 @@ class ActionBar extends PureComponent { } menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick }); + if (isFeatureEnabled('outgoing_quotes') && !['private', 'direct'].includes(status.get('visibility'))) { + menu.push({ text: intl.formatMessage(messages.quotePolicyChange), action: this.handleQuotePolicyChange }); + } menu.push(null); menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick }); menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick, dangerous: true }); diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index 7bdcdb8971..3cfda6e837 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -265,6 +265,11 @@ class Status extends ImmutablePureComponent { dispatch(openModal({ modalType: 'CONFIRM_REVOKE_QUOTE', modalProps: { statusId: status.get('id'), quotedStatusId: status.getIn(['quote', 'quoted_status']) }})); }; + handleQuotePolicyChange = (status) => { + const { dispatch } = this.props; + dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId: status.get('id') } })); + }; + handleEditClick = (status) => { const { dispatch, askReplyConfirmation } = this.props; @@ -642,6 +647,7 @@ class Status extends ImmutablePureComponent { onBookmark={this.handleBookmarkClick} onDelete={this.handleDeleteClick} onRevokeQuote={this.handleRevokeQuoteClick} + onQuotePolicyChange={this.handleQuotePolicyChange} onEdit={this.handleEditClick} onDirect={this.handleDirectClick} onMention={this.handleMentionClick} diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx index 3b7a24faaf..c02cacd659 100644 --- a/app/javascript/mastodon/features/ui/components/modal_root.jsx +++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx @@ -43,6 +43,7 @@ import { ImageModal } from './image_modal'; import MediaModal from './media_modal'; import { ModalPlaceholder } from './modal_placeholder'; import VideoModal from './video_modal'; +import { VisibilityModal } from './visibility_modal'; export const MODAL_COMPONENTS = { 'MEDIA': () => Promise.resolve({ default: MediaModal }), @@ -76,6 +77,7 @@ export const MODAL_COMPONENTS = { 'CLOSED_REGISTRATIONS': ClosedRegistrationsModal, 'IGNORE_NOTIFICATIONS': IgnoreNotificationsModal, 'ANNUAL_REPORT': AnnualReportModal, + 'COMPOSE_PRIVACY': () => Promise.resolve({ default: VisibilityModal }), }; export default class ModalRoot extends PureComponent { diff --git a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx new file mode 100644 index 0000000000..82a1a482a3 --- /dev/null +++ b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx @@ -0,0 +1,293 @@ +import { forwardRef, useCallback, useId, useMemo } from 'react'; +import type { FC } from 'react'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import classNames from 'classnames'; + +import { changeComposeVisibility } from '@/mastodon/actions/compose'; +import { setStatusQuotePolicy } from '@/mastodon/actions/statuses_typed'; +import type { ApiQuotePolicy } from '@/mastodon/api_types/quotes'; +import { isQuotePolicy } from '@/mastodon/api_types/quotes'; +import type { StatusVisibility } from '@/mastodon/api_types/statuses'; +import { Dropdown } from '@/mastodon/components/dropdown'; +import type { SelectItem } from '@/mastodon/components/dropdown_selector'; +import { IconButton } from '@/mastodon/components/icon_button'; +import { messages as privacyMessages } from '@/mastodon/features/compose/components/privacy_dropdown'; +import { + createAppSelector, + useAppDispatch, + useAppSelector, +} from '@/mastodon/store'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; + +import type { BaseConfirmationModalProps } from './confirmation_modals/confirmation_modal'; + +const messages = defineMessages({ + close: { id: 'lightbox.close', defaultMessage: 'Close' }, + buttonTitle: { + id: 'visibility_modal.button_title', + defaultMessage: 'Set visibility', + }, + quotePublic: { + id: 'visibility_modal.quote_public', + defaultMessage: 'Anyone', + }, + quoteFollowers: { + id: 'visibility_modal.quote_followers', + defaultMessage: 'Followers only', + }, + quoteNobody: { + id: 'visibility_modal.quote_nobody', + defaultMessage: 'No one', + }, +}); + +interface VisibilityModalProps extends BaseConfirmationModalProps { + statusId: string; +} + +const selectStatusPolicy = createAppSelector( + [(state) => state.statuses, (_state, statusId: string) => statusId], + (statuses, statusId) => { + const status = statuses.get(statusId); + if (!status) { + return 'public'; + } + const policy = + (status.getIn(['quote_approval', 'automatic', 0]) as string) || 'nobody'; + const visibility = status.get('visibility') as StatusVisibility; + + // If the status is private or direct, it cannot be quoted by anyone. + if (visibility === 'private' || visibility === 'direct') { + return 'nobody'; + } + + // If the status has a specific quote policy, return it. + if (isQuotePolicy(policy)) { + return policy; + } + + // Otherwise, return the default based on visibility. + if (visibility === 'unlisted') { + return 'followers'; + } + return 'public'; + }, +); + +export const VisibilityModal: FC = forwardRef( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ({ onClose, statusId }, ref) => { + const intl = useIntl(); + const currentVisibility = useAppSelector( + (state) => + (state.statuses.getIn([statusId, 'visibility'], 'public') as + | StatusVisibility + | undefined) ?? 'public', + ); + const currentQuotePolicy = useAppSelector((state) => + selectStatusPolicy(state, statusId), + ); + const disableQuotePolicy = + currentVisibility === 'private' || currentVisibility === 'direct'; + const isSaving = useAppSelector( + (state) => + state.statuses.getIn([statusId, 'isSavingQuotePolicy']) === true, + ); + + const visibilityItems = useMemo[]>( + () => [ + { + value: 'public', + text: intl.formatMessage(privacyMessages.public_short), + meta: intl.formatMessage(privacyMessages.public_long), + }, + { + value: 'unlisted', + text: intl.formatMessage(privacyMessages.unlisted_short), + meta: intl.formatMessage(privacyMessages.unlisted_long), + }, + { + value: 'private', + text: intl.formatMessage(privacyMessages.private_short), + meta: intl.formatMessage(privacyMessages.private_long), + }, + { + value: 'direct', + text: intl.formatMessage(privacyMessages.direct_short), + meta: intl.formatMessage(privacyMessages.direct_long), + }, + ], + [intl], + ); + const quoteItems = useMemo[]>( + () => [ + { value: 'public', text: intl.formatMessage(messages.quotePublic) }, + { + value: 'followers', + text: intl.formatMessage(messages.quoteFollowers), + }, + { value: 'nobody', text: intl.formatMessage(messages.quoteNobody) }, + ], + [intl], + ); + + const dispatch = useAppDispatch(); + const handleVisibilityChange = useCallback( + (value: string) => { + // Published statuses cannot change visibility. + if (statusId) { + return; + } + dispatch(changeComposeVisibility(value)); + }, + [dispatch, statusId], + ); + const handleQuotePolicyChange = useCallback( + (value: string) => { + if (isQuotePolicy(value) && !disableQuotePolicy) { + void dispatch(setStatusQuotePolicy({ policy: value, statusId })); + } + }, + [disableQuotePolicy, dispatch, statusId], + ); + + const privacyDropdownId = useId(); + const quoteDropdownId = useId(); + + return ( +
+
+ + + {(chunks) => ( + {chunks} + )} + +
+
+
+ ( + {chunks} + ), + }} + tagName='p' + /> +
+
+ + + +
+
+
+ ); + }, +); +VisibilityModal.displayName = 'VisibilityModal'; + +const QuotePolicyHelper: FC<{ + policy: ApiQuotePolicy; + visibility: StatusVisibility; +}> = ({ policy, visibility }) => { + if (visibility === 'unlisted' && policy !== 'nobody') { + return ( +

+ +

+ ); + } + + if (visibility === 'private') { + return ( +

+ +

+ ); + } + + if (visibility === 'direct') { + return ( +

+ +

+ ); + } + + return null; +}; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 6b796f9f81..bee9b0410f 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Your handle:", "domain_pill.your_server": "Your digital home, where all of your posts live. Don’t like this one? Transfer servers at any time and bring your followers, too.", "domain_pill.your_username": "Your unique identifier on this server. It’s possible to find users with the same username on different servers.", + "dropdown.empty": "Select an option", "embed.instructions": "Embed this post on your website by copying the code below.", "embed.preview": "Here is what it will look like:", "emoji_button.activity": "Activity", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Post pending", "status.quote_error.pending_approval_popout.body": "Quotes shared across the Fediverse may take time to display, as different servers have different protocols.", "status.quote_error.pending_approval_popout.title": "Pending quote? Remain calm", + "status.quote_policy_change": "Change who can quote", "status.quote_post_author": "Quoted a post by @{name}", "status.read_more": "Read more", "status.reblog": "Boost", @@ -959,5 +961,17 @@ "video.skip_forward": "Skip forward", "video.unmute": "Unmute", "video.volume_down": "Volume down", - "video.volume_up": "Volume up" + "video.volume_up": "Volume up", + "visibility_modal.button_title": "Set visibility", + "visibility_modal.header": "Visibility and interaction", + "visibility_modal.helper.direct_quoting": "Private mentions can't be quoted.", + "visibility_modal.helper.privacy_editing": "Published posts cannot change their visibility.", + "visibility_modal.helper.private_quoting": "Follower-only posts can't be quoted.", + "visibility_modal.helper.unlisted_quoting": "When people quote you, their post will also be hidden from trending timelines.", + "visibility_modal.instructions": "Control who can interact with this post. Global settings can be found under Preferences > Other.", + "visibility_modal.privacy_label": "Privacy", + "visibility_modal.quote_followers": "Followers only", + "visibility_modal.quote_label": "Change who can quote", + "visibility_modal.quote_nobody": "No one", + "visibility_modal.quote_public": "Anyone" } diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js index 239ab13920..13ff5e016e 100644 --- a/app/javascript/mastodon/reducers/statuses.js +++ b/app/javascript/mastodon/reducers/statuses.js @@ -29,6 +29,7 @@ import { STATUS_FETCH_REQUEST, STATUS_FETCH_FAIL, } from '../actions/statuses'; +import { setStatusQuotePolicy } from '../actions/statuses_typed'; const importStatus = (state, status) => state.set(status.id, fromJS(status)); @@ -70,6 +71,22 @@ const initialState = ImmutableMap(); /** @type {import('@reduxjs/toolkit').Reducer} */ export default function statuses(state = initialState, action) { + if (setStatusQuotePolicy.pending.match(action)) { + const status = state.get(action.meta.arg.statusId); + if (status) { + return state.setIn([action.meta.arg.statusId, 'isSavingQuotePolicy'], true); + } + } else if (setStatusQuotePolicy.fulfilled.match(action)) { + const status = state.get(action.payload.id); + if (status) { + return state + .setIn([action.payload.id, 'quote_approval'], action.payload.quote_approval) + .deleteIn([action.payload.id, 'isSavingQuotePolicy']); + } + } else if (setStatusQuotePolicy.rejected.match(action)) { + return state.deleteIn([action.meta.arg.statusId, 'isSavingQuotePolicy']); + } + switch(action.type) { case STATUS_FETCH_REQUEST: return state.setIn([action.id, 'isLoading'], true); diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts index 69f6028be2..3204d13ee4 100644 --- a/app/javascript/mastodon/store/typed_functions.ts +++ b/app/javascript/mastodon/store/typed_functions.ts @@ -40,7 +40,10 @@ interface AppThunkConfig { fulfilledMeta: AppMeta; rejectedMeta: AppMeta; } -type AppThunkApi = Pick, 'getState' | 'dispatch'>; +export type AppThunkApi = Pick< + GetThunkAPI, + 'getState' | 'dispatch' +>; interface AppThunkOptions { useLoadingBar?: boolean; diff --git a/app/javascript/mastodon/utils/environment.ts b/app/javascript/mastodon/utils/environment.ts index c5fe46bc93..fc4448740f 100644 --- a/app/javascript/mastodon/utils/environment.ts +++ b/app/javascript/mastodon/utils/environment.ts @@ -12,7 +12,11 @@ export function isProduction() { else return import.meta.env.PROD; } -export type Features = 'modern_emojis'; +export type Features = + | 'modern_emojis' + | 'outgoing_quotes' + | 'fasp' + | 'http_message_signatures'; export function isFeatureEnabled(feature: Features) { return initialState?.features.includes(feature) ?? false; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index cca92a46d9..1de7b74c50 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -5402,7 +5402,8 @@ a.status-card { } .privacy-dropdown__dropdown, -.language-dropdown__dropdown { +.language-dropdown__dropdown, +.visibility-dropdown__dropdown { box-shadow: var(--dropdown-shadow); background: var(--dropdown-background-color); backdrop-filter: $backdrop-blur-filter; @@ -5431,7 +5432,8 @@ a.status-card { z-index: 9999; } -.privacy-dropdown__option { +.privacy-dropdown__option, +.visibility-dropdown__option { font-size: 14px; line-height: 20px; letter-spacing: 0.25px; @@ -5577,6 +5579,39 @@ a.status-card { } } +.visibility-dropdown { + &__overlay[data-popper-placement] { + z-index: 9999; + } + + &__label.disabled { + cursor: default; + opacity: 0.5; + } + + &__button { + color: $primary-text-color; + background: var(--dropdown-background-color); + border: 1px solid var(--dropdown-border-color); + padding: 8px 12px; + width: 100%; + text-align: left; + border-radius: 4px; + font-size: 14px; + height: 40px; + + &:disabled { + cursor: default; + } + } + + &__helper { + margin-top: 4px; + font-size: 0.8em; + color: $dark-text-color; + } +} + .search { margin-bottom: 32px; position: relative; @@ -5869,6 +5904,17 @@ a.status-card { } } +.modal-root label { + cursor: pointer; + display: block; + + > span { + display: block; + font-weight: 500; + margin-bottom: 8px; + } +} + .video-modal .video-player { max-height: 80vh; max-width: 100vw; @@ -6375,6 +6421,15 @@ a.status-card { letter-spacing: 0.25px; overflow-y: auto; + &__description { + margin: 24px 24px 0; + color: $darker-text-color; + + a { + color: inherit; + } + } + &__form { display: flex; flex-direction: column; From 4de21056ff70ffc7eb688ae2f825965bd58ae98c Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Thu, 14 Aug 2025 11:25:31 -0400 Subject: [PATCH 43/64] Update sidekiq to version 8.0.7 (#34824) --- Gemfile | 2 +- Gemfile.lock | 14 +++++++------- README.md | 2 +- app/workers/concerns/bulk_mailing_concern.rb | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index b3d0a818d5..7af47881b7 100644 --- a/Gemfile +++ b/Gemfile @@ -82,7 +82,7 @@ gem 'rqrcode', '~> 3.0' gem 'ruby-progressbar', '~> 1.13' gem 'sanitize', '~> 7.0' gem 'scenic', '~> 1.7' -gem 'sidekiq', '< 8' +gem 'sidekiq', '< 9' gem 'sidekiq-bulk', '~> 0.2.0' gem 'sidekiq-scheduler', '~> 6.0' gem 'sidekiq-unique-jobs', '> 8' diff --git a/Gemfile.lock b/Gemfile.lock index 464d5bd2c9..b0bf819481 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -823,12 +823,12 @@ GEM securerandom (0.4.1) shoulda-matchers (6.5.0) activesupport (>= 5.2.0) - sidekiq (7.3.9) - base64 - connection_pool (>= 2.3.0) - logger - rack (>= 2.2.4) - redis-client (>= 0.22.2) + sidekiq (8.0.7) + connection_pool (>= 2.5.0) + json (>= 2.9.0) + logger (>= 1.6.2) + rack (>= 3.1.0) + redis-client (>= 0.23.2) sidekiq-bulk (0.2.0) sidekiq sidekiq-scheduler (6.0.1) @@ -1077,7 +1077,7 @@ DEPENDENCIES sanitize (~> 7.0) scenic (~> 1.7) shoulda-matchers - sidekiq (< 8) + sidekiq (< 9) sidekiq-bulk (~> 0.2.0) sidekiq-scheduler (~> 6.0) sidekiq-unique-jobs (> 8) diff --git a/README.md b/README.md index 1202728965..5c0e596b72 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Mastodon is a **free, open-source social network server** based on [ActivityPub] - **Ruby** 3.2+ - **PostgreSQL** 13+ -- **Redis** 6.2+ +- **Redis** 7.0+ - **Node.js** 20+ This repository includes deployment configurations for **Docker and docker-compose**, as well as for other environments like Heroku and Scalingo. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). A [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the main documentation. diff --git a/app/workers/concerns/bulk_mailing_concern.rb b/app/workers/concerns/bulk_mailing_concern.rb index 5f8154d7fa..98fcc0541d 100644 --- a/app/workers/concerns/bulk_mailing_concern.rb +++ b/app/workers/concerns/bulk_mailing_concern.rb @@ -7,7 +7,7 @@ module BulkMailingConcern job_class = ActionMailer::MailDeliveryJob Sidekiq::Client.push_bulk({ - 'class' => ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper, + 'class' => Sidekiq::ActiveJob::Wrapper, 'wrapped' => job_class, 'queue' => mailer_class.deliver_later_queue_name, 'args' => args_array.map do |args| From 25f1a515f86d4b84e72b6f28cfea46a28a904347 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 07:12:01 +0000 Subject: [PATCH 44/64] New Crowdin Translations (automated) (#35788) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/az.json | 268 ++++++++++++++++++++- app/javascript/mastodon/locales/br.json | 6 +- app/javascript/mastodon/locales/de.json | 16 +- app/javascript/mastodon/locales/es-AR.json | 16 +- app/javascript/mastodon/locales/fo.json | 16 +- app/javascript/mastodon/locales/hu.json | 16 +- app/javascript/mastodon/locales/is.json | 11 +- app/javascript/mastodon/locales/sv.json | 13 +- app/javascript/mastodon/locales/uk.json | 8 +- app/javascript/mastodon/locales/vi.json | 16 +- app/javascript/mastodon/locales/zh-TW.json | 16 +- config/locales/az.yml | 3 + config/locales/devise.az.yml | 14 ++ config/locales/doorkeeper.az.yml | 165 +++++++++++-- config/locales/pl.yml | 3 + config/locales/ru.yml | 2 +- config/locales/simple_form.pl.yml | 5 + config/locales/simple_form.sv.yml | 3 + config/locales/sv.yml | 16 ++ 19 files changed, 585 insertions(+), 28 deletions(-) diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index 7540c8fa4b..a243952ec7 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Tanıdıcınız:", "domain_pill.your_server": "Bütün paylaşımlarınızın yaşadığı rəqəmsal ev. Buranı bəyənmirsiniz? İstədiyiniz vaxt serverdən köçün və izləyicilərinizi də aparın.", "domain_pill.your_username": "Serverdəki unikal identifikatoruz. Fərqli serverlərdə eyni istifadəçi adı ilə istifadəçilər tapmaq mümkündür.", + "dropdown.empty": "Bir seçim et", "embed.instructions": "Aşağıdakı kodu kopyalayaraq bu postu veb-saytınıza yerləşdirin.", "embed.preview": "Belə görünəcək:", "emoji_button.activity": "Aktivlik", @@ -324,6 +325,9 @@ "empty_column.follow_requests": "İzləmə sorğularınız yoxdur. Qəbul etdikdə burada görəcəksiniz.", "empty_column.followed_tags": "Heç bir heşteq izləmirsiniz. İzlədikdə burada görünəcək.", "empty_column.hashtag": "Bu heşteqdə hələ ki, heç nə yoxdur.", + "empty_column.home": "Əsas zaman xəttiniz boşdur! Doldurmaq üçün bir neçə istifadəçini izləyin.", + "empty_column.list": "Hələ bu siyahıda heç nə yoxdur. Bu siyahıdakı üzvlər yeni göndəriş paylaşdığı zaman burada görünəcək.", + "empty_column.mutes": "Hələ heç bir istifadəçini səssizə almamısınız.", "empty_column.notification_requests": "Hamısı hazırdır! Burada heç nə yoxdur. Yeni bildiriş aldığınız zaman, ayarlarınıza görə burada görünəcək.", "empty_column.notifications": "Hələ heç bir bildirişiniz yoxdur. Başqaları sizinlə qarşılıqlı əlaqə qurduğu zaman, onu burada görəcəksiniz.", "empty_column.public": "Burada hələ heç nə yoxdur! Buranı doldurmaq üçün hər kəsə açıq bir şey yazın və ya digər serverlərdəki istifadəçiləri izləyin.", @@ -351,6 +355,7 @@ "filter_modal.added.settings_link": "ayarlar səhifəsi", "filter_modal.added.short_explanation": "Bu göndəriş, aşağıdakı filtr kateqoriyasına əlavə edilib: {title}.", "filter_modal.added.title": "Filtr əlavə edilib!", + "filter_modal.select_filter.context_mismatch": "bu kontektsə tətbiq olunmur", "filter_modal.select_filter.expired": "müddəti bitib", "filter_modal.select_filter.prompt_new": "Yeni kateqoriya: {name}", "filter_modal.select_filter.search": "Axtar və ya yarat", @@ -358,6 +363,7 @@ "filter_modal.select_filter.title": "Bu göndərişi filtrlə", "filter_modal.title.status": "Bir göndərişi filtrlə", "filter_warning.matches_filter": "“{title}” filtri ilə uyuşur", + "filtered_notifications_banner.pending_requests": "Tanıdığınız {count, plural, =0 {heç kimdən} one {bir şəxsdən} other {# şəxsdən}}", "filtered_notifications_banner.title": "Filtrlənmiş bildirişlər", "firehose.all": "Hamısı", "firehose.local": "Bu server", @@ -379,6 +385,7 @@ "follow_suggestions.popular_suggestion_longer": "{domain} üzərində məşhur", "follow_suggestions.similar_to_recently_followed_longer": "Son zaman izlədiyiniz profillərə oxşar", "follow_suggestions.view_all": "Hamısına bax", + "follow_suggestions.who_to_follow": "İzləyə bilərsən", "followed_tags": "İzlənilən mövzu etiketləri", "footer.about": "Haqqında", "footer.directory": "Profil kataloqu", @@ -442,10 +449,48 @@ "interaction_modal.action.reblog": "Davam etmək üçün hesabınızdan təkrar göndərməlisiniz.", "interaction_modal.action.reply": "Davam etmək üçün hesabınızdan cavab verməlisiniz.", "interaction_modal.action.vote": "Davam etmək üçün hesabınızdan səs verməlisiniz.", + "interaction_modal.go": "Get", + "interaction_modal.no_account_yet": "Hələ heç bir hesabınız yoxdur?", + "interaction_modal.on_another_server": "Fərqli bir serverdə", + "interaction_modal.on_this_server": "Bu serverdə", + "interaction_modal.title.favourite": "{name} - göndərişini sevimlilərə əlavə et", + "interaction_modal.title.follow": "{name} - izlə", "interaction_modal.title.reblog": "{name} - göndərişini təkrar paylaş", + "interaction_modal.title.reply": "{name} - göndərişinə cavab ver", + "interaction_modal.title.vote": "{name} - anketində səs ver", + "interaction_modal.username_prompt": "Məs: {example}", + "intervals.full.days": "{number, plural, one {# gün} other {# gün}}", + "intervals.full.hours": "{number, plural, one {# saat} other {# saat}}", + "intervals.full.minutes": "{number, plural, one {# dəqiqə} other {# dəqiqə}}", + "keyboard_shortcuts.back": "Geri get", + "keyboard_shortcuts.blocked": "Əngəllənən istifadəçilərin siyahısını aç", "keyboard_shortcuts.boost": "Göndərişi təkrar paylaş", + "keyboard_shortcuts.column": "Sütuna fokuslan", + "keyboard_shortcuts.compose": "Mətn yazma sahəsinə fokuslan", + "keyboard_shortcuts.description": "Açıqlama", + "keyboard_shortcuts.direct": "şəxsi adçəkmələr sütununu açmaq üçün", + "keyboard_shortcuts.down": "Siyahıda aşağı daşı", + "keyboard_shortcuts.enter": "Göndərişi aç", + "keyboard_shortcuts.favourite": "Göndərişi sevimlilərə əlavə et", + "keyboard_shortcuts.favourites": "Sevimli siyahını aç", + "keyboard_shortcuts.heading": "Klaviatura qısayolları", + "keyboard_shortcuts.home": "Əsas ekran zaman xəttini aç", + "keyboard_shortcuts.hotkey": "Qısayol düyməsi", + "keyboard_shortcuts.legend": "Bu əfsanəni nümayiş etdir", + "keyboard_shortcuts.local": "Lokal zaman xəttini aç", + "keyboard_shortcuts.mention": "Müəllifin adını çək", + "keyboard_shortcuts.muted": "Səssizdəki istifadəçilərin siyahısını aç", + "keyboard_shortcuts.my_profile": "Profilinizi açın", + "keyboard_shortcuts.notifications": "Bildirişlər sütununu aç", + "keyboard_shortcuts.open_media": "Medianı aç", "keyboard_shortcuts.profile": "Müəllifin profilini aç", "keyboard_shortcuts.reply": "Göndərişə cavab ver", + "keyboard_shortcuts.requests": "İzləmə istəyi siyahısını aç", + "keyboard_shortcuts.search": "Axtarış çubuğuna fokuslan", + "keyboard_shortcuts.spoilers": "CW xanasını göstər/gizlət", + "keyboard_shortcuts.start": "\"Başlayaq\" sütununu aç", + "keyboard_shortcuts.toggle_hidden": "CW arxasındakı mətni göstər/gizlət", + "keyboard_shortcuts.toggle_sensitivity": "Medianı göstər/gizlət", "keyboard_shortcuts.toot": "Yeni bir göndəriş başlat", "keyboard_shortcuts.translate": "bir göndərişi tərcümə etmək üçün", "keyboard_shortcuts.unfocus": "Fokusu göndəriş yazma xanasından/axtarışdan götür", @@ -502,13 +547,59 @@ "mute_modal.you_wont_see_posts": "Onlar hələ də göndərişlərinizi görə biləcək, ancaq onların göndərişlərini görməyəcəksiniz.", "navigation_bar.about": "Haqqında", "navigation_bar.account_settings": "Parol və təhlükəsizlik", + "navigation_bar.administration": "Administrasiya", "navigation_bar.advanced_interface": "Qabaqcıl veb interfeysində aç", "navigation_bar.automated_deletion": "Göndərişin avtomatik silinməsi", "navigation_bar.blocks": "Əngəllənmiş istifadəçilər", + "navigation_bar.bookmarks": "Əlfəcinlər", + "navigation_bar.direct": "Şəxsi adçəkmələr", + "navigation_bar.domain_blocks": "Əngəllənmiş domenlər", + "navigation_bar.favourites": "Sevimlilər", + "navigation_bar.filters": "Səssizə alınmış sözlər", + "navigation_bar.follow_requests": "İzləmə istəkləri", + "navigation_bar.followed_tags": "İzlənilən mövzu etiketləri", "navigation_bar.follows_and_followers": "İzlənilənlər və izləyicilər", "navigation_bar.import_export": "Daxilə və xaricə köçürmə", + "navigation_bar.lists": "Siyahılar", + "navigation_bar.live_feed_local": "Canlı lent (lokal)", + "navigation_bar.live_feed_public": "Canlı lent (hər kəsə açıq)", + "navigation_bar.logout": "Çıxış", "navigation_bar.moderation": "Moderasiya", + "navigation_bar.more": "Daha çox", + "navigation_bar.mutes": "Səssizə alınmış istifadəçilər", + "navigation_bar.opened_in_classic_interface": "Göndərişlər, hesablar və digər müəyyən səhifələr klassik veb interfeysində ilkin olaraq açılır.", + "navigation_bar.preferences": "Tərcihlər", + "navigation_bar.privacy_and_reach": "Gizlilik və əlçatanlıq", + "navigation_bar.search": "Axtar", + "navigation_bar.search_trends": "Axtar / Trendlər", + "navigation_panel.collapse_followed_tags": "İzlənilən mövzu etiketləri menyusunu yığcamlaşdır", + "navigation_panel.collapse_lists": "Siyahı menyusunu yığcamlaşdır", + "navigation_panel.expand_followed_tags": "İzlənilən mövzu etiketləri menyusunu genişləndir", + "navigation_panel.expand_lists": "Siyahı menyusunu genişləndir", "not_signed_in_indicator.not_signed_in": "Bu resursa erişmək üçün giriş etməlisiniz.", + "notification.admin.report": "{name} şikayət etdi: {target}", + "notification.admin.report_account": "{name}, {category} üçün şikayət etdi: {target} - {count, plural, one {bir göndəriş} other {# göndəriş}}", + "notification.admin.report_account_other": "{name} şikayət etdi: {target} - {count, plural, one {bir göndəriş} other {# göndəriş}}", + "notification.admin.report_statuses": "{name}, {category} üçün şikayət etdi: {target}", + "notification.admin.report_statuses_other": "{name} şikayət etdi: {target}", + "notification.admin.sign_up": "{name} qeydiyyatdan keçib", + "notification.admin.sign_up.name_and_others": "{name} və digər {count, plural, one {# nəfər} other {# nəfər}} qeydiyyatdan keçib", + "notification.annual_report.view": "#Wrapstodon-a bax", + "notification.favourite": "{name} göndərişinizi sevimlilərinə əlavə etdi", + "notification.favourite.name_and_others_with_link": "{name} və digər {count, plural, one {# nəfər} other {# nəfər}} göndərişinizi sevimlilərinə əlavə etdi", + "notification.favourite_pm": "{name}, şəxsi adçəkmənizi sevimlilərinə əlavə etdi", + "notification.favourite_pm.name_and_others_with_link": "{name} və digər {count, plural, one {# nəfər} other {# nəfər}} şəxsi adçəkmənizi sevimlilərinə əlavə etdi", + "notification.follow": "{name} sizi izləyir", + "notification.follow.name_and_others": "{name} və digər {count, plural, one {# nəfər} other {# nəfər}} sizi izləyir", + "notification.follow_request": "{name} sizi izləmək üçün istək göndərdi", + "notification.follow_request.name_and_others": "{name} və digər {count, plural, one {# nəfər} other {# nəfər}} sizi izləmək üçün istək göndərdi", + "notification.label.mention": "Adçəkmə", + "notification.label.private_mention": "Şəxsi adçəkmə", + "notification.label.private_reply": "Şəxsi cavab", + "notification.label.quote": "{name} göndərişinizi sitat gətirdi", + "notification.label.reply": "Cavab", + "notification.mention": "Adçəkmə", + "notification.mentioned_you": "{name} adınızı çəkdi", "notification.moderation-warning.learn_more": "Daha ətraflı", "notification.moderation_warning": "Bir moderasiya xəbərdarlığı aldınız", "notification.moderation_warning.action_delete_statuses": "Bəzi göndərişləriniz silindi.", @@ -518,8 +609,11 @@ "notification.moderation_warning.action_sensitive": "Göndərişləriniz artıq həssas olaraq işarələnəcək.", "notification.moderation_warning.action_silence": "Hesabınız məhdudlaşdırılıb.", "notification.moderation_warning.action_suspend": "Hesabınızın fəaliyyəti dayandırılıb.", + "notification.own_poll": "Anketiniz bitdi", + "notification.poll": "Səs verdiyiniz anket bitdi", "notification.reblog": "{name} göndərişinizi təkrar paylaşdı", "notification.reblog.name_and_others_with_link": "{name} və {count, plural, one {digər # nəfər} other {digər # nəfər}} göndərişinizi təkrar paylaşdı", + "notification.relationships_severance_event": "{name} ilə bağlantı qopdu", "notification.relationships_severance_event.account_suspension": "{from} admini {target} fəaliyyətini dayandırıb, bu da o deməkdir ki, artıq onlardan güncəlləmələr ala və ya onlarla qarşılıqlı əlaqə qura bilməyəcəyiniz.", "notification.relationships_severance_event.domain_block": "{target}, {from} admini tərəfindən əngəllənib, buna {followersCount} izləyiciniz və izlədiyiniz {followingCount, plural, one {# hesab} other {# hesab}} daxildir.", "notification.relationships_severance_event.learn_more": "Daha ətraflı", @@ -527,29 +621,177 @@ "notification.status": "{name} indicə paylaşdı", "notification.update": "{name} bir göndərişə düzəliş etdi", "notification_requests.accept": "Qəbul et", + "notification_requests.accept_multiple": "{count, plural, one {# istəyi qəbul et…} other {# istəyi qəbul et…}}", + "notification_requests.confirm_accept_multiple.button": "{count, plural, one {İstəyi qəbul et} other {İstəkləri qəbul et}}", + "notification_requests.confirm_accept_multiple.message": "{count, plural, one {Bir bildiriş istəyini} other {# bildiriş istəklərini}} qəbul etmək üzrəsiniz. Davam etmək istədiyinizə əminsiniz?", + "notification_requests.confirm_accept_multiple.title": "Bildiriş istəkləri qəbul edilsin?", + "notification_requests.confirm_dismiss_multiple.button": "{count, plural, one {İstəyi rədd et} other {İstəkləri rədd et}}", "notification_requests.confirm_dismiss_multiple.message": "{count, plural, one {bir bildiriş sorğusunu} other {# bildiriş sorğusunu}} bağlamaq üzrəsiniz. {count, plural, one {Ona} other {Onlara}} yenidən asanlıqla erişə bilməyəcəksiniz. Davam etmək istədiyinizə əminsiniz?", + "notification_requests.confirm_dismiss_multiple.title": "Bildiriş istəklərinə rədd cavabı verilsin?", + "notification_requests.dismiss": "Rədd et", + "notification_requests.dismiss_multiple": "{count, plural, one {# istəyi rədd et…} other {# istəyi rədd et…}}", "notification_requests.edit_selection": "Düzəliş et", "notification_requests.exit_selection": "Hazırdır", "notification_requests.explainer_for_limited_account": "Hesab, bir moderator tərəfindən məhdudlaşdırıldığı üçün bu hesabın bildirişləri filtrləndi.", "notification_requests.explainer_for_limited_remote_account": "Hesab və ya onun serveri, bir moderator tərəfindən məhdudlaşdırıldığı üçün bu hesabın bildirişləri filtrləndi.", + "notification_requests.maximize": "Böyüt", + "notification_requests.minimize_banner": "Filtrlənmiş bildirişlər bannerini kiçilt", + "notification_requests.notifications_from": "{name} - bildirişləri", + "notification_requests.title": "Filtrlənmiş bildirişlər", + "notification_requests.view": "Bildirişlərə bax", + "notifications.clear": "Bildirişləri təmizlə", + "notifications.clear_confirmation": "Bütün bildirişlərinizi həmişəlik təmizləmək istədiyinizə əminsiniz?", + "notifications.clear_title": "Bildirişlər təmizlənsin?", + "notifications.column_settings.admin.report": "Yeni hesabatlar:", + "notifications.column_settings.admin.sign_up": "Yeni qeydiyyatlar:", + "notifications.column_settings.alert": "Masaüstü bildirişlər", + "notifications.column_settings.favourite": "Sevimlilər:", + "notifications.column_settings.filter_bar.advanced": "Bütün kateqoriyaları nümayiş etdir", + "notifications.column_settings.filter_bar.category": "Cəld filtr çubuğu", "notifications.column_settings.follow": "Yeni izləyicilər:", + "notifications.column_settings.follow_request": "Yeni izləmə istəkləri:", + "notifications.column_settings.group": "Qrup", + "notifications.column_settings.mention": "Adçəkmələr:", + "notifications.column_settings.poll": "Anket nəticələri:", + "notifications.column_settings.push": "Ani bildirişlər", + "notifications.column_settings.quote": "Sitatlar:", "notifications.column_settings.reblog": "Təkrar paylaşmalar:", + "notifications.column_settings.show": "Sütunda göstər", + "notifications.column_settings.sound": "Səs oxut", + "notifications.column_settings.status": "Yeni göndərişlər:", + "notifications.column_settings.unread_notifications.category": "Oxunmamış bildirişlər", + "notifications.column_settings.unread_notifications.highlight": "Oxunmamış bildirişləri vurğula", + "notifications.column_settings.update": "Düzəlişlər:", + "notifications.filter.all": "Hamısı", "notifications.filter.boosts": "Təkrar paylaşmalar", + "notifications.filter.favourites": "Sevimlilər", "notifications.filter.follows": "İzlənilənlər", + "notifications.filter.mentions": "Adçəkmələr", + "notifications.filter.polls": "Anket nəticələri", "notifications.filter.statuses": "İzlədiyiniz şəxslərdən güncəlləmələr", + "notifications.grant_permission": "İcazəni ver.", + "notifications.group": "{count} bildiriş", + "notifications.mark_as_read": "Hər bir bildiriş oxunmuş olaraq işarələ", + "notifications.permission_denied": "Brauzer icazələri istəyinə daha əvvəl rədd cavabı verildiyi üçün masaüstü bildirişləri əlçatmazdır", + "notifications.permission_denied_alert": "Brauzer icazəsinə daha əvvəl rədd cavabı verildiyi üçün masaüstü bildirişləri fəallaşdırıla bilmir", + "notifications.permission_required": "Tələb olunan icazə verilmədiyi üçün masaüstü bildirişləri əlçatmazdır.", + "notifications.policy.accept": "Qəbul et", + "notifications.policy.accept_hint": "Bildirişlərdə göstər", + "notifications.policy.drop": "Yox say", + "notifications.policy.filter": "Filtr", + "notifications.policy.filter_hint": "Filtrlənmiş bildirişlər gələn qutusuna göndər", "notifications.policy.filter_limited_accounts_hint": "Server moderatorları tərəfindən məhdudlaşdırılıb", "notifications.policy.filter_limited_accounts_title": "Moderasiya edilmiş hesablar", + "notifications.policy.filter_new_accounts.hint": "Son {days, plural, one {bir gündə} other {# gündə}} yaradıldı", + "notifications.policy.filter_new_accounts_title": "Yeni hesablar", + "notifications.policy.filter_not_followers_hint": "Sizi {days, plural, one {bir gündən} other {# gündən}} az müddətdir izləyən insanlar daxildir", + "notifications.policy.filter_not_followers_title": "Sizi izləməyən insanlar", + "notifications.policy.filter_not_following_hint": "Onları manual qəbul edənə qədər", + "notifications.policy.filter_not_following_title": "İzləmədiyiniz insanlar", + "notifications.policy.title": "Bildirişləri idarə et…", + "notifications_permission_banner.enable": "Masaüstü bildirişləri fəallaşdır", + "notifications_permission_banner.title": "Heç nəyi buraxmayın", + "onboarding.follows.back": "Geri", + "onboarding.follows.done": "Hazırdır", + "onboarding.follows.search": "Axtar", + "onboarding.follows.title": "Başlamaq üçün insanları izləyin", "onboarding.profile.discoverable": "Profilimi kəşf edilə bilən et", "onboarding.profile.discoverable_hint": "Mastodon-da kəşf edilə bilməni aktivləşdirsəniz, göndərişləriniz axtarış nəticələrində və trendlərdə görünə bilər və profiliniz sizinlə oxşar maraqlara sahib şəxslərə təklif edilə bilər.", "onboarding.profile.display_name": "Ekran adı", + "onboarding.profile.display_name_hint": "Tam adınız və ya ləqəbiniz…", + "onboarding.profile.note": "Bioqrafiya", "onboarding.profile.note_hint": "Digər insanların @adını_çəkə və ya #mövzu_etiketləri istifadə edə bilərsiniz…", + "onboarding.profile.save_and_continue": "Saxla və davam et", "onboarding.profile.title": "Profili ayarla", + "onboarding.profile.upload_avatar": "Profil şəkli yüklə", + "onboarding.profile.upload_header": "Profil başlığı yüklə", "password_confirmation.exceeds_maxlength": "Parol təsdiqi, maksimum parol uzunluğunu aşır", "password_confirmation.mismatching": "Parol təsdiqi uyuşmur", + "picture_in_picture.restore": "Geri qoy", + "poll.closed": "Bağlandı", + "poll.refresh": "Təzələ", + "poll.reveal": "Nəticələrə bax", + "poll.total_people": "{count, plural, one {# nəfər} other {# nəfər}}", + "poll.total_votes": "{count, plural, one {# səs} other {# səs}}", + "poll.vote": "Səs ver", + "poll.voted": "Bu cavaba səs verdiniz", + "poll.votes": "{votes, plural, one {# səs} other {# səs}}", + "poll_button.add_poll": "Bir anket əlavə et", + "poll_button.remove_poll": "Anketi sil", + "privacy.change": "Göndəriş gizliliyini dəyişdir", + "privacy.direct.long": "Göndərişdə adı çəkilən hər kəs", + "privacy.direct.short": "Şəxsi adçəkmə", "privacy.private.long": "Yalnız izləyiciləriniz", "privacy.private.short": "İzləyicilər", + "privacy.public.long": "Mastodon-da olan və olmayan hər kəs", + "privacy.public.short": "Hər kəsə açıq", + "privacy.unlisted.short": "Səssiz hər kəsə açıq", "privacy_policy.last_updated": "Son güncəlləmə {date}", + "privacy_policy.title": "Gizlilik Siyasəti", + "recommended": "Tövsiyə edilən", + "refresh": "Təzələ", + "regeneration_indicator.please_stand_by": "Lütfən gözləyin.", + "regeneration_indicator.preparing_your_home_feed": "Əsas ekran lentiniz hazırlanır…", + "relative_time.days": "{number} gü", + "relative_time.full.days": "{number, plural, one {# gün} other {# gün}} əvvəl", + "relative_time.full.hours": "{number, plural, one {# saat} other {# saat}} əvvəl", + "relative_time.full.just_now": "indicə", + "relative_time.full.minutes": "{number, plural, one {# dəqiqə} other {# dəqiqə}} əvvəl", + "relative_time.full.seconds": "{number, plural, one {# saniyə} other {# saniyə}} əvvəl", + "relative_time.hours": "{number} sa", + "relative_time.just_now": "indi", + "relative_time.minutes": "{number} dəq", + "relative_time.seconds": "{number} san", + "relative_time.today": "bu gün", + "reply_indicator.attachments": "{count, plural, one {# qoşma} other {# qoşma}}", + "reply_indicator.cancel": "İmtina", + "reply_indicator.poll": "Anket", + "report.block": "Əngəllə", + "report.block_explanation": "Onun göndərişlərini görməyəcəksiniz. O, göndərişlərinizi görə və ya sizi izləyə bilməz. Əngəllədiyinizi anlaya biləcək.", + "report.categories.legal": "Hüquqi", + "report.categories.other": "Digər", + "report.categories.spam": "Spam", + "report.categories.violation": "Məzmun, bir və ya daha çox server qaydasını pozur", "report.category.subtitle": "Ən çox uyuşanı seçin", + "report.category.title": "Bu {type} ilə bağlı nələrin baş verdiyini bizə deyin", + "report.category.title_account": "profil", + "report.category.title_status": "göndəriş", + "report.close": "Hazırdır", + "report.comment.title": "Bilməyimizi istədiyiniz başqa nəsə var?", + "report.forward": "Bura yönləndir: {target}", + "report.forward_hint": "Hesab, başqa bir serverdəndir. Hesabatın anonim bir kopyası ora da göndərilsin?", + "report.mute": "Səssizə al", + "report.mute_explanation": "Onun göndərişlərini görməyəcəksiniz. O, sizi izləməyə və göndərişlərinizi görməyə davam edə bilər, ancaq səssizə alındığını bilməyəcək.", + "report.next": "Növbəti", + "report.placeholder": "Əlavə rəylər", + "report.reasons.dislike": "Bunu bəyənmədim", + "report.reasons.dislike_description": "Bu, görmək istədiyiniz bir şey deyil", + "report.reasons.legal": "Qanunsuzdur", + "report.reasons.legal_description": "Sizin və ya serverinizin olduğu ölkənin qanunlarını pozduğuna inanırsınız", + "report.reasons.other": "Başqa bir şeydir", + "report.reasons.other_description": "Problem, digər kateqoriyalara uyğun gəlmir", + "report.reasons.spam": "Spamdır", + "report.reasons.spam_description": "Zərərli keçidlər, saxta qarşılıqlı əlaqə və ya təkrarlanan cavablar", + "report.reasons.violation": "Server qaydalarını pozur", + "report.reasons.violation_description": "Müəyyən qaydaları pozduğundan xəbərdarsınız", + "report.rules.subtitle": "Uyğun olanların hamısını seçin", + "report.rules.title": "Hansı qaydalar pozulub?", + "report.statuses.subtitle": "Uyğun olanların hamısını seçin", + "report.statuses.title": "Bu şikayəti dəstəkləyən hər hansısa bir göndəriş var?", + "report.submit": "Təqdim et", + "report.target": "{target} şikayət edilir", + "report.thanks.take_action": "Mastodon-da nə görə biləcəyinizi idarə etmək üçün seçimləriniz bunlardır:", + "report.thanks.take_action_actionable": "Biz bunu incələdiyimiz müddətdə, siz @{name} ilə bağlı bunları edə bilərsiniz:", + "report.thanks.title": "Bunu görmək istəmirsiniz?", + "report.thanks.title_actionable": "Şikayət etdiyiniz üçün təşəkkürlər, məsələyə baxacağıq.", + "report.unfollow": "@{name} - izləmədən çıxart", + "report.unfollow_explanation": "Bu hesabı izləyirsiniz. Əsas ekran lentinizdə onun göndərişlərini artıq görmək istəmirsinizsə, onu izləmədən çıxarın.", + "report_notification.attached_statuses": "{count, plural, one {{count} göndəriş} other {{count} göndəriş}} əlavə edildi", + "report_notification.categories.legal": "Hüquqi", + "report_notification.categories.legal_sentence": "qanunsuz məzmun", + "report_notification.categories.other": "Digər", + "report_notification.categories.other_sentence": "digər", + "report_notification.categories.spam": "Spam", "report_notification.categories.spam_sentence": "spam", "report_notification.categories.violation": "Qayda pozuntusu", "report_notification.categories.violation_sentence": "qayda pozuntusu", @@ -581,6 +823,7 @@ "search_results.title": "\"{q}\" axtar", "server_banner.about_active_users": "Son 30 gündə bu serveri istifadə edənlər (aylıq aktiv istifadəçilər)", "server_banner.active_users": "aktiv istifadəçilər", + "server_banner.administered_by": "Administrasiya:", "server_banner.is_one_of_many": "{domain}, fediverse-də iştirak etmək üçün istifadə edə biləcəyiniz bir neçə müstəqil Mastodon serverlərindən biridir.", "server_banner.server_stats": "Server statistikaları:", "sign_in_banner.create_account": "Hesab yarat", @@ -597,7 +840,10 @@ "status.cannot_reblog": "Bu göndəriş təkrar paylaşıla bilməz", "status.context.load_new_replies": "Yeni cavablar mövcuddur", "status.context.loading": "Daha çox cavab yoxlanılır", + "status.continued_thread": "Davam edən mövzu", + "status.copy": "Göndəriş keçidini kopyala", "status.delete": "Sil", + "status.detailed_status": "Detallı danışıq görünüşü", "status.direct": "Şəxsi olaraq adını çək: @{name}", "status.direct_indicator": "Şəxsi olaraq adını çək", "status.edit": "Düzəliş et", @@ -620,6 +866,8 @@ "status.quote_error.filtered": "Bəzi filtrlərinizə görə gizlidir", "status.quote_error.not_available": "Göndəriş əlçatmazdır", "status.quote_error.pending_approval": "Göndəriş gözləmədədir", + "status.quote_error.pending_approval_popout.title": "Gözləyən sitat var? Səbrli olun.", + "status.quote_post_author": "@{name} göndərişini sitat gətirdi", "status.read_more": "Daha çoxunu oxu", "status.reblog": "Təkrar paylaş", "status.reblog_private": "Orijinal görünmə ilə təkrar paylaş", @@ -628,18 +876,23 @@ "status.reblogs.empty": "Hələ heç kim bu göndərişi təkrar paylaşmayıb. Kimsə paylaşdığı zaman, burada görünəcək.", "status.remove_bookmark": "Əlfəcini sil", "status.remove_favourite": "Sevimlilərdən sil", + "status.replied_in_thread": "Mövzuda cavablandırıldı", "status.replied_to": "Cavab verildi: {name}", "status.reply": "Cavabla", + "status.replyAll": "Mövzuda cavab ver", "status.report": "Bildir: @{name}", + "status.revoke_quote": "@{name} - göndərişindən mənim göndərişimi sil", "status.sensitive_warning": "Həssas məzmun", "status.share": "Paylaş", "status.show_less_all": "Hamısı üçün daha az göstər", "status.show_more_all": "Hamısı üçün daha çox göstər", "status.show_original": "Orijinalı göstər", + "status.title.with_attachments": "{user} {attachmentCount, plural, one {bir qoşma} other {{attachmentCount} qoşma}} paylaşdı", "status.translate": "Tərcümə et", "status.translated_from_with": "{provider} ilə {lang} dilindən tərcümə edilib", "status.uncached_media_warning": "Önizləmə mövcud deyil", "status.unmute_conversation": "Danışığın səsini aç", + "subscribed_languages.lead": "Dəyişiklikdən sonra əsas ekran və siyahı zaman xəttinizdə yalnız seçdiyiniz dillərdəki göndərişlər görünəcək. Bütün dillərdə göndəriş almaq üçün heç birini seçməyin.", "subscribed_languages.save": "Dəyişiklikləri saxla", "subscribed_languages.target": "{target} üçün abunə olunmuş dilləri dəyişdir", "tabs_bar.home": "Ana səhifə", @@ -655,6 +908,7 @@ "time_remaining.minutes": "{number, plural, one {# dəqiqə} other {# dəqiqə}} qalıb", "time_remaining.moments": "Bir neçə dəqiqə qalıb", "time_remaining.seconds": "{number, plural, one {# saniyə} other {# saniyə}} qalıb", + "trends.counter_by_accounts": "Son {days, plural, one {bir gündə} other {{days} gündə}} {count, plural, one {{counter} nəfər} other {{counter} nəfər}}", "trends.trending_now": "İndi trenddədir", "ui.beforeunload": "Mastodon-u tərk etsəniz, qaralamanız itəcək.", "units.short.billion": "{count} mlyrd", @@ -686,5 +940,17 @@ "video.skip_forward": "İrəli ötür", "video.unmute": "Səsi aç", "video.volume_down": "Həcmi azalt", - "video.volume_up": "Həcmi artır" + "video.volume_up": "Həcmi artır", + "visibility_modal.button_title": "Görünməni ayarla", + "visibility_modal.header": "Görünmə və qarşılıqlı əlaqə", + "visibility_modal.helper.direct_quoting": "Şəxsi adçəkmələr, sitat gətirilə bilməz.", + "visibility_modal.helper.privacy_editing": "Dərc edilən göndərişlərin görünməsi dəyişdirilə bilməz.", + "visibility_modal.helper.private_quoting": "Yalnız izləyicilərə xas göndərişlər, sitat gətirilə bilməz.", + "visibility_modal.helper.unlisted_quoting": "İnsanlar sizdən sitat gətirdiyi zaman, onların göndərişləri də trend zaman xəttindən gizlədiləcək.", + "visibility_modal.instructions": "Bu göndərişlə kimin əlaqə qura biləcəyini idarə edin. Qlobal ayarlar Tərcihlər > Digər bölməsinin altında tapıla bilər.", + "visibility_modal.privacy_label": "Gizlilik", + "visibility_modal.quote_followers": "Yalnız izləyicilər", + "visibility_modal.quote_label": "Kimin sitat gətirə biləcəyini dəyişdir", + "visibility_modal.quote_nobody": "Heç kim", + "visibility_modal.quote_public": "Hər kəs" } diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json index cdca2446ca..f07edacd0c 100644 --- a/app/javascript/mastodon/locales/br.json +++ b/app/javascript/mastodon/locales/br.json @@ -637,5 +637,9 @@ "video.fullscreen": "Skramm a-bezh", "video.hide": "Kuzhat ar video", "video.pause": "Paouez", - "video.play": "Lenn" + "video.play": "Lenn", + "visibility_modal.privacy_label": "Prevezded", + "visibility_modal.quote_followers": "Tud koumanantet hepken", + "visibility_modal.quote_nobody": "Den ebet", + "visibility_modal.quote_public": "Pep den" } diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 018f66935c..c5cc80edd4 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Deine Adresse:", "domain_pill.your_server": "Deine digitale Heimat. Hier „leben“ alle Beiträge von dir. Falls es dir hier nicht gefällt, kannst du jederzeit den Server wechseln und ebenso deine Follower übertragen.", "domain_pill.your_username": "Deine eindeutige Identität auf diesem Server. Es ist möglich, Profile mit dem gleichen Profilnamen auf verschiedenen Servern zu finden.", + "dropdown.empty": "Option auswählen", "embed.instructions": "Du kannst diesen Beitrag auf deiner Website einbetten, indem du den nachfolgenden Code kopierst.", "embed.preview": "Vorschau:", "emoji_button.activity": "Aktivitäten", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Beitragsveröffentlichung ausstehend", "status.quote_error.pending_approval_popout.body": "Zitierte Beiträge, die im Fediverse geteilt werden, benötigen einige Zeit, bis sie überall angezeigt werden, da die verschiedenen Server unterschiedliche Protokolle nutzen.", "status.quote_error.pending_approval_popout.title": "Zitierter Beitrag noch nicht freigegeben? Immer mit der Ruhe", + "status.quote_policy_change": "Ändern, wer zitieren darf", "status.quote_post_author": "Zitierte einen Beitrag von @{name}", "status.read_more": "Gesamten Beitrag anschauen", "status.reblog": "Teilen", @@ -959,5 +961,17 @@ "video.skip_forward": "Vorspulen", "video.unmute": "Stummschaltung aufheben", "video.volume_down": "Leiser", - "video.volume_up": "Lauter" + "video.volume_up": "Lauter", + "visibility_modal.button_title": "Sichtbarkeit festlegen", + "visibility_modal.header": "Sichtbarkeit und Interaktion", + "visibility_modal.helper.direct_quoting": "Private Erwähnungen können nicht zitiert werden.", + "visibility_modal.helper.privacy_editing": "Die Sichtbarkeit bereits veröffentlichter Beiträge kann nachträglich nicht mehr geändert werden.", + "visibility_modal.helper.private_quoting": "Beiträge, die nur für deine Follower bestimmt sind, können nicht zitiert werden.", + "visibility_modal.helper.unlisted_quoting": "Sollten dich andere zitieren, werden ihre zitierten Beiträge ebenfalls nicht in den Trends und öffentlichen Timelines angezeigt.", + "visibility_modal.instructions": "Bestimme, wer mit diesem Beitrag interagieren darf. Allgemeingültige Einstellungen findest du unter Einstellungen > Erweitert.", + "visibility_modal.privacy_label": "Datenschutz", + "visibility_modal.quote_followers": "Nur Follower", + "visibility_modal.quote_label": "Ändern, wer zitieren darf", + "visibility_modal.quote_nobody": "Niemand", + "visibility_modal.quote_public": "Alle" } diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 2b2ce14d5b..28645d5c83 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Tu alias:", "domain_pill.your_server": "Tu hogar digital, donde residen todos tus mensajes. ¿No te gusta este sitio? Mudate a otro servidor en cualquier momento y llevate a tus seguidores.", "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar cuentas con el mismo nombre de usuario en diferentes servidores.", + "dropdown.empty": "Seleccioná una opción", "embed.instructions": "Insertá este mensaje a tu sitio web copiando el código de abajo.", "embed.preview": "Así es cómo se verá:", "emoji_button.activity": "Actividad", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Mensaje pendiente", "status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que diferentes servidores tienen diferentes protocolos.", "status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Esperá un momento", + "status.quote_policy_change": "Cambiá quién puede citar", "status.quote_post_author": "Se citó un mensaje de @{name}", "status.read_more": "Leé más", "status.reblog": "Adherir", @@ -959,5 +961,17 @@ "video.skip_forward": "Adelantar", "video.unmute": "Quitar silenciado", "video.volume_down": "Bajar volumen", - "video.volume_up": "Subir volumen" + "video.volume_up": "Subir volumen", + "visibility_modal.button_title": "Establecer visibilidad", + "visibility_modal.header": "Visibilidad e interacción", + "visibility_modal.helper.direct_quoting": "No se pueden citar las menciones privadas.", + "visibility_modal.helper.privacy_editing": "No se puede cambiar la visibilidad a los mensajes ya enviados.", + "visibility_modal.helper.private_quoting": "No se pueden citar los mensajes destinados solo a seguidores.", + "visibility_modal.helper.unlisted_quoting": "Cuando otras cuentas te citen, sus publicaciones también se ocultarán de las líneas temporales de tendencias.", + "visibility_modal.instructions": "Controlá quién puede interactuar con este mensaje. Los ajustes globales se pueden encontrar en «Configuración» > «Otras opciones».", + "visibility_modal.privacy_label": "Privacidad", + "visibility_modal.quote_followers": "Solo para seguidores", + "visibility_modal.quote_label": "Cambiá quién puede citar", + "visibility_modal.quote_nobody": "Ninguna cuenta", + "visibility_modal.quote_public": "Cualquier cuenta" } diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 7caaf0c230..1edf56d888 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Títt hald:", "domain_pill.your_server": "Títt talgilda heim, har allir tínir postar liva. Dámar tað ikki hendan? Flyt til ein annan ambætara tá tú hevur hug til tess og tak fylgjarar tínar við eisini.", "domain_pill.your_username": "Títt eyðmerki á hesum ambætaranum. Tað er møguligt at finna brúkarar við tí sama brúkaranavninum á ymiskum ambætarum.", + "dropdown.empty": "Vel ein møguleika", "embed.instructions": "Fell hendan postin inní á tínum vevstaði við at taka avrit av koduni niðanfyri.", "embed.preview": "Soleiðis fer tað at síggja út:", "emoji_button.activity": "Virksemi", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Postur bíðar", "status.quote_error.pending_approval_popout.body": "Sitatir, sum eru deild tvørtur um fediversið, kunnu taka nakað av tíð at vísast, tí ymiskir ambætarar hava ymiskar protokollir.", "status.quote_error.pending_approval_popout.title": "Bíðar eftir sitati? Tak tað róligt", + "status.quote_policy_change": "Broyt hvør kann sitera", "status.quote_post_author": "Siteraði ein post hjá @{name}", "status.read_more": "Les meira", "status.reblog": "Stimbra", @@ -959,5 +961,17 @@ "video.skip_forward": "Leyp um frameftir", "video.unmute": "Doyv ikki", "video.volume_down": "Minka ljóðstyrki", - "video.volume_up": "Øk um ljóðstyrki" + "video.volume_up": "Øk um ljóðstyrki", + "visibility_modal.button_title": "Set sýni", + "visibility_modal.header": "Sýni og samvirkni", + "visibility_modal.helper.direct_quoting": "Privatar umrøður kunnu ikki siterast.", + "visibility_modal.helper.privacy_editing": "Útgivnir postar kunnnu ikki broyta sýni.", + "visibility_modal.helper.private_quoting": "Postar, sum einans eru fyri fylgjarar, kunnu ikki siterast.", + "visibility_modal.helper.unlisted_quoting": "Tá fólk sitera teg, so vera teirra postar eisini fjaldir frá tíðarlinjum við ráki.", + "visibility_modal.instructions": "Stýr, hvør kann virka saman við hesum postinum. Globalar stillingar finnast undir Stilingar > Onnur.", + "visibility_modal.privacy_label": "Privatlív", + "visibility_modal.quote_followers": "Einans fylgjarar", + "visibility_modal.quote_label": "Broyt hvør kann sitera", + "visibility_modal.quote_nobody": "Eingin", + "visibility_modal.quote_public": "Ein og hvør" } diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 5ba44f9c75..39c7a4825d 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Saját fióknév:", "domain_pill.your_server": "A digitális otthonod, ahol a bejegyzéseid találhatók. Nem tetszik a mostani? Válts kiszolgálót bármikor, és vidd magaddal a követőidet is.", "domain_pill.your_username": "Az egyedi azonosítód ezen a kiszolgálón. Lehet, hogy ugyanazon felhasználónév különböző kiszolgálókon is megtalálható.", + "dropdown.empty": "Válassz egy lehetőséget", "embed.instructions": "Ágyazd be ezt a bejegyzést a weboldaladba az alábbi kód kimásolásával.", "embed.preview": "Így fog kinézni:", "emoji_button.activity": "Tevékenység", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "A bejegyzés függőben van", "status.quote_error.pending_approval_popout.body": "A Födiverzumon keresztül megosztott idézetek megjelenítése eltarthat egy darabig, mivel a különböző kiszolgálók különböző protokollokat használnak.", "status.quote_error.pending_approval_popout.title": "Függőben lévő idézet? Maradj nyugodt.", + "status.quote_policy_change": "Módosítás, hogy kik idézhetnek", "status.quote_post_author": "Idézte @{name} bejegyzését", "status.read_more": "Bővebben", "status.reblog": "Megtolás", @@ -959,5 +961,17 @@ "video.skip_forward": "Előreugrás", "video.unmute": "Némítás feloldása", "video.volume_down": "Hangerő le", - "video.volume_up": "Hangerő fel" + "video.volume_up": "Hangerő fel", + "visibility_modal.button_title": "Láthatóság beállítása", + "visibility_modal.header": "Láthatóság és interakció", + "visibility_modal.helper.direct_quoting": "A privát említések nem idézhetőek.", + "visibility_modal.helper.privacy_editing": "A közzétett bejegyzések láthatósága nem módosítható.", + "visibility_modal.helper.private_quoting": "A csak követőknek szánt bejegyzéseket nem lehet idézni.", + "visibility_modal.helper.unlisted_quoting": "Amikor idéznek tőled, a bejegyzésük rejtve lesz a felkapott bejegyzések hírfolyamain is.", + "visibility_modal.instructions": "Döntsd el, hogy ki léphet interakcióba a bejegyzéssel. A globális beállítások a Beállítások > Egyéb alatt találhatóak.", + "visibility_modal.privacy_label": "Adatvédelem", + "visibility_modal.quote_followers": "Csak követőknek", + "visibility_modal.quote_label": "Módosítás, hogy kik idézhetnek", + "visibility_modal.quote_nobody": "Senki", + "visibility_modal.quote_public": "Bárki" } diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index a3c9e8733c..edee4b67f4 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Kennislóðin þín:", "domain_pill.your_server": "Stafrænt heimili þitt, þar sem allar færslur þínar eru hýstar. Kanntu ekki við þennan netþjón? Þú getur flutt þig á milli netþjóna hvenær sem er og tekið með þér alla fylgjendurna þína.", "domain_pill.your_username": "Sértækt auðkenni þitt á þessum netþjóni. Það er mögulegt að finna notendur með sama notandanafn á mismunandi netþjónum.", + "dropdown.empty": "Veldu valkost", "embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.", "embed.preview": "Svona mun þetta líta út:", "emoji_button.activity": "Virkni", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Færsla í bið", "status.quote_error.pending_approval_popout.body": "Tilvitnanir sem deilt er út um samfélagsnetið geta þurft nokkurn tíma áður en þær birtast, því mismunandi netþjónar geta haft mismunandi samskiptareglur.", "status.quote_error.pending_approval_popout.title": "Færsla í bið? Verum róleg", + "status.quote_policy_change": "Breyttu því hver getur tilvitnað", "status.quote_post_author": "Vitnaði í færslu frá @{name}", "status.read_more": "Lesa meira", "status.reblog": "Endurbirting", @@ -959,5 +961,12 @@ "video.skip_forward": "Stökkva áfram", "video.unmute": "Hætta að þagga", "video.volume_down": "Lækka hljóðstyrk", - "video.volume_up": "Hækka hljóðstyrk" + "video.volume_up": "Hækka hljóðstyrk", + "visibility_modal.button_title": "Stilla sýnileika", + "visibility_modal.header": "Sýnileiki og gagnvirkni", + "visibility_modal.privacy_label": "Persónuvernd", + "visibility_modal.quote_followers": "Einungis fylgjendur", + "visibility_modal.quote_label": "Breyttu því hver getur tilvitnað", + "visibility_modal.quote_nobody": "Enginn", + "visibility_modal.quote_public": "Hver sem er" } diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 45ca92bebe..c1643ab9be 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -245,6 +245,8 @@ "confirmations.remove_from_followers.confirm": "Ta bort följare", "confirmations.remove_from_followers.message": "{name} kommer att sluta följa dig. Är du säker på att du vill fortsätta?", "confirmations.remove_from_followers.title": "Ta bort följare?", + "confirmations.revoke_quote.confirm": "Ta bort inlägg", + "confirmations.revoke_quote.title": "Ta bort inlägg?", "confirmations.unfollow.confirm": "Avfölj", "confirmations.unfollow.message": "Är du säker på att du vill avfölja {name}?", "confirmations.unfollow.title": "Avfölj användare?", @@ -289,6 +291,7 @@ "domain_pill.your_handle": "Ditt handtag:", "domain_pill.your_server": "Ditt digitala hem, där alla dina inlägg bor. Gillar du inte just denna? Byt server när som helst och ta med dina anhängare också.", "domain_pill.your_username": "Din unika identifierare på denna server. Det är möjligt att hitta användare med samma användarnamn på olika servrar.", + "dropdown.empty": "Välj ett alternativ", "embed.instructions": "Bädda in detta inlägg på din webbplats genom att kopiera koden nedan.", "embed.preview": "Så här kommer det att se ut:", "emoji_button.activity": "Aktivitet", @@ -498,6 +501,8 @@ "keyboard_shortcuts.translate": "för att översätta ett inlägg", "keyboard_shortcuts.unfocus": "Avfokusera skrivfält/sökfält", "keyboard_shortcuts.up": "Flytta uppåt i listan", + "learn_more_link.got_it": "Jag förstår", + "learn_more_link.learn_more": "Läs mer", "lightbox.close": "Stäng", "lightbox.next": "Nästa", "lightbox.previous": "Tidigare", @@ -873,6 +878,7 @@ "status.open": "Utvidga detta inlägg", "status.pin": "Fäst i profil", "status.quote_error.filtered": "Dolt på grund av ett av dina filter", + "status.quote_error.not_available": "Inlägg ej tillgängligt", "status.read_more": "Läs mer", "status.reblog": "Boosta", "status.reblog_private": "Boosta med ursprunglig synlighet", @@ -946,5 +952,10 @@ "video.skip_forward": "Hoppa framåt", "video.unmute": "Avtysta", "video.volume_down": "Volym ned", - "video.volume_up": "Volym upp" + "video.volume_up": "Volym upp", + "visibility_modal.header": "Synlighet och interaktion", + "visibility_modal.privacy_label": "Integritet", + "visibility_modal.quote_followers": "Endast följare", + "visibility_modal.quote_nobody": "Ingen", + "visibility_modal.quote_public": "Alla" } diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index bee00c0f06..c8f7b7e415 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -274,6 +274,7 @@ "domain_pill.your_handle": "Ваша адреса:", "domain_pill.your_server": "Ваш цифровий дім, де живуть усі ваші дописи. Не подобається цей? Перенесіть сервери в будь-який час і залучайте своїх підписників.", "domain_pill.your_username": "Ваш унікальний ідентифікатор на цьому сервері. Ви можете знайти користувачів з однаковими іменами на різних серверах.", + "dropdown.empty": "Оберіть варіант", "embed.instructions": "Вбудуйте цей допис до вашого вебсайту, скопіювавши код нижче.", "embed.preview": "Ось який вигляд це матиме:", "emoji_button.activity": "Діяльність", @@ -919,5 +920,10 @@ "video.fullscreen": "На весь екран", "video.hide": "Приховати відео", "video.pause": "Призупинити", - "video.play": "Програвати" + "video.play": "Програвати", + "visibility_modal.privacy_label": "Конфіденційність", + "visibility_modal.quote_followers": "Тільки для підписників", + "visibility_modal.quote_label": "Змінити хто може цитувати", + "visibility_modal.quote_nobody": "Ніхто", + "visibility_modal.quote_public": "Будь-хто" } diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 37e8ecee8d..f5d3b1b345 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Địa chỉ Mastodon của bạn:", "domain_pill.your_server": "Nơi lưu trữ tút của bạn. Không thích ở đây? Chuyển sang máy chủ khác và giữ nguyên người theo dõi của bạn.", "domain_pill.your_username": "Chỉ riêng bạn trên máy chủ này. Những máy chủ khác có thể cũng có tên người dùng giống vậy.", + "dropdown.empty": "Chọn một lựa chọn", "embed.instructions": "Sao chép đoạn mã dưới đây và chèn vào trang web của bạn.", "embed.preview": "Nó sẽ hiển thị như vầy:", "emoji_button.activity": "Hoạt động", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Tút đang chờ duyệt", "status.quote_error.pending_approval_popout.body": "Các trích dẫn được chia sẻ trên Fediverse có thể mất thời gian để hiển thị vì các máy chủ khác nhau có giao thức khác nhau.", "status.quote_error.pending_approval_popout.title": "Đang chờ trích dẫn? Hãy bình tĩnh", + "status.quote_policy_change": "Thay đổi người có thể trích dẫn", "status.quote_post_author": "Trích dẫn từ tút của @{name}", "status.read_more": "Đọc tiếp", "status.reblog": "Đăng lại", @@ -959,5 +961,17 @@ "video.skip_forward": "Tua tới", "video.unmute": "Bật tiếng", "video.volume_down": "Giảm âm lượng", - "video.volume_up": "Tăng âm lượng" + "video.volume_up": "Tăng âm lượng", + "visibility_modal.button_title": "Thay đổi quyền riêng tư", + "visibility_modal.header": "Hiển thị và tương tác", + "visibility_modal.helper.direct_quoting": "Không thể trích dẫn nhắn riêng.", + "visibility_modal.helper.privacy_editing": "Không thể thay đổi kiểu hiển thị của tút đã đăng.", + "visibility_modal.helper.private_quoting": "Không thể trích dẫn những tút chỉ dành cho người theo dõi.", + "visibility_modal.helper.unlisted_quoting": "Khi ai đó trích dẫn bạn, tút của họ cũng sẽ bị ẩn khỏi bảng tin công khai.", + "visibility_modal.instructions": "Kiểm soát những ai có thể tương tác với tút này. Cài đặt chung trong Thiết lập > Khác.", + "visibility_modal.privacy_label": "Riêng tư", + "visibility_modal.quote_followers": "Chỉ người theo dõi", + "visibility_modal.quote_label": "Thay đổi người có thể trích dẫn", + "visibility_modal.quote_nobody": "Không ai", + "visibility_modal.quote_public": "Bất cứ ai" } diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 9dc2998504..2627fe21e3 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "您的帳號:", "domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。", "domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。", + "dropdown.empty": "選取選項", "embed.instructions": "若您欲於您的網站嵌入此嘟文,請複製以下程式碼。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "嘟文正在發送中", "status.quote_error.pending_approval_popout.body": "因為伺服器間可能運行不同協定,顯示聯邦宇宙間之引用嘟文會有些許延遲。", "status.quote_error.pending_approval_popout.title": "引用嘟文正在發送中?別著急,請稍候片刻", + "status.quote_policy_change": "變更可以引用的人", "status.quote_post_author": "已引用 @{name} 之嘟文", "status.read_more": "閱讀更多", "status.reblog": "轉嘟", @@ -959,5 +961,17 @@ "video.skip_forward": "下一部", "video.unmute": "取消靜音", "video.volume_down": "降低音量", - "video.volume_up": "提高音量" + "video.volume_up": "提高音量", + "visibility_modal.button_title": "設定可見性", + "visibility_modal.header": "可見性與互動", + "visibility_modal.helper.direct_quoting": "無法引用私人提及。", + "visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文的可見性。", + "visibility_modal.helper.private_quoting": "無法引用僅追蹤者的嘟文。", + "visibility_modal.helper.unlisted_quoting": "當期他人引用您時,他們的嘟文也會自熱門時間軸隱藏。", + "visibility_modal.instructions": "控制誰能與此嘟文互動。可在偏好設定 > 其他下找到全域設定。", + "visibility_modal.privacy_label": "隱私權", + "visibility_modal.quote_followers": "僅限跟隨者", + "visibility_modal.quote_label": "變更可以引用的人", + "visibility_modal.quote_nobody": "沒有人", + "visibility_modal.quote_public": "所有人" } diff --git a/config/locales/az.yml b/config/locales/az.yml index 1e66e71bed..302dccdecb 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -2,6 +2,9 @@ az: about: about_mastodon_html: 'Gələcəyin sosial şəbəkəsi: Reklam yoxdur, korporativ müşahidə yoxdur, etik dizayn və mərkəziyyətsizlik! Mastodon ilə öz verilərinizə sahib çıxın!' + contact_missing: Ayarlanmayıb + contact_unavailable: Mövcud deyil + title: Haqqında admin: account_actions: title: "%{acct} üzərində moderasiya əməliyyatını icra et" diff --git a/config/locales/devise.az.yml b/config/locales/devise.az.yml index 1df8c31cd6..108f6bc685 100644 --- a/config/locales/devise.az.yml +++ b/config/locales/devise.az.yml @@ -100,3 +100,17 @@ az: already_signed_out: Uğurla hesabdan çıxış edildi. signed_in: Uğurla hesaba daxil olundu. signed_out: Uğurla hesabdan çıxış edildi. + unlocks: + send_instructions: Bir neçə dəqiqə ərzində e-poçt ünvanınızın kilidini necə açmaqla bağlı təlimatlar olan bir e-poçt alacaqsınız. Bu e-poçtu almamısınızsa, lütfən spam qovluğunuzu yoxlayın. + send_paranoid_instructions: Əgər hesabınız mövcuddursa, bir neçə dəqiqə ərzində e-poçt ünvanınızın kilidini necə açmaqla bağlı təlimatlar olan bir e-poçt alacaqsınız. Bu e-poçtu almamısınızsa, lütfən spam qovluğunuzu yoxlayın. + unlocked: Hesabınızın kilidi uğurla açıldı. Davam etmək üçün lütfən giriş edin. + errors: + messages: + already_confirmed: artıq təsdiqlənib, lütfən hesabınıza daxil olmağa çalışın + confirmation_period_expired: "%{period} ərzində təsdiqlənməsi lazımdır, lütfən yenisini tələb edin" + expired: müddəti bitib, lütfən yenisini tələb edin + not_found: tapılmadı + not_locked: kilidlənməyib + not_saved: + one: '1 xəta, bu %{resource} resursunu saxlamağı qadağan etdi:' + other: "%{count} xəta, bu %{resource} resursunu saxlamağı qadağan etdi:" diff --git a/config/locales/doorkeeper.az.yml b/config/locales/doorkeeper.az.yml index 210506ffeb..7cf62a7af9 100644 --- a/config/locales/doorkeeper.az.yml +++ b/config/locales/doorkeeper.az.yml @@ -1,42 +1,175 @@ --- az: + activerecord: + attributes: + doorkeeper/application: + name: Tətbiq adı + redirect_uri: Yönləndirmə URL-si + website: Tətbiq veb saytı + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: fraqment ehtiva edə bilməz. + invalid_uri: yararlı bir URL olmalıdır. + relative_uri: mütləq bir URL olmalıdır. + secured_uri: HTTPS/SSL URL olmalıdır. doorkeeper: + applications: + buttons: + authorize: Səlahiyyət ver + cancel: İmtina + destroy: Məhv et + edit: Düzəliş et + submit: Təqdim et + confirmations: + destroy: Əminsiniz? + edit: + title: Tətbiqə düzəliş et + form: + error: Ups! Mümkün xətalar üçün formunuzu yoxlayın + help: + native_redirect_uri: Lokal testlər üçün %{native_redirect_uri} istifadə edin + redirect_uri: Hər URL üçün bir sətir istifadə edin + index: + application: Tətbiq + delete: Sil + empty: Heç bir tətbiqiniz yoxdur. + name: Ad + new: Yeni tətbiq + show: Göstər + title: Tətbiqləriniz + new: + title: Yeni tətbiq + show: + actions: Əməliyyatlar + application_id: Client açarı + secret: Client sirri + title: 'Tətbiq: %{name}' + authorizations: + buttons: + authorize: Səlahiyyət ver + deny: Rədd et + error: + title: Bir xəta baş verdi + new: + prompt_html: "%{client_name} hesabınıza erişmək üçün icazə istəyir. Yalnız bu mənbəni tanıyırsınızsa və ona güvənirsinizsə bu istəyi təsdiqləyin." + review_permissions: İcazələri incələ + title: Səlahiyyət tələb olunur + show: + title: Bu səlahiyyət kodunu kopyalayın və tətbiqə yapışdırın. authorized_applications: + buttons: + revoke: Ləğv et + confirmations: + revoke: Əminsiniz? index: authorized_at: "%{date} tarixində səlahiyyət verilib" description_html: Bunlar, API istifadə edərək hesabınıza erişəbilən tətbiqlərdir. Əgər burada tanımadığınız tətbiqlər və ya yanlış davranan bir tətbiq varsa, erişimini ləğv edə bilərsiniz. last_used_at: Ən son %{date} istifadə edilib + never_used: Heç vaxt istifadə edilməyib + scopes: İcazələr + superapp: Daxili title: Səlahiyyətli tətbiqləriniz errors: messages: + access_denied: Resurs sahibi və ya avtorizasiya serveri istəyə rədd cavabı verdi. invalid_token: expired: Erişim tokeninin vaxtı bitib revoked: Erişim tokeni ləğv edilib unknown: Erişim tokeni yararsızdır + flash: + applications: + create: + notice: Tətbiq yaradıldı. + destroy: + notice: Tətbiq silindi. + update: + notice: Tətbiq güncəlləndi. + authorized_applications: + destroy: + notice: Tətbiq ləğv edildi. grouped_scopes: access: read: Yalnız oxuma erişimi read/write: Oxuma və yazma erişimi write: Yalnız yazma erişimi title: + accounts: Hesablar + admin/accounts: Hesabların administrasiyası + admin/all: Bütün administrativ funksiyalar + admin/reports: Şikayətlərin administrasiyası all: Mastodon hesabınıza tam erişim + blocks: Əngəlləmələr + bookmarks: Əlfəcinlər + conversations: Danışıqlar + crypto: Ucdan-uca şifrələmə + favourites: Sevimlilər filters: Filtrlər follow: İzləmələr, səsi kəsmələr və əngəlləmələr follows: İzlənilənlər + lists: Siyahılar + media: Media qoşmaları + mutes: Səssizdəkilər + notifications: Bildirişlər + profile: Mastodon profiliniz + push: Ani bildirişlər + reports: Şikayətlər + search: Axtar + statuses: Göndərişlər + layouts: + admin: + nav: + applications: Tətbiqlər + oauth2_provider: OAuth2 Provayderi + application: + title: OAuth səlahiyyəti tələb olunur scopes: - admin:read: serverdəki bütün veriləri oxuma - admin:read:domain_blocks: əngəllənən bütün domenlərin həssas məlumatlarını oxuma - admin:read:email_domain_blocks: əngəllənən bütün e-poçt domenlərinin həssas məlumatlarını oxuma - admin:write: serverdəki bütün veriləri dəyişdirmə - admin:write:accounts: hesablarda moderasiya əməliyyatlarını icra et - admin:write:canonical_email_blocks: - admin:write:domain_allows: domen icazələri üzərində moderasiya əməliyyatlarını icra et - admin:write:domain_blocks: əngəllənən domenlər üzərində moderasiya fəaliyyətlərini icra et - admin:write:email_domain_blocks: əngəllənən e-poçt domenləri üzərində moderasiya fəaliyyətlərini icra et - admin:write:ip_blocks: IP əngəlləmələri üzrə moderasiya əməliyyatlarını icra et - admin:write:reports: hesabatlarda moderasiya əməliyyatlarını icra et - read: hesabınızın bütün verilərini oxuma - read:filters: filtrlərinizə baxın - read:follows: izlədiklərinizə baxın - write: hesabınızın bütün verilərini dəyişdirmə - write:filters: filtrlər yarat + admin:read: serverdəki bütün veriləri oxuyur + admin:read:accounts: bütün hesabların həssas məlumatlarını oxuyur + admin:read:canonical_email_blocks: bütün kanonik e-poçt əngəlləmələrinin həssas məlumatlarını oxuyur + admin:read:domain_allows: bütün domen icazələrinin həssas məlumatlarını oxuyur + admin:read:domain_blocks: bütün əngəllənən domenlərin həssas məlumatlarını oxuyur + admin:read:email_domain_blocks: bütün əngəllənən e-poçt domenlərinin həssas məlumatlarını oxuyur + admin:read:ip_blocks: bütün IP əngəlləmələrinin həssas məlumatlarını oxuyur + admin:read:reports: bütün şikayətlərin və şikayət edilən hesabların həssas məlumatlarını oxuyur + admin:write: serverdəki bütün veriləri dəyişdirir + admin:write:accounts: hesablarda moderasiya əməliyyatlarını icra edir + admin:write:canonical_email_blocks: əngəllənən kanonik e-poçtlar üzərində moderasiya əməliyyatlarını icra edir + admin:write:domain_allows: icazə verilən domenlər üzərində moderasiya əməliyyatlarını icra edir + admin:write:domain_blocks: əngəllənən domenlər üzərində moderasiya əməliyyatlarını icra edir + admin:write:email_domain_blocks: əngəllənən e-poçt domenləri üzərində moderasiya əməliyyatlarını icra edir + admin:write:ip_blocks: əngəllənən IP-lər üzərində moderasiya əməliyyatlarını icra edir + admin:write:reports: hesabatlarda moderasiya əməliyyatlarını icra edir + crypto: ucdan-uca şifrələməni istifadə edir + follow: hesab münasibətlərini dəyişdirir + profile: hesabınızın yalnız profil məlumatlarını oxuyur + push: ani bildirişlərinizi alır + read: hesabınızın bütün verilərini oxuyur + read:accounts: hesab məlumatlarını görür + read:blocks: əngəllədiklərinizi görür + read:bookmarks: əlfəcinlərinizi görür + read:favourites: sevimlilərinizi görür + read:filters: filtrlərinizi görür + read:follows: izlədiklərinizi görür + read:lists: siyahılarınızı görür + read:mutes: səssizə aldıqlarınızı görür + read:notifications: bildirişlərinizi görür + read:reports: hesabatlarınızı görür + read:search: sizin adınıza axtarış edir + read:statuses: bütün göndərişləri görür + write: hesabınızın bütün verilərini dəyişdirir + write:accounts: profilinizi dəyişdirir + write:blocks: hesabları və domenləri əngəlləyir + write:bookmarks: göndərişləri əlfəcinlərə əlavə edir + write:conversations: danışıqları səssizə alır və silir + write:favourites: göndərişləri sevimlilərə əlavə edir + write:filters: filtrlər yaradır + write:follows: insanları izləyir + write:lists: siyahılar yaradır + write:media: media faylları yükləyir + write:mutes: insanları və danışıqları səssizə alır + write:notifications: bildirişlərinizi təmizləyir + write:reports: digər insanları şikayət edir + write:statuses: göndərişləri dərc edir diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 32ea9f26c3..ac60d968d9 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -2063,6 +2063,9 @@ pl: recovery_instructions_html: Jeżeli kiedykolwiek utracisz dostęp do telefonu, możesz wykorzystać jeden z kodów zapasowych, aby odzyskać dostęp do konta. Trzymaj je w bezpiecznym miejscu. Na przykład, wydrukuj je i przechowuj z ważnymi dokumentami. webauthn: Klucze bezpieczeństwa user_mailer: + announcement_published: + subject: Ogłoszenie serwisu + title: Ogłoszenie serwisu %{domain} appeal_approved: action: Ustawienia Konta explanation: Twoje odwołanie dotyczące ostrzeżenia nałożonego na twoje konto dnia %{strike_date}, które zostało wysłane dnia %{appeal_date} zostało zatwierdzone. Twoje konto jest ponownie w dobrej kondycji. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 58f71bb454..b34a8ab84c 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1932,7 +1932,7 @@ ru: download: Скачать (%{count}) event_type: account_suspension: Пользователь был заблокирован модераторами (%{target_name}) - domain_block: Сервер был заблокирован модераторами (%{target_name}) + domain_block: Сервер %{target_name} был заблокирован модераторами user_domain_block: Вы заблокировали %{target_name} lost_followers: Потерянные подписчики lost_follows: Потерянные подписки diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index 23204dea2d..7300d67c97 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -150,6 +150,11 @@ pl: min_age: Nie powinien być niższy niż minimalny wiek wymagany przez prawo twojego państwa. user: chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu + date_of_birth: + few: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. + many: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. + one: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. + other: Musimy upewnić się, że jesteś co najmniej %{count} aby użyć %{domain}. Nie będziemy tego przechowywać. role: Rola kontroluje uprawnienia użytkownika. user_role: color: Kolor używany dla roli w całym interfejsie użytkownika, wyrażony jako RGB w formacie szesnastkowym diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 96f00e48c2..598617efdc 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -367,6 +367,9 @@ sv: name: Namn permissions_as_keys: Behörigheter position: Prioritet + username_block: + allow_with_approval: Tillåt registreringar med godkännande + username: Ord att matcha webhook: events: Aktiverade händelser template: Lastmall diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 25bc593917..594f4b9740 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -190,6 +190,7 @@ sv: create_relay: Skapa ombud create_unavailable_domain: Skapa otillgänglig domän create_user_role: Skapa roll + create_username_block: Skapa användarnamnsregel demote_user: Degradera användare destroy_announcement: Radera notis destroy_canonical_email_block: Ta bort e-post block @@ -203,6 +204,7 @@ sv: destroy_status: Radera inlägg destroy_unavailable_domain: Ta bort otillgänglig domän destroy_user_role: Förstör roll + destroy_username_block: Ta bort användarnamnsregel disable_2fa_user: Inaktivera 2FA disable_custom_emoji: Inaktivera egna emojis disable_relay: Inaktivera ombud @@ -237,6 +239,7 @@ sv: update_report: Uppdatera rapport update_status: Uppdatera inlägg update_user_role: Uppdatera roll + update_username_block: Uppdatera användarnamnsregel actions: approve_appeal_html: "%{name} godkände överklagande av modereringsbeslut från %{target}" approve_user_html: "%{name} godkände registrering från %{target}" @@ -1085,6 +1088,17 @@ sv: other: Använd av %{count} personer under den senaste veckan title: Rekommendationer & Trender trending: Trendande + username_blocks: + add_new: Lägg till ny + comparison: + contains: Innehåller + delete: Ta bort + edit: + title: Redigera användarnamnsregel + new: + create: Skapa regel + title: Skapa ny användarnamnsregel + not_permitted: Ej tillåtet warning_presets: add_new: Lägg till ny delete: Radera @@ -1880,6 +1894,8 @@ sv: ownership: Någon annans inlägg kan inte fästas reblog: En boost kan inte fästas quote_policies: + followers: Endast dina följare + nobody: Ingen public: Alla title: '%{name}: "%{quote}"' visibilities: From 83fcd1cf4f0d11cd34d79d6dcda8d827848d3bc7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:01:07 +0200 Subject: [PATCH 45/64] Update dependency rails-i18n to v8.0.2 (#35796) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b0bf819481..6a4040cffb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -688,7 +688,7 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - rails-i18n (8.0.1) + rails-i18n (8.0.2) i18n (>= 0.7, < 2) railties (>= 8.0.0, < 9) railties (8.0.2.1) From a18e6199efb60be6d0f14bca176dfc37f1fdbc07 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:03:54 +0200 Subject: [PATCH 46/64] New Crowdin Translations (automated) (#35795) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/az.json | 3 +- app/javascript/mastodon/locales/be.json | 16 +++++++- app/javascript/mastodon/locales/bg.json | 28 ++++++++++++- app/javascript/mastodon/locales/ca.json | 18 ++++++++- app/javascript/mastodon/locales/cs.json | 16 +++++++- app/javascript/mastodon/locales/cy.json | 33 ++++++++++++++- app/javascript/mastodon/locales/da.json | 16 +++++++- app/javascript/mastodon/locales/el.json | 16 +++++++- app/javascript/mastodon/locales/eo.json | 14 ++++++- app/javascript/mastodon/locales/es-MX.json | 16 +++++++- app/javascript/mastodon/locales/es.json | 16 +++++++- app/javascript/mastodon/locales/fa.json | 20 ++++++++- app/javascript/mastodon/locales/fi.json | 16 +++++++- app/javascript/mastodon/locales/ga.json | 16 +++++++- app/javascript/mastodon/locales/gl.json | 16 +++++++- app/javascript/mastodon/locales/he.json | 16 +++++++- app/javascript/mastodon/locales/nan.json | 22 ++++++++-- app/javascript/mastodon/locales/zh-TW.json | 6 +-- config/locales/bg.yml | 38 +++++++++++++++++ config/locales/ca.yml | 2 +- config/locales/cy.yml | 31 ++++++++++++++ config/locales/devise.be.yml | 2 +- config/locales/fa.yml | 20 +++++++++ config/locales/fi.yml | 8 ++-- config/locales/nan.yml | 47 ++++++++++++++++++++-- config/locales/ru.yml | 22 +++++----- config/locales/simple_form.bg.yml | 15 +++++++ config/locales/simple_form.cy.yml | 10 +++++ config/locales/simple_form.fa.yml | 8 ++++ 29 files changed, 461 insertions(+), 46 deletions(-) diff --git a/app/javascript/mastodon/locales/az.json b/app/javascript/mastodon/locales/az.json index a243952ec7..e9bcd2f34e 100644 --- a/app/javascript/mastodon/locales/az.json +++ b/app/javascript/mastodon/locales/az.json @@ -174,7 +174,7 @@ "column.lists": "Siyahılar", "column.mutes": "Səssizləşdirilmiş istifadəçilər", "column.notifications": "Bildirişlər", - "column.pins": "Bərkidilmiş paylaşımlar", + "column.pins": "Sancılmış göndərişlər", "column.public": "Federasiya zaman qrafiki", "column_back_button.label": "Geriyə", "column_header.hide_settings": "Ayarları gizlət", @@ -483,6 +483,7 @@ "keyboard_shortcuts.my_profile": "Profilinizi açın", "keyboard_shortcuts.notifications": "Bildirişlər sütununu aç", "keyboard_shortcuts.open_media": "Medianı aç", + "keyboard_shortcuts.pinned": "Sancılmış göndərişlərin siyahısını aç", "keyboard_shortcuts.profile": "Müəllifin profilini aç", "keyboard_shortcuts.reply": "Göndərişə cavab ver", "keyboard_shortcuts.requests": "İzləmə istəyi siyahısını aç", diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index a3caa5a023..29ad29c4f5 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Ваш ідэнтыфікатар:", "domain_pill.your_server": "Ваш лічбавы дом, дзе захоўваюцца ўсе вашыя допісы. Не падабаецца гэты сервер? Змяніце сервер у любы час з захаваннем сваіх падпісчыкаў.", "domain_pill.your_username": "Ваш унікальны ідэнтыфікатар на гэтым серверы. Можна знайсці карыстальнікаў з аднолькавым іменем карыстальніка на розных серверах.", + "dropdown.empty": "Выбраць варыянт", "embed.instructions": "Убудуйце гэты допіс на свой сайт, скапіраваўшы прыведзены ніжэй код.", "embed.preview": "Вось як гэта будзе выглядаць:", "emoji_button.activity": "Актыўнасць", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Допіс чакае пацвярджэння", "status.quote_error.pending_approval_popout.body": "Допісы, якія былі цытаваныя паміж серверамі Fediverse, могуць доўга загружацца, паколькі розныя серверы маюць розныя пратаколы.", "status.quote_error.pending_approval_popout.title": "Цытаваны допіс чакае пацвярджэння? Захоўвайце спакой", + "status.quote_policy_change": "Змяніць, хто можа цытаваць", "status.quote_post_author": "Цытаваў допіс @{name}", "status.read_more": "Чытаць болей", "status.reblog": "Пашырыць", @@ -959,5 +961,17 @@ "video.skip_forward": "Праматаць уперад", "video.unmute": "Уключыць гук", "video.volume_down": "Паменшыць гучнасць", - "video.volume_up": "Павялічыць гучнасць" + "video.volume_up": "Павялічыць гучнасць", + "visibility_modal.button_title": "Вызначыць бачнасць", + "visibility_modal.header": "Бачнасць і ўзаемадзеянне", + "visibility_modal.helper.direct_quoting": "Прыватныя згадванні нельга цытаваць.", + "visibility_modal.helper.privacy_editing": "Апублікаваным допісам нельга змяняць бачнасць.", + "visibility_modal.helper.private_quoting": "Допісы для падпісчыкаў нельга цытаваць.", + "visibility_modal.helper.unlisted_quoting": "Калі людзі працытуюць Вас, іх допіс таксама будзе схаваны ад стужкі трэндаў.", + "visibility_modal.instructions": "Кантралюйце, хто можа ўзаемадзейнічаць з Вашым допісам. Глабальныя налады можна знайсці ў Налады > Іншае.", + "visibility_modal.privacy_label": "Прыватнасць", + "visibility_modal.quote_followers": "Толькі падпісчыкі", + "visibility_modal.quote_label": "Змяніць, хто можа цытаваць", + "visibility_modal.quote_nobody": "Ніхто", + "visibility_modal.quote_public": "Усе" } diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 6f0cf6f54f..04abc227fa 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -1,6 +1,7 @@ { "about.blocks": "Модерирани сървъри", "about.contact": "За контакти:", + "about.default_locale": "По подразбиране", "about.disclaimer": "Mastodon е безплатен софтуер с отворен изходен код и търговска марка на Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Няма налична причина", "about.domain_blocks.preamble": "Mastodon обикновено позволява да разглеждате съдържание и да взаимодействате с други потребители от всякакви сървъри във Федивселената. Има изключения, направени конкретно за този сървър.", @@ -244,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Премахване на последовател", "confirmations.remove_from_followers.message": "{name} ще спре да ви следва. Наистина ли искате да продължите?", "confirmations.remove_from_followers.title": "Премахвате ли последовател?", + "confirmations.revoke_quote.confirm": "Премахване на публикация", + "confirmations.revoke_quote.message": "Действието е неотменимо.", + "confirmations.revoke_quote.title": "Премахвате ли публикацията?", "confirmations.unfollow.confirm": "Без следване", "confirmations.unfollow.message": "Наистина ли искате вече да не следвате {name}?", "confirmations.unfollow.title": "Спирате ли да следвате потребителя?", @@ -288,6 +292,7 @@ "domain_pill.your_handle": "Вашият адрес:", "domain_pill.your_server": "Цифровият ви дом, където живеят всичките ви публикации. Не харесвате ли този? Прехвърляте се на сървъри по всяко време и докарвате последователите си също.", "domain_pill.your_username": "Неповторимият ви идентификатор на този сървър. Възможно е да се намерят потребители със същото потребителско име на други сървъри.", + "dropdown.empty": "Изберете възможност", "embed.instructions": "Вградете публикацията в уебсайта си, копирайки кода долу.", "embed.preview": "Ето как ще изглежда:", "emoji_button.activity": "Дейност", @@ -493,6 +498,8 @@ "keyboard_shortcuts.translate": "за превод на публикация", "keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене", "keyboard_shortcuts.up": "Преместване нагоре в списъка", + "learn_more_link.got_it": "Разбрах", + "learn_more_link.learn_more": "Научете повече", "lightbox.close": "Затваряне", "lightbox.next": "Напред", "lightbox.previous": "Назад", @@ -587,6 +594,7 @@ "notification.label.mention": "Споменаване", "notification.label.private_mention": "Частно споменаване", "notification.label.private_reply": "Личен отговор", + "notification.label.quote": "{name} цитира ваша публикация", "notification.label.reply": "Отговор", "notification.mention": "Споменаване", "notification.mentioned_you": "{name} ви спомена", @@ -644,6 +652,7 @@ "notifications.column_settings.mention": "Споменавания:", "notifications.column_settings.poll": "Резултати от анкета:", "notifications.column_settings.push": "Изскачащи известия", + "notifications.column_settings.quote": "Цитати:", "notifications.column_settings.reblog": "Подсилвания:", "notifications.column_settings.show": "Показване в колоната", "notifications.column_settings.sound": "Пускане на звук", @@ -834,6 +843,8 @@ "status.bookmark": "Отмятане", "status.cancel_reblog_private": "Край на подсилването", "status.cannot_reblog": "Публикацията не може да се подсилва", + "status.context.load_new_replies": "Има нови отговори", + "status.context.loading": "Проверка за още отговори", "status.continued_thread": "Продължена нишка", "status.copy": "Копиране на връзката към публикация", "status.delete": "Изтриване", @@ -860,6 +871,10 @@ "status.open": "Разширяване на публикацията", "status.pin": "Закачане в профила", "status.quote_error.filtered": "Скрито поради един от филтрите ви", + "status.quote_error.not_available": "Неналична публикация", + "status.quote_error.pending_approval": "Публикацията чака одобрение", + "status.quote_policy_change": "Промяна кой може да цитира", + "status.quote_post_author": "Цитирах публикация от @{name}", "status.read_more": "Още за четене", "status.reblog": "Подсилване", "status.reblog_private": "Подсилване с оригиналната видимост", @@ -874,6 +889,7 @@ "status.reply": "Отговор", "status.replyAll": "Отговор на нишка", "status.report": "Докладване на @{name}", + "status.revoke_quote": "Премахване на моя публикация от публикацията на @{name}", "status.sensitive_warning": "Деликатно съдържание", "status.share": "Споделяне", "status.show_less_all": "Показване на по-малко за всички", @@ -933,5 +949,15 @@ "video.skip_forward": "Прескок напред", "video.unmute": "Без заглушаване", "video.volume_down": "Намаляване на звука", - "video.volume_up": "Увеличаване на звука" + "video.volume_up": "Увеличаване на звука", + "visibility_modal.button_title": "Задаване на видимост", + "visibility_modal.header": "Видимост и взаимодействие", + "visibility_modal.helper.direct_quoting": "Частни споменавания не може да се цитират.", + "visibility_modal.helper.privacy_editing": "Публикуваните публикации не може да променят видимостта си.", + "visibility_modal.instructions": "Управлявайте кой може да взаимодейства с тази публикация. Глобалните настройки може да се намерят под Предпочитания> Друго.", + "visibility_modal.privacy_label": "Поверителност", + "visibility_modal.quote_followers": "Само последователи", + "visibility_modal.quote_label": "Промяна кой може да цитира", + "visibility_modal.quote_nobody": "Никого", + "visibility_modal.quote_public": "Някой" } diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 103b4f3715..288227053d 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -245,7 +245,9 @@ "confirmations.remove_from_followers.confirm": "Elimina el seguidor", "confirmations.remove_from_followers.message": "{name} deixarà de seguir-vos. Tirem endavant?", "confirmations.remove_from_followers.title": "Eliminem el seguidor?", + "confirmations.revoke_quote.confirm": "Eliminar la publicació", "confirmations.revoke_quote.message": "Aquesta acció no es pot desfer.", + "confirmations.revoke_quote.title": "Eliminar la publicació?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Segur que vols deixar de seguir {name}?", "confirmations.unfollow.title": "Deixar de seguir l'usuari?", @@ -290,6 +292,7 @@ "domain_pill.your_handle": "El vostre identificador:", "domain_pill.your_server": "La vostra llar digital, on són totes les vostres publicacions. No us agrada aquesta? Canvieu de servidor quan vulgueu i emporteu-vos els vostres seguidors.", "domain_pill.your_username": "El vostre identificador únic en aquest servidor. Hi pot haver usuaris amb el mateix nom a diferents servidors.", + "dropdown.empty": "Seleccioneu una opció", "embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.", "embed.preview": "Aquest aspecte tindrà:", "emoji_button.activity": "Activitat", @@ -881,6 +884,7 @@ "status.quote_error.pending_approval": "Publicació pendent", "status.quote_error.pending_approval_popout.body": "Les citacions compartides a través del Fediverse poden trigar en aparèixer, perquè diferents servidors tenen diferents protocols.", "status.quote_error.pending_approval_popout.title": "Publicació pendent? Mantinguem la calma", + "status.quote_policy_change": "Canvieu qui us pot citar", "status.quote_post_author": "S'ha citat una publicació de @{name}", "status.read_more": "Més informació", "status.reblog": "Impulsa", @@ -956,5 +960,17 @@ "video.skip_forward": "Salta endavant", "video.unmute": "Deixa de silenciar", "video.volume_down": "Abaixa el volum", - "video.volume_up": "Apuja el volum" + "video.volume_up": "Apuja el volum", + "visibility_modal.button_title": "Establiu la visibilitat", + "visibility_modal.header": "Visibilitat i interacció", + "visibility_modal.helper.direct_quoting": "No es poden citar les mencions privades.", + "visibility_modal.helper.privacy_editing": "No es pot canviar la visibilitat de les publicacions ja fetes.", + "visibility_modal.helper.private_quoting": "No es poden citar les publicacions només per a seguidors.", + "visibility_modal.helper.unlisted_quoting": "Quan la gent et citi les seves publicacions estaran amagades de les línies de temps de tendències.", + "visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. La configuració global es troba a Preferències>Altres.", + "visibility_modal.privacy_label": "Privacitat", + "visibility_modal.quote_followers": "Només seguidors", + "visibility_modal.quote_label": "Canvieu qui us pot citar", + "visibility_modal.quote_nobody": "Ningú", + "visibility_modal.quote_public": "Qualsevol" } diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index bd8d5a5d8b..dc314244a3 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Tvůj handle:", "domain_pill.your_server": "Tvůj digitální domov, kde žijí všechny tvé příspěvky. Nelíbí se ti? Kdykoliv se přesuň na jiný server a vezmi si sebou i své sledující.", "domain_pill.your_username": "Tvůj jedinečný identifikátor na tomto serveru. Je možné najít uživatele se stejným uživatelským jménem na jiných serverech.", + "dropdown.empty": "Vyberte možnost", "embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.", "embed.preview": "Takhle to bude vypadat:", "emoji_button.activity": "Aktivita", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Příspěvek čeká na schválení", "status.quote_error.pending_approval_popout.body": "Zobrazení citátů sdílených napříč Fediversem může chvíli trvat, protože různé servery používají různé protokoly.", "status.quote_error.pending_approval_popout.title": "Příspěvek čeká na schválení? Buďte klidní", + "status.quote_policy_change": "Změňte, kdo může citovat", "status.quote_post_author": "Citovali příspěvek od @{name}", "status.read_more": "Číst více", "status.reblog": "Boostnout", @@ -959,5 +961,17 @@ "video.skip_forward": "Přeskočit vpřed", "video.unmute": "Zrušit ztlumení", "video.volume_down": "Snížit hlasitost", - "video.volume_up": "Zvýšit hlasitost" + "video.volume_up": "Zvýšit hlasitost", + "visibility_modal.button_title": "Nastavit viditelnost", + "visibility_modal.header": "Viditelnost a interakce", + "visibility_modal.helper.direct_quoting": "Soukromé zmínky nemohou být citovány.", + "visibility_modal.helper.privacy_editing": "Publikované příspěvky nemohou změnit svou viditelnost.", + "visibility_modal.helper.private_quoting": "Nelze citovat příspěvky, které jsou pouze pro sledující.", + "visibility_modal.helper.unlisted_quoting": "Když vás lidé citují, jejich příspěvek bude v časové ose populárních příspěvků také skryt.", + "visibility_modal.instructions": "Kontrolujte, kdo může interagovat s tímto příspěvkem. Globální nastavení můžete najít pod Nastavení > Ostatní.", + "visibility_modal.privacy_label": "Soukromí", + "visibility_modal.quote_followers": "Pouze sledující", + "visibility_modal.quote_label": "Změňte, kdo může citovat", + "visibility_modal.quote_nobody": "Nikdo", + "visibility_modal.quote_public": "Kdokoliv" } diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 9dfc6b35a6..d88be09b56 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -245,6 +245,9 @@ "confirmations.remove_from_followers.confirm": "Dileu dilynwr", "confirmations.remove_from_followers.message": "Bydd {name} yn rhoi'r gorau i'ch dilyn. A ydych yn siŵr eich bod am fwrw ymlaen?", "confirmations.remove_from_followers.title": "Tynnu dilynwr?", + "confirmations.revoke_quote.confirm": "Dileu'r postiad", + "confirmations.revoke_quote.message": "Does dim modd dadwneud y weithred hon.", + "confirmations.revoke_quote.title": "Dileu'r postiad?", "confirmations.unfollow.confirm": "Dad-ddilyn", "confirmations.unfollow.message": "Ydych chi'n siŵr eich bod am ddad-ddilyn {name}?", "confirmations.unfollow.title": "Dad-ddilyn defnyddiwr?", @@ -289,6 +292,7 @@ "domain_pill.your_handle": "Eich handlen:", "domain_pill.your_server": "Eich cartref digidol, lle mae'ch holl bostiadau'n byw. Ddim yn hoffi'r un hon? Trosglwyddwch weinyddion ar unrhyw adeg a dewch â'ch dilynwyr hefyd.", "domain_pill.your_username": "Eich dynodwr unigryw ar y gweinydd hwn. Mae'n bosibl dod o hyd i ddefnyddwyr gyda'r un enw defnyddiwr ar wahanol weinyddion.", + "dropdown.empty": "Dewis dewis", "embed.instructions": "Gosodwch y post hwn ar eich gwefan drwy gopïo'r côd isod.", "embed.preview": "Dyma sut olwg fydd arno:", "emoji_button.activity": "Gweithgarwch", @@ -498,6 +502,8 @@ "keyboard_shortcuts.translate": "i gyfieithu postiad", "keyboard_shortcuts.unfocus": "Dad-ffocysu ardal cyfansoddi testun/chwilio", "keyboard_shortcuts.up": "Symud yn uwch yn y rhestr", + "learn_more_link.got_it": "Iawn", + "learn_more_link.learn_more": "Dysgu rhagor", "lightbox.close": "Cau", "lightbox.next": "Nesaf", "lightbox.previous": "Blaenorol", @@ -558,7 +564,7 @@ "navigation_bar.favourites": "Ffefrynnau", "navigation_bar.filters": "Geiriau wedi'u tewi", "navigation_bar.follow_requests": "Ceisiadau dilyn", - "navigation_bar.followed_tags": "Hashnodau a ddilynir", + "navigation_bar.followed_tags": "Hashnodau sy'n cael eu dilyn", "navigation_bar.follows_and_followers": "Yn dilyn a dilynwyr", "navigation_bar.import_export": "Mewnforio ac allforio", "navigation_bar.lists": "Rhestrau", @@ -598,6 +604,7 @@ "notification.label.mention": "Crybwyll", "notification.label.private_mention": "Crybwyll preifat", "notification.label.private_reply": "Ymateb preifat", + "notification.label.quote": "Mae {name} wedi dyfynnu eich postiad", "notification.label.reply": "Ymateb", "notification.mention": "Crybwyll", "notification.mentioned_you": "Rydych wedi'ch crybwyll gan {name}", @@ -655,6 +662,7 @@ "notifications.column_settings.mention": "Crybwylliadau:", "notifications.column_settings.poll": "Canlyniadau pleidlais:", "notifications.column_settings.push": "Hysbysiadau gwthio", + "notifications.column_settings.quote": "Dyfyniadau:", "notifications.column_settings.reblog": "Hybiau:", "notifications.column_settings.show": "Dangos yn y golofn", "notifications.column_settings.sound": "Chwarae sain", @@ -845,6 +853,8 @@ "status.bookmark": "Nod tudalen", "status.cancel_reblog_private": "Dadhybu", "status.cannot_reblog": "Does dim modd hybu'r postiad hwn", + "status.context.load_new_replies": "Mae atebion newydd ar gael", + "status.context.loading": "Yn chwilio am fwy o atebion", "status.continued_thread": "Edefyn parhaus", "status.copy": "Copïo dolen i'r post", "status.delete": "Dileu", @@ -871,6 +881,12 @@ "status.open": "Ehangu'r post hwn", "status.pin": "Pinio ar y proffil", "status.quote_error.filtered": "Wedi'i guddio oherwydd un o'ch hidlwyr", + "status.quote_error.not_available": "Postiad ddim ar gael", + "status.quote_error.pending_approval": "Postiad yn yr arfaeth", + "status.quote_error.pending_approval_popout.body": "Gall dyfyniadau sy'n cael eu rhannu ar draws y Ffedysawd gymryd amser i'w dangos, gan fod gan wahanol weinyddion brotocolau gwahanol.", + "status.quote_error.pending_approval_popout.title": "Dyfyniad yn aros? Amynedd :-)", + "status.quote_policy_change": "Newid pwy all ddyfynnu", + "status.quote_post_author": "Wedi dyfynnu postiad gan @{name}", "status.read_more": "Darllen rhagor", "status.reblog": "Hybu", "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol", @@ -885,6 +901,7 @@ "status.reply": "Ymateb", "status.replyAll": "Ateb edefyn", "status.report": "Adrodd ar @{name}", + "status.revoke_quote": "Dileu fy mhostiad o bostiad @{name}", "status.sensitive_warning": "Cynnwys sensitif", "status.share": "Rhannu", "status.show_less_all": "Dangos llai i bawb", @@ -944,5 +961,17 @@ "video.skip_forward": "Symud ymlaen", "video.unmute": "Dad-dewi", "video.volume_down": "Lefel sain i lawr", - "video.volume_up": "Lefel sain i fyny" + "video.volume_up": "Lefel sain i fyny", + "visibility_modal.button_title": "Gosod gwelededd", + "visibility_modal.header": "Gwelededd a rhyngweithio", + "visibility_modal.helper.direct_quoting": "Does dim modd dyfynnu crybwylliadau preifat.", + "visibility_modal.helper.privacy_editing": "Does dim modd newid gwelededd postiadau wedi'u cyhoeddi.", + "visibility_modal.helper.private_quoting": "Does dim modd dyfynnu postiadau dilynwyr yn unig.", + "visibility_modal.helper.unlisted_quoting": "Pan fydd pobl yn eich dyfynnu, bydd eu postiad hefyd yn cael ei guddio rhag llinellau amser sy'n trendio.", + "visibility_modal.instructions": "Rheolwch bwy all ryngweithio â'r postiad hwn. Mae modd dod o hyd i osodiadau eang o dan Dewisiadau > Arall.", + "visibility_modal.privacy_label": "Preifatrwydd", + "visibility_modal.quote_followers": "Dilynwyr yn unig", + "visibility_modal.quote_label": "Newid pwy all ddyfynnu", + "visibility_modal.quote_nobody": "Neb", + "visibility_modal.quote_public": "Pawb" } diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 597990435b..1f36a14f7d 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Dit handle:", "domain_pill.your_server": "Dit digitale hjem, hvor alle dine indlæg lever. Synes ikke om den her server? Du kan til enhver tid rykke over på en anden server og beholde dine følgere.", "domain_pill.your_username": "Din entydige identifikator på denne server. Det er muligt at finde brugere med samme brugernavn på forskellige servere.", + "dropdown.empty": "Vælg en indstillingsmulighed", "embed.instructions": "Indlejr dette indlæg på din hjemmeside ved at kopiere nedenstående kode.", "embed.preview": "Sådan kommer det til at se ud:", "emoji_button.activity": "Aktivitet", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Afventende indlæg", "status.quote_error.pending_approval_popout.body": "Citater delt på tværs af Fediverset kan tage tid at vise, da forskellige servere har forskellige protokoller.", "status.quote_error.pending_approval_popout.title": "Afventende citat? Tag det roligt", + "status.quote_policy_change": "Ændr hvem der kan citere", "status.quote_post_author": "Citerede et indlæg fra @{name}", "status.read_more": "Læs mere", "status.reblog": "Fremhæv", @@ -959,5 +961,17 @@ "video.skip_forward": "Overspring fremad", "video.unmute": "Slå lyd tl", "video.volume_down": "Lydstyrke ned", - "video.volume_up": "Lydstyrke op" + "video.volume_up": "Lydstyrke op", + "visibility_modal.button_title": "Indstil synlighed", + "visibility_modal.header": "Synlighed og interaktion", + "visibility_modal.helper.direct_quoting": "Private omtaler kan ikke citeres.", + "visibility_modal.helper.privacy_editing": "Publicerede indlægs synlighed kan ikke ændres.", + "visibility_modal.helper.private_quoting": "Indlæg kun for følgere kan ikke citeres.", + "visibility_modal.helper.unlisted_quoting": "Når man citeres af andre, skjules deres indlæg også på tendenstidslinjer.", + "visibility_modal.instructions": "Styr, hvem der kan interagere med dette indlæg. Globale indstillinger findes under Præferencer > Andet.", + "visibility_modal.privacy_label": "Fortrolighed", + "visibility_modal.quote_followers": "Kun følgere", + "visibility_modal.quote_label": "Ændr hvem der kan citere", + "visibility_modal.quote_nobody": "Ingen", + "visibility_modal.quote_public": "Alle" } diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 5632def3ea..6f25078bf6 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Το πλήρες όνομα χρήστη σου:", "domain_pill.your_server": "Το ψηφιακό σου σπίτι, όπου ζουν όλες σου οι αναρτήσεις. Δε σ' αρέσει αυτός; Μετακινήσου σε διακομιστές ανά πάσα στιγμή και πάρε και τους ακόλουθούς σου.", "domain_pill.your_username": "Το μοναδικό σου αναγνωριστικό σε τούτο τον διακομιστή. Είναι πιθανό να βρεις χρήστες με το ίδιο όνομα χρήστη σε διαφορετικούς διακομιστές.", + "dropdown.empty": "Διαλέξτε μια επιλογή", "embed.instructions": "Ενσωμάτωσε αυτή την ανάρτηση στην ιστοσελίδα σου αντιγράφοντας τον παρακάτω κώδικα.", "embed.preview": "Ορίστε πως θα φαίνεται:", "emoji_button.activity": "Δραστηριότητα", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Ανάρτηση σε αναμονή", "status.quote_error.pending_approval_popout.body": "Οι παραθέσεις που μοιράζονται στο Fediverse μπορεί να χρειαστούν χρόνο για να εμφανιστούν, καθώς διαφορετικοί διακομιστές έχουν διαφορετικά πρωτόκολλα.", "status.quote_error.pending_approval_popout.title": "Παράθεση σε εκκρεμότητα; Μείνετε ψύχραιμοι", + "status.quote_policy_change": "Αλλάξτε ποιός μπορεί να κάνει παράθεση", "status.quote_post_author": "Παρατίθεται μια ανάρτηση από @{name}", "status.read_more": "Διάβασε περισότερα", "status.reblog": "Ενίσχυση", @@ -959,5 +961,17 @@ "video.skip_forward": "Παράλειψη εμπρός", "video.unmute": "Άρση σίγασης", "video.volume_down": "Μείωση έντασης", - "video.volume_up": "Αύξηση έντασης" + "video.volume_up": "Αύξηση έντασης", + "visibility_modal.button_title": "Ορισμός ορατότητας", + "visibility_modal.header": "Ορατότητα και αλληλεπίδραση", + "visibility_modal.helper.direct_quoting": "Ιδιωτικές επισημάνσεις δεν μπορούν να παρατεθούν.", + "visibility_modal.helper.privacy_editing": "Δημοσιευμένες αναρτήσεις δεν μπορούν να αλλάξουν την ορατότητά τους.", + "visibility_modal.helper.private_quoting": "Οι αναρτήσεις μόνο για ακολούθους δεν μπορούν να παρατεθούν.", + "visibility_modal.helper.unlisted_quoting": "Όταν οι άνθρωποι σας παραθέτουν, η ανάρτηση τους θα είναι επίσης κρυμμένη από τα δημοφιλή χρονοδιαγράμματα.", + "visibility_modal.instructions": "Ελέγξτε ποιός μπορεί να αλληλεπιδράσει με αυτή την ανάρτηση. Οι καθολικές ρυθμίσεις μπορούν να βρεθούν κάτω από Προτιμήσεις > Άλλα.", + "visibility_modal.privacy_label": "Απόρρητο", + "visibility_modal.quote_followers": "Μόνο ακόλουθοι", + "visibility_modal.quote_label": "Αλλάξτε ποιός μπορεί να κάνει παράθεση", + "visibility_modal.quote_nobody": "Κανένας", + "visibility_modal.quote_public": "Οποιοσδήποτε" } diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 938e9e706b..c93cacf3aa 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -287,6 +287,7 @@ "domain_pill.your_handle": "Via identigo:", "domain_pill.your_server": "Via cifereca hejmo, kie loĝas ĉiuj viaj afiŝoj. Ĉu vi ne ŝatas ĉi tiun? Transloku servilojn iam ajn kaj alportu ankaŭ viajn sekvantojn.", "domain_pill.your_username": "Via unika identigilo sur ĉi tiu servilo. Eblas trovi uzantojn kun la sama uzantnomo sur malsamaj serviloj.", + "dropdown.empty": "Elektu opcion", "embed.instructions": "Enkorpigu ĉi tiun afiŝon en vian retejon per kopio de la suba kodo.", "embed.preview": "Ĝi aperos tiel:", "emoji_button.activity": "Agadoj", @@ -940,5 +941,16 @@ "video.skip_forward": "Preterpasi antaŭen", "video.unmute": "Ne plu silentigi", "video.volume_down": "Laŭteco Malpliigi", - "video.volume_up": "Laŭteco pliigi" + "video.volume_up": "Laŭteco pliigi", + "visibility_modal.button_title": "Agordu videblon", + "visibility_modal.header": "Videblo kaj interago", + "visibility_modal.helper.direct_quoting": "Privataj mencioj ne povas esti cititaj.", + "visibility_modal.helper.privacy_editing": "Publikigitaj afiŝoj ne povas ŝanĝi sian videblon.", + "visibility_modal.helper.private_quoting": "Afiŝoj nur por sekvantoj ne povas esti cititaj.", + "visibility_modal.helper.unlisted_quoting": "Kiam homoj citas vin, ilia afiŝo ankaŭ estos kaŝita de tendencaj templinioj.", + "visibility_modal.privacy_label": "Privateco", + "visibility_modal.quote_followers": "Nur sekvantoj", + "visibility_modal.quote_label": "Ŝanĝi kiu povas citi", + "visibility_modal.quote_nobody": "Neniu", + "visibility_modal.quote_public": "Iu ajn" } diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index 317f531108..4fe9ff66a5 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Tu alias:", "domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.", "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", + "dropdown.empty": "Elige una opción", "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Publicación pendiente", "status.quote_error.pending_approval_popout.body": "Las citas compartidas en el Fediverso pueden tardar en mostrarse, ya que cada servidor tiene un protocolo diferente.", "status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma", + "status.quote_policy_change": "Cambia quién puede citarte", "status.quote_post_author": "Ha citado una publicación de @{name}", "status.read_more": "Leer más", "status.reblog": "Impulsar", @@ -959,5 +961,17 @@ "video.skip_forward": "Saltar adelante", "video.unmute": "Dejar de silenciar", "video.volume_down": "Bajar el volumen", - "video.volume_up": "Subir el volumen" + "video.volume_up": "Subir el volumen", + "visibility_modal.button_title": "Establece la visibilidad", + "visibility_modal.header": "Visibilidad e interacción", + "visibility_modal.helper.direct_quoting": "Las menciones privadas no pueden citarse.", + "visibility_modal.helper.privacy_editing": "Las publicaciones ya enviadas no pueden cambiar su visibilidad.", + "visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.", + "visibility_modal.helper.unlisted_quoting": "Cuando las personas te citen, sus publicaciones también se ocultarán de las cronologías de tendencias.", + "visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. La configuración global se encuentra en Preferencias > Otros.", + "visibility_modal.privacy_label": "Privacidad", + "visibility_modal.quote_followers": "Solo seguidores", + "visibility_modal.quote_label": "Cambia quién puede citarte", + "visibility_modal.quote_nobody": "Nadie", + "visibility_modal.quote_public": "Cualquiera" } diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index d23f1f5c12..2ee502b0d4 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Tu alias:", "domain_pill.your_server": "Tu hogar digital, donde residen todas tus publicaciones. ¿No te gusta este sitio? Muévete a otro servidor en cualquier momento y llévate a tus seguidores.", "domain_pill.your_username": "Tu identificador único en este servidor. Es posible encontrar usuarios con el mismo nombre de usuario en diferentes servidores.", + "dropdown.empty": "Selecciona una opción", "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Publicación pendiente", "status.quote_error.pending_approval_popout.body": "Las citas compartidas a través del Fediverso pueden tardar en mostrarse, ya que los diferentes servidores tienen diferentes protocolos.", "status.quote_error.pending_approval_popout.title": "¿Cita pendiente? Mantén la calma", + "status.quote_policy_change": "Cambia quién puede citarte", "status.quote_post_author": "Ha citado una publicación de @{name}", "status.read_more": "Leer más", "status.reblog": "Impulsar", @@ -959,5 +961,17 @@ "video.skip_forward": "Adelantar", "video.unmute": "Dejar de silenciar", "video.volume_down": "Bajar volumen", - "video.volume_up": "Subir volumen" + "video.volume_up": "Subir volumen", + "visibility_modal.button_title": "Configura la visibilidad", + "visibility_modal.header": "Visibilidad e interacciones", + "visibility_modal.helper.direct_quoting": "Las menciones privadas no se pueden citar.", + "visibility_modal.helper.privacy_editing": "Las publicaciones no pueden cambiar su visibilidad.", + "visibility_modal.helper.private_quoting": "Las publicaciones para seguidores no pueden citarse.", + "visibility_modal.helper.unlisted_quoting": "Cuando la gente te cite, su publicación tampoco se mostrará en las cronologías públicas.", + "visibility_modal.instructions": "Controla quién puede interactuar con esta publicación. Puedes encontrar los ajustes globales en Preferencias > Otros.", + "visibility_modal.privacy_label": "Privacidad", + "visibility_modal.quote_followers": "Sólo seguidores", + "visibility_modal.quote_label": "Cambia quién puede citarte", + "visibility_modal.quote_nobody": "Nadie", + "visibility_modal.quote_public": "Cualquiera" } diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 798be24ad6..b2ab96a37f 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -39,7 +39,7 @@ "account.featured_tags.last_status_at": "آخرین فرسته در {date}", "account.featured_tags.last_status_never": "بدون فرسته", "account.follow": "پی‌گرفتن", - "account.follow_back": "دنبال کردن متقابل", + "account.follow_back": "پی‌گیری متقابل", "account.followers": "پی‌گیرندگان", "account.followers.empty": "هنوز کسی پی‌گیر این کاربر نیست.", "account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}", @@ -292,6 +292,7 @@ "domain_pill.your_handle": "شناسه‌تان:", "domain_pill.your_server": "خانهٔ رقمیتان. جایی که همهٔ فرسته‌هایتان می‌زیند. دوستش ندارید؟ در هر زمان کارسازتان را جابه‌جا کرده و پی‌گیرندگانتان را نیز بیاورید.", "domain_pill.your_username": "شناسهٔ یکتایتان روی این کارساز. ممکن است کاربرانی با نام کاربری مشابه روی کارسازهای دیگر باشند.", + "dropdown.empty": "انتخاب یک گزینه", "embed.instructions": "جاسازی این فرسته روی پایگاهتان با رونوشت کردن کد زیر.", "embed.preview": "این گونه دیده خواهد شد:", "emoji_button.activity": "فعالیت", @@ -881,7 +882,10 @@ "status.pin": "سنجاق به نمایه", "status.quote_error.filtered": "نهفته بنا بر یکی از پالایه‌هایتان", "status.quote_error.not_available": "فرسته در دسترس نیست", + "status.quote_error.pending_approval": "فرسته منتظر", "status.quote_error.pending_approval_popout.body": "نقل‌قول‌هایی که در سراسر فدیورس هم‌رسانی می‌شوند ممکن است زمان‌بر باشند تا نمایش داده شوند، چون کارسازهای مختلف از شیوه‌نامه‌های متفاوتی استفاده می‌کنند.", + "status.quote_error.pending_approval_popout.title": "منتظر نقل؟ خونسرد بمانید", + "status.quote_policy_change": "تغییر کسانی که می‌توانند نقل کنند", "status.quote_post_author": "فرسته‌ای از @{name} نقل شد", "status.read_more": "بیشتر بخوانید", "status.reblog": "تقویت", @@ -957,5 +961,17 @@ "video.skip_forward": "پرش به پیش", "video.unmute": "ناخموشی", "video.volume_down": "کاهش حجم صدا", - "video.volume_up": "افزایش حجم صدا" + "video.volume_up": "افزایش حجم صدا", + "visibility_modal.button_title": "تنظیم نمایانی", + "visibility_modal.header": "نمایانی و برهم‌کنش", + "visibility_modal.helper.direct_quoting": "نام‌بری‌های خصوصی قابل نقل نیستند.", + "visibility_modal.helper.privacy_editing": "نمی‌توان نمایانی فرسته‌های منتشر شده را تغییر داد.", + "visibility_modal.helper.private_quoting": "فرسته‌های فقط برای پی‌گیرندگان نمی‌توانند نقل شوند.", + "visibility_modal.helper.unlisted_quoting": "هنگامی که افراد نقلتان می‌کنند فرسته‌شان هم از خط‌زمانی‌های داغ پنهان خواهد بود.", + "visibility_modal.instructions": "واپایش کسانی که می‌توانند با این فرسته برهم‌کنش داشته باشند. تنظیمات سراسری می‌تواند در ترجیحات > دیگر پیدا شود.", + "visibility_modal.privacy_label": "محرمانگی", + "visibility_modal.quote_followers": "فقط پی‌گیرندگان", + "visibility_modal.quote_label": "تغییر کسانی که می‌توانند نقل کنند", + "visibility_modal.quote_nobody": "هیچ‌کس", + "visibility_modal.quote_public": "هرکسی" } diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index e1b8d49e11..8139866922 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Käyttäjätunnuksesi:", "domain_pill.your_server": "Digitaalinen kotisi, jossa kaikki julkaisusi sijaitsevat. Etkö pidä tästä? Siirry palvelimelta toiselle milloin tahansa ja tuo myös seuraajasi mukanasi.", "domain_pill.your_username": "Yksilöllinen tunnisteesi tällä palvelimella. Eri palvelimilta on mahdollista löytää käyttäjiä, joilla on sama käyttäjänimi.", + "dropdown.empty": "Valitse vaihtoehto", "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.", "embed.preview": "Tältä se näyttää:", "emoji_button.activity": "Aktiviteetit", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Julkaisu odottaa", "status.quote_error.pending_approval_popout.body": "Saattaa viedä jonkin ainaa ennen kuin fediversumin kautta jaetut julkaisut tulevat näkyviin, sillä eri palvelimet käyttävät eri protokollia.", "status.quote_error.pending_approval_popout.title": "Odottava lainaus? Pysy rauhallisena", + "status.quote_policy_change": "Vaihda, kuka voi lainata", "status.quote_post_author": "Lainaa käyttäjän @{name} julkaisua", "status.read_more": "Näytä enemmän", "status.reblog": "Tehosta", @@ -959,5 +961,17 @@ "video.skip_forward": "Siirry eteenpäin", "video.unmute": "Poista mykistys", "video.volume_down": "Vähennä äänenvoimakkuutta", - "video.volume_up": "Lisää äänenvoimakkuutta" + "video.volume_up": "Lisää äänenvoimakkuutta", + "visibility_modal.button_title": "Aseta näkyvyys", + "visibility_modal.header": "Näkyvyys ja vuorovaikutus", + "visibility_modal.helper.direct_quoting": "Yksityismainintoja ei voi lainata.", + "visibility_modal.helper.privacy_editing": "Lähetettyjen julkaisujen näkyvyyttä ei voi vaihtaa.", + "visibility_modal.helper.private_quoting": "Vain seuraajille tarkoitettuja julkaisuja ei voi lainata.", + "visibility_modal.helper.unlisted_quoting": "Kun ihmiset lainaavat sinua, myös heidän julkaisunsa piilotetaan suosittujen julkaisujen aikajanoilta.", + "visibility_modal.instructions": "Hallitse, kuka voi olla vuorovaikutuksessa tämän julkaisun kanssa. Yleiset asetukset sijaitsevat kohdassa Asetukset > Muut.", + "visibility_modal.privacy_label": "Yksityisyys", + "visibility_modal.quote_followers": "Vain seuraajat", + "visibility_modal.quote_label": "Vaihda, kuka voi lainata", + "visibility_modal.quote_nobody": "Ei kukaan", + "visibility_modal.quote_public": "Kuka tahansa" } diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 4760b64626..1b730557c9 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Do láimhseáil:", "domain_pill.your_server": "Do theach digiteach, áit a bhfuil do phoist go léir ina gcónaí. Nach maith leat an ceann seo? Aistrigh freastalaithe am ar bith agus tabhair leat do leantóirí freisin.", "domain_pill.your_username": "D'aitheantóir uathúil ar an bhfreastalaí seo. Is féidir teacht ar úsáideoirí leis an ainm úsáideora céanna ar fhreastalaithe éagsúla.", + "dropdown.empty": "Roghnaigh rogha", "embed.instructions": "Embed this status on your website by copying the code below.", "embed.preview": "Seo an chuma a bheidh air:", "emoji_button.activity": "Gníomhaíocht", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Post ar feitheamh", "status.quote_error.pending_approval_popout.body": "D’fhéadfadh sé go dtógfadh sé tamall le Sleachta a roinntear ar fud Fediverse a thaispeáint, toisc go mbíonn prótacail éagsúla ag freastalaithe éagsúla.", "status.quote_error.pending_approval_popout.title": "Ag fanacht le luachan? Fan socair", + "status.quote_policy_change": "Athraigh cé a fhéadann luachan a thabhairt", "status.quote_post_author": "Luaigh mé post le @{name}", "status.read_more": "Léan a thuilleadh", "status.reblog": "Treisiú", @@ -959,5 +961,17 @@ "video.skip_forward": "Scipeáil ar aghaidh", "video.unmute": "Díbhalbhú", "video.volume_down": "Toirt síos", - "video.volume_up": "Toirt suas" + "video.volume_up": "Toirt suas", + "visibility_modal.button_title": "Socraigh infheictheacht", + "visibility_modal.header": "Infheictheacht agus idirghníomhaíocht", + "visibility_modal.helper.direct_quoting": "Ní féidir lua a thabhairt ar luanna príobháideacha.", + "visibility_modal.helper.privacy_editing": "Ní féidir infheictheacht postálacha foilsithe a athrú.", + "visibility_modal.helper.private_quoting": "Ní féidir poist atá dírithe ar leanúna amháin a lua.", + "visibility_modal.helper.unlisted_quoting": "Nuair a luann daoine thú, beidh a bpost i bhfolach ó amlínte treochta freisin.", + "visibility_modal.instructions": "Rialú cé a fhéadfaidh idirghníomhú leis an bpost seo. Is féidir socruithe domhanda a fháil faoi Sainroghanna > Eile.", + "visibility_modal.privacy_label": "Príobháideacht", + "visibility_modal.quote_followers": "Leantóirí amháin", + "visibility_modal.quote_label": "Athraigh cé a fhéadann luachan a thabhairt", + "visibility_modal.quote_nobody": "Níl aon duine", + "visibility_modal.quote_public": "Aon duine" } diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index c6d0fbd806..775af83056 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "O teu alcume:", "domain_pill.your_server": "O teu fogar dixital, onde están as túas publicacións. Non é do teu agrado? Podes cambiar de servidor cando queiras levando as túas seguidoras contigo.", "domain_pill.your_username": "O teu identificador único neste servidor. É posible que atopes usuarias co mesmo nome de usuaria en outros servidores.", + "dropdown.empty": "Escolle unha opción", "embed.instructions": "Inclúe esta publicación no teu sitio web copiando o seguinte código.", "embed.preview": "Vaise ver así:", "emoji_button.activity": "Actividade", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "Publicación pendente", "status.quote_error.pending_approval_popout.body": "As citas compartidas no Fediverso poderían tardar en mostrarse, xa que os diferentes servidores teñen diferentes protocolos.", "status.quote_error.pending_approval_popout.title": "Cita pendente? Non te apures", + "status.quote_policy_change": "Cambia quen pode citarte", "status.quote_post_author": "Citou unha publicación de @{name}", "status.read_more": "Ler máis", "status.reblog": "Promover", @@ -959,5 +961,17 @@ "video.skip_forward": "Avanzar", "video.unmute": "Non silenciar", "video.volume_down": "Baixar volume", - "video.volume_up": "Subir volume" + "video.volume_up": "Subir volume", + "visibility_modal.button_title": "Establece a visibilidade", + "visibility_modal.header": "Visibilidade e interaccións", + "visibility_modal.helper.direct_quoting": "A mencións privadas non se poden citar.", + "visibility_modal.helper.privacy_editing": "Non se pode cambiar a visibilidade das publicacións xa publicadas.", + "visibility_modal.helper.private_quoting": "As publicacións só para seguidoras non se poden citar.", + "visibility_modal.helper.unlisted_quoting": "Cando alguén te cite, a súa publicación non aparecerá nas cronoloxías de popularidade.", + "visibility_modal.instructions": "Controla quen pode interactuar con esta publicación. Os axustes xerais están en Preferencias > Outros.", + "visibility_modal.privacy_label": "Privacidade", + "visibility_modal.quote_followers": "Só para seguidoras", + "visibility_modal.quote_label": "Cambia quen pode citarte", + "visibility_modal.quote_nobody": "Ninguén", + "visibility_modal.quote_public": "Calquera" } diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index bdb23bc4cb..69e1f870ed 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "הכינוי שלך:", "domain_pill.your_server": "הבית המקוון שלך, היכן ששוכנות כל הודעותיך. לא מוצא חן בעיניך? ניתן לעבור שרתים בכל עת וגם לשמור על העוקבים.", "domain_pill.your_username": "המזהה הייחודי שלך על שרת זה. ניתן למצוא משתמשים עם שם משתמש זהה על שרתים שונים.", + "dropdown.empty": "בחירת אפשרות", "embed.instructions": "ניתן להטמיע את ההודעה הזו באתרך ע\"י העתקת הקוד שלהלן.", "embed.preview": "דוגמא כיצד זה יראה:", "emoji_button.activity": "פעילות", @@ -884,6 +885,7 @@ "status.quote_error.pending_approval": "ההודעה בהמתנה לאישור", "status.quote_error.pending_approval_popout.body": "ציטוטים ששותפו בפדיוורס עשויים להתפרסם אחרי עיכוב קל, כיוון ששרתים שונים משתמשים בפרוטוקולים שונים.", "status.quote_error.pending_approval_popout.title": "ההודעה בהמתנה? המתינו ברוגע", + "status.quote_policy_change": "הגדרת הרשאה לציטוט הודעותיך", "status.quote_post_author": "ההודעה צוטטה על ידי @{name}", "status.read_more": "לקרוא עוד", "status.reblog": "הדהוד", @@ -959,5 +961,17 @@ "video.skip_forward": "דילוג קדימה", "video.unmute": "ביטול השתקה", "video.volume_down": "הנמכת עוצמת השמע", - "video.volume_up": "הגברת עוצמת שמע" + "video.volume_up": "הגברת עוצמת שמע", + "visibility_modal.button_title": "בחירת רמת חשיפה", + "visibility_modal.header": "חשיפה והידוּד (אינטראקציה)", + "visibility_modal.helper.direct_quoting": "הודעות פרטיות לא ניתנות לציטוט.", + "visibility_modal.helper.privacy_editing": "לא ניתן לשנות את דרגת החשיפה של הודעות שפורסמו.", + "visibility_modal.helper.private_quoting": "לא ניתן לצטט הודעות שחשופות לעוקבים בלבד.", + "visibility_modal.helper.unlisted_quoting": "כאשר אחרים מצטטים אותך, ההודעות שלהם יוסתרו גם מ\"נושאים חמים\".", + "visibility_modal.instructions": "שליטה בהרשאה להידוּד (תגובות וציטוטים) עם הודעה זו. הגדרות ברירת המחדל ניתן למצוא תחת העדפות > אחרים.", + "visibility_modal.privacy_label": "פרטיות", + "visibility_modal.quote_followers": "לעוקבים בלבד", + "visibility_modal.quote_label": "הגדרת הרשאה לציטוט הודעותיך", + "visibility_modal.quote_nobody": "אף אחד", + "visibility_modal.quote_public": "כולם" } diff --git a/app/javascript/mastodon/locales/nan.json b/app/javascript/mastodon/locales/nan.json index 33cb8cac4b..da133ef612 100644 --- a/app/javascript/mastodon/locales/nan.json +++ b/app/javascript/mastodon/locales/nan.json @@ -292,6 +292,7 @@ "domain_pill.your_handle": "Lí ê口座:", "domain_pill.your_server": "Lí數位ê厝,內底有lí所有ê PO文。無kah意?Ē當轉kàu別ê服侍器,koh保有跟tuè lí êl âng。.", "domain_pill.your_username": "Lí 佇tsit ê服侍器獨一ê稱呼。佇無kâng ê服侍器有可能tshuē著kāng名ê用者。", + "dropdown.empty": "揀選項", "embed.instructions": "Khóo-pih 下kha ê程式碼,來kā tsit篇PO文tàu佇lí ê網站。", "embed.preview": "伊e án-ne顯示:\n", "emoji_button.activity": "活動", @@ -570,7 +571,7 @@ "navigation_bar.live_feed_local": "即時ê內容(本地)", "navigation_bar.live_feed_public": "即時ê內容(公開)", "navigation_bar.logout": "登出", - "navigation_bar.moderation": "審核", + "navigation_bar.moderation": "管理", "navigation_bar.more": "其他", "navigation_bar.mutes": "消音ê用者", "navigation_bar.opened_in_classic_interface": "PO文、口座kap其他指定ê頁面,預設ē佇經典ê網頁界面內phah開。", @@ -608,11 +609,11 @@ "notification.mention": "提起", "notification.mentioned_you": "{name}kā lí提起", "notification.moderation-warning.learn_more": "看詳細", - "notification.moderation_warning": "Lí有收著審核ê警告", + "notification.moderation_warning": "Lí有收著管理ê警告", "notification.moderation_warning.action_delete_statuses": "Lí ê一寡PO文hōo lâng thâi掉ah。", "notification.moderation_warning.action_disable": "Lí ê口座hōo lâng停止使用ah。", "notification.moderation_warning.action_mark_statuses_as_sensitive": "Lí ê一寡PO文,hōo lâng標做敏感ê內容。", - "notification.moderation_warning.action_none": "Lí ê口座有收著審核ê警告。", + "notification.moderation_warning.action_none": "Lí ê口座有收著管理ê警告。", "notification.moderation_warning.action_sensitive": "Tuì tsit-má開始,lí êPO文ē標做敏感ê內容。", "notification.moderation_warning.action_silence": "Lí ê口座hōo lâng限制ah。", "notification.moderation_warning.action_suspend": "Lí ê口座ê權限已經停止ah。", @@ -883,6 +884,7 @@ "status.quote_error.pending_approval": "鋪文當咧送", "status.quote_error.pending_approval_popout.body": "因為無kâng ê服侍器有無kâng ê協定,佇聯邦宇宙分享ê引文可能愛開時間來顯示。", "status.quote_error.pending_approval_popout.title": "Leh送引文?請sió等leh", + "status.quote_policy_change": "改通引用ê lâng", "status.quote_post_author": "引用 @{name} ê PO文ah", "status.read_more": "讀詳細", "status.reblog": "轉送", @@ -957,5 +959,17 @@ "video.skip_forward": "跳kah頭前", "video.unmute": "取消消音", "video.volume_down": "變khah細聲", - "video.volume_up": "變khah大聲" + "video.volume_up": "變khah大聲", + "visibility_modal.button_title": "設定通看ê程度", + "visibility_modal.header": "通看ê程度kap互動", + "visibility_modal.helper.direct_quoting": "私人ê提起bē當引用。", + "visibility_modal.helper.privacy_editing": "公開ê PO文bē當改in通看ê程度。", + "visibility_modal.helper.private_quoting": "Bē當引用kan-ta跟tuè ê通看ê PO文。", + "visibility_modal.helper.unlisted_quoting": "若別lâng引用lí,in ê PO文mā ē tuì趨勢時間線隱藏。", + "visibility_modal.instructions": "控制ē當kap tsit篇PO文互動ê lâng,Ē當佇 偏愛ê設定>其他tshuē tio̍h全地ê設定。", + "visibility_modal.privacy_label": "隱私權", + "visibility_modal.quote_followers": "Kan-ta hōo跟tuè ê lâng", + "visibility_modal.quote_label": "改通引用ê lâng", + "visibility_modal.quote_nobody": "無半位", + "visibility_modal.quote_public": "Ta̍k ê lâng" } diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 2627fe21e3..67e10ce2aa 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -292,7 +292,7 @@ "domain_pill.your_handle": "您的帳號:", "domain_pill.your_server": "您數位世界的家,您所有的嘟文都在這裡。不喜歡這台伺服器嗎?您能隨時搬家至其他伺服器並且仍保有您的跟隨者。", "domain_pill.your_username": "您於您的伺服器中獨一無二的識別。於不同的伺服器上可能找到具有相同帳號的使用者。", - "dropdown.empty": "選取選項", + "dropdown.empty": "選項", "embed.instructions": "若您欲於您的網站嵌入此嘟文,請複製以下程式碼。", "embed.preview": "它將顯示成這樣:", "emoji_button.activity": "活動", @@ -965,9 +965,9 @@ "visibility_modal.button_title": "設定可見性", "visibility_modal.header": "可見性與互動", "visibility_modal.helper.direct_quoting": "無法引用私人提及。", - "visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文的可見性。", + "visibility_modal.helper.privacy_editing": "無法變更已發佈的嘟文之可見性。", "visibility_modal.helper.private_quoting": "無法引用僅追蹤者的嘟文。", - "visibility_modal.helper.unlisted_quoting": "當期他人引用您時,他們的嘟文也會自熱門時間軸隱藏。", + "visibility_modal.helper.unlisted_quoting": "當其他人引用您時,他們的嘟文也會自熱門時間軸隱藏。", "visibility_modal.instructions": "控制誰能與此嘟文互動。可在偏好設定 > 其他下找到全域設定。", "visibility_modal.privacy_label": "隱私權", "visibility_modal.quote_followers": "僅限跟隨者", diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 077a729b91..f32f69406e 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -190,6 +190,7 @@ bg: create_relay: Създаване на пренасочване create_unavailable_domain: Създаване на недостъпен домейн create_user_role: Създаване на роля + create_username_block: Създаване на правило за потебителско име demote_user: Понижаване на потребител destroy_announcement: Изтриване на оповестяване destroy_canonical_email_block: Изтриване на блокиране за е-поща @@ -202,6 +203,7 @@ bg: destroy_status: Изтриване на публикация destroy_unavailable_domain: Изтриване на недостъпен домейн destroy_user_role: Унищожаване на роля + destroy_username_block: Изтриване на правило за потебителско име disable_2fa_user: Изкл. на 2факт.удостов. disable_custom_emoji: Деактивиране на персонализирано емоджи disable_sign_in_token_auth_user: Изключване на удостоверяването с код по имейл за потребител @@ -234,6 +236,7 @@ bg: update_report: Обновяване на доклада update_status: Обновяване на публикация update_user_role: Обновяване на ролята + update_username_block: Обновяване на правило за потеб. име actions: approve_appeal_html: "%{name} одобри обжалването на решение за модериране от %{target}" approve_user_html: "%{name} одобри регистрирането от %{target}" @@ -251,6 +254,7 @@ bg: create_ip_block_html: "%{name} създаде правило за IP %{target}" create_unavailable_domain_html: "%{name} спря доставянето до домейн %{target}" create_user_role_html: "%{name} създаде роля %{target}" + create_username_block_html: "%{name} добави правило за потребителско име, съдържащо %{target}" demote_user_html: "%{name} понижи потребителя %{target}" destroy_announcement_html: "%{name} изтри оповестяване %{target}" destroy_canonical_email_block_html: "%{name} отблокира имейла с хеш %{target}" @@ -263,6 +267,7 @@ bg: destroy_status_html: "%{name} премахна публикация от %{target}" destroy_unavailable_domain_html: "%{name} възобнови доставката до домейн %{target}" destroy_user_role_html: "%{name} изтри роля %{target}" + destroy_username_block_html: "%{name} премахна правило за потребителско име, съдържащо %{target}" disable_2fa_user_html: "%{name} изключи двуфакторното изискване за потребител %{target}" disable_custom_emoji_html: "%{name} изключи емоджито %{target}" disable_sign_in_token_auth_user_html: "%{name} изключва удостоверението с код по е-поща за %{target}" @@ -295,6 +300,7 @@ bg: update_report_html: "%{name} осъвремени доклад %{target}" update_status_html: "%{name} обнови публикация от %{target}" update_user_role_html: "%{name} промени ролята %{target}" + update_username_block_html: "%{name} обнови правило за потребителско име, съдържащо %{target}" deleted_account: изтрит акаунт empty: Няма намерени дневници. filter_by_action: Филтриране по действие @@ -791,12 +797,16 @@ bg: title: Сървърни правила translation: Превод translations: Преводи + translations_explanation: Може по избор да добавите преводи за правилата. Стандартната стойност ще се показва, ако няма налична преведена версия. Винаги се уверявайте, че всеки предоставен превод е синхронизиран със стандартната стойност. settings: about: manage_rules: Управление на правилата на сървъра preamble: Предложете задълбочена информация за това как вашият сървър се управлява, модерира и финансира. rules_hint: Съществува специална част за правилата, които се очаква вашите потребители да спазват. title: Относно + allow_referrer_origin: + desc: Когато потребителите ви щракнат върху връзки към външни сайтове, то браузърите им може да изпращат адреса на сървъра ви в Mastodon както референтът. Изключете това, ако то неповторимо би установило самоличността на потребителя ви, например ако това е личен сървър в Mastodon. + title: Позволяване на външни сайтове да виждат сървъра ви в Mastodon като източник на трафик appearance: preamble: Настройване на мрежовия интерфейс на Mastodon. title: Външен вид @@ -1067,6 +1077,23 @@ bg: other: Използвано от %{count} души през последната седмица title: Препоръки и насоки на развитие trending: Изгряващи + username_blocks: + add_new: Добавяне на ново + block_registrations: Блокиране на регистрациите + comparison: + contains: Съдържа + contains_html: Съдържа %{string} + created_msg: Успешно създадено правило за потребителско име + delete: Изтриване + edit: + title: Промяна на правило за потреб. име + new: + create: Създаване на правило + title: Създаване на ново правило за потреб. име + no_username_block_selected: Няма променени правила за потребителско име, тъй като нищо не бе избрано + not_permitted: Няма позволение + title: Правила за потребителско име + updated_msg: Успешно обновено правило за потребителско име warning_presets: add_new: Добавяне на ново delete: Изтриване @@ -1331,6 +1358,10 @@ bg: basic_information: Основна информация hint_html: "Персонализирайте какво хората виждат в обществения ви профил и до публикациите ви. Другите хора са по-склонни да ви последват и да взаимодействат с вас, когато имате попълнен профил и снимка на профила." other: Друго + emoji_styles: + auto: Автоматично + native: Естествено системно + twemoji: Twemoji errors: '400': Подадохте невалидна или деформирана заявка. '403': Нямате позволение да разгледате тази страница. @@ -1640,6 +1671,10 @@ bg: title: Ново споменаване poll: subject: Анкетата от %{name} приключи + quote: + body: 'Ваша публикация беше цитирана от %{name}:' + subject: "%{name} цитира ваша публикация" + title: Нов цитат reblog: body: 'Ваша публикация беше раздута от %{name}:' subject: "%{name} разду ваша публикация" @@ -1850,6 +1885,7 @@ bg: edited_at_html: Редактирано на %{date} errors: in_reply_not_found: Изглежда, че публикацията, на която се опитвате да отговорите, не съществува. + quoted_status_not_found: Публикацията, която се опитвате да цитирате, не съществува. over_character_limit: прехвърлен лимит от %{max} символа pin_errors: direct: Публикациите, които са видими само за потребители споменати в тях, не могат да бъдат закачани @@ -1857,6 +1893,8 @@ bg: ownership: Публикация на някого другиго не може да бъде закачена reblog: Раздуване не може да бъде закачано quote_policies: + followers: Само последователите ви + nobody: Никого public: Всеки title: "%{name}: „%{quote}“" visibilities: diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 7dfa928f57..65299b87bc 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1713,7 +1713,7 @@ ca: too_few_options: ha de tenir més d'una opció too_many_options: no pot contenir més de %{max} opcions preferences: - other: Altre + other: Altres posting_defaults: Valors per defecte de publicació public_timelines: Línies de temps públiques privacy: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index e8990d3482..8860bcb0a6 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -202,6 +202,7 @@ cy: create_relay: Creu Cyfnewidiad create_unavailable_domain: Creu Parth Ddim ar Gael create_user_role: Creu Rôl + create_username_block: Creu Rheol Enw Defnyddiwr demote_user: Diraddio Defnyddiwr destroy_announcement: Dileu Cyhoeddiad destroy_canonical_email_block: Dileu Rhwystr E-bost @@ -215,6 +216,7 @@ cy: destroy_status: Dileu Postiad destroy_unavailable_domain: Dileu Parth Ddim ar Gael destroy_user_role: Dileu Rôl + destroy_username_block: Dileu Rheol Enw Defnyddiwr disable_2fa_user: Diffodd 2FA disable_custom_emoji: Analluogi Emoji Addasedig disable_relay: Analluogi Cyfnewidiad @@ -249,6 +251,7 @@ cy: update_report: Diweddaru Adroddiad update_status: Diweddaru Postiad update_user_role: Diweddaru Rôl + update_username_block: Diweddaru Rheol Enw Defnyddiwr actions: approve_appeal_html: Mae %{name} wedi cymeradwyo penderfyniad cymedroli gan %{target} approve_user_html: Mae %{name} wedi cymeradwyo cofrestru gan %{target} @@ -267,6 +270,7 @@ cy: create_relay_html: Creodd %{name} gyfnewidiad %{target} create_unavailable_domain_html: Mae %{name} wedi stopio danfon i barth %{target} create_user_role_html: Mae %{name} wedi creu rôl %{target} + create_username_block_html: Mae %{name} wedi ychwanegu rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target} demote_user_html: Mae %{name} wedi israddio defnyddiwr %{target} destroy_announcement_html: Mae %{name} wedi dileu cyhoeddiad %{target} destroy_canonical_email_block_html: Mae %{name} wedi dad-rwystro parth e-bost %{target} @@ -280,6 +284,7 @@ cy: destroy_status_html: Mae %{name} wedi tynnu postiad gan %{target} destroy_unavailable_domain_html: Mae %{name} wedi ailddechrau anfon i barth %{target} destroy_user_role_html: Mae %{name} wedi dileu rôl %{target} + destroy_username_block_html: Mae %{name} wedi dileu rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target} disable_2fa_user_html: Mae %{name} wedi analluogi gofyniad dau ffactor ar gyfer defnyddiwr %{target} disable_custom_emoji_html: Mae %{name} wedi analluogi emoji %{target} disable_relay_html: Analluogodd %{name} y cyfnewidiad %{target} @@ -314,6 +319,7 @@ cy: update_report_html: Mae %{name} wedi diweddaru adroddiad %{target} update_status_html: Mae %{name} wedi diweddaru postiad gan %{target} update_user_role_html: Mae %{name} wedi newid rôl %{target} + update_username_block_html: Mae %{name} wedi diweddaru rheol ar gyfer enwau defnyddwyr sy'n cynnwys %{target} deleted_account: cyfrif wedi'i ddileu empty: Dim logiau ar gael. filter_by_action: Hidlo yn ôl gweithred @@ -1157,6 +1163,25 @@ cy: zero: Wedi'i ddefnyddio gan %{count} o bobl dros yr wythnos ddiwethaf title: Argymhellion a Threndiau trending: Trendio + username_blocks: + add_new: Ychwanegu newydd + block_registrations: Rhwystro cofrestriadau + comparison: + contains: Yn cynnwys + equals: Yn hafal i + contains_html: Yn cynnwys %{string} + created_msg: Rheol enw defnyddiwr wedi'i chreu'n llwyddiannus + delete: Dileu + edit: + title: Golygu rheol enw defnyddiwr + matches_exactly_html: Yn hafal i %{string} + new: + create: Creu rheol + title: Creu rheol enw defnyddiwr newydd + no_username_block_selected: Heb newid unrhyw reolau enw defnyddiwr gan nad oes un ohonyn nhw wedi'u dewis + not_permitted: Dim caniatâd + title: Rheolau enw defnyddiwr + updated_msg: Rheol enw defnyddiwr wedi'i diweddaru'n llwyddiannus warning_presets: add_new: Ychwanegu newydd delete: Dileu @@ -1817,6 +1842,10 @@ cy: title: Crywbylliad newydd poll: subject: Mae arolwg gan %{name} wedi dod i ben + quote: + body: 'Mae %{name} wedi dyfynnu eich postiad :' + subject: Mae %{name} wedi dyfynnu eich postiad + title: Dyfyniad newydd reblog: body: 'Cafodd eich postiad ei hybu gan %{name}:' subject: Rhoddodd %{name} hwb i'ch postiad @@ -2051,6 +2080,8 @@ cy: ownership: Nid oes modd pinio postiad rhywun arall reblog: Nid oes modd pinio hwb quote_policies: + followers: Dim ond eich dilynwyr + nobody: Neb public: Pawb title: '%{name}: "%{quote}"' visibilities: diff --git a/config/locales/devise.be.yml b/config/locales/devise.be.yml index 8aebd2b198..21dd93e31a 100644 --- a/config/locales/devise.be.yml +++ b/config/locales/devise.be.yml @@ -58,7 +58,7 @@ be: subtitle: Для вашага ўліковага запісу была ўключаная двухфактарная аўтэнтыфікацыя. title: двухэтапнае спраўджанне уключана two_factor_recovery_codes_changed: - explanation: Папярэднія коды аднаўлення былі ануляваны і былі створаныя новыя. + explanation: Папярэднія коды аднаўлення былі ануляваны і створаны новыя. subject: 'Mastodon: створаныя новыя коды аднаўлення' subtitle: Папярэднія коды аднаўлення былі ануляваны і замест іх былі створаныя новыя. title: 2FA коды аднаўлення былі зменены diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 913f384884..e3e8348ef0 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -258,6 +258,7 @@ fa: create_relay_html: "%{name} یک رله %{target} ایجاد کرد" create_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را متوقف کرد" create_user_role_html: "%{name} نقش %{target} را ایجاد کرد" + create_username_block_html: "‫‏%{name} قانونی برای نام‌های کاربری دارای %{target} افزود" demote_user_html: "%{name} کاربر %{target} را تنزل داد" destroy_announcement_html: "%{name} اعلامیهٔ %{target} را حذف کرد" destroy_canonical_email_block_html: "%{name} رایانامه با درهم‌ریزی %{target} را نامسدود کرد" @@ -271,6 +272,7 @@ fa: destroy_status_html: "%{name} وضعیت %{target} را برداشت" destroy_unavailable_domain_html: "%{name} تحویل محتوا به دامنه %{target} را از سر گرفت" destroy_user_role_html: "%{name} نقش %{target} را حذف کرد" + destroy_username_block_html: "‫‏%{name} قانون نام‌های کاربری دارای %{target} را برداشت" disable_2fa_user_html: "%{name} ضرورت ورود دو مرحله‌ای را برای کاربر %{target} غیر فعال کرد" disable_custom_emoji_html: "%{name} شکلک %{target} را غیرفعال کرد" disable_relay_html: "%{name} رله %{target} را غیرفعال کرد" @@ -305,6 +307,7 @@ fa: update_report_html: "%{name} گزارش %{target} را به‌روز کرد" update_status_html: "%{name} نوشتهٔ %{target} را به‌روز کرد" update_user_role_html: "%{name} نقش %{target} را تغییر داد" + update_username_block_html: "‫‏%{name} قانونی برای نام‌های کاربری دارای %{target} را به‌روز کرد" deleted_account: حساب حذف شد empty: هیچ گزارشی پیدا نشد. filter_by_action: پالایش بر اساس کنش @@ -1089,7 +1092,24 @@ fa: title: توصیه ها و روندها trending: پرطرفدار username_blocks: + add_new: افزودن جدید + block_registrations: انسداد ثبت‌نام‌ها + comparison: + contains: دارای + equals: برابر + contains_html: دارای %{string} + created_msg: قانون نام کاربری با موفّقیت ایجاد شد delete: حذف + edit: + title: ویرایش قانون نام‌کاربری + matches_exactly_html: برابر %{string} + new: + create: ایجاد قانون + title: ایجاد قانون نام‌کاربری جدید + no_username_block_selected: هیچ قاعدهٔ نام کاربری‌ای تغییری نکرد زیرا هیچ‌کدام گزیده نشده بودند + not_permitted: مجاز نیست + title: قانون نام کاربری + updated_msg: قانون نام کاربری با موفّقیت به‌روز شد warning_presets: add_new: افزودن تازه delete: زدودن diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 64752d5555..1c6ebec196 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -18,8 +18,8 @@ fi: pin_errors: following: Sinun täytyy seurata käyttäjää, jota haluat tukea posts: - one: Julkaisu - other: Julkaisua + one: julkaisu + other: julkaisua posts_tab_heading: Julkaisut self_follow_error: Oman tilisi seuraaminen ei ole sallittua admin: @@ -507,14 +507,14 @@ fi: registration_requested: Rekisteröintiä pyydetty registrations: confirm: Vahvista - description: Sait rekisteröinnin FASP:lta. Hylkää se, jos et aloittanut sitä. Jos aloitat tämän, vertaile huolellisesti nimeä ja sormenjälkeä ennen rekisteröinnin vahvistamista. + description: Vastaanotit rekisteröintymisen FASP-palvelusta. Hylkää rekisteröintyminen, jos et aloittanut sitä. Jos aloitit sen, vertaile huolellisesti nimeä ja avaimen sormenjälkeä ennen kuin hyväksyt rekisteröintymisen. reject: Hylkää title: Vahvista FASP-rekisteröinti save: Tallenna select_capabilities: Valitse kyvykkyydet sign_in: Kirjaudu sisään status: Tila - title: Fediversumin Tukitoimintojen Tarjoajat + title: Fediversumin tukitoimintojen tarjoajat title: FASP follow_recommendations: description_html: "Seurantasuositukset auttavat uusia käyttäjiä löytämään nopeasti kiinnostavaa sisältöä. Kun käyttäjä ei ole ollut tarpeeksi vuorovaikutuksessa muiden kanssa, jotta hänelle olisi muodostunut henkilökohtaisia seuraamissuosituksia, suositellaan niiden sijaan näitä tilejä. Ne lasketaan päivittäin uudelleen yhdistelmästä tilejä, jotka ovat viime aikoina olleet aktiivisimmin sitoutuneita ja joilla on suurimmat paikalliset seuraajamäärät tietyllä kielellä." diff --git a/config/locales/nan.yml b/config/locales/nan.yml index f6b11afc93..51d365229b 100644 --- a/config/locales/nan.yml +++ b/config/locales/nan.yml @@ -25,7 +25,7 @@ nan: action: 執行動作 already_silenced: Tsit ê口座有受著限制。 already_suspended: Tsit ê口座ê權限已經hōo lâng停止。 - title: Kā %{acct} 做審核ê動作 + title: Kā %{acct} 做管理ê動作 account_moderation_notes: create: 留記錄 created_msg: 管理記錄成功建立! @@ -238,7 +238,7 @@ nan: update_user_role: 更新角色 update_username_block: 更新使用者號名規則 actions: - approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì審核決定ê投訴" + approve_appeal_html: "%{name} 允准 %{target} 所寫ê tuì管理決定ê投訴" approve_user_html: "%{name} 允准 %{target} ê 註冊" assigned_to_self_report_html: "%{name} kā報告 %{target} 分配hōo家tī" change_email_user_html: "%{name} 改變 %{target} ê電子phue地址" @@ -282,7 +282,7 @@ nan: memorialize_account_html: "%{name} kā %{target} 設做故人口座" promote_user_html: "%{name} kā 用者 %{target} 升級" publish_terms_of_service_html: "%{name} 公佈服務規則ê更新" - reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì審核決定ê投訴" + reject_appeal_html: "%{name} 拒絕 %{target} 所寫ê tuì管理決定ê投訴" reject_user_html: "%{name} 拒絕 %{target} ê 註冊" remove_avatar_user_html: "%{name} thâi掉 %{target} ê標頭" reopen_report_html: "%{name} 重開 %{target} ê檢舉" @@ -667,7 +667,7 @@ nan: none: 無 comment_description_html: 為著提供其他資訊,%{name} 寫: confirm: 確認 - confirm_action: 確認kā %{acct} 審核ê動作 + confirm_action: 確認kā %{acct} 管理ê動作 created_at: 檢舉tī delete_and_resolve: Thâi掉PO文 forwarded: 轉送ah @@ -720,9 +720,48 @@ nan: target_origin: 受檢舉ê口座ê來源 title: 檢舉 unassign: 取消分配 + unknown_action_msg: M̄知影ê動作:%{action} + unresolved: 無解決 + updated_at: 更新 + view_profile: 看個人資料 roles: + add_new: 加添角色 + assigned_users: + other: "%{count} ê用者" + categories: + administration: 管理員 + devops: DevOps + invites: 邀請 + moderation: 管理 + special: 特別 + delete: Thâi掉 + description_html: 用用者角色,lí通自訂lí ê用者ē當接近使用Mastodon ê siánn物功能kap區域。 + edit: 編「%{name}」ê角色 + everyone: 預設ê權限 + everyone_full_description_html: Tse是ē影響所有用者ê基本角色,就算是無分配tio̍h角色ê mā kâng款。所有其他ê角色繼承伊ê權限。 + permissions_count: + other: "%{count} ê權限" privileges: + administrator: 管理員 + administrator_description: 有tsit ê權限ê用者ē忽略所有ê權限。 + delete_user_data: Thâi掉用者ê資料 + delete_user_data_description: 允准用者liâm-mi thâi掉其他用者ê資料 + invite_users: 邀請用者 + invite_users_description: 允准用者邀請新lâng來tsit ê服侍器 manage_announcements: 管理公告 + manage_announcements_description: 允准用者管理佇tsit ê服侍器ê公告 + manage_appeals: 管理投訴 + manage_appeals_description: 允准用者審查tuì管理動作ê投訴 + manage_blocks: 管理封鎖 + manage_blocks_description: 允准用者封鎖電子phue ê 提供者kap IP地址 + manage_custom_emojis: 管理自訂ê Emoji + manage_custom_emojis_description: 允准用者管理佇tsit ê服侍器ê自訂Emoji + manage_federation: 管理聯邦 + manage_federation_description: 允准用者封鎖á是允准kap其他域名相連,mā控制寄送ê能力 + manage_invites: 管理邀請 + manage_invites_description: 允准用者瀏覽kap停止使用邀請連結 + manage_reports: 管理檢舉 + manage_reports_description: 允准用者審查檢舉kap執行對in ê管理ê動作。 statuses: language: 語言 trends: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index b34a8ab84c..9153e01a3b 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1996,7 +1996,7 @@ ru: ignore_favs: Не учитывать добавление в избранное ignore_reblogs: Не учитывать продвижения interaction_exceptions: Исключения на основе взаимодействий - interaction_exceptions_explanation: 'Обратите внимание: нет никаких гарантий, что посты будут удалены, после того, как они единожды перешли порог по отметкам «избранного» или продвижений.' + interaction_exceptions_explanation: 'Обратите внимание: даже если количество взаимодействий опустится ниже установленного значения после того, как оно однажды превысило его, то всё равно может случиться так, что пост не будет удалён.' keep_direct: Не удалять личные сообщения keep_direct_hint: Те ваши посты, которые видны только упомянутым в них людям, не будут удалены keep_media: Не удалять посты с вложениями @@ -2040,29 +2040,29 @@ ru: contrast: Mastodon (высококонтрастная) default: Mastodon (тёмная) mastodon-light: Mastodon (светлая) - system: Автоматически (используйте системную тему) + system: Автоматически (как в системе) time: formats: default: "%d %b %Y, %H:%M" month: "%m.%Y" time: "%H:%M" - with_time_zone: "%b %d, %Y, %H:%M %Z" + with_time_zone: "%d %b %Y, %H:%M %Z" translation: errors: quota_exceeded: Превышена квота использования службы перевода в масштабах всего сервера. too_many_requests: В последнее время в службу переводов поступает слишком много запросов. two_factor_authentication: add: Добавить - disable: Отключить - disabled_success: Двухфакторная аутентификация успешно отключена + disable: Отключить 2FA + disabled_success: Двухфакторная аутентификация отключена edit: Изменить - enabled: Двухфакторная аутентификация настроена - enabled_success: Двухфакторная авторизация успешно настроена - generate_recovery_codes: Сгенерировать коды восстановления + enabled: Двухфакторная аутентификация включена + enabled_success: Двухфакторная аутентификация настроена + generate_recovery_codes: Сгенерировать резервные коды lost_recovery_codes: Коды восстановления позволяются войти в учётную запись в случае утери смартфона. Если вы потеряли свои коды восстановления, вы можете создать новые здесь. Прошлые коды работать перестанут. - methods: Методы двухфакторной аутентификации - otp: Приложение для проверки подлинности - recovery_codes: Коды восстановления + methods: Способы подтверждения входа + otp: Приложение-аутентификатор + recovery_codes: Резервные коды recovery_codes_regenerated: Коды восстановления успешно сгенерированы recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. Каждый код действителен только один раз.' webauthn: Электронные ключи diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 928b17ed1d..87ebe45e57 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -56,10 +56,12 @@ bg: scopes: Указва до кои API има достъп приложението. Ако изберете диапазон от най-високо ниво, няма нужда да избирате индивидуални. setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания) setting_always_send_emails: Обикновено известията по имейл няма да са изпратени при дейна употреба на Mastodon + setting_default_quote_policy: Тази настройка ще се отрази само за публикациите, създадени със следващата версия на Mastodon, но може да изберете предпочитанията си в подготовката. setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване setting_display_media_default: Скриване на мултимедия отбелязана като деликатна setting_display_media_hide_all: Винаги скриване на мултимедията setting_display_media_show_all: Винаги показване на мултимедията + setting_emoji_style: Как се показват емоджита. "Автоматично" ще опита да използва естествените за системата емоджита, но се връща към Twemoji за остарели браузъри. setting_system_scrollbars_ui: Прилага се само към настолни браузъри, основаващи се на Safari и Chrome setting_use_blurhash: Преливането е въз основа на цветовете на скритите визуализации, но се замъгляват подробностите setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала @@ -147,6 +149,9 @@ bg: min_age: Не трябва да е под изискваната минимална възраст от закона на юрисдикцията ви. user: chosen_languages: Само публикации на отметнатите езици ще се показват в публичните часови оси + date_of_birth: + one: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това. + other: Трябва да се уверим, че сте поне на %{count}, за да употребявате %{domain}. Няма да съхраняваме това. role: Ролята управлява какви позволения има потребителят. user_role: color: Цветът, използван за ролите в потребителския интерфейс, като RGB в шестнадесетичен формат @@ -154,6 +159,10 @@ bg: name: Публично име на ролята, ако ролята е зададена да се показва като значка permissions_as_keys: Потребители с тази роля ще имат достъп до... position: По-висшата роля може да разреши конфликти в някои ситуации. Някои действия могат да бъдат извършени само за роли с по-нисък приоритет + username_block: + allow_with_approval: Вместо напълно да се предотвратява регистрирането, съвпадащите регистрирания ще изискват одобрението ви + comparison: Имайте предвид проблема със Scunthorpe, блокирайки частично съвпаденията + username: Ще се намира съвпадение независимо от главните и малките букви и често срещаните приличащи си знаци като "4" за "a" или "3" за "e" webhook: events: Изберете събития за изпращане template: Съставете свой полезен товар на JSON посредством променлива интерполация. Оставете празно за подразбиращ се JSON. @@ -236,6 +245,7 @@ bg: setting_display_media_default: Стандартно setting_display_media_hide_all: Скриване на всичко setting_display_media_show_all: Показване на всичко + setting_emoji_style: Стил на емоджито setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание setting_hide_network: Скриване на социалния ви свързан граф setting_missing_alt_text_modal: Показване на диалогов прозорец потвърждение преди публикуване на мултимедия без алт. текст @@ -318,6 +328,7 @@ bg: follow_request: Някой пожела да ви последва mention: Някой ви спомена pending_account: Новите акаунти се нуждаят от преглед + quote: Някой ви цитира reblog: Някой подсили ваша публикация report: Новият доклад е подаден software_updates: @@ -364,6 +375,10 @@ bg: name: Име permissions_as_keys: Разрешения position: Приоритет + username_block: + allow_with_approval: Позволяване на регистрации с одобрение + comparison: Начин на сравнение + username: Думи, които трябва да пасват webhook: events: Включване на събития template: Шаблон за полезен товар diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 260d753000..8a727fcd78 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -56,6 +56,7 @@ cy: scopes: Pa APIs y bydd y rhaglen yn cael mynediad iddynt. Os dewiswch gwmpas lefel uchaf, nid oes angen i chi ddewis rhai unigol. setting_aggregate_reblogs: Peidiwch â dangos hybiau newydd ar bostiadau sydd wedi cael eu hybu'n ddiweddar (dim ond yn effeithio ar hybiau newydd ei dderbyn) setting_always_send_emails: Fel arfer ni fydd hysbysiadau e-bost yn cael eu hanfon pan fyddwch chi wrthi'n defnyddio Mastodon + setting_default_quote_policy: Dim ond ar gyfer fersiynau nesaf Mastodon bydd y gosodiadau hyn yn dod i rym, ond gallwch wneud eich dewis ymlaen llaw. setting_default_sensitive: Mae cyfryngau sensitif wedi'u cuddio yn rhagosodedig a gellir eu datgelu trwy glicio setting_display_media_default: Cuddio cyfryngau wedi eu marcio'n sensitif setting_display_media_hide_all: Cuddio cyfryngau bob tro @@ -163,6 +164,10 @@ cy: name: Enw cyhoeddus y rôl, os yw'r rôl wedi'i gosod i'w dangos fel bathodyn permissions_as_keys: Bydd defnyddwyr sydd â'r rôl hon yn cael mynediad at... position: Mae rôl uwch yn penderfynu ar ddatrys gwrthdrawiadau mewn rhai sefyllfaoedd. Dim ond ar rolau â blaenoriaeth is y gellir cyflawni rhai gweithredoedd + username_block: + allow_with_approval: Yn lle atal cofrestru’n llwyr, bydd angen eich cymeradwyaeth rhag cofrestru cyfatebol + comparison: Byddwch yn ymwybodol o Broblem Scunthorpe wrth rwystro cyfatebion rhannol. + username: Bydd yn cael ei gyfatebu waeth beth fo'r nodau bach a mawr a homoglyffau cyffredin fel "4" ar gyfer "a" neu "3" ar gyfer "e" webhook: events: Dewiswch ddigwyddiadau i'w hanfon template: Cyfansoddwch eich llwyth tâl JSON eich hun gan ddefnyddio rhyngosod newidiol. Gadewch yn wag ar gyfer JSON rhagosodedig. @@ -328,6 +333,7 @@ cy: follow_request: Mae rhywun yn ceisio eich dilyn chi mention: Mae rhywun yn sôn amdanoch chi pending_account: Mae cyfrif newydd angen adolygiad + quote: Dyfynnodd rhywun chi reblog: Mae rhywun wedi hybu eich postiad report: Cyflwynwyd adroddiad newydd software_updates: @@ -374,6 +380,10 @@ cy: name: Enw permissions_as_keys: Caniatâd position: Blaenoriaeth + username_block: + allow_with_approval: Caniatáu cofrestru gyda chymeradwyaeth + comparison: Dull cymharu + username: Gair i gyfatebu webhook: events: Digwyddiadau wedi'u galluogi template: Templed prif lwyth diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index c9842f07ea..19697b72aa 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -160,6 +160,10 @@ fa: name: نام عمومی نقش، اگر قرار است نقش به عنوان یک نشان نمایش داده شود permissions_as_keys: کاربرانی که این نقش را دارند به... position: نقش بالاتر در موقعیت‌های خاص حل تعارض را تعیین می‌کند. برخی اقدامات را فقط می توان روی نقش هایی با اولویت کمتر انجام داد + username_block: + allow_with_approval: به جای جلوگیری از ثبت‌نام، ثبت‌نام‌های مطابق نیازمند تأییدتان خواهند بود + comparison: لطفاً هنگام مسدود کردن تطابق‌های جزیی به مشکل اسکان‌ثورپ توجّه داشته باشید + username: تطبیق بدون توجه به بزرگی و کوچکی یا استفاده از نویسه‌های مشابه مثل 4 به جای a یا 3 به جای e webhook: events: گزینش رویدادها برای فرستادن template: بار JSON خود را با استفاده از درون یابی متغیر بنویسید. JSON پیش فرض را خالی بگذارید. @@ -372,6 +376,10 @@ fa: name: نام permissions_as_keys: اجازه‌ها position: اولویت + username_block: + allow_with_approval: اجازهٔ ثبت‌نام با تأیید + comparison: روش مقایسه + username: واژه برای تطبیق webhook: events: رویدادهای به کار افتاده template: قالب بار From 9d15b85d3b2ddfe964148eadba55e4ab87c571c7 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 18 Aug 2025 03:35:56 -0400 Subject: [PATCH 47/64] Include `update` in the resources args for api/web/push_subscriptions route (#35801) --- config/routes/api.rb | 6 +----- spec/requests/api/web/push_subscriptions_spec.rb | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/config/routes/api.rb b/config/routes/api.rb index f8b903c7b9..34b2e255da 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -369,10 +369,6 @@ namespace :api, format: false do namespace :web do resource :settings, only: [:update] resources :embeds, only: [:show] - resources :push_subscriptions, only: [:create, :destroy] do - member do - put :update - end - end + resources :push_subscriptions, only: [:create, :destroy, :update] end end diff --git a/spec/requests/api/web/push_subscriptions_spec.rb b/spec/requests/api/web/push_subscriptions_spec.rb index 05e6f28d1f..21830d1b1c 100644 --- a/spec/requests/api/web/push_subscriptions_spec.rb +++ b/spec/requests/api/web/push_subscriptions_spec.rb @@ -162,7 +162,7 @@ RSpec.describe 'API Web Push Subscriptions' do end end - describe 'PUT /api/web/push_subscriptions' do + describe 'PUT /api/web/push_subscriptions/:id' do before { sign_in Fabricate :user } let(:subscription) { Fabricate :web_push_subscription } From 72bd1ed4b3df9188a1ad3e664c86fe2e928bd134 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 18 Aug 2025 10:34:45 +0200 Subject: [PATCH 48/64] Fix updates to quote policy not being federated (#35804) --- .../api/v1/statuses/interaction_policies_controller.rb | 2 +- spec/requests/api/v1/statuses/interaction_policies_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/statuses/interaction_policies_controller.rb b/app/controllers/api/v1/statuses/interaction_policies_controller.rb index 8b822185f6..b8ec4fe140 100644 --- a/app/controllers/api/v1/statuses/interaction_policies_controller.rb +++ b/app/controllers/api/v1/statuses/interaction_policies_controller.rb @@ -28,6 +28,6 @@ class Api::V1::Statuses::InteractionPoliciesController < Api::V1::Statuses::Base def broadcast_updates! DistributionWorker.perform_async(@status.id, { 'update' => true }) - ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id) + ActivityPub::StatusUpdateDistributionWorker.perform_async(@status.id, { 'updated_at' => Time.now.utc.iso8601 }) end end diff --git a/spec/requests/api/v1/statuses/interaction_policies_spec.rb b/spec/requests/api/v1/statuses/interaction_policies_spec.rb index 6b988bb523..cdc33e40d7 100644 --- a/spec/requests/api/v1/statuses/interaction_policies_spec.rb +++ b/spec/requests/api/v1/statuses/interaction_policies_spec.rb @@ -62,7 +62,7 @@ RSpec.describe 'Interaction policies', feature: :outgoing_quotes do expect(DistributionWorker) .to have_enqueued_sidekiq_job(status.id, { 'update' => true }) expect(ActivityPub::StatusUpdateDistributionWorker) - .to have_enqueued_sidekiq_job(status.id) + .to have_enqueued_sidekiq_job(status.id, { 'updated_at' => anything }) end end From f5754f2a3600f6ae9c9d7d89fe5aa5ecb85e7bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ev=D0=B0n=20Summers?= Date: Mon, 18 Aug 2025 16:13:44 +0200 Subject: [PATCH 49/64] Mention admin@localhost in DEVELOPMENT.md for non-Vagrant setups (#35704) --- docs/DEVELOPMENT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 79153a2021..0425f8892b 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -91,7 +91,7 @@ development environment configured with the software needed for this project. ## Next steps - Once you have successfully set up a development environment, it will be available on http://localhost:3000 -- Log in as the default admin user with the username `admin@mastodon.local` and the password `mastodonadmin`. +- Log in as the default admin user with the username `admin@mastodon.local` or `admin@localhost` (depending on your setup) and the password `mastodonadmin`. - Check out the [Mastodon docs] for tips on working with emails in development (you'll need this when creating new user accounts) as well as a list of useful commands for testing and updating your dev instance. - You can optionally populate your database with sample data by running `bin/rails dev:populate_sample_data`. This will create a `@showcase_account` account with various types of contents. From c2fcf4183ce1c4f78097be032fdee2fc354b66d4 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 18 Aug 2025 16:51:16 +0200 Subject: [PATCH 50/64] =?UTF-8?q?Fix=20=E2=80=9CDelete=20&=20Redraft?= =?UTF-8?q?=E2=80=9D=20as=20well=20as=20=E2=80=9CEdit=E2=80=9D=20unexpecte?= =?UTF-8?q?dly=20reseting=20quote=20policy=20(#35808)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/mastodon/reducers/compose.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index c5b3c22ec1..bb4d917cca 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -512,6 +512,8 @@ export const composeReducer = (state = initialState, action) => { map.set('sensitive', action.status.get('sensitive')); map.set('language', action.status.get('language')); map.set('id', null); + // Mastodon-authored posts can be expected to have at most one automatic approval policy + map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody'); if (action.status.get('spoiler_text').length > 0) { map.set('spoiler', true); @@ -541,6 +543,8 @@ export const composeReducer = (state = initialState, action) => { map.set('idempotencyKey', uuid()); map.set('sensitive', action.status.get('sensitive')); map.set('language', action.status.get('language')); + // Mastodon-authored posts can be expected to have at most one automatic approval policy + map.set('quote_policy', action.status.getIn(['quote_approval', 'automatic', 0]) || 'nobody'); if (action.spoiler_text.length > 0) { map.set('spoiler', true); From 95111e88e3c9d44efdc4a18a80a7b082cf340655 Mon Sep 17 00:00:00 2001 From: Alan Date: Mon, 18 Aug 2025 09:55:38 -0600 Subject: [PATCH 51/64] Update color alpha blending to use Sass color functions (#35787) --- .../styles/mastodon-light/diff.scss | 18 +-- app/javascript/styles/mastodon/_mixins.scss | 3 +- app/javascript/styles/mastodon/accounts.scss | 15 ++- app/javascript/styles/mastodon/admin.scss | 3 +- .../styles/mastodon/components.scss | 125 +++++++++--------- .../styles/mastodon/css_variables.scss | 10 +- app/javascript/styles/mastodon/forms.scss | 23 ++-- app/javascript/styles/mastodon/polls.scss | 5 +- app/javascript/styles/mastodon/widgets.scss | 3 +- 9 files changed, 108 insertions(+), 97 deletions(-) diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index 874c44240a..d92012a157 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -16,7 +16,7 @@ .status-card__actions button, .status-card__actions a { - color: rgba($white, 0.8); + color: color.change($white, $alpha: 0.8); &:hover, &:active, @@ -298,14 +298,14 @@ .simple_form { .warning { box-shadow: none; - background: rgba($error-red, 0.5); + background: color.change($error-red, $alpha: 0.5); text-shadow: none; } .recommended { border-color: $ui-highlight-color; color: $ui-highlight-color; - background-color: rgba($ui-highlight-color, 0.1); + background-color: color.change($ui-highlight-color, $alpha: 0.1); } input[type='text'], @@ -327,7 +327,7 @@ .compose-form .compose-form__warning { border-color: $ui-highlight-color; - background-color: rgba($ui-highlight-color, 0.1); + background-color: color.change($ui-highlight-color, $alpha: 0.1); &, a { @@ -375,10 +375,10 @@ } .status__wrapper-direct { - background-color: rgba($ui-highlight-color, 0.1); + background-color: color.change($ui-highlight-color, $alpha: 0.1); &:focus { - background-color: rgba($ui-highlight-color, 0.15); + background-color: color.change($ui-highlight-color, $alpha: 0.15); } } @@ -433,8 +433,8 @@ } .inline-follow-suggestions { - background-color: rgba($ui-highlight-color, 0.1); - border-bottom-color: rgba($ui-highlight-color, 0.3); + background-color: color.change($ui-highlight-color, $alpha: 0.1); + border-bottom-color: color.change($ui-highlight-color, $alpha: 0.3); } .inline-follow-suggestions__body__scrollable__card { @@ -508,7 +508,7 @@ a.sparkline { @supports not selector(::-webkit-scrollbar) { html { - scrollbar-color: rgba($action-button-color, 0.25) + scrollbar-color: color.change($action-button-color, $alpha: 0.25) var(--background-border-color); } } diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss index b7d9203e3f..d66fa40581 100644 --- a/app/javascript/styles/mastodon/_mixins.scss +++ b/app/javascript/styles/mastodon/_mixins.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; @use 'variables' as *; @mixin search-input { @@ -22,7 +23,7 @@ padding-bottom: 14px; margin-top: 10px; color: $light-text-color; - box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + box-shadow: 2px 4px 15px color.change($base-shadow-color, $alpha: 0.4); h4 { text-transform: uppercase; diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index 3854db0c39..da4b9bdaa8 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; @use 'variables' as *; @use 'functions' as *; @@ -161,7 +162,7 @@ .nothing-here { background: $ui-base-color; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); + box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2); color: $darker-text-color; font-size: 14px; font-weight: 500; @@ -205,8 +206,8 @@ .simple_form .overridden, .simple_form .recommended, .simple_form .not_recommended { - background-color: rgba($ui-secondary-color, 0.1); - border: 1px solid rgba($ui-secondary-color, 0.5); + background-color: color.change($ui-secondary-color, $alpha: 0.1); + border: 1px solid color.change($ui-secondary-color, $alpha: 0.5); } .account-role { @@ -240,8 +241,8 @@ .information-badge { &.superapp { color: $success-green; - background-color: rgba($success-green, 0.1); - border-color: rgba($success-green, 0.5); + background-color: color.change($success-green, $alpha: 0.1); + border-color: color.change($success-green, $alpha: 0.5); } } @@ -302,8 +303,8 @@ } .verified { - border: 1px solid rgba($valid-value-color, 0.5); - background: rgba($valid-value-color, 0.25); + border: 1px solid color.change($valid-value-color, $alpha: 0.5); + background: color.change($valid-value-color, $alpha: 0.25); a { color: $valid-value-color; diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 3709a4f504..e9b584f396 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; @use 'sass:math'; @use 'functions' as *; @use 'variables' as *; @@ -1255,7 +1256,7 @@ a.name-tag, } path:first-child { - fill: rgba($highlight-text-color, 0.25) !important; + fill: color.change($highlight-text-color, $alpha: 0.25) !important; fill-opacity: 1 !important; } diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 1de7b74c50..48a7ed12cc 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -311,7 +311,7 @@ &:active, &:focus-visible { color: lighten($action-button-color, 7%); - background-color: rgba($action-button-color, 0.15); + background-color: color.change($action-button-color, $alpha: 0.15); } &:focus-visible { @@ -331,7 +331,7 @@ &:active, &:focus-visible { color: darken($lighter-text-color, 7%); - background-color: rgba($lighter-text-color, 0.15); + background-color: color.change($lighter-text-color, $alpha: 0.15); } &:focus-visible { @@ -361,14 +361,14 @@ &.overlayed { box-sizing: content-box; - background: rgba($black, 0.65); + background: color.change($black, $alpha: 0.65); backdrop-filter: $backdrop-blur-filter; - color: rgba($white, 0.7); + color: color.change($white, $alpha: 0.7); border-radius: 4px; padding: 2px; &:hover { - background: rgba($black, 0.9); + background: color.change($black, $alpha: 0.9); } } @@ -391,7 +391,7 @@ border-color: $valid-value-color; color: $valid-value-color; transition: none; - background-color: rgba($valid-value-color, 0.15); + background-color: color.change($valid-value-color, $alpha: 0.15); } } @@ -411,7 +411,7 @@ &:active, &:focus { color: darken($lighter-text-color, 7%); - background-color: rgba($lighter-text-color, 0.15); + background-color: color.change($lighter-text-color, $alpha: 0.15); } &:focus-visible { @@ -618,7 +618,7 @@ body > [data-popper-placement] { &__warning { color: $inverted-text-color; background: $ui-primary-color; - box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3); + box-shadow: 0 2px 6px color.change($base-shadow-color, $alpha: 0.3); padding: 8px 10px; border-radius: 4px; font-size: 13px; @@ -694,7 +694,7 @@ body > [data-popper-placement] { .spoiler-input__input { padding: 12px 12px - 5px; - background: rgba($ui-highlight-color, 0.05); + background: color.change($ui-highlight-color, $alpha: 0.05); color: $highlight-text-color; } @@ -1428,7 +1428,7 @@ body > [data-popper-placement] { .focusable { &:focus-visible { outline: 0; - background: rgba($ui-highlight-color, 0.05); + background: color.change($ui-highlight-color, $alpha: 0.05); box-shadow: inset 0 0 0 2px $ui-button-focus-outline-color; } } @@ -1683,10 +1683,10 @@ body > [data-popper-placement] { .notification-ungrouped--direct, .notification-group--direct, .notification-group--annual-report { - background: rgba($ui-highlight-color, 0.05); + background: color.change($ui-highlight-color, $alpha: 0.05); &:focus { - background: rgba($ui-highlight-color, 0.1); + background: color.change($ui-highlight-color, $alpha: 0.1); } } @@ -2016,7 +2016,7 @@ body > [data-popper-placement] { &__domain-pill { display: inline-flex; - background: rgba($highlight-text-color, 0.2); + background: color.change($highlight-text-color, $alpha: 0.2); border-radius: 4px; border: 0; color: $highlight-text-color; @@ -2077,7 +2077,7 @@ body > [data-popper-placement] { &__handle { border: 2px dashed $highlight-text-color; - background: rgba($highlight-text-color, 0.1); + background: color.change($highlight-text-color, $alpha: 0.1); padding: 12px 8px; color: $highlight-text-color; border-radius: 4px; @@ -3283,7 +3283,7 @@ a.account__display-name { .columns-area__panels__pane--overlay { pointer-events: auto; - background: rgba($base-overlay-background, 0.5); + background: color.change($base-overlay-background, $alpha: 0.5); z-index: 3; .columns-area__panels__pane__inner { @@ -3820,7 +3820,10 @@ a.account__display-name { border-radius: 10px; padding: 0; user-select: none; - -webkit-tap-highlight-color: rgba($base-overlay-background, 0); + -webkit-tap-highlight-color: color.change( + $base-overlay-background, + $alpha: 0 + ); -webkit-tap-highlight-color: transparent; } @@ -4069,7 +4072,7 @@ a.account__display-name { cursor: pointer; & > div { - background: rgba($base-shadow-color, 0.6); + background: color.change($base-shadow-color, $alpha: 0.6); border-radius: 8px; padding: 12px 9px; backdrop-filter: $backdrop-blur-filter; @@ -4399,7 +4402,7 @@ a.status-card { z-index: 1; &.active { - box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3); + box-shadow: 0 1px 0 color.change($highlight-text-color, $alpha: 0.3); &::before { display: block; @@ -4415,8 +4418,8 @@ a.status-card { z-index: 1; background: radial-gradient( ellipse, - rgba($ui-highlight-color, 0.23) 0%, - rgba($ui-highlight-color, 0) 60% + color.change($ui-highlight-color, $alpha: 0.23) 0%, + color.change($ui-highlight-color, $alpha: 0) 60% ); } } @@ -4510,7 +4513,7 @@ a.status-card { &.active { .column-header__icon { color: $highlight-text-color; - text-shadow: 0 0 10px rgba($highlight-text-color, 0.4); + text-shadow: 0 0 10px color.change($highlight-text-color, $alpha: 0.4); } } @@ -4855,7 +4858,7 @@ a.status-card { font-size: 14px; &__label { - background-color: rgba($black, 0.45); + background-color: color.change($black, $alpha: 0.45); backdrop-filter: $backdrop-blur-filter; border-radius: 8px; padding: 12px 16px; @@ -4875,7 +4878,7 @@ a.status-card { &:hover, &:focus { .spoiler-button__overlay__label { - background-color: rgba($black, 0.9); + background-color: color.change($black, $alpha: 0.9); } } } @@ -5266,7 +5269,7 @@ a.status-card { .upload-area { align-items: center; - background: rgba($base-overlay-background, 0.8); + background: color.change($base-overlay-background, $alpha: 0.8); display: flex; height: 100vh; justify-content: center; @@ -5301,7 +5304,7 @@ a.status-card { z-index: -1; border-radius: 4px; background: $ui-base-color; - box-shadow: 0 0 5px rgba($base-shadow-color, 0.2); + box-shadow: 0 0 5px color.change($base-shadow-color, $alpha: 0.2); } .upload-area__content { @@ -5939,7 +5942,7 @@ a.status-card { align-items: center; .icon-button { - color: rgba($white, 0.7); + color: color.change($white, $alpha: 0.7); padding: 8px; .icon { @@ -5952,11 +5955,11 @@ a.status-card { &:focus, &:active { color: $white; - background-color: rgba($white, 0.15); + background-color: color.change($white, $alpha: 0.15); } &:focus { - background-color: rgba($white, 0.3); + background-color: color.change($white, $alpha: 0.3); } } } @@ -5997,7 +6000,7 @@ a.status-card { background: transparent; box-sizing: border-box; border: 0; - color: rgba($white, 0.7); + color: color.change($white, $alpha: 0.7); cursor: pointer; display: flex; align-items: center; @@ -6051,11 +6054,11 @@ a.status-card { &:focus, &:active { color: $white; - background-color: rgba($white, 0.15); + background-color: color.change($white, $alpha: 0.15); } &:focus { - background-color: rgba($white, 0.3); + background-color: color.change($white, $alpha: 0.3); } &.active { @@ -6064,11 +6067,11 @@ a.status-card { &:hover, &:focus, &:active { - background: rgba($highlight-text-color, 0.15); + background: color.change($highlight-text-color, $alpha: 0.15); } &:focus { - background: rgba($highlight-text-color, 0.3); + background: color.change($highlight-text-color, $alpha: 0.3); } } @@ -6078,11 +6081,11 @@ a.status-card { &:hover, &:focus, &:active { - background: rgba($gold-star, 0.15); + background: color.change($gold-star, $alpha: 0.15); } &:focus { - background: rgba($gold-star, 0.3); + background: color.change($gold-star, $alpha: 0.3); } } @@ -6954,7 +6957,7 @@ a.status-card { display: block; color: $white; border: 0; - background: rgba($black, 0.65); + background: color.change($black, $alpha: 0.65); backdrop-filter: $backdrop-blur-filter; padding: 3px 12px; border-radius: 99px; @@ -6979,7 +6982,7 @@ a.status-card { text-align: center; color: $white; border: 0; - background: rgba($black, 0.65); + background: color.change($black, $alpha: 0.65); backdrop-filter: $backdrop-blur-filter; padding: 3px 8px; border-radius: 4px; @@ -7001,7 +7004,7 @@ a.status-card { } .media-gallery__alt__popover { - background: rgba($black, 0.65); + background: color.change($black, $alpha: 0.65); backdrop-filter: $backdrop-blur-filter; border-radius: 4px; box-shadow: var(--dropdown-shadow); @@ -7023,7 +7026,7 @@ a.status-card { p { font-size: 15px; line-height: 20px; - color: rgba($white, 0.85); + color: color.change($white, $alpha: 0.85); white-space: pre-line; } } @@ -7467,8 +7470,8 @@ a.status-card { box-sizing: border-box; background: linear-gradient( 0deg, - rgba($base-shadow-color, 0.85) 0, - rgba($base-shadow-color, 0.45) 60%, + color.change($base-shadow-color, $alpha: 0.85) 0, + color.change($base-shadow-color, $alpha: 0.45) 60%, transparent ); padding: 0 15px; @@ -7564,7 +7567,7 @@ a.status-card { flex: 0 0 auto; background: transparent; border: 0; - color: rgba($white, 0.75); + color: color.change($white, $alpha: 0.75); font-weight: 500; &:active, @@ -7628,7 +7631,7 @@ a.status-card { &::before { content: ''; width: 50px; - background: rgba($white, 0.35); + background: color.change($white, $alpha: 0.35); border-radius: 4px; display: block; position: absolute; @@ -7660,7 +7663,7 @@ a.status-card { margin-inline-start: -6px; transform: translate(0, -50%); background: $white; - box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2); + box-shadow: 1px 2px 6px color.change($base-shadow-color, $alpha: 0.2); opacity: 0; .no-reduce-motion & { @@ -7698,7 +7701,7 @@ a.status-card { &::before { content: ''; width: 100%; - background: rgba($white, 0.35); + background: color.change($white, $alpha: 0.35); border-radius: 4px; display: block; position: absolute; @@ -7717,7 +7720,7 @@ a.status-card { } &__buffer { - background: rgba($white, 0.2); + background: color.change($white, $alpha: 0.2); } &__handle { @@ -7730,7 +7733,7 @@ a.status-card { top: 10px; margin-inline-start: -6px; background: $white; - box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2); + box-shadow: 1px 2px 6px color.change($base-shadow-color, $alpha: 0.2); .no-reduce-motion & { transition: opacity 0.1s ease; @@ -7754,7 +7757,7 @@ a.status-card { top: 50%; inset-inline-start: 50%; transform: translate(-50%, -50%); - background: rgba($base-shadow-color, 0.45); + background: color.change($base-shadow-color, $alpha: 0.45); backdrop-filter: $backdrop-blur-filter; color: $white; border-radius: 8px; @@ -8089,7 +8092,7 @@ noscript { inset-inline-start: 0; width: 100%; height: 100%; - background: rgba($base-overlay-background, 0.5); + background: color.change($base-overlay-background, $alpha: 0.5); } .focal-point { @@ -8111,7 +8114,7 @@ noscript { transform: translate(-50%, -50%); border: 2px solid #fff; border-radius: 50%; - box-shadow: 0 0 0 9999em rgba($base-shadow-color, 0.35); + box-shadow: 0 0 0 9999em color.change($base-shadow-color, $alpha: 0.35); pointer-events: none; } } @@ -8353,7 +8356,7 @@ noscript { } .verified { - border: 1px solid rgba($valid-value-color, 0.5); + border: 1px solid color.change($valid-value-color, $alpha: 0.5); margin-top: -1px; margin-inline: -1px; @@ -8573,7 +8576,7 @@ noscript { width: 50px; path:first-child { - fill: rgba($highlight-text-color, 0.25) !important; + fill: color.change($highlight-text-color, $alpha: 0.25) !important; fill-opacity: 1 !important; } @@ -8598,7 +8601,7 @@ noscript { .trends__item__sparkline { path:first-child { - fill: rgba($gold-star, 0.25) !important; + fill: color.change($gold-star, $alpha: 0.25) !important; } path:last-child { @@ -9763,7 +9766,7 @@ noscript { margin-bottom: 5px; border-radius: 8px; border: 1px solid $highlight-text-color; - background: rgba($highlight-text-color, 0.15); + background: color.change($highlight-text-color, $alpha: 0.15); overflow: hidden; flex-shrink: 0; @@ -9818,7 +9821,7 @@ noscript { } .button-tertiary { - background: rgba($ui-base-color, 0.15); + background: color.change($ui-base-color, $alpha: 0.15); backdrop-filter: blur(8px); } } @@ -9835,7 +9838,7 @@ noscript { .warning-banner { border: 1px solid $warning-red; - background: rgba($warning-red, 0.15); + background: color.change($warning-red, $alpha: 0.15); &__message { h1 { @@ -10170,13 +10173,13 @@ noscript { padding: 15px; margin: 0; color: $white; - background: rgba($black, 0.85); + background: color.change($black, $alpha: 0.85); backdrop-filter: blur(8px); border: 1px solid rgba(lighten($classic-base-color, 4%), 0.85); border-radius: 8px; box-shadow: - 0 10px 15px -3px rgba($base-shadow-color, 0.25), - 0 4px 6px -4px rgba($base-shadow-color, 0.25); + 0 10px 15px -3px color.change($base-shadow-color, $alpha: 0.25), + 0 4px 6px -4px color.change($base-shadow-color, $alpha: 0.25); cursor: default; font-size: 15px; line-height: 21px; @@ -10214,7 +10217,7 @@ noscript { &:hover, &:focus, &:active { - background: rgba($ui-base-color, 0.85); + background: color.change($ui-base-color, $alpha: 0.85); } } @@ -10312,7 +10315,7 @@ noscript { padding: 16px 0; padding-bottom: 0; border-bottom: 1px solid var(--background-border-color); - background: rgba($ui-highlight-color, 0.05); + background: color.change($ui-highlight-color, $alpha: 0.05); &__header { display: flex; diff --git a/app/javascript/styles/mastodon/css_variables.scss b/app/javascript/styles/mastodon/css_variables.scss index 7f27c12f77..78915ae10e 100644 --- a/app/javascript/styles/mastodon/css_variables.scss +++ b/app/javascript/styles/mastodon/css_variables.scss @@ -6,10 +6,10 @@ --dropdown-border-color: #{lighten($ui-base-color, 4%)}; --dropdown-background-color: #{rgba(darken($ui-base-color, 8%), 0.9)}; --dropdown-shadow: - 0 20px 25px -5px #{rgba($base-shadow-color, 0.25)}, - 0 8px 10px -6px #{rgba($base-shadow-color, 0.25)}; + 0 20px 25px -5px #{color.change($base-shadow-color, $alpha: 0.25)}, + 0 8px 10px -6px #{color.change($base-shadow-color, $alpha: 0.25)}; --modal-background-color: #{rgba(darken($ui-base-color, 8%), 0.7)}; - --modal-background-variant-color: #{rgba($ui-base-color, 0.7)}; + --modal-background-variant-color: #{color.change($ui-base-color, $alpha: 0.7)}; --modal-border-color: #{lighten($ui-base-color, 4%)}; --background-border-color: #{lighten($ui-base-color, 4%)}; --background-color: #{darken($ui-base-color, 8%)}; @@ -21,7 +21,9 @@ --on-surface-color: #{color.adjust($ui-base-color, $alpha: -0.5)}; --avatar-border-radius: 8px; --media-outline-color: #{rgba(#fcf8ff, 0.15)}; - --overlay-icon-shadow: drop-shadow(0 0 8px #{rgba($base-shadow-color, 0.35)}); + --overlay-icon-shadow: drop-shadow( + 0 0 8px #{color.change($base-shadow-color, $alpha: 0.35)} + ); --error-background-color: #{darken($error-red, 16%)}; --error-active-background-color: #{darken($error-red, 12%)}; --on-error-color: #fff; diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index 4762168bd8..b3708b722e 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; @use 'variables' as *; @use 'functions' as *; @@ -733,20 +734,20 @@ code { text-align: center; &.notice { - border: 1px solid rgba($valid-value-color, 0.5); - background: rgba($valid-value-color, 0.25); + border: 1px solid color.change($valid-value-color, $alpha: 0.5); + background: color.change($valid-value-color, $alpha: 0.25); color: $valid-value-color; } &.warning { - border: 1px solid rgba($gold-star, 0.5); - background: rgba($gold-star, 0.25); + border: 1px solid color.change($gold-star, $alpha: 0.5); + background: color.change($gold-star, $alpha: 0.25); color: $gold-star; } &.alert { - border: 1px solid rgba($error-value-color, 0.5); - background: rgba($error-value-color, 0.1); + border: 1px solid color.change($error-value-color, $alpha: 0.5); + background: color.change($error-value-color, $alpha: 0.1); color: $error-value-color; } @@ -965,7 +966,7 @@ code { background: $simple-background-color; padding: 4px; margin: 0 10px 20px 0; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); + box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2); display: inline-block; svg { @@ -988,10 +989,10 @@ code { .simple_form { .warning { box-sizing: border-box; - background: rgba($error-value-color, 0.5); + background: color.change($error-value-color, $alpha: 0.5); color: $primary-text-color; - text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3); - box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4); + text-shadow: 1px 1px 0 color.change($base-shadow-color, $alpha: 0.3); + box-shadow: 0 2px 6px color.change($base-shadow-color, $alpha: 0.4); border-radius: 4px; padding: 10px; margin-bottom: 15px; @@ -1350,7 +1351,7 @@ code { width: 100%; height: 100%; position: absolute; - background: rgba($error-value-color, 0.25); + background: color.change($error-value-color, $alpha: 0.25); z-index: 2; border-radius: 8px; } diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss index f49ce3c413..4402e51b9b 100644 --- a/app/javascript/styles/mastodon/polls.scss +++ b/app/javascript/styles/mastodon/polls.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; @use 'variables' as *; @use 'functions' as *; @@ -206,7 +207,7 @@ &:active, &:focus { - background-color: rgba($dark-text-color, 0.1); + background-color: color.change($dark-text-color, $alpha: 0.1); } } @@ -225,7 +226,7 @@ background: rgba(darken($ui-primary-color, 14%), 0.7); &.leading { - background: rgba($ui-highlight-color, 0.5); + background: color.change($ui-highlight-color, $alpha: 0.5); } } } diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 8d09c7d583..266a9ca930 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -1,3 +1,4 @@ +@use 'sass:color'; @use 'variables' as *; @use 'functions' as *; @@ -16,7 +17,7 @@ padding: 15px; text-decoration: none; color: inherit; - box-shadow: 0 0 15px rgba($base-shadow-color, 0.2); + box-shadow: 0 0 15px color.change($base-shadow-color, $alpha: 0.2); } & > a { From 255d8f3f8c6ece6a9f1fce9ea901d71577b92099 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 18 Aug 2025 18:37:13 +0200 Subject: [PATCH 52/64] Fix e-mail confirmation bypassing username approval (#35806) --- app/models/user.rb | 8 +++-- .../models/concerns/user/confirmation.rb | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index aca72daff0..8e0785e7fd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -412,7 +412,7 @@ class User < ApplicationRecord def set_approved self.approved = begin - if sign_up_from_ip_requires_approval? || sign_up_email_requires_approval? || sign_up_username_requires_approval? + if requires_approval? false else open_registrations? || valid_invitation? || external? @@ -426,7 +426,11 @@ class User < ApplicationRecord def grant_approval_on_confirmation? # Re-check approval on confirmation if the server has switched to open registrations - open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval? + open_registrations? && !requires_approval? + end + + def requires_approval? + sign_up_from_ip_requires_approval? || sign_up_email_requires_approval? || sign_up_username_requires_approval? end def wrap_email_confirmation diff --git a/spec/support/examples/models/concerns/user/confirmation.rb b/spec/support/examples/models/concerns/user/confirmation.rb index 4edc402f95..bb4d1b52b9 100644 --- a/spec/support/examples/models/concerns/user/confirmation.rb +++ b/spec/support/examples/models/concerns/user/confirmation.rb @@ -86,6 +86,42 @@ RSpec.shared_examples 'User::Confirmation' do end end + context 'when the user requires explicit approval because of signup IP address' do + let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email, approved: false, sign_up_ip: '192.0.2.5') } + + before do + Setting.registrations_mode = 'open' + Fabricate(:ip_block, ip: '192.0.2.5', severity: :sign_up_requires_approval) + end + + it 'sets email to new_email and marks user as confirmed, but not as approved and does not trigger `account.approved` web hook' do + expect { subject } + .to change { user.reload.email }.to(new_email) + .and change { user.reload.confirmed_at }.from(nil) + .and not_change { user.reload.approved }.from(false) + expect(TriggerWebhookWorker) + .to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id) + end + end + + context 'when the user requires explicit approval because of username' do + let(:user) { Fabricate(:user, confirmed_at: nil, unconfirmed_email: new_email, approved: false, account_attributes: { username: 'VeryStrangeUsername' }) } + + before do + Setting.registrations_mode = 'open' + Fabricate(:username_block, username: 'StrangeUser', exact: false, allow_with_approval: true) + end + + it 'sets email to new_email and marks user as confirmed, but not as approved and does not trigger `account.approved` web hook' do + expect { subject } + .to change { user.reload.email }.to(new_email) + .and change { user.reload.confirmed_at }.from(nil) + .and not_change { user.reload.approved }.from(false) + expect(TriggerWebhookWorker) + .to_not have_received(:perform_async).with('account.approved', 'Account', user.account_id) + end + end + context 'when registrations mode is approved' do before { Setting.registrations_mode = 'approved' } From 28bf811a070f4c4fcc8a81378b89173e5766f433 Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Mon, 18 Aug 2025 11:45:31 -0500 Subject: [PATCH 53/64] Update Dockerfile to use Debian 'trixie' (#35768) --- Dockerfile | 35 ++++++++++++++++------------------- streaming/Dockerfile | 6 +++--- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Dockerfile b/Dockerfile index 23214c2483..3872322854 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,11 +17,11 @@ ARG RUBY_VERSION="3.4.5" # # Node.js version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] # renovate: datasource=node-version depName=node ARG NODE_MAJOR_VERSION="22" -# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"] -ARG DEBIAN_VERSION="bookworm" -# Node.js image to use for base image based on combined variables (ex: 20-bookworm-slim) +# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"] +ARG DEBIAN_VERSION="trixie" +# Node.js image to use for base image based on combined variables (ex: 20-trixie-slim) FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS node -# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-bookworm) +# Ruby image to use for base image based on combined variables (ex: 3.4.x-slim-trixie) FROM ${BASE_REGISTRY}/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} AS ruby # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA @@ -96,9 +96,6 @@ RUN \ # Set /opt/mastodon as working directory WORKDIR /opt/mastodon -# Add backport repository for some specific packages where we need the latest version -RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list - # hadolint ignore=DL3008,DL3005 RUN \ # Mount Apt cache and lib directories from Docker buildx caches @@ -161,11 +158,11 @@ RUN \ libexif-dev \ libexpat1-dev \ libgirepository1.0-dev \ - libheif-dev/bookworm-backports \ + libheif-dev \ + libhwy-dev \ libimagequant-dev \ libjpeg62-turbo-dev \ liblcms2-dev \ - liborc-dev \ libspng-dev \ libtiff-dev \ libwebp-dev \ @@ -209,7 +206,7 @@ FROM build AS ffmpeg # ffmpeg version to compile, change with [--build-arg FFMPEG_VERSION="7.0.x"] # renovate: datasource=repology depName=ffmpeg packageName=openpkg_current/ffmpeg -ARG FFMPEG_VERSION=7.1 +ARG FFMPEG_VERSION=7.1.1 # ffmpeg download URL, change with [--build-arg FFMPEG_URL="https://ffmpeg.org/releases"] ARG FFMPEG_URL=https://ffmpeg.org/releases @@ -327,28 +324,28 @@ RUN \ # Apt update install non-dev versions of necessary components apt-get install -y --no-install-recommends \ libexpat1 \ - libglib2.0-0 \ - libicu72 \ + libglib2.0-0t64 \ + libicu76 \ libidn12 \ libpq5 \ - libreadline8 \ - libssl3 \ + libreadline8t64 \ + libssl3t64 \ libyaml-0-2 \ # libvips components libcgif0 \ libexif12 \ - libheif1/bookworm-backports \ + libheif1 \ + libhwy1t64 \ libimagequant0 \ libjpeg62-turbo \ liblcms2-2 \ - liborc-0.4-0 \ libspng0 \ libtiff6 \ libwebp7 \ libwebpdemux2 \ libwebpmux3 \ # ffmpeg components - libdav1d6 \ + libdav1d7 \ libmp3lame0 \ libopencore-amrnb0 \ libopencore-amrwb0 \ @@ -358,9 +355,9 @@ RUN \ libvorbis0a \ libvorbisenc2 \ libvorbisfile3 \ - libvpx7 \ + libvpx9 \ libx264-164 \ - libx265-199 \ + libx265-215 \ ; # Copy Mastodon sources into final layer diff --git a/streaming/Dockerfile b/streaming/Dockerfile index 14f2d3c7e7..0ddde2f8dc 100644 --- a/streaming/Dockerfile +++ b/streaming/Dockerfile @@ -11,9 +11,9 @@ ARG BASE_REGISTRY="docker.io" # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"] # renovate: datasource=node-version depName=node ARG NODE_MAJOR_VERSION="22" -# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"] -ARG DEBIAN_VERSION="bookworm" -# Node image to use for base image based on combined variables (ex: 20-bookworm-slim) +# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="trixie"] +ARG DEBIAN_VERSION="trixie" +# Node image to use for base image based on combined variables (ex: 20-trixie-slim) FROM ${BASE_REGISTRY}/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim AS streaming # Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA From d4b2e7f77139e27cbde83034fe96dbd189ac56c9 Mon Sep 17 00:00:00 2001 From: Echo Date: Mon, 18 Aug 2025 18:52:28 +0200 Subject: [PATCH 54/64] Composer Quote UI (#35805) Co-authored-by: diondiondion --- .../components/autosuggest_textarea.jsx | 3 ++- app/javascript/mastodon/components/status.jsx | 19 +++++++++++++ .../mastodon/containers/status_container.jsx | 7 +++++ .../compose/components/compose_form.jsx | 3 +++ .../compose/components/quoted_post.tsx | 27 +++++++++++++++++++ .../containers/poll_button_container.js | 14 +++++++--- .../containers/upload_button_container.js | 3 ++- app/javascript/mastodon/locales/en.json | 1 + app/javascript/mastodon/reducers/compose.js | 12 +++++++-- app/javascript/mastodon/selectors/filters.ts | 2 +- .../mastodon/store/typed_functions.ts | 2 +- .../styles/mastodon/components.scss | 24 +++++++++++++++++ 12 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 app/javascript/mastodon/features/compose/components/quoted_post.tsx diff --git a/app/javascript/mastodon/components/autosuggest_textarea.jsx b/app/javascript/mastodon/components/autosuggest_textarea.jsx index c7ec3779f3..de5accc4b2 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.jsx +++ b/app/javascript/mastodon/components/autosuggest_textarea.jsx @@ -53,6 +53,7 @@ const AutosuggestTextarea = forwardRef(({ onFocus, autoFocus = true, lang, + className, }, textareaRef) => { const [suggestionsHidden, setSuggestionsHidden] = useState(true); @@ -192,7 +193,7 @@ const AutosuggestTextarea = forwardRef(({ }; return ( -
+