diff --git a/CHANGELOG.md b/CHANGELOG.md index f30b502ad1..9f4776cbc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. +## [4.5.1] - 2025-11-13 + +### Fixes + +- Fix Cmd/Ctrl + Enter not submitting Alt text modal on some browsers (#36866 by @diondiondion) +- Fix posts coming from public/hashtag streaming being marked as unquotable (#36860 and #36869 by @ClearlyClaire) +- Fix old previously-undiscovered posts being treated as new when receiving an `Update` (#36848 by @ClearlyClaire) +- Fix blank screen in browsers that don't support `Intl.DisplayNames` (#36847 by @diondiondion) +- Fix filters not being applied to quotes in detailed view (#36843 by @ClearlyClaire) +- Fix scroll shift caused by fetch-all-replies alerts (#36807 by @diondiondion) +- Fix dropdown menu not focusing first item when opened via keyboard (#36804 by @diondiondion) +- Fix assets build issue on arch64 (#36781 by @ClearlyClaire) +- Fix `/api/v1/statuses/:id/context` sometimes returing `Mastodon-Async-Refresh` without `result_count` (#36779 by @ClearlyClaire) +- Fix prepared quote not being discarded with contents when replying (#36778 by @ClearlyClaire) + ## [4.5.0] - 2025-11-06 ### Added diff --git a/Gemfile.lock b/Gemfile.lock index 404dfc9cc2..73c54fc633 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -96,8 +96,8 @@ GEM ast (2.4.3) attr_required (1.0.2) aws-eventstream (1.4.0) - aws-partitions (1.1180.0) - aws-sdk-core (3.236.0) + aws-partitions (1.1181.0) + aws-sdk-core (3.237.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -608,7 +608,7 @@ GEM premailer (~> 1.7, >= 1.7.9) prettyprint (0.2.0) prism (1.6.0) - prometheus_exporter (2.3.0) + prometheus_exporter (2.3.1) webrick propshaft (1.3.1) actionpack (>= 7.0.0) @@ -838,7 +838,7 @@ GEM stackprof (0.2.27) starry (0.2.0) base64 - stoplight (5.5.0) + stoplight (5.6.0) zeitwerk stringio (3.1.7) strong_migrations (2.5.1) diff --git a/app/inputs/date_of_birth_input.rb b/app/inputs/date_of_birth_input.rb index 131234b02e..37f48133b3 100644 --- a/app/inputs/date_of_birth_input.rb +++ b/app/inputs/date_of_birth_input.rb @@ -2,25 +2,25 @@ class DateOfBirthInput < SimpleForm::Inputs::Base OPTIONS = [ - { autocomplete: 'bday-day', maxlength: 2, pattern: '[0-9]+', placeholder: 'DD' }.freeze, - { autocomplete: 'bday-month', maxlength: 2, pattern: '[0-9]+', placeholder: 'MM' }.freeze, { autocomplete: 'bday-year', maxlength: 4, pattern: '[0-9]+', placeholder: 'YYYY' }.freeze, + { autocomplete: 'bday-month', maxlength: 2, pattern: '[0-9]+', placeholder: 'MM' }.freeze, + { autocomplete: 'bday-day', maxlength: 2, pattern: '[0-9]+', placeholder: 'DD' }.freeze, ].freeze def input(wrapper_options = nil) merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) merged_input_options[:inputmode] = 'numeric' - values = (object.public_send(attribute_name) || '').split('.') + values = (object.public_send(attribute_name) || '').to_s.split('-') - safe_join(Array.new(3) do |index| + safe_join(2.downto(0).map do |index| options = merged_input_options.merge(OPTIONS[index]).merge id: generate_id(index), 'aria-label': I18n.t("simple_form.labels.user.date_of_birth_#{index + 1}i"), value: values[index] @builder.text_field("#{attribute_name}(#{index + 1}i)", options) end) end def label_target - "#{attribute_name}_1i" + "#{attribute_name}_3i" end private diff --git a/app/javascript/entrypoints/admin.tsx b/app/javascript/entrypoints/admin.tsx index af9309d342..a2c53d472b 100644 --- a/app/javascript/entrypoints/admin.tsx +++ b/app/javascript/entrypoints/admin.tsx @@ -1,7 +1,7 @@ import { createRoot } from 'react-dom/client'; -import Rails from '@rails/ujs'; import { decode, ValidationError } from 'blurhash'; +import { on } from 'delegated-events'; import ready from '../mastodon/ready'; @@ -24,10 +24,9 @@ const setAnnouncementEndsAttributes = (target: HTMLInputElement) => { } }; -Rails.delegate( - document, - 'input[type="datetime-local"]#announcement_starts_at', +on( 'change', + 'input[type="datetime-local"]#announcement_starts_at', ({ target }) => { if (target instanceof HTMLInputElement) setAnnouncementEndsAttributes(target); @@ -63,7 +62,7 @@ const hideSelectAll = () => { if (hiddenField) hiddenField.value = '0'; }; -Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { +on('change', '#batch_checkbox_all', ({ target }) => { if (!(target instanceof HTMLInputElement)) return; const selectAllMatchingElement = document.querySelector( @@ -85,7 +84,7 @@ Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { } }); -Rails.delegate(document, '.batch-table__select-all button', 'click', () => { +on('click', '.batch-table__select-all button', () => { const hiddenField = document.querySelector( '#select_all_matching', ); @@ -113,7 +112,7 @@ Rails.delegate(document, '.batch-table__select-all button', 'click', () => { } }); -Rails.delegate(document, batchCheckboxClassName, 'change', () => { +on('change', batchCheckboxClassName, () => { const checkAllElement = document.querySelector( 'input#batch_checkbox_all', ); @@ -140,14 +139,9 @@ Rails.delegate(document, batchCheckboxClassName, 'change', () => { } }); -Rails.delegate( - document, - '.filter-subset--with-select select', - 'change', - ({ target }) => { - if (target instanceof HTMLSelectElement) target.form?.submit(); - }, -); +on('change', '.filter-subset--with-select select', ({ target }) => { + if (target instanceof HTMLSelectElement) target.form?.submit(); +}); const onDomainBlockSeverityChange = (target: HTMLSelectElement) => { const rejectMediaDiv = document.querySelector( @@ -168,11 +162,11 @@ const onDomainBlockSeverityChange = (target: HTMLSelectElement) => { } }; -Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => { +on('change', '#domain_block_severity', ({ target }) => { if (target instanceof HTMLSelectElement) onDomainBlockSeverityChange(target); }); -const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => { +function onEnableBootstrapTimelineAccountsChange(target: HTMLInputElement) { const bootstrapTimelineAccountsField = document.querySelector( '#form_admin_settings_bootstrap_timeline_accounts', @@ -194,12 +188,11 @@ const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => { ); } } -}; +} -Rails.delegate( - document, - '#form_admin_settings_enable_bootstrap_timeline_accounts', +on( 'change', + '#form_admin_settings_enable_bootstrap_timeline_accounts', ({ target }) => { if (target instanceof HTMLInputElement) onEnableBootstrapTimelineAccountsChange(target); @@ -239,11 +232,11 @@ const onChangeRegistrationMode = (target: HTMLSelectElement) => { }); }; -const convertUTCDateTimeToLocal = (value: string) => { +function convertUTCDateTimeToLocal(value: string) { const date = new Date(value + 'Z'); const twoChars = (x: number) => x.toString().padStart(2, '0'); return `${date.getFullYear()}-${twoChars(date.getMonth() + 1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`; -}; +} function convertLocalDatetimeToUTC(value: string) { const date = new Date(value); @@ -251,14 +244,9 @@ function convertLocalDatetimeToUTC(value: string) { return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6); } -Rails.delegate( - document, - '#form_admin_settings_registrations_mode', - 'change', - ({ target }) => { - if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target); - }, -); +on('change', '#form_admin_settings_registrations_mode', ({ target }) => { + if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target); +}); async function mountReactComponent(element: Element) { const componentName = element.getAttribute('data-admin-component'); @@ -305,7 +293,7 @@ ready(() => { if (registrationMode) onChangeRegistrationMode(registrationMode); const checkAllElement = document.querySelector( - 'input#batch_checkbox_all', + '#batch_checkbox_all', ); if (checkAllElement) { const allCheckboxes = Array.from( @@ -318,7 +306,7 @@ ready(() => { } document - .querySelector('a#add-instance-button') + .querySelector('a#add-instance-button') ?.addEventListener('click', (e) => { const domain = document.querySelector( 'input[type="text"]#by_domain', @@ -342,7 +330,7 @@ ready(() => { } }); - Rails.delegate(document, 'form', 'submit', ({ target }) => { + on('submit', 'form', ({ target }) => { if (target instanceof HTMLFormElement) target .querySelectorAll('input[type="datetime-local"]') diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index dd1956446d..6e88eb8778 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -4,8 +4,8 @@ import { IntlMessageFormat } from 'intl-messageformat'; import type { MessageDescriptor, PrimitiveType } from 'react-intl'; import { defineMessages } from 'react-intl'; -import Rails from '@rails/ujs'; import axios from 'axios'; +import { on } from 'delegated-events'; import { throttle } from 'lodash'; import { timeAgoString } from '../mastodon/components/relative_timestamp'; @@ -175,10 +175,9 @@ function loaded() { }); } - Rails.delegate( - document, - 'input#user_account_attributes_username', + on( 'input', + 'input#user_account_attributes_username', throttle( ({ target }) => { if (!(target instanceof HTMLInputElement)) return; @@ -202,60 +201,47 @@ function loaded() { ), ); - Rails.delegate( - document, - '#user_password,#user_password_confirmation', - 'input', - () => { - const password = document.querySelector( - 'input#user_password', - ); - const confirmation = document.querySelector( - 'input#user_password_confirmation', - ); - if (!confirmation || !password) return; + on('input', '#user_password,#user_password_confirmation', () => { + const password = document.querySelector( + 'input#user_password', + ); + const confirmation = document.querySelector( + 'input#user_password_confirmation', + ); + if (!confirmation || !password) return; - if ( - confirmation.value && - confirmation.value.length > password.maxLength - ) { - confirmation.setCustomValidity( - formatMessage(messages.passwordExceedsLength), - ); - } else if (password.value && password.value !== confirmation.value) { - confirmation.setCustomValidity( - formatMessage(messages.passwordDoesNotMatch), - ); - } else { - confirmation.setCustomValidity(''); - } - }, - ); + if (confirmation.value && confirmation.value.length > password.maxLength) { + confirmation.setCustomValidity( + formatMessage(messages.passwordExceedsLength), + ); + } else if (password.value && password.value !== confirmation.value) { + confirmation.setCustomValidity( + formatMessage(messages.passwordDoesNotMatch), + ); + } else { + confirmation.setCustomValidity(''); + } + }); } -Rails.delegate( - document, - '#edit_profile input[type=file]', - 'change', - ({ target }) => { - if (!(target instanceof HTMLInputElement)) return; +on('change', '#edit_profile input[type=file]', ({ target }) => { + if (!(target instanceof HTMLInputElement)) return; - const avatar = document.querySelector( - `img#${target.id}-preview`, - ); + const avatar = document.querySelector( + `img#${target.id}-preview`, + ); - if (!avatar) return; + if (!avatar) return; - let file: File | undefined; - if (target.files) file = target.files[0]; + let file: File | undefined; + if (target.files) file = target.files[0]; - const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; + const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; - if (url) avatar.src = url; - }, -); + if (url) avatar.src = url; +}); -Rails.delegate(document, '.input-copy input', 'click', ({ target }) => { +on('click', '.input-copy input', ({ target }) => { if (!(target instanceof HTMLInputElement)) return; target.focus(); @@ -263,7 +249,7 @@ Rails.delegate(document, '.input-copy input', 'click', ({ target }) => { target.setSelectionRange(0, target.value.length); }); -Rails.delegate(document, '.input-copy button', 'click', ({ target }) => { +on('click', '.input-copy button', ({ target }) => { if (!(target instanceof HTMLButtonElement)) return; const input = target.parentNode?.querySelector( @@ -312,22 +298,22 @@ const toggleSidebar = () => { sidebar.classList.toggle('visible'); }; -Rails.delegate(document, '.sidebar__toggle__icon', 'click', () => { +on('click', '.sidebar__toggle__icon', () => { toggleSidebar(); }); -Rails.delegate(document, '.sidebar__toggle__icon', 'keydown', (e) => { +on('keydown', '.sidebar__toggle__icon', (e) => { if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); toggleSidebar(); } }); -Rails.delegate(document, 'img.custom-emoji', 'mouseover', ({ target }) => { +on('mouseover', 'img.custom-emoji', ({ target }) => { if (target instanceof HTMLImageElement && target.dataset.original) target.src = target.dataset.original; }); -Rails.delegate(document, 'img.custom-emoji', 'mouseout', ({ target }) => { +on('mouseout', 'img.custom-emoji', ({ target }) => { if (target instanceof HTMLImageElement && target.dataset.static) target.src = target.dataset.static; }); @@ -376,22 +362,17 @@ const setInputHint = ( } }; -Rails.delegate( - document, - '#account_statuses_cleanup_policy_enabled', - 'change', - ({ target }) => { - if (!(target instanceof HTMLInputElement) || !target.form) return; +on('change', '#account_statuses_cleanup_policy_enabled', ({ target }) => { + if (!(target instanceof HTMLInputElement) || !target.form) return; - target.form - .querySelectorAll< - HTMLInputElement | HTMLSelectElement - >('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select') - .forEach((input) => { - setInputDisabled(input, !target.checked); - }); - }, -); + target.form + .querySelectorAll< + HTMLInputElement | HTMLSelectElement + >('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select') + .forEach((input) => { + setInputDisabled(input, !target.checked); + }); +}); const updateDefaultQuotePrivacyFromPrivacy = ( privacySelect: EventTarget | null, @@ -414,18 +395,13 @@ const updateDefaultQuotePrivacyFromPrivacy = ( } }; -Rails.delegate( - document, - '#user_settings_attributes_default_privacy', - 'change', - ({ target }) => { - updateDefaultQuotePrivacyFromPrivacy(target); - }, -); +on('change', '#user_settings_attributes_default_privacy', ({ target }) => { + updateDefaultQuotePrivacyFromPrivacy(target); +}); // Empty the honeypot fields in JS in case something like an extension // automatically filled them. -Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { +on('submit', '#registration_new_user,#new_user', () => { [ 'user_website', 'user_confirm_password', @@ -439,7 +415,7 @@ Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { }); }); -Rails.delegate(document, '.rules-list button', 'click', ({ target }) => { +on('click', '.rules-list button', ({ target }) => { if (!(target instanceof HTMLElement)) { return; } diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index dd3e7b530d..f4a3699734 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -675,8 +675,8 @@ export function selectComposeSuggestion(position, token, suggestion, path) { dispatch(useEmoji(suggestion)); } else if (suggestion.type === 'hashtag') { - completion = suggestion.name.slice(token.length - 1); - startPosition = position + token.length; + completion = token + suggestion.name.slice(token.length - 1); + startPosition = position - 1; } else if (suggestion.type === 'account') { completion = `@${getState().getIn(['accounts', suggestion.id, 'acct'])}`; startPosition = position - 1; diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js index 12c02dd4df..075dc84ef1 100644 --- a/app/javascript/mastodon/actions/importer/normalizer.js +++ b/app/javascript/mastodon/actions/importer/normalizer.js @@ -112,7 +112,7 @@ export function normalizeStatus(status, normalOldStatus, { bogusQuotePolicy = fa } if (normalOldStatus) { - normalStatus.quote_approval ||= normalOldStatus.quote_approval; + normalStatus.quote_approval ||= normalOldStatus.get('quote_approval'); const list = normalOldStatus.get('media_attachments'); if (normalStatus.media_attachments && list) { diff --git a/app/javascript/mastodon/components/autosuggest_textarea.jsx b/app/javascript/mastodon/components/autosuggest_textarea.jsx index 137bad9b7e..a9acc87252 100644 --- a/app/javascript/mastodon/components/autosuggest_textarea.jsx +++ b/app/javascript/mastodon/components/autosuggest_textarea.jsx @@ -50,6 +50,7 @@ const AutosuggestTextarea = forwardRef(({ onKeyUp, onKeyDown, onPaste, + onDrop, onFocus, autoFocus = true, lang, @@ -153,6 +154,12 @@ const AutosuggestTextarea = forwardRef(({ onPaste(e); }, [onPaste]); + const handleDrop = useCallback((e) => { + if (onDrop) { + onDrop(e); + } + }, [onDrop]); + // Show the suggestions again whenever they change and the textarea is focused useEffect(() => { if (suggestions.size > 0 && textareaRef.current === document.activeElement) { @@ -204,6 +211,7 @@ const AutosuggestTextarea = forwardRef(({ onFocus={handleFocus} onBlur={handleBlur} onPaste={handlePaste} + onDrop={handleDrop} dir='auto' aria-autocomplete='list' aria-label={placeholder} @@ -235,6 +243,7 @@ AutosuggestTextarea.propTypes = { onKeyUp: PropTypes.func, onKeyDown: PropTypes.func, onPaste: PropTypes.func.isRequired, + onDrop: PropTypes.func, onFocus:PropTypes.func, autoFocus: PropTypes.bool, lang: PropTypes.string, diff --git a/app/javascript/mastodon/components/status/handled_link.tsx b/app/javascript/mastodon/components/status/handled_link.tsx index be816e9853..43763d9c32 100644 --- a/app/javascript/mastodon/components/status/handled_link.tsx +++ b/app/javascript/mastodon/components/status/handled_link.tsx @@ -27,12 +27,14 @@ export const HandledLink: FC> = ({ }) => { // Handle hashtags if ( - text.startsWith('#') || - prevText?.endsWith('#') || - text.startsWith('#') || - prevText?.endsWith('#') + (text.startsWith('#') || + prevText?.endsWith('#') || + text.startsWith('#') || + prevText?.endsWith('#')) && + !text.includes('%') ) { const hashtag = text.slice(1).trim(); + return ( > = ({ return ( { if (e.key.toLowerCase() === 'enter' && (e.ctrlKey || e.metaKey)) { this.handleSubmit(); + e.preventDefault(); } this.blurOnEscape(e); }; @@ -248,7 +250,7 @@ class ComposeForm extends ImmutablePureComponent { }; render () { - const { intl, onPaste, autoFocus, withoutNavigation, maxChars, isSubmitting } = this.props; + const { intl, onPaste, onDrop, autoFocus, withoutNavigation, maxChars, isSubmitting } = this.props; const { highlighted } = this.state; return ( @@ -304,6 +306,7 @@ class ComposeForm extends ImmutablePureComponent { onSuggestionsClearRequested={this.onSuggestionsClearRequested} onSuggestionSelected={this.onSuggestionSelected} onPaste={onPaste} + onDrop={onDrop} autoFocus={autoFocus} lang={this.props.lang} className='compose-form__input' 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 15b1c7cc41..e64a5904ac 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -18,6 +18,23 @@ import ComposeForm from '../components/compose_form'; const urlLikeRegex = /^https?:\/\/[^\s]+\/[^\s]+$/i; +const processPasteOrDrop = (transfer, e, dispatch) => { + if (transfer && transfer.files.length === 1) { + dispatch(uploadCompose(transfer.files)); + e.preventDefault(); + } else if (transfer && transfer.files.length === 0) { + const data = transfer.getData('text/plain'); + if (!data.match(urlLikeRegex)) return; + + try { + const url = new URL(data); + dispatch(pasteLinkCompose({ url })); + } catch { + return; + } + } +}; + const mapStateToProps = state => ({ text: state.getIn(['compose', 'text']), suggestions: state.getIn(['compose', 'suggestions']), @@ -85,20 +102,11 @@ const mapDispatchToProps = (dispatch, props) => ({ }, onPaste (e) { - if (e.clipboardData && e.clipboardData.files.length === 1) { - dispatch(uploadCompose(e.clipboardData.files)); - e.preventDefault(); - } else if (e.clipboardData && e.clipboardData.files.length === 0) { - const data = e.clipboardData.getData('text/plain'); - if (!data.match(urlLikeRegex)) return; + processPasteOrDrop(e.clipboardData, e, dispatch); + }, - try { - const url = new URL(data); - dispatch(pasteLinkCompose({ url })); - } catch { - return; - } - } + onDrop (e) { + processPasteOrDrop(e.dataTransfer, e, dispatch); }, onPickEmoji (position, data, needsSpace) { diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 4a0bbb9fba..636c6f34dd 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -157,6 +157,8 @@ "bundle_modal_error.close": "Tanca", "bundle_modal_error.message": "S'ha produït un error en carregar aquesta pantalla.", "bundle_modal_error.retry": "Torna-ho a provar", + "carousel.current": "Diapositiva {current, number} / {max, number}", + "carousel.slide": "Diapositiva {current, number} de {max, number}", "closed_registrations.other_server_instructions": "Com que Mastodon és descentralitzat, pots crear un compte en un altre servidor i continuar interactuant amb aquest.", "closed_registrations_modal.description": "No es pot crear un compte a {domain} ara mateix, però tingues en compte que no necessites específicament un compte a {domain} per a usar Mastodon.", "closed_registrations_modal.find_another_server": "Troba un altre servidor", @@ -173,6 +175,8 @@ "column.edit_list": "Edita la llista", "column.favourites": "Favorits", "column.firehose": "Tuts en directe", + "column.firehose_local": "Canal en directe per a aquest servidor", + "column.firehose_singular": "Canal en directe", "column.follow_requests": "Peticions de seguir-te", "column.home": "Inici", "column.list_members": "Gestiona els membres de la llista", @@ -245,8 +249,13 @@ "confirmations.missing_alt_text.secondary": "Publica-la igualment", "confirmations.missing_alt_text.title": "Hi voleu afegir text alternatiu?", "confirmations.mute.confirm": "Silencia", + "confirmations.private_quote_notify.cancel": "Torna a l'edició", + "confirmations.private_quote_notify.message": "La persona que citeu i altres mencionades rebran una notificació i podran veure la vostra publicació, encara que no us segueixen.", + "confirmations.private_quote_notify.title": "Voleu compartir amb seguidors i usuaris mencionats?", "confirmations.quiet_post_quote_info.dismiss": "No m'ho tornis a recordar", "confirmations.quiet_post_quote_info.got_it": "Entesos", + "confirmations.quiet_post_quote_info.message": "Quan citeu una publicació pública en mode silenciós, la vostra publicació s'amagarà de les línies de temps de tendències.", + "confirmations.quiet_post_quote_info.title": "Citació d'una publicació pública en mode silenciós", "confirmations.redraft.confirm": "Esborra i reescriu", "confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.", "confirmations.redraft.title": "Esborrar i reescriure la publicació?", @@ -332,6 +341,7 @@ "empty_column.bookmarked_statuses": "Encara no has marcat cap tut. Quan en marquis un, apareixerà aquí.", "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!", "empty_column.direct": "Encara no tens mencions privades. Quan n'enviïs o en rebis una, et sortirà aquí.", + "empty_column.disabled_feed": "Aquest canal ha estat desactivat per l'administració del vostre servidor.", "empty_column.domain_blocks": "Encara no hi ha dominis blocats.", "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!", "empty_column.favourited_statuses": "Encara no has afavorit cap tut. Quan ho facis, apareixerà aquí.", @@ -357,6 +367,7 @@ "explore.trending_statuses": "Tuts", "explore.trending_tags": "Etiquetes", "featured_carousel.header": "{count, plural, one {Publicació fixada} other {Publicacions fixades}}", + "featured_carousel.slide": "Publicació {current, number} de {max, number}", "filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquest tut. Si també vols que el tut es filtri en aquest context, hauràs d'editar el filtre.", "filter_modal.added.context_mismatch_title": "El context no coincideix!", "filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.", @@ -456,6 +467,7 @@ "ignore_notifications_modal.not_following_title": "Voleu ignorar les notificacions de qui no seguiu?", "ignore_notifications_modal.private_mentions_title": "Voleu ignorar les notificacions de mencions privades no sol·licitades?", "info_button.label": "Ajuda", + "info_button.what_is_alt_text": "

Què és el text alternatiu?

El text alternatiu proporciona descripcions d'imatges per a persones amb discapacitat visual, connexions de poca amplada de banda o aquelles que busquen un context addicional.

Podeu millorar l'accessibilitat i la comprensió per a tothom escrivint un text alternatiu clar, concís i objectiu.

  • Descriviu els elements importants
  • Utilitzeu frases senzilles
  • Resumiu el text en imatges
  • Eviteu la informació redundant
  • Centreu-vos en les tendències i els aspectes clau dels elements visuals complexos (com ara diagrames o mapes)
", "interaction_modal.action": "Per a interactuar amb la publicació de {name} cal que inicieu la sessió en el servidor que feu servir.", "interaction_modal.go": "Endavant", "interaction_modal.no_account_yet": "Encara no teniu cap compte?", @@ -1000,10 +1012,14 @@ "video.volume_down": "Abaixa el volum", "video.volume_up": "Apuja el volum", "visibility_modal.button_title": "Establiu la visibilitat", + "visibility_modal.direct_quote_warning.text": "Si deseu la configuració actual, la cita incrustada es convertirà en un enllaç.", + "visibility_modal.direct_quote_warning.title": "Les cites no es poden incrustar a les mencions privades", "visibility_modal.header": "Visibilitat i interacció", "visibility_modal.helper.direct_quoting": "No es poden citar mencions privades fetes a Mastondon.", + "visibility_modal.helper.privacy_editing": "La visibilitat no es pot canviar després de publicar una publicació.", + "visibility_modal.helper.privacy_private_self_quote": "Les autocites de publicacions privades no es poden fer públiques.", "visibility_modal.helper.private_quoting": "No es poden citar publicacions fetes a Mastodon 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.helper.unlisted_quoting": "Quan la gent us citi, les seves publicacions quedaran amagades de les línies de temps de tendències.", "visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. També podeu aplicar la configuració a totes les publicacions futures navegant a Preferències > Valors per defecte de publicació.", "visibility_modal.privacy_label": "Visibilitat", "visibility_modal.quote_followers": "Només seguidors", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index f97d3c2560..310c3f8ea7 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -110,7 +110,7 @@ "alt_text_modal.cancel": "Abbrechen", "alt_text_modal.change_thumbnail": "Vorschaubild ändern", "alt_text_modal.describe_for_people_with_hearing_impairments": "Beschreibe den Inhalt für Menschen mit Schwerhörigkeit …", - "alt_text_modal.describe_for_people_with_visual_impairments": "Beschreibe den Inhalt für Menschen mit Sehschwäche …", + "alt_text_modal.describe_for_people_with_visual_impairments": "Beschreibe den Inhalt für Menschen, die blind oder sehbehindert sind …", "alt_text_modal.done": "Fertig", "announcement.announcement": "Ankündigung", "annual_report.summary.archetype.booster": "Trendjäger*in", @@ -245,7 +245,7 @@ "confirmations.logout.message": "Möchtest du dich wirklich abmelden?", "confirmations.logout.title": "Abmelden?", "confirmations.missing_alt_text.confirm": "Bildbeschreibung hinzufügen", - "confirmations.missing_alt_text.message": "Dein Beitrag enthält Medien ohne Bildbeschreibung. Mit Alt-Texten erreichst du auch Menschen mit einer Sehschwäche.", + "confirmations.missing_alt_text.message": "Dein Beitrag enthält Medien ohne Bildbeschreibung. Mit ALT-Texten erreichst Du auch Menschen, die blind oder sehbehindert sind.", "confirmations.missing_alt_text.secondary": "Trotzdem veröffentlichen", "confirmations.missing_alt_text.title": "Bildbeschreibung hinzufügen?", "confirmations.mute.confirm": "Stummschalten", @@ -470,7 +470,7 @@ "ignore_notifications_modal.not_following_title": "Benachrichtigungen von Profilen ignorieren, denen du nicht folgst?", "ignore_notifications_modal.private_mentions_title": "Benachrichtigungen von unerwünschten privaten Erwähnungen ignorieren?", "info_button.label": "Hilfe", - "info_button.what_is_alt_text": "

Was ist Alt-Text?

Alt-Text bietet Bildbeschreibungen für Personen mit einer Sehschwäche, einer schlechten Internetverbindung und für alle, die zusätzlichen Kontext möchten.

Du kannst die Zugänglichkeit und die Verständlichkeit für alle verbessern, indem du eine klare, genaue und objektive Bildbeschreibung hinzufügst.

  • Erfasse wichtige Elemente
  • Fasse Text in Bildern zusammen
  • Verwende einen korrekten Satzbau
  • Vermeide unwichtige Informationen
  • Konzentriere dich bei komplexen Darstellungen (z. B. Diagramme oder Karten) auf Trends und wichtige Erkenntnisse
", + "info_button.what_is_alt_text": "

Was ist Alt-Text?

Der Alt-Text bietet Bildbeschreibungen für blinde und sehbehinderte Menschen, aber auch für alle mit einer schlechten Internetverbindung und wer einen zusätzlichen Kontext möchten.

Du kannst die Barrierefreiheit und Verständlichkeit für alle verbessern, indem du eine klare, genaue und objektive Bildbeschreibung erstellst.

  • Erfasse wichtige Elemente
  • Fasse Texte bildlich zusammen
  • Verwende einen korrekten Satzbau
  • Vermeide unwichtige und überflüssige Informationen
  • Konzentriere dich bei komplexen Darstellungen (z. B. bei Diagrammen oder Karten) auf Veränderungen und Schlüsselwörter
", "interaction_modal.action": "Melde dich auf deinem Mastodon-Server an, damit du mit dem Beitrag von {name} interagieren kannst.", "interaction_modal.go": "Los", "interaction_modal.no_account_yet": "Du hast noch kein Konto?", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 2191bb35cb..596ad83af0 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -1029,7 +1029,7 @@ "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. También podés aplicar los ajustes para todos los mensajes futuros accediendo a «Configuración» > «Configuración predeterminada de mensajes».", "visibility_modal.privacy_label": "Visibilidad", - "visibility_modal.quote_followers": "Solo para seguidores", + "visibility_modal.quote_followers": "Solo seguidores", "visibility_modal.quote_label": "Quién puede citar", "visibility_modal.quote_nobody": "Solo yo", "visibility_modal.quote_public": "Cualquier cuenta", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index e4568d7aaf..5cafc8f61b 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -903,6 +903,7 @@ "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}", "status.embed": "Faigh cód leabú", "status.favourite": "Is fearr leat", + "status.favourites_count": "{count, plural,\n one {{counter} cheanán}\n two {{counter} cheanáin}\n few {{counter} ceanáin}\n many {{counter} ceanán}\n other {{counter} ceanáin}\n}", "status.filter": "Déan scagadh ar an bpostáil seo", "status.history.created": "Chruthaigh {name} {date}", "status.history.edited": "Curtha in eagar ag {name} in {date}", @@ -937,12 +938,14 @@ "status.quotes.empty": "Níl an post seo luaite ag aon duine go fóill. Nuair a dhéanann duine é, taispeánfar anseo é.", "status.quotes.local_other_disclaimer": "Ní thaispeánfar sleachta ar dhiúltaigh an t-údar dóibh.", "status.quotes.remote_other_disclaimer": "Níl ráthaíocht ann go dtaispeánfar anseo ach sleachta ó {domain}. Ní thaispeánfar sleachta ar dhiúltaigh an t-údar dóibh.", + "status.quotes_count": "{count, plural,\n one {{counter} athfhriotal}\n two {{counter} athfhriotail}\n few {{counter} athfhriotail}\n many {{counter} athfhriotal}\n other {{counter} athfhriotail}\n}", "status.read_more": "Léan a thuilleadh", "status.reblog": "Treisiú", "status.reblog_or_quote": "Borradh nó luachan", "status.reblog_private": "Roinn arís le do leanúna", "status.reblogged_by": "Mhol {name}", "status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.", + "status.reblogs_count": "{count, plural,\n one {{counter} athfhriotal}\n two {{counter} athfhriotail}\n few {{counter} athfhriotail}\n many {{counter} athfhriotal}\n other {{counter} athfhriotail}\n}", "status.redraft": "Scrios ⁊ athdhréachtaigh", "status.remove_bookmark": "Bain leabharmharc", "status.remove_favourite": "Bain ó cheanáin", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 446dd0e3a4..f8a1c39f6a 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -903,6 +903,7 @@ "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}", "status.embed": "O código a incluír", "status.favourite": "Favorecer", + "status.favourites_count": "{count, plural, one {{counter} favorecemento} other {{counter} favorecementos}}", "status.filter": "Filtrar esta publicación", "status.history.created": "{name} creouno o {date}", "status.history.edited": "{name} editouno o {date}", @@ -937,12 +938,14 @@ "status.quotes.empty": "Aínda ninguén citou esta publicación. Cando alguén o faga aparecerá aquí.", "status.quotes.local_other_disclaimer": "Non se mostrarán as citas rexeitadas pola autora.", "status.quotes.remote_other_disclaimer": "Só se garante que se mostren as citas do dominio {domain}. Non se mostrarán as citas rexeitadas pola persoa autora.", + "status.quotes_count": "{count, plural, one {{counter} cita} other {{counter} citas}}", "status.read_more": "Ler máis", "status.reblog": "Promover", "status.reblog_or_quote": "Promover ou citar", "status.reblog_private": "Volver a compartir coas túas seguidoras", "status.reblogged_by": "{name} promoveu", "status.reblogs.empty": "Aínda ninguén promoveu esta publicación. Cando alguén o faga, amosarase aquí.", + "status.reblogs_count": "{count, plural, one {{counter} promoción} other {{counter} promocións}}", "status.redraft": "Eliminar e reescribir", "status.remove_bookmark": "Eliminar marcador", "status.remove_favourite": "Retirar das favoritas", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index b1d61b8036..fcf7e3134e 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -880,6 +880,7 @@ "status.quote_error.filtered": "あなたのフィルター設定によって非表示になっています", "status.quote_error.pending_approval": "承認待ちの投稿", "status.quote_noun": "引用", + "status.quote_policy_change": "引用できるユーザーの変更", "status.quote_post_author": "{name} の投稿を引用", "status.quote_private": "非公開の投稿は引用できません", "status.quotes.local_other_disclaimer": "投稿者が拒否した引用は表示されません。", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index d9582aeca3..e3552abd2d 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -252,6 +252,7 @@ "confirmations.private_quote_notify.cancel": "편집으로 돌아가기", "confirmations.private_quote_notify.confirm": "게시", "confirmations.private_quote_notify.do_not_show_again": "이 메시지를 다시 표시하지 않음", + "confirmations.private_quote_notify.message": "인용하려는 사람과 멘션된 사람들은 나를 팔로우하지 않더라도 게시물에 대한 알림을 받으며 내용을 볼 수 있습니다.", "confirmations.quiet_post_quote_info.dismiss": "다시 보지 않기", "confirmations.quiet_post_quote_info.got_it": "알겠습니다", "confirmations.quiet_post_quote_info.message": "조용한 공개 게시물을 인용하면 그 게시물은 유행 타임라인에서 나타나지 않을 것입니다.", diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json index e9f490ede5..54297554fd 100644 --- a/app/javascript/mastodon/locales/lv.json +++ b/app/javascript/mastodon/locales/lv.json @@ -639,7 +639,7 @@ "privacy.private.long": "Tikai Tavi sekotāji", "privacy.private.short": "Sekotāji", "privacy.public.long": "Jebkurš Mastodon un ārpus tā", - "privacy.public.short": "Redzams visiem", + "privacy.public.short": "Publisks", "privacy.quote.anyone": "{visibility}, jebkurš var citēt", "privacy.quote.disabled": "{visibility}, aizliegta citēšana", "privacy.quote.limited": "{visibility}, ierobežota citēšana", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 3d00eeb1c1..6251b4c719 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -4,7 +4,7 @@ "about.default_locale": "Padrão", "about.disclaimer": "Mastodon é um software de código aberto e livre, e uma marca registrada de Mastodon gGmbH.", "about.domain_blocks.no_reason_available": "Razão não disponível", - "about.domain_blocks.preamble": "O Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor em específico.", + "about.domain_blocks.preamble": "O \"Mastodon\" geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no \"fediverso\". Estas são as exceções deste servidor em específico.", "about.domain_blocks.silenced.explanation": "Você geralmente não verá perfis e conteúdo deste servidor, a menos que você o procure explicitamente ou opte por seguir.", "about.domain_blocks.silenced.title": "Limitado", "about.domain_blocks.suspended.explanation": "Nenhum dado desse servidor será processado, armazenado ou trocado, impossibilitando qualquer interação ou comunicação com os usuários deste servidor.", @@ -36,7 +36,7 @@ "account.familiar_followers_two": "Seguido por {name1} e {name2}", "account.featured": "Em destaque", "account.featured.accounts": "Perfis", - "account.featured.hashtags": "Hashtags", + "account.featured.hashtags": "\"Hashtags\"", "account.featured_tags.last_status_at": "Última publicação em {date}", "account.featured_tags.last_status_never": "Sem publicações", "account.follow": "Seguir", @@ -49,7 +49,7 @@ "account.followers": "Seguidores", "account.followers.empty": "Nada aqui.", "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", - "account.followers_you_know_counter": "{counter} que você sabe", + "account.followers_you_know_counter": "{counter} que você conhece", "account.following": "Seguindo", "account.following_counter": "{count, plural, one {{counter} seguindo} other {{counter} seguindo}}", "account.follows.empty": "Nada aqui.", @@ -903,6 +903,7 @@ "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}", "status.embed": "Obter código de incorporação", "status.favourite": "Favorita", + "status.favourites_count": "{count, plural, one {{counter} favorito} other {{counter} favoritos}}", "status.filter": "Filtrar esta publicação", "status.history.created": "{name} criou {date}", "status.history.edited": "{name} editou {date}", @@ -937,12 +938,14 @@ "status.quotes.empty": "Ninguém citou essa publicação até agora. Quando alguém citar aparecerá aqui.", "status.quotes.local_other_disclaimer": "Citações rejeitadas pelo autor não serão exibidas.", "status.quotes.remote_other_disclaimer": "Apenas citações do {domain} têm a garantia de serem exibidas aqui. Citações rejeitadas pelo autor não serão exibidas.", + "status.quotes_count": "{count, plural, one {{counter} mencionar} other {{counter} menções}}", "status.read_more": "Ler mais", "status.reblog": "Dar boost", "status.reblog_or_quote": "Acelerar ou citar", "status.reblog_private": "Compartilhar novamente com seus seguidores", "status.reblogged_by": "{name} deu boost", "status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.", + "status.reblogs_count": "{count, plural, one {{counter} impulsionar} other {{counter} impulsionados}}", "status.redraft": "Excluir e rascunhar", "status.remove_bookmark": "Remover do Salvos", "status.remove_favourite": "Remover dos favoritos", diff --git a/app/models/user.rb b/app/models/user.rb index 13e902a06d..1db8b40697 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -131,11 +131,12 @@ class User < ApplicationRecord delegate :can?, to: :role - attr_reader :invite_code, :date_of_birth + attr_reader :invite_code attr_writer :current_account attribute :external, :boolean, default: false attribute :bypass_registration_checks, :boolean, default: false + attribute :date_of_birth, :date def self.those_who_can(*any_of_privileges) matching_role_ids = UserRole.that_can(*any_of_privileges).map(&:id) @@ -151,17 +152,6 @@ class User < ApplicationRecord Rails.env.local? end - def date_of_birth=(hash_or_string) - @date_of_birth = begin - if hash_or_string.is_a?(Hash) - day, month, year = hash_or_string.values_at(1, 2, 3) - "#{day}.#{month}.#{year}" - else - hash_or_string - end - end - end - def role if role_id.nil? UserRole.everyone diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index 7e1c763225..86d96d848b 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -819,6 +819,8 @@ fr-CA: preamble: Fournissez des informations détaillées sur le fonctionnement, la modération et le financement du serveur. rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer. title: À propos + allow_referrer_origin: + title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic appearance: preamble: Personnaliser l'interface web de Mastodon. title: Apparence @@ -857,7 +859,7 @@ fr-CA: local_feed: Fil local trends: Tendances registrations: - moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! + moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde ! preamble: Affecte qui peut créer un compte sur votre serveur. title: Inscriptions registrations_mode: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 4ed4367365..64105f80c4 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -819,6 +819,8 @@ fr: preamble: Fournissez des informations détaillées sur le fonctionnement, la modération et le financement du serveur. rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer. title: À propos + allow_referrer_origin: + title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic appearance: preamble: Personnaliser l'interface web de Mastodon. title: Apparence @@ -857,7 +859,7 @@ fr: local_feed: Fil local trends: Tendances registrations: - moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde! + moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde ! preamble: Affecte qui peut créer un compte sur votre serveur. title: Inscriptions registrations_mode: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 5c19c10c62..c146ad9439 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -222,7 +222,7 @@ ru: enable_user: Разморозка пользователей memorialize_account: Присвоение пользователям статуса «мемориала» promote_user: Повышение пользователей - publish_terms_of_service: Опубликование пользовательского соглашения + publish_terms_of_service: Публикация пользовательского соглашения reject_appeal: Отклонение обжалований reject_user: Отклонение регистраций remove_avatar_user: Удаление аватаров @@ -1016,9 +1016,9 @@ ru: draft: Черновик generate: Использовать шаблон generates: - action: Генерировать + action: Сгенерировать chance_to_review_html: "Сгенерированное пользовательское соглашение не будет опубликовано автоматически. У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить." - explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях, и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов. + explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов. title: Создание пользовательского соглашения going_live_on_html: Вступило в силу с %{date} history: История @@ -1028,8 +1028,8 @@ ru: notified_on_html: 'Дата уведомления пользователей: %{date}' notify_users: Уведомить пользователей preview: - explanation_html: 'Сообщение будет отравлено %{display_count} пользователям, которые зарегистрировались до %{date}. В теле письма будет указан следующий текст:' - send_preview: Отправить предпросмотр на %{email} + explanation_html: 'Сообщение будет отравлено %{display_count} пользователям, которые зарегистрировались до %{date}. Письмо будет содержать следующий текст:' + send_preview: Отправить тестовое уведомление на %{email} send_to_all: few: Отправить %{display_count} сообщения many: Отправить %{display_count} сообщений @@ -2031,7 +2031,7 @@ ru: terms_of_service_interstitial: past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением. review_link: Посмотреть пользовательское соглашение - title: Изменяется пользовательское соглашение %{domain} + title: Изменяется пользовательское соглашение на сервере %{domain} themes: contrast: Mastodon (высококонтрастная) default: Mastodon (тёмная) @@ -2098,12 +2098,12 @@ ru: title: Выполнен вход terms_of_service_changed: agreement: Продолжая использовать %{domain}, вы соглашаетесь с этими условиями. Если вы не согласны с новыми условиями, вы в любой момент можете удалить вашу учётную запись на %{domain}. - changelog: 'Вот что обновление условий будет значит для вас в общих чертах:' - description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:' - description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с
обновлёнными условиями. + changelog: 'Вот что обновление условий будет значить для вас в общих чертах:' + description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение сервера %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:' + description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение сервера %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями. sign_off: Ваш %{domain} - subject: Обновления наших условий использования - subtitle: На %{domain} изменилось пользовательское соглашение + subject: Мы обновляем наше пользовательское соглашение + subtitle: Изменяется пользовательское соглашение на сервере %{domain} title: Важное обновление warning: appeal: Обжаловать diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 79d5f033f1..27d16dcff6 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -347,9 +347,7 @@ ar: jurisdiction: الاختصاص القانوني min_age: الحد الإدنى للعمر user: - date_of_birth_1i: يوم date_of_birth_2i: شهر - date_of_birth_3i: سنة role: الدور time_zone: النطاق الزمني user_role: diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml index eac024fa70..b636e44bbd 100644 --- a/config/locales/simple_form.be.yml +++ b/config/locales/simple_form.be.yml @@ -374,9 +374,7 @@ be: jurisdiction: Юрысдыкцыя min_age: Мінімальны ўзрост user: - date_of_birth_1i: Дзень date_of_birth_2i: Месяц - date_of_birth_3i: Год role: Роля time_zone: Часавы пояс user_role: diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 2306109b6b..723164f363 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -354,9 +354,7 @@ bg: jurisdiction: Законова юрисдикция min_age: Минимална възраст user: - date_of_birth_1i: Ден date_of_birth_2i: Месец - date_of_birth_3i: Година role: Роля time_zone: Часова зона user_role: diff --git a/config/locales/simple_form.br.yml b/config/locales/simple_form.br.yml index 87065f9a0b..6be3f3d178 100644 --- a/config/locales/simple_form.br.yml +++ b/config/locales/simple_form.br.yml @@ -109,9 +109,7 @@ br: domain: Domani jurisdiction: Barnadurezh user: - date_of_birth_1i: Devezh date_of_birth_2i: Mizvezh - date_of_birth_3i: Bloavezh role: Roll time_zone: Gwerzhid eur user_role: diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 776465c62c..d1daf27e55 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -353,9 +353,7 @@ ca: jurisdiction: Jurisdicció min_age: Edat mínima user: - date_of_birth_1i: Dia date_of_birth_2i: Mes - date_of_birth_3i: Any role: Rol time_zone: Zona horària user_role: diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index 8570d6ea02..b4f8ba94f7 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -374,9 +374,7 @@ cs: jurisdiction: Právní příslušnost min_age: Věková hranice user: - date_of_birth_1i: Den date_of_birth_2i: Měsíc - date_of_birth_3i: Rok role: Role time_zone: Časové pásmo user_role: diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index f53e4f16ca..9d1abbf0a6 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -376,9 +376,7 @@ cy: jurisdiction: Awdurdodaeth gyfreithiol min_age: Isafswm oedran user: - date_of_birth_1i: Dydd date_of_birth_2i: Mis - date_of_birth_3i: Blwyddyn role: Rôl time_zone: Cylchfa amser user_role: diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index c4b539010b..8f72a69fd7 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -372,9 +372,7 @@ da: jurisdiction: Juridisk jurisdiktion min_age: Minimumsalder user: - date_of_birth_1i: Dag date_of_birth_2i: Måned - date_of_birth_3i: År role: Rolle time_zone: Tidszone user_role: diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index c3539839ad..f6e64a4985 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -372,9 +372,7 @@ de: jurisdiction: Gerichtsstand min_age: Mindestalter user: - date_of_birth_1i: Tag date_of_birth_2i: Monat - date_of_birth_3i: Jahr role: Rolle time_zone: Zeitzone user_role: diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index a4c600ede2..3e55f2f4e0 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -372,9 +372,7 @@ el: jurisdiction: Νομική δικαιοδοσία min_age: Ελάχιστη ηλικία user: - date_of_birth_1i: Ημέρα date_of_birth_2i: Μήνας - date_of_birth_3i: Έτος role: Ρόλος time_zone: Ζώνη ώρας user_role: diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml index 7ab3d887e7..cb2c485f77 100644 --- a/config/locales/simple_form.en-GB.yml +++ b/config/locales/simple_form.en-GB.yml @@ -346,9 +346,7 @@ en-GB: jurisdiction: Legal jurisdiction min_age: Minimum age user: - date_of_birth_1i: Day date_of_birth_2i: Month - date_of_birth_3i: Year role: Role time_zone: Time Zone user_role: diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 43d8e55567..077f53cbcd 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -372,9 +372,9 @@ en: jurisdiction: Legal jurisdiction min_age: Minimum age user: - date_of_birth_1i: Day + date_of_birth_1i: Year date_of_birth_2i: Month - date_of_birth_3i: Year + date_of_birth_3i: Day role: Role time_zone: Time zone user_role: diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index f2973d7bb3..b91acce3a5 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -353,9 +353,7 @@ eo: jurisdiction: Laŭleĝa jurisdikcio min_age: Minimuma aĝo user: - date_of_birth_1i: Tago date_of_birth_2i: Monato - date_of_birth_3i: Jaro role: Rolo time_zone: Horzono user_role: diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml index eb277888af..fdaef9653b 100644 --- a/config/locales/simple_form.es-AR.yml +++ b/config/locales/simple_form.es-AR.yml @@ -372,9 +372,7 @@ es-AR: jurisdiction: Jurisdicción legal min_age: Edad mínima user: - date_of_birth_1i: Día date_of_birth_2i: Mes - date_of_birth_3i: Año role: Rol time_zone: Zona horaria user_role: diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 551192480a..fc900f040b 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -372,9 +372,7 @@ es-MX: jurisdiction: Jurisdicción legal min_age: Edad mínima user: - date_of_birth_1i: Día date_of_birth_2i: Mes - date_of_birth_3i: Año role: Rol time_zone: Zona horaria user_role: diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 0dfd10f407..c84431530f 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -372,9 +372,7 @@ es: jurisdiction: Jurisdicción legal min_age: Edad mínima user: - date_of_birth_1i: Día date_of_birth_2i: Mes - date_of_birth_3i: Año role: Rol time_zone: Zona horaria user_role: diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml index 9cf4a9ad48..785c9ec6b2 100644 --- a/config/locales/simple_form.et.yml +++ b/config/locales/simple_form.et.yml @@ -372,9 +372,7 @@ et: jurisdiction: Jurisdiktsioon min_age: Vanuse alampiir user: - date_of_birth_1i: Päev date_of_birth_2i: Kuu - date_of_birth_3i: Aasta role: Roll time_zone: Ajavöönd user_role: diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 3a0a8b6741..26888fd24f 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -325,9 +325,7 @@ eu: terms_of_service_generator: domain: Domeinua user: - date_of_birth_1i: Eguna date_of_birth_2i: Hilabetea - date_of_birth_3i: Urtea role: Rola time_zone: Ordu zona user_role: diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 3a32b9e40e..20afb20fae 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -372,9 +372,7 @@ fa: jurisdiction: صلاحیت قانونی min_age: کمینهٔ زمان user: - date_of_birth_1i: روز date_of_birth_2i: ماه - date_of_birth_3i: سال role: نقش time_zone: منطقهٔ زمانی user_role: diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index 99c1b79bbe..16bb25fbe6 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -372,9 +372,7 @@ fi: jurisdiction: Lainkäyttöalue min_age: Vähimmäisikä user: - date_of_birth_1i: Päivä date_of_birth_2i: Kuukausi - date_of_birth_3i: Vuosi role: Rooli time_zone: Aikavyöhyke user_role: diff --git a/config/locales/simple_form.fo.yml b/config/locales/simple_form.fo.yml index de563ec527..1a569b9e8b 100644 --- a/config/locales/simple_form.fo.yml +++ b/config/locales/simple_form.fo.yml @@ -372,9 +372,7 @@ fo: jurisdiction: Løgdømi min_age: Lægsti aldur user: - date_of_birth_1i: Dagur date_of_birth_2i: Mánaði - date_of_birth_3i: Ár role: Leiklutur time_zone: Tíðarsona user_role: diff --git a/config/locales/simple_form.fr-CA.yml b/config/locales/simple_form.fr-CA.yml index e064ceeed1..9bac4b88f2 100644 --- a/config/locales/simple_form.fr-CA.yml +++ b/config/locales/simple_form.fr-CA.yml @@ -152,6 +152,8 @@ fr-CA: name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge permissions_as_keys: Les utilisateur·rice·s ayant ce rôle auront accès à … position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Mais certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure + username_block: + comparison: Veuillez garder à l'esprit le problème de Scunthorpe lors du blocage des correspondances partielles webhook: events: Sélectionnez les événements à envoyer template: Écrivez votre propre bloc JSON avec la possibilité d’utiliser de l’interpolation de variables. Laissez vide pour le bloc JSON par défaut. @@ -353,9 +355,7 @@ fr-CA: jurisdiction: Juridiction min_age: Âge minimum user: - date_of_birth_1i: Jour date_of_birth_2i: Mois - date_of_birth_3i: Année role: Rôle time_zone: Fuseau horaire user_role: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index dda65ff288..68a1218f15 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -152,6 +152,8 @@ fr: name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge permissions_as_keys: Les utilisateur·rice·s ayant ce rôle auront accès à … position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Mais certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure + username_block: + comparison: Veuillez garder à l'esprit le problème de Scunthorpe lors du blocage des correspondances partielles webhook: events: Sélectionnez les événements à envoyer template: Écrivez votre propre bloc JSON avec la possibilité d’utiliser de l’interpolation de variables. Laissez vider pour utiliser le bloc JSON par défaut. @@ -353,9 +355,7 @@ fr: jurisdiction: Juridiction min_age: Âge minimum user: - date_of_birth_1i: Jour date_of_birth_2i: Mois - date_of_birth_3i: Année role: Rôle time_zone: Fuseau horaire user_role: diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml index 6507b94ab8..7b88eee24f 100644 --- a/config/locales/simple_form.fy.yml +++ b/config/locales/simple_form.fy.yml @@ -349,9 +349,7 @@ fy: jurisdiction: Rjochtsgebiet min_age: Minimum leeftiid user: - date_of_birth_1i: Dei date_of_birth_2i: Moanne - date_of_birth_3i: Jier role: Rol time_zone: Tiidsône user_role: diff --git a/config/locales/simple_form.ga.yml b/config/locales/simple_form.ga.yml index d5e70f0892..bb09eb229a 100644 --- a/config/locales/simple_form.ga.yml +++ b/config/locales/simple_form.ga.yml @@ -375,9 +375,7 @@ ga: jurisdiction: Dlínse dhlíthiúil min_age: Aois íosta user: - date_of_birth_1i: Lá date_of_birth_2i: Mí - date_of_birth_3i: Bliain role: Ról time_zone: Crios ama user_role: diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml index 54d1be91b7..e11b300b33 100644 --- a/config/locales/simple_form.gd.yml +++ b/config/locales/simple_form.gd.yml @@ -373,9 +373,7 @@ gd: jurisdiction: Uachdranas laghail min_age: An aois as lugha user: - date_of_birth_1i: Latha date_of_birth_2i: Mìos - date_of_birth_3i: Bliadhna role: Dreuchd time_zone: Roinn-tìde user_role: diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index dac629a90c..d0a10f3ebd 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -372,9 +372,7 @@ gl: jurisdiction: Xurisdición legal min_age: Idade mínima user: - date_of_birth_1i: Día date_of_birth_2i: Mes - date_of_birth_3i: Ano role: Rol time_zone: Fuso horario user_role: diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index 492d27bea0..57fdebd25c 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -374,9 +374,7 @@ he: jurisdiction: איזור השיפוט min_age: גיל מינימלי user: - date_of_birth_1i: יום date_of_birth_2i: חודש - date_of_birth_3i: שנה role: תפקיד time_zone: אזור זמן user_role: diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index 64729dca73..6468298c72 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -371,9 +371,7 @@ hu: jurisdiction: Joghatóság min_age: Minimális életkor user: - date_of_birth_1i: Nap date_of_birth_2i: Hónap - date_of_birth_3i: Év role: Szerep time_zone: Időzóna user_role: diff --git a/config/locales/simple_form.ia.yml b/config/locales/simple_form.ia.yml index b8231e2e14..39992a569e 100644 --- a/config/locales/simple_form.ia.yml +++ b/config/locales/simple_form.ia.yml @@ -370,9 +370,7 @@ ia: jurisdiction: Jurisdiction min_age: Etate minime user: - date_of_birth_1i: Die date_of_birth_2i: Mense - date_of_birth_3i: Anno role: Rolo time_zone: Fuso horari user_role: diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml index 9795077ca1..bcd9f0f32d 100644 --- a/config/locales/simple_form.is.yml +++ b/config/locales/simple_form.is.yml @@ -372,9 +372,7 @@ is: jurisdiction: Lögsagnarumdæmi min_age: Lágmarksaldur user: - date_of_birth_1i: Dagur date_of_birth_2i: Mánuður - date_of_birth_3i: Ár role: Hlutverk time_zone: Tímabelti user_role: diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 8ce108ba96..ecb4e23965 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -372,9 +372,7 @@ it: jurisdiction: Giurisdizione legale min_age: Età minima user: - date_of_birth_1i: Giorno date_of_birth_2i: Mese - date_of_birth_3i: Anno role: Ruolo time_zone: Fuso orario user_role: diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 3dc3906997..9025e16b18 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -348,9 +348,7 @@ ja: jurisdiction: 裁判管轄 min_age: 登録可能な最低年齢 user: - date_of_birth_1i: 日 date_of_birth_2i: 月 - date_of_birth_3i: 年 role: ロール time_zone: タイムゾーン user_role: diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml index 6f3acf712b..cf66a05130 100644 --- a/config/locales/simple_form.kab.yml +++ b/config/locales/simple_form.kab.yml @@ -158,9 +158,7 @@ kab: terms_of_service_generator: domain: Taɣult user: - date_of_birth_1i: Ass date_of_birth_2i: Ayyur - date_of_birth_3i: Aseggas role: Tamlilt time_zone: Tamnaḍt tasragant user_role: diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index be7a506333..0b9630b777 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -78,6 +78,7 @@ ko: featured_tag: name: '이것들은 최근에 많이 쓰인 해시태그들입니다:' filters: + action: 게시물이 필터에 걸러질 때 어떤 동작을 수행할 지 고르세요 actions: blur: 텍스트는 숨기지 않고 그대로 둔 채 경고 뒤에 미디어를 숨김니다 hide: 필터에 걸러진 글을 처음부터 없었던 것처럼 완전히 가리기 @@ -366,9 +367,7 @@ ko: jurisdiction: 법적 관할권 min_age: 최소 연령 user: - date_of_birth_1i: 일 date_of_birth_2i: 월 - date_of_birth_3i: 년 role: 역할 time_zone: 시간대 user_role: diff --git a/config/locales/simple_form.lad.yml b/config/locales/simple_form.lad.yml index 604f5173b8..35fb5fb9f4 100644 --- a/config/locales/simple_form.lad.yml +++ b/config/locales/simple_form.lad.yml @@ -313,9 +313,7 @@ lad: domain: Domeno min_age: Edad minima user: - date_of_birth_1i: Diya date_of_birth_2i: Mez - date_of_birth_3i: Anyo role: Rolo time_zone: Zona de tiempo user_role: diff --git a/config/locales/simple_form.lt.yml b/config/locales/simple_form.lt.yml index f5f7b582c2..4e88520f84 100644 --- a/config/locales/simple_form.lt.yml +++ b/config/locales/simple_form.lt.yml @@ -246,9 +246,7 @@ lt: jurisdiction: Teisinis teismingumas min_age: Mažiausias amžius user: - date_of_birth_1i: Diena date_of_birth_2i: Mėnuo - date_of_birth_3i: Metai role: Vaidmuo time_zone: Laiko juosta user_role: diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml index ca6d19884a..b2426d24f0 100644 --- a/config/locales/simple_form.lv.yml +++ b/config/locales/simple_form.lv.yml @@ -335,9 +335,7 @@ lv: domain: Domēna vārds min_age: Mazākais pieļaujamais vecums user: - date_of_birth_1i: Diena date_of_birth_2i: Mēnesis - date_of_birth_3i: Gads role: Loma time_zone: Laika josla user_role: diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index cc4065ac77..c0aa3f692e 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -372,9 +372,7 @@ nl: jurisdiction: Jurisdictie min_age: Minimumleeftijd user: - date_of_birth_1i: Dag date_of_birth_2i: Maand - date_of_birth_3i: Jaar role: Rol time_zone: Tijdzone user_role: diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml index 878805b614..b7b1021cd1 100644 --- a/config/locales/simple_form.nn.yml +++ b/config/locales/simple_form.nn.yml @@ -372,9 +372,7 @@ nn: jurisdiction: Rettskrins min_age: Minstealder user: - date_of_birth_1i: Dag date_of_birth_2i: Månad - date_of_birth_3i: År role: Rolle time_zone: Tidssone user_role: diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index a8518eecc2..192a30a53a 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -370,9 +370,7 @@ pl: jurisdiction: Jurysdykcja min_age: Wiek minimalny user: - date_of_birth_1i: Dzień date_of_birth_2i: Miesiąc - date_of_birth_3i: Rok role: Rola time_zone: Strefa czasowa user_role: diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 5f4a9bddf3..dd0c8aaf10 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -372,9 +372,7 @@ pt-BR: jurisdiction: Jurisdição legal min_age: Idade mínima user: - date_of_birth_1i: Dia date_of_birth_2i: Mês - date_of_birth_3i: Ano role: Cargo time_zone: Fuso horário user_role: diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml index a11d63bfa1..7f760745a6 100644 --- a/config/locales/simple_form.pt-PT.yml +++ b/config/locales/simple_form.pt-PT.yml @@ -372,9 +372,7 @@ pt-PT: jurisdiction: Jurisdição legal min_age: Idade mínima user: - date_of_birth_1i: Dia date_of_birth_2i: Mês - date_of_birth_3i: Ano role: Função time_zone: Fuso horário user_role: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index 7496eaf8ae..d973273cb1 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -82,6 +82,7 @@ ru: activity_api_enabled: Еженедельная выгрузка количества локальных постов, активных пользователей и новых регистраций app_icon: WEBP, PNG, GIF или JPG. Заменяет значок приложения на мобильных устройствах по умолчанию вашим значком. backups_retention_period: Пользователи могут запустить создание архива своих постов, чтобы скачать его позже. Если задать положительное значение, эти архивы будут автоматически удалены с вашего хранилища через указанное число дней. + bootstrap_timeline_accounts: Эти учётные записи будут закреплены в начале списка рекомендуемых профилей для новых пользователей. Список учётных записей нужно вводить через запятую. closed_registrations_message: Отображается, когда регистрация закрыта content_cache_retention_period: Все сообщения с других серверов (включая бусты и ответы) будут удалены через указанное количество дней, независимо от того, как локальный пользователь взаимодействовал с этими сообщениями. Это касается и тех сообщений, которые локальный пользователь пометил в закладки или избранное. Приватные упоминания между пользователями из разных инстансов также будут потеряны и не смогут быть восстановлены. Использование этой настройки предназначено для экземпляров специального назначения и нарушает многие ожидания пользователей при использовании в общих целях. custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon. @@ -138,12 +139,12 @@ ru: admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов. arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты. arbitration_website: Веб-форма или «N/A» в случае электронной почты. - choice_of_law: Город, регион, территория или государство, внутреннее материальное право которого регулирует любые претензии. + choice_of_law: Город, регион, территория или государство, внутреннее материальное право которого будет регулировать любые претензии. dmca_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа. dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше. domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс. jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо. - min_age: Не меньше минимального возраста, требуемого по закону в вашей юрисдикции. + min_age: Не меньше минимального возраста, требуемого по закону в вашей стране. user: chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку date_of_birth: @@ -350,17 +351,15 @@ ru: terms_of_service_generator: admin_email: Адрес электронной почты для юридических уведомлений arbitration_address: Почтовый адрес для уведомлений об арбитраже - arbitration_website: Вебсайт для подачи уведомления об арбитраже - choice_of_law: Юрисдикция + arbitration_website: Веб-сайт для подачи уведомления об арбитраже + choice_of_law: Выбор права dmca_address: Почтовый адрес для обращений правообладателей dmca_email: Адрес электронной почты для обращений правообладателей domain: Доменное имя jurisdiction: Юрисдикция min_age: Минимальный возраст user: - date_of_birth_1i: День date_of_birth_2i: Месяц - date_of_birth_3i: Год role: Роль time_zone: Часовой пояс user_role: diff --git a/config/locales/simple_form.si.yml b/config/locales/simple_form.si.yml index c012ded990..a81524f182 100644 --- a/config/locales/simple_form.si.yml +++ b/config/locales/simple_form.si.yml @@ -344,9 +344,7 @@ si: jurisdiction: නීතිමය අධිකරණ බලය min_age: අවම වයස user: - date_of_birth_1i: දහවල date_of_birth_2i: මාසය - date_of_birth_3i: වර්ෂය role: භූමිකාව time_zone: වේලා කලාපය user_role: diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 55cd67b6f0..ee86870244 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -340,9 +340,7 @@ sl: jurisdiction: Pravna pristojnost min_age: Najmanjša starost user: - date_of_birth_1i: Dan date_of_birth_2i: Mesec - date_of_birth_3i: Leto role: Vloga time_zone: Časovni pas user_role: diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml index 2d155cf2a2..f42cec04f0 100644 --- a/config/locales/simple_form.sq.yml +++ b/config/locales/simple_form.sq.yml @@ -371,9 +371,7 @@ sq: jurisdiction: Juridiksion ligjor min_age: Mosha minimale user: - date_of_birth_1i: Ditë date_of_birth_2i: Muaj - date_of_birth_3i: Vit role: Rol time_zone: Zonë kohore user_role: diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 2af0a51be4..10cc444f24 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -354,9 +354,7 @@ sv: jurisdiction: Rättslig jurisdiktion min_age: Minimiålder user: - date_of_birth_1i: Dag date_of_birth_2i: Månad - date_of_birth_3i: År role: Roll time_zone: Tidszon user_role: diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 71eea7a46b..1561213e30 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -314,9 +314,7 @@ th: terms_of_service_generator: domain: โดเมน user: - date_of_birth_1i: วัน date_of_birth_2i: เดือน - date_of_birth_3i: ปี role: บทบาท time_zone: โซนเวลา user_role: diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index 4a5cad5087..1f610eef04 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -372,9 +372,7 @@ tr: jurisdiction: Yasal yetki alanı min_age: Minimum yaş user: - date_of_birth_1i: Gün date_of_birth_2i: Ay - date_of_birth_3i: Yıl role: Rol time_zone: Zaman dilimi user_role: diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index a22ebf2883..d10209ebea 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -342,9 +342,7 @@ uk: jurisdiction: Правова юрисдикція min_age: Мінімальний вік user: - date_of_birth_1i: День date_of_birth_2i: Місяць - date_of_birth_3i: Рік role: Роль time_zone: Часовий пояс user_role: diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml index b450672262..2e2a670576 100644 --- a/config/locales/simple_form.vi.yml +++ b/config/locales/simple_form.vi.yml @@ -371,9 +371,7 @@ vi: jurisdiction: Quyền tài phán pháp lý min_age: Độ tuổi tối thiểu user: - date_of_birth_1i: Ngày date_of_birth_2i: Tháng - date_of_birth_3i: Năm role: Vai trò time_zone: Múi giờ user_role: diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index d6069a43d3..05c23aa2b7 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -371,9 +371,7 @@ zh-CN: jurisdiction: 法律管辖区 min_age: 最低年龄 user: - date_of_birth_1i: 日 date_of_birth_2i: 月 - date_of_birth_3i: 年 role: 角色 time_zone: 时区 user_role: diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index a92d7bcd95..7c57864b2e 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -305,9 +305,7 @@ zh-HK: terms_of_service_generator: domain: 域名 user: - date_of_birth_1i: 日 date_of_birth_2i: 月 - date_of_birth_3i: 年 role: 角色 time_zone: 時區 user_role: diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 274ed20284..13946ceda4 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -371,9 +371,7 @@ zh-TW: jurisdiction: 司法管轄區 min_age: 最低年齡 user: - date_of_birth_1i: 日 date_of_birth_2i: 月 - date_of_birth_3i: 年 role: 角色 time_zone: 時區 user_role: diff --git a/docker-compose.yml b/docker-compose.yml index fbf822b7ea..90b507a25f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,7 @@ services: web: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/glitch-soc/mastodon:v4.5.0 + image: ghcr.io/glitch-soc/mastodon:v4.5.1 restart: always env_file: .env.production command: bundle exec puma -C config/puma.rb @@ -83,7 +83,7 @@ services: # build: # dockerfile: ./streaming/Dockerfile # context: . - image: ghcr.io/glitch-soc/mastodon-streaming:v4.5.0 + image: ghcr.io/glitch-soc/mastodon-streaming:v4.5.1 restart: always env_file: .env.production command: node ./streaming/index.js @@ -102,7 +102,7 @@ services: sidekiq: # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # build: . - image: ghcr.io/glitch-soc/mastodon:v4.5.0 + image: ghcr.io/glitch-soc/mastodon:v4.5.1 restart: always env_file: .env.production command: bundle exec sidekiq @@ -115,7 +115,7 @@ services: volumes: - ./public/system:/mastodon/public/system healthcheck: - test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ [78]' || false"] + test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 8' || false"] ## Uncomment to enable federation with tor instances along with adding the following ENV variables ## http_hidden_proxy=http://privoxy:8118 diff --git a/lib/vite_ruby/sri_extensions.rb b/lib/vite_ruby/sri_extensions.rb index d97ab352da..31363272bf 100644 --- a/lib/vite_ruby/sri_extensions.rb +++ b/lib/vite_ruby/sri_extensions.rb @@ -107,6 +107,7 @@ module ViteRails::TagHelpers::IntegrityExtension stylesheet, integrity: vite_manifest.integrity_hash_for_file(stylesheet), media: media, + crossorigin: crossorigin, **options ) end diff --git a/package.json b/package.json index 342bbe26d8..1e26c37f75 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "core-js": "^3.30.2", "cross-env": "^10.0.0", "debug": "^4.4.1", + "delegated-events": "^1.1.2", "detect-passive-events": "^2.0.3", "emoji-mart": "npm:emoji-mart-lazyload@latest", "emojibase": "^16.0.0", diff --git a/yarn.lock b/yarn.lock index 9b5e2e4416..abc39e42e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2765,6 +2765,7 @@ __metadata: core-js: "npm:^3.30.2" cross-env: "npm:^10.0.0" debug: "npm:^4.4.1" + delegated-events: "npm:^1.1.2" detect-passive-events: "npm:^2.0.3" emoji-mart: "npm:emoji-mart-lazyload@latest" emojibase: "npm:^16.0.0" @@ -6397,6 +6398,15 @@ __metadata: languageName: node linkType: hard +"delegated-events@npm:^1.1.2": + version: 1.1.2 + resolution: "delegated-events@npm:1.1.2" + dependencies: + selector-set: "npm:^1.1.5" + checksum: 10c0/b295a6d6c6cef4b9312bfd4132ac3a1255f3c2fadf3692a04cf7ddf8f0d472bfce9de06323faa75e922d20e5674d45022e1a5378b8500cd7d573ffa0cf7ca602 + languageName: node + linkType: hard + "denque@npm:^2.1.0": version: 2.1.0 resolution: "denque@npm:2.1.0" @@ -8881,13 +8891,13 @@ __metadata: linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 languageName: node linkType: hard @@ -12169,6 +12179,13 @@ __metadata: languageName: node linkType: hard +"selector-set@npm:^1.1.5": + version: 1.1.5 + resolution: "selector-set@npm:1.1.5" + checksum: 10c0/4835907846eb8496c2cc4e5ce48355cce1ef3b55e82789542739dcdc71ebfb756e133d1d7f7ec9f0cf4b1c11fc0375a1d3b99a482d9c973493ca85a6d4b012ab + languageName: node + linkType: hard + "semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2"