Merge commit 'c87b05282909383353a9561e97b9f18a2db0766d' into glitch-soc/merge-upstream

This commit is contained in:
Claire
2025-11-14 18:19:00 +01:00
83 changed files with 238 additions and 299 deletions

View File

@@ -2,6 +2,21 @@
All notable changes to this project will be documented in this file. 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 ## [4.5.0] - 2025-11-06
### Added ### Added

View File

@@ -96,8 +96,8 @@ GEM
ast (2.4.3) ast (2.4.3)
attr_required (1.0.2) attr_required (1.0.2)
aws-eventstream (1.4.0) aws-eventstream (1.4.0)
aws-partitions (1.1180.0) aws-partitions (1.1181.0)
aws-sdk-core (3.236.0) aws-sdk-core (3.237.0)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0) aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9) aws-sigv4 (~> 1.9)
@@ -608,7 +608,7 @@ GEM
premailer (~> 1.7, >= 1.7.9) premailer (~> 1.7, >= 1.7.9)
prettyprint (0.2.0) prettyprint (0.2.0)
prism (1.6.0) prism (1.6.0)
prometheus_exporter (2.3.0) prometheus_exporter (2.3.1)
webrick webrick
propshaft (1.3.1) propshaft (1.3.1)
actionpack (>= 7.0.0) actionpack (>= 7.0.0)
@@ -838,7 +838,7 @@ GEM
stackprof (0.2.27) stackprof (0.2.27)
starry (0.2.0) starry (0.2.0)
base64 base64
stoplight (5.5.0) stoplight (5.6.0)
zeitwerk zeitwerk
stringio (3.1.7) stringio (3.1.7)
strong_migrations (2.5.1) strong_migrations (2.5.1)

View File

@@ -2,25 +2,25 @@
class DateOfBirthInput < SimpleForm::Inputs::Base class DateOfBirthInput < SimpleForm::Inputs::Base
OPTIONS = [ 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-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 ].freeze
def input(wrapper_options = nil) def input(wrapper_options = nil)
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
merged_input_options[:inputmode] = 'numeric' 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] 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) @builder.text_field("#{attribute_name}(#{index + 1}i)", options)
end) end)
end end
def label_target def label_target
"#{attribute_name}_1i" "#{attribute_name}_3i"
end end
private private

View File

@@ -1,7 +1,7 @@
import { createRoot } from 'react-dom/client'; import { createRoot } from 'react-dom/client';
import Rails from '@rails/ujs';
import { decode, ValidationError } from 'blurhash'; import { decode, ValidationError } from 'blurhash';
import { on } from 'delegated-events';
import ready from '../mastodon/ready'; import ready from '../mastodon/ready';
@@ -24,10 +24,9 @@ const setAnnouncementEndsAttributes = (target: HTMLInputElement) => {
} }
}; };
Rails.delegate( on(
document,
'input[type="datetime-local"]#announcement_starts_at',
'change', 'change',
'input[type="datetime-local"]#announcement_starts_at',
({ target }) => { ({ target }) => {
if (target instanceof HTMLInputElement) if (target instanceof HTMLInputElement)
setAnnouncementEndsAttributes(target); setAnnouncementEndsAttributes(target);
@@ -63,7 +62,7 @@ const hideSelectAll = () => {
if (hiddenField) hiddenField.value = '0'; if (hiddenField) hiddenField.value = '0';
}; };
Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { on('change', '#batch_checkbox_all', ({ target }) => {
if (!(target instanceof HTMLInputElement)) return; if (!(target instanceof HTMLInputElement)) return;
const selectAllMatchingElement = document.querySelector( 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<HTMLInputElement>( const hiddenField = document.querySelector<HTMLInputElement>(
'#select_all_matching', '#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<HTMLInputElement>( const checkAllElement = document.querySelector<HTMLInputElement>(
'input#batch_checkbox_all', 'input#batch_checkbox_all',
); );
@@ -140,14 +139,9 @@ Rails.delegate(document, batchCheckboxClassName, 'change', () => {
} }
}); });
Rails.delegate( on('change', '.filter-subset--with-select select', ({ target }) => {
document, if (target instanceof HTMLSelectElement) target.form?.submit();
'.filter-subset--with-select select', });
'change',
({ target }) => {
if (target instanceof HTMLSelectElement) target.form?.submit();
},
);
const onDomainBlockSeverityChange = (target: HTMLSelectElement) => { const onDomainBlockSeverityChange = (target: HTMLSelectElement) => {
const rejectMediaDiv = document.querySelector( 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); if (target instanceof HTMLSelectElement) onDomainBlockSeverityChange(target);
}); });
const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => { function onEnableBootstrapTimelineAccountsChange(target: HTMLInputElement) {
const bootstrapTimelineAccountsField = const bootstrapTimelineAccountsField =
document.querySelector<HTMLInputElement>( document.querySelector<HTMLInputElement>(
'#form_admin_settings_bootstrap_timeline_accounts', '#form_admin_settings_bootstrap_timeline_accounts',
@@ -194,12 +188,11 @@ const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => {
); );
} }
} }
}; }
Rails.delegate( on(
document,
'#form_admin_settings_enable_bootstrap_timeline_accounts',
'change', 'change',
'#form_admin_settings_enable_bootstrap_timeline_accounts',
({ target }) => { ({ target }) => {
if (target instanceof HTMLInputElement) if (target instanceof HTMLInputElement)
onEnableBootstrapTimelineAccountsChange(target); 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 date = new Date(value + 'Z');
const twoChars = (x: number) => x.toString().padStart(2, '0'); 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())}`; return `${date.getFullYear()}-${twoChars(date.getMonth() + 1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`;
}; }
function convertLocalDatetimeToUTC(value: string) { function convertLocalDatetimeToUTC(value: string) {
const date = new Date(value); const date = new Date(value);
@@ -251,14 +244,9 @@ function convertLocalDatetimeToUTC(value: string) {
return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6); return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6);
} }
Rails.delegate( on('change', '#form_admin_settings_registrations_mode', ({ target }) => {
document, if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target);
'#form_admin_settings_registrations_mode', });
'change',
({ target }) => {
if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target);
},
);
async function mountReactComponent(element: Element) { async function mountReactComponent(element: Element) {
const componentName = element.getAttribute('data-admin-component'); const componentName = element.getAttribute('data-admin-component');
@@ -305,7 +293,7 @@ ready(() => {
if (registrationMode) onChangeRegistrationMode(registrationMode); if (registrationMode) onChangeRegistrationMode(registrationMode);
const checkAllElement = document.querySelector<HTMLInputElement>( const checkAllElement = document.querySelector<HTMLInputElement>(
'input#batch_checkbox_all', '#batch_checkbox_all',
); );
if (checkAllElement) { if (checkAllElement) {
const allCheckboxes = Array.from( const allCheckboxes = Array.from(
@@ -318,7 +306,7 @@ ready(() => {
} }
document document
.querySelector('a#add-instance-button') .querySelector<HTMLAnchorElement>('a#add-instance-button')
?.addEventListener('click', (e) => { ?.addEventListener('click', (e) => {
const domain = document.querySelector<HTMLInputElement>( const domain = document.querySelector<HTMLInputElement>(
'input[type="text"]#by_domain', 'input[type="text"]#by_domain',
@@ -342,7 +330,7 @@ ready(() => {
} }
}); });
Rails.delegate(document, 'form', 'submit', ({ target }) => { on('submit', 'form', ({ target }) => {
if (target instanceof HTMLFormElement) if (target instanceof HTMLFormElement)
target target
.querySelectorAll<HTMLInputElement>('input[type="datetime-local"]') .querySelectorAll<HTMLInputElement>('input[type="datetime-local"]')

View File

@@ -4,8 +4,8 @@ import { IntlMessageFormat } from 'intl-messageformat';
import type { MessageDescriptor, PrimitiveType } from 'react-intl'; import type { MessageDescriptor, PrimitiveType } from 'react-intl';
import { defineMessages } from 'react-intl'; import { defineMessages } from 'react-intl';
import Rails from '@rails/ujs';
import axios from 'axios'; import axios from 'axios';
import { on } from 'delegated-events';
import { throttle } from 'lodash'; import { throttle } from 'lodash';
import { timeAgoString } from '../mastodon/components/relative_timestamp'; import { timeAgoString } from '../mastodon/components/relative_timestamp';
@@ -175,10 +175,9 @@ function loaded() {
}); });
} }
Rails.delegate( on(
document,
'input#user_account_attributes_username',
'input', 'input',
'input#user_account_attributes_username',
throttle( throttle(
({ target }) => { ({ target }) => {
if (!(target instanceof HTMLInputElement)) return; if (!(target instanceof HTMLInputElement)) return;
@@ -202,60 +201,47 @@ function loaded() {
), ),
); );
Rails.delegate( on('input', '#user_password,#user_password_confirmation', () => {
document, const password = document.querySelector<HTMLInputElement>(
'#user_password,#user_password_confirmation', 'input#user_password',
'input', );
() => { const confirmation = document.querySelector<HTMLInputElement>(
const password = document.querySelector<HTMLInputElement>( 'input#user_password_confirmation',
'input#user_password', );
); if (!confirmation || !password) return;
const confirmation = document.querySelector<HTMLInputElement>(
'input#user_password_confirmation',
);
if (!confirmation || !password) return;
if ( if (confirmation.value && confirmation.value.length > password.maxLength) {
confirmation.value && confirmation.setCustomValidity(
confirmation.value.length > password.maxLength formatMessage(messages.passwordExceedsLength),
) { );
confirmation.setCustomValidity( } else if (password.value && password.value !== confirmation.value) {
formatMessage(messages.passwordExceedsLength), confirmation.setCustomValidity(
); formatMessage(messages.passwordDoesNotMatch),
} else if (password.value && password.value !== confirmation.value) { );
confirmation.setCustomValidity( } else {
formatMessage(messages.passwordDoesNotMatch), confirmation.setCustomValidity('');
); }
} else { });
confirmation.setCustomValidity('');
}
},
);
} }
Rails.delegate( on('change', '#edit_profile input[type=file]', ({ target }) => {
document, if (!(target instanceof HTMLInputElement)) return;
'#edit_profile input[type=file]',
'change',
({ target }) => {
if (!(target instanceof HTMLInputElement)) return;
const avatar = document.querySelector<HTMLImageElement>( const avatar = document.querySelector<HTMLImageElement>(
`img#${target.id}-preview`, `img#${target.id}-preview`,
); );
if (!avatar) return; if (!avatar) return;
let file: File | undefined; let file: File | undefined;
if (target.files) file = target.files[0]; 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; if (!(target instanceof HTMLInputElement)) return;
target.focus(); target.focus();
@@ -263,7 +249,7 @@ Rails.delegate(document, '.input-copy input', 'click', ({ target }) => {
target.setSelectionRange(0, target.value.length); 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; if (!(target instanceof HTMLButtonElement)) return;
const input = target.parentNode?.querySelector<HTMLInputElement>( const input = target.parentNode?.querySelector<HTMLInputElement>(
@@ -312,22 +298,22 @@ const toggleSidebar = () => {
sidebar.classList.toggle('visible'); sidebar.classList.toggle('visible');
}; };
Rails.delegate(document, '.sidebar__toggle__icon', 'click', () => { on('click', '.sidebar__toggle__icon', () => {
toggleSidebar(); toggleSidebar();
}); });
Rails.delegate(document, '.sidebar__toggle__icon', 'keydown', (e) => { on('keydown', '.sidebar__toggle__icon', (e) => {
if (e.key === ' ' || e.key === 'Enter') { if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault(); e.preventDefault();
toggleSidebar(); toggleSidebar();
} }
}); });
Rails.delegate(document, 'img.custom-emoji', 'mouseover', ({ target }) => { on('mouseover', 'img.custom-emoji', ({ target }) => {
if (target instanceof HTMLImageElement && target.dataset.original) if (target instanceof HTMLImageElement && target.dataset.original)
target.src = 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) if (target instanceof HTMLImageElement && target.dataset.static)
target.src = target.dataset.static; target.src = target.dataset.static;
}); });
@@ -376,22 +362,17 @@ const setInputHint = (
} }
}; };
Rails.delegate( on('change', '#account_statuses_cleanup_policy_enabled', ({ target }) => {
document, if (!(target instanceof HTMLInputElement) || !target.form) return;
'#account_statuses_cleanup_policy_enabled',
'change',
({ target }) => {
if (!(target instanceof HTMLInputElement) || !target.form) return;
target.form target.form
.querySelectorAll< .querySelectorAll<
HTMLInputElement | HTMLSelectElement HTMLInputElement | HTMLSelectElement
>('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select') >('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select')
.forEach((input) => { .forEach((input) => {
setInputDisabled(input, !target.checked); setInputDisabled(input, !target.checked);
}); });
}, });
);
const updateDefaultQuotePrivacyFromPrivacy = ( const updateDefaultQuotePrivacyFromPrivacy = (
privacySelect: EventTarget | null, privacySelect: EventTarget | null,
@@ -414,18 +395,13 @@ const updateDefaultQuotePrivacyFromPrivacy = (
} }
}; };
Rails.delegate( on('change', '#user_settings_attributes_default_privacy', ({ target }) => {
document, updateDefaultQuotePrivacyFromPrivacy(target);
'#user_settings_attributes_default_privacy', });
'change',
({ target }) => {
updateDefaultQuotePrivacyFromPrivacy(target);
},
);
// Empty the honeypot fields in JS in case something like an extension // Empty the honeypot fields in JS in case something like an extension
// automatically filled them. // automatically filled them.
Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => { on('submit', '#registration_new_user,#new_user', () => {
[ [
'user_website', 'user_website',
'user_confirm_password', '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)) { if (!(target instanceof HTMLElement)) {
return; return;
} }

View File

@@ -675,8 +675,8 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
dispatch(useEmoji(suggestion)); dispatch(useEmoji(suggestion));
} else if (suggestion.type === 'hashtag') { } else if (suggestion.type === 'hashtag') {
completion = suggestion.name.slice(token.length - 1); completion = token + suggestion.name.slice(token.length - 1);
startPosition = position + token.length; startPosition = position - 1;
} else if (suggestion.type === 'account') { } else if (suggestion.type === 'account') {
completion = `@${getState().getIn(['accounts', suggestion.id, 'acct'])}`; completion = `@${getState().getIn(['accounts', suggestion.id, 'acct'])}`;
startPosition = position - 1; startPosition = position - 1;

View File

@@ -112,7 +112,7 @@ export function normalizeStatus(status, normalOldStatus, { bogusQuotePolicy = fa
} }
if (normalOldStatus) { if (normalOldStatus) {
normalStatus.quote_approval ||= normalOldStatus.quote_approval; normalStatus.quote_approval ||= normalOldStatus.get('quote_approval');
const list = normalOldStatus.get('media_attachments'); const list = normalOldStatus.get('media_attachments');
if (normalStatus.media_attachments && list) { if (normalStatus.media_attachments && list) {

View File

@@ -50,6 +50,7 @@ const AutosuggestTextarea = forwardRef(({
onKeyUp, onKeyUp,
onKeyDown, onKeyDown,
onPaste, onPaste,
onDrop,
onFocus, onFocus,
autoFocus = true, autoFocus = true,
lang, lang,
@@ -153,6 +154,12 @@ const AutosuggestTextarea = forwardRef(({
onPaste(e); onPaste(e);
}, [onPaste]); }, [onPaste]);
const handleDrop = useCallback((e) => {
if (onDrop) {
onDrop(e);
}
}, [onDrop]);
// Show the suggestions again whenever they change and the textarea is focused // Show the suggestions again whenever they change and the textarea is focused
useEffect(() => { useEffect(() => {
if (suggestions.size > 0 && textareaRef.current === document.activeElement) { if (suggestions.size > 0 && textareaRef.current === document.activeElement) {
@@ -204,6 +211,7 @@ const AutosuggestTextarea = forwardRef(({
onFocus={handleFocus} onFocus={handleFocus}
onBlur={handleBlur} onBlur={handleBlur}
onPaste={handlePaste} onPaste={handlePaste}
onDrop={handleDrop}
dir='auto' dir='auto'
aria-autocomplete='list' aria-autocomplete='list'
aria-label={placeholder} aria-label={placeholder}
@@ -235,6 +243,7 @@ AutosuggestTextarea.propTypes = {
onKeyUp: PropTypes.func, onKeyUp: PropTypes.func,
onKeyDown: PropTypes.func, onKeyDown: PropTypes.func,
onPaste: PropTypes.func.isRequired, onPaste: PropTypes.func.isRequired,
onDrop: PropTypes.func,
onFocus:PropTypes.func, onFocus:PropTypes.func,
autoFocus: PropTypes.bool, autoFocus: PropTypes.bool,
lang: PropTypes.string, lang: PropTypes.string,

View File

@@ -27,12 +27,14 @@ export const HandledLink: FC<HandledLinkProps & ComponentProps<'a'>> = ({
}) => { }) => {
// Handle hashtags // Handle hashtags
if ( if (
text.startsWith('#') || (text.startsWith('#') ||
prevText?.endsWith('#') || prevText?.endsWith('#') ||
text.startsWith('') || text.startsWith('') ||
prevText?.endsWith('') prevText?.endsWith('')) &&
!text.includes('%')
) { ) {
const hashtag = text.slice(1).trim(); const hashtag = text.slice(1).trim();
return ( return (
<Link <Link
className={classNames('mention hashtag', className)} className={classNames('mention hashtag', className)}
@@ -69,7 +71,7 @@ export const HandledLink: FC<HandledLinkProps & ComponentProps<'a'>> = ({
return ( return (
<a <a
{...props} {...props}
href={href} href={encodeURI(href)}
title={href} title={href}
className={classNames('unhandled-link', className)} className={classNames('unhandled-link', className)}
target='_blank' target='_blank'

View File

@@ -64,6 +64,7 @@ class ComposeForm extends ImmutablePureComponent {
onSuggestionSelected: PropTypes.func.isRequired, onSuggestionSelected: PropTypes.func.isRequired,
onChangeSpoilerText: PropTypes.func.isRequired, onChangeSpoilerText: PropTypes.func.isRequired,
onPaste: PropTypes.func.isRequired, onPaste: PropTypes.func.isRequired,
onDrop: PropTypes.func.isRequired,
onPickEmoji: PropTypes.func.isRequired, onPickEmoji: PropTypes.func.isRequired,
autoFocus: PropTypes.bool, autoFocus: PropTypes.bool,
withoutNavigation: PropTypes.bool, withoutNavigation: PropTypes.bool,
@@ -102,6 +103,7 @@ class ComposeForm extends ImmutablePureComponent {
handleKeyDownPost = (e) => { handleKeyDownPost = (e) => {
if (e.key.toLowerCase() === 'enter' && (e.ctrlKey || e.metaKey)) { if (e.key.toLowerCase() === 'enter' && (e.ctrlKey || e.metaKey)) {
this.handleSubmit(); this.handleSubmit();
e.preventDefault();
} }
this.blurOnEscape(e); this.blurOnEscape(e);
}; };
@@ -248,7 +250,7 @@ class ComposeForm extends ImmutablePureComponent {
}; };
render () { render () {
const { intl, onPaste, autoFocus, withoutNavigation, maxChars, isSubmitting } = this.props; const { intl, onPaste, onDrop, autoFocus, withoutNavigation, maxChars, isSubmitting } = this.props;
const { highlighted } = this.state; const { highlighted } = this.state;
return ( return (
@@ -304,6 +306,7 @@ class ComposeForm extends ImmutablePureComponent {
onSuggestionsClearRequested={this.onSuggestionsClearRequested} onSuggestionsClearRequested={this.onSuggestionsClearRequested}
onSuggestionSelected={this.onSuggestionSelected} onSuggestionSelected={this.onSuggestionSelected}
onPaste={onPaste} onPaste={onPaste}
onDrop={onDrop}
autoFocus={autoFocus} autoFocus={autoFocus}
lang={this.props.lang} lang={this.props.lang}
className='compose-form__input' className='compose-form__input'

View File

@@ -18,6 +18,23 @@ import ComposeForm from '../components/compose_form';
const urlLikeRegex = /^https?:\/\/[^\s]+\/[^\s]+$/i; 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 => ({ const mapStateToProps = state => ({
text: state.getIn(['compose', 'text']), text: state.getIn(['compose', 'text']),
suggestions: state.getIn(['compose', 'suggestions']), suggestions: state.getIn(['compose', 'suggestions']),
@@ -85,20 +102,11 @@ const mapDispatchToProps = (dispatch, props) => ({
}, },
onPaste (e) { onPaste (e) {
if (e.clipboardData && e.clipboardData.files.length === 1) { processPasteOrDrop(e.clipboardData, e, dispatch);
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;
try { onDrop (e) {
const url = new URL(data); processPasteOrDrop(e.dataTransfer, e, dispatch);
dispatch(pasteLinkCompose({ url }));
} catch {
return;
}
}
}, },
onPickEmoji (position, data, needsSpace) { onPickEmoji (position, data, needsSpace) {

View File

@@ -157,6 +157,8 @@
"bundle_modal_error.close": "Tanca", "bundle_modal_error.close": "Tanca",
"bundle_modal_error.message": "S'ha produït un error en carregar aquesta pantalla.", "bundle_modal_error.message": "S'ha produït un error en carregar aquesta pantalla.",
"bundle_modal_error.retry": "Torna-ho a provar", "bundle_modal_error.retry": "Torna-ho a provar",
"carousel.current": "<sr>Diapositiva</sr> {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.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.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", "closed_registrations_modal.find_another_server": "Troba un altre servidor",
@@ -173,6 +175,8 @@
"column.edit_list": "Edita la llista", "column.edit_list": "Edita la llista",
"column.favourites": "Favorits", "column.favourites": "Favorits",
"column.firehose": "Tuts en directe", "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.follow_requests": "Peticions de seguir-te",
"column.home": "Inici", "column.home": "Inici",
"column.list_members": "Gestiona els membres de la llista", "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.secondary": "Publica-la igualment",
"confirmations.missing_alt_text.title": "Hi voleu afegir text alternatiu?", "confirmations.missing_alt_text.title": "Hi voleu afegir text alternatiu?",
"confirmations.mute.confirm": "Silencia", "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.dismiss": "No m'ho tornis a recordar",
"confirmations.quiet_post_quote_info.got_it": "Entesos", "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.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.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ó?", "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.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.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.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.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.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í.", "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_statuses": "Tuts",
"explore.trending_tags": "Etiquetes", "explore.trending_tags": "Etiquetes",
"featured_carousel.header": "{count, plural, one {Publicació fixada} other {Publicacions fixades}}", "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_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.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.", "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.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?", "ignore_notifications_modal.private_mentions_title": "Voleu ignorar les notificacions de mencions privades no sol·licitades?",
"info_button.label": "Ajuda", "info_button.label": "Ajuda",
"info_button.what_is_alt_text": "<h1>Què és el text alternatiu?</h1> <p>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.</p> <p>Podeu millorar l'accessibilitat i la comprensió per a tothom escrivint un text alternatiu clar, concís i objectiu.</p> <ul> <li>Descriviu els elements importants</li> <li>Utilitzeu frases senzilles</li> <li>Resumiu el text en imatges</li> <li>Eviteu la informació redundant</li> <li>Centreu-vos en les tendències i els aspectes clau dels elements visuals complexos (com ara diagrames o mapes)</li> </ul>",
"interaction_modal.action": "Per a interactuar amb la publicació de {name} cal que inicieu la sessió en el servidor que feu servir.", "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.go": "Endavant",
"interaction_modal.no_account_yet": "Encara no teniu cap compte?", "interaction_modal.no_account_yet": "Encara no teniu cap compte?",
@@ -1000,10 +1012,14 @@
"video.volume_down": "Abaixa el volum", "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.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.header": "Visibilitat i interacció",
"visibility_modal.helper.direct_quoting": "No es poden citar mencions privades fetes a Mastondon.", "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.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 <link>Preferències > Valors per defecte de publicació</link>.", "visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. També podeu aplicar la configuració a totes les publicacions futures navegant a <link>Preferències > Valors per defecte de publicació</link>.",
"visibility_modal.privacy_label": "Visibilitat", "visibility_modal.privacy_label": "Visibilitat",
"visibility_modal.quote_followers": "Només seguidors", "visibility_modal.quote_followers": "Només seguidors",

View File

@@ -110,7 +110,7 @@
"alt_text_modal.cancel": "Abbrechen", "alt_text_modal.cancel": "Abbrechen",
"alt_text_modal.change_thumbnail": "Vorschaubild ändern", "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_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", "alt_text_modal.done": "Fertig",
"announcement.announcement": "Ankündigung", "announcement.announcement": "Ankündigung",
"annual_report.summary.archetype.booster": "Trendjäger*in", "annual_report.summary.archetype.booster": "Trendjäger*in",
@@ -245,7 +245,7 @@
"confirmations.logout.message": "Möchtest du dich wirklich abmelden?", "confirmations.logout.message": "Möchtest du dich wirklich abmelden?",
"confirmations.logout.title": "Abmelden?", "confirmations.logout.title": "Abmelden?",
"confirmations.missing_alt_text.confirm": "Bildbeschreibung hinzufügen", "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.secondary": "Trotzdem veröffentlichen",
"confirmations.missing_alt_text.title": "Bildbeschreibung hinzufügen?", "confirmations.missing_alt_text.title": "Bildbeschreibung hinzufügen?",
"confirmations.mute.confirm": "Stummschalten", "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.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?", "ignore_notifications_modal.private_mentions_title": "Benachrichtigungen von unerwünschten privaten Erwähnungen ignorieren?",
"info_button.label": "Hilfe", "info_button.label": "Hilfe",
"info_button.what_is_alt_text": "<h1>Was ist Alt-Text?</h1> <p>Alt-Text bietet Bildbeschreibungen für Personen mit einer Sehschwäche, einer schlechten Internetverbindung und für alle, die zusätzlichen Kontext möchten.</p> <p>Du kannst die Zugänglichkeit und die Verständlichkeit für alle verbessern, indem du eine klare, genaue und objektive Bildbeschreibung hinzufügst.</p> <ul> <li>Erfasse wichtige Elemente</li> <li>Fasse Text in Bildern zusammen</li> <li>Verwende einen korrekten Satzbau</li> <li>Vermeide unwichtige Informationen</li> <li>Konzentriere dich bei komplexen Darstellungen (z. B. Diagramme oder Karten) auf Trends und wichtige Erkenntnisse</li> </ul>", "info_button.what_is_alt_text": "<h1>Was ist Alt-Text?</h1> <p>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.</p> <p>Du kannst die Barrierefreiheit und Verständlichkeit für alle verbessern, indem du eine klare, genaue und objektive Bildbeschreibung erstellst.</p> <ul> <li>Erfasse wichtige Elemente</li> <li>Fasse Texte bildlich zusammen</li> <li>Verwende einen korrekten Satzbau</li> <li>Vermeide unwichtige und überflüssige Informationen</li> <li>Konzentriere dich bei komplexen Darstellungen (z. B. bei Diagrammen oder Karten) auf Veränderungen und Schlüsselwörter</li> </ul>",
"interaction_modal.action": "Melde dich auf deinem Mastodon-Server an, damit du mit dem Beitrag von {name} interagieren kannst.", "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.go": "Los",
"interaction_modal.no_account_yet": "Du hast noch kein Konto?", "interaction_modal.no_account_yet": "Du hast noch kein Konto?",

View File

@@ -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.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 <link>«Configuración» > «Configuración predeterminada de mensajes»</link>.", "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 <link>«Configuración» > «Configuración predeterminada de mensajes»</link>.",
"visibility_modal.privacy_label": "Visibilidad", "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_label": "Quién puede citar",
"visibility_modal.quote_nobody": "Solo yo", "visibility_modal.quote_nobody": "Solo yo",
"visibility_modal.quote_public": "Cualquier cuenta", "visibility_modal.quote_public": "Cualquier cuenta",

View File

@@ -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.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.embed": "Faigh cód leabú",
"status.favourite": "Is fearr leat", "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.filter": "Déan scagadh ar an bpostáil seo",
"status.history.created": "Chruthaigh {name} {date}", "status.history.created": "Chruthaigh {name} {date}",
"status.history.edited": "Curtha in eagar ag {name} in {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.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.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.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.read_more": "Léan a thuilleadh",
"status.reblog": "Treisiú", "status.reblog": "Treisiú",
"status.reblog_or_quote": "Borradh nó luachan", "status.reblog_or_quote": "Borradh nó luachan",
"status.reblog_private": "Roinn arís le do leanúna", "status.reblog_private": "Roinn arís le do leanúna",
"status.reblogged_by": "Mhol {name}", "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.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.redraft": "Scrios ⁊ athdhréachtaigh",
"status.remove_bookmark": "Bain leabharmharc", "status.remove_bookmark": "Bain leabharmharc",
"status.remove_favourite": "Bain ó cheanáin", "status.remove_favourite": "Bain ó cheanáin",

View File

@@ -903,6 +903,7 @@
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}", "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
"status.embed": "O código a incluír", "status.embed": "O código a incluír",
"status.favourite": "Favorecer", "status.favourite": "Favorecer",
"status.favourites_count": "{count, plural, one {{counter} favorecemento} other {{counter} favorecementos}}",
"status.filter": "Filtrar esta publicación", "status.filter": "Filtrar esta publicación",
"status.history.created": "{name} creouno o {date}", "status.history.created": "{name} creouno o {date}",
"status.history.edited": "{name} editouno 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.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.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.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.read_more": "Ler máis",
"status.reblog": "Promover", "status.reblog": "Promover",
"status.reblog_or_quote": "Promover ou citar", "status.reblog_or_quote": "Promover ou citar",
"status.reblog_private": "Volver a compartir coas túas seguidoras", "status.reblog_private": "Volver a compartir coas túas seguidoras",
"status.reblogged_by": "{name} promoveu", "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.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.redraft": "Eliminar e reescribir",
"status.remove_bookmark": "Eliminar marcador", "status.remove_bookmark": "Eliminar marcador",
"status.remove_favourite": "Retirar das favoritas", "status.remove_favourite": "Retirar das favoritas",

View File

@@ -880,6 +880,7 @@
"status.quote_error.filtered": "あなたのフィルター設定によって非表示になっています", "status.quote_error.filtered": "あなたのフィルター設定によって非表示になっています",
"status.quote_error.pending_approval": "承認待ちの投稿", "status.quote_error.pending_approval": "承認待ちの投稿",
"status.quote_noun": "引用", "status.quote_noun": "引用",
"status.quote_policy_change": "引用できるユーザーの変更",
"status.quote_post_author": "{name} の投稿を引用", "status.quote_post_author": "{name} の投稿を引用",
"status.quote_private": "非公開の投稿は引用できません", "status.quote_private": "非公開の投稿は引用できません",
"status.quotes.local_other_disclaimer": "投稿者が拒否した引用は表示されません。", "status.quotes.local_other_disclaimer": "投稿者が拒否した引用は表示されません。",

View File

@@ -252,6 +252,7 @@
"confirmations.private_quote_notify.cancel": "편집으로 돌아가기", "confirmations.private_quote_notify.cancel": "편집으로 돌아가기",
"confirmations.private_quote_notify.confirm": "게시", "confirmations.private_quote_notify.confirm": "게시",
"confirmations.private_quote_notify.do_not_show_again": "이 메시지를 다시 표시하지 않음", "confirmations.private_quote_notify.do_not_show_again": "이 메시지를 다시 표시하지 않음",
"confirmations.private_quote_notify.message": "인용하려는 사람과 멘션된 사람들은 나를 팔로우하지 않더라도 게시물에 대한 알림을 받으며 내용을 볼 수 있습니다.",
"confirmations.quiet_post_quote_info.dismiss": "다시 보지 않기", "confirmations.quiet_post_quote_info.dismiss": "다시 보지 않기",
"confirmations.quiet_post_quote_info.got_it": "알겠습니다", "confirmations.quiet_post_quote_info.got_it": "알겠습니다",
"confirmations.quiet_post_quote_info.message": "조용한 공개 게시물을 인용하면 그 게시물은 유행 타임라인에서 나타나지 않을 것입니다.", "confirmations.quiet_post_quote_info.message": "조용한 공개 게시물을 인용하면 그 게시물은 유행 타임라인에서 나타나지 않을 것입니다.",

View File

@@ -639,7 +639,7 @@
"privacy.private.long": "Tikai Tavi sekotāji", "privacy.private.long": "Tikai Tavi sekotāji",
"privacy.private.short": "Sekotāji", "privacy.private.short": "Sekotāji",
"privacy.public.long": "Jebkurš Mastodon un ārpus tā", "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.anyone": "{visibility}, jebkurš var citēt",
"privacy.quote.disabled": "{visibility}, aizliegta citēšana", "privacy.quote.disabled": "{visibility}, aizliegta citēšana",
"privacy.quote.limited": "{visibility}, ierobežota citēšana", "privacy.quote.limited": "{visibility}, ierobežota citēšana",

View File

@@ -4,7 +4,7 @@
"about.default_locale": "Padrão", "about.default_locale": "Padrão",
"about.disclaimer": "Mastodon é um software de código aberto e livre, e uma marca registrada de Mastodon gGmbH.", "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.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.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.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.", "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.familiar_followers_two": "Seguido por {name1} e {name2}",
"account.featured": "Em destaque", "account.featured": "Em destaque",
"account.featured.accounts": "Perfis", "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_at": "Última publicação em {date}",
"account.featured_tags.last_status_never": "Sem publicações", "account.featured_tags.last_status_never": "Sem publicações",
"account.follow": "Seguir", "account.follow": "Seguir",
@@ -49,7 +49,7 @@
"account.followers": "Seguidores", "account.followers": "Seguidores",
"account.followers.empty": "Nada aqui.", "account.followers.empty": "Nada aqui.",
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}", "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": "Seguindo",
"account.following_counter": "{count, plural, one {{counter} seguindo} other {{counter} seguindo}}", "account.following_counter": "{count, plural, one {{counter} seguindo} other {{counter} seguindo}}",
"account.follows.empty": "Nada aqui.", "account.follows.empty": "Nada aqui.",
@@ -903,6 +903,7 @@
"status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}", "status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}",
"status.embed": "Obter código de incorporação", "status.embed": "Obter código de incorporação",
"status.favourite": "Favorita", "status.favourite": "Favorita",
"status.favourites_count": "{count, plural, one {{counter} favorito} other {{counter} favoritos}}",
"status.filter": "Filtrar esta publicação", "status.filter": "Filtrar esta publicação",
"status.history.created": "{name} criou {date}", "status.history.created": "{name} criou {date}",
"status.history.edited": "{name} editou {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.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.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.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.read_more": "Ler mais",
"status.reblog": "Dar boost", "status.reblog": "Dar boost",
"status.reblog_or_quote": "Acelerar ou citar", "status.reblog_or_quote": "Acelerar ou citar",
"status.reblog_private": "Compartilhar novamente com seus seguidores", "status.reblog_private": "Compartilhar novamente com seus seguidores",
"status.reblogged_by": "{name} deu boost", "status.reblogged_by": "{name} deu boost",
"status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.", "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.redraft": "Excluir e rascunhar",
"status.remove_bookmark": "Remover do Salvos", "status.remove_bookmark": "Remover do Salvos",
"status.remove_favourite": "Remover dos favoritos", "status.remove_favourite": "Remover dos favoritos",

View File

@@ -131,11 +131,12 @@ class User < ApplicationRecord
delegate :can?, to: :role delegate :can?, to: :role
attr_reader :invite_code, :date_of_birth attr_reader :invite_code
attr_writer :current_account attr_writer :current_account
attribute :external, :boolean, default: false attribute :external, :boolean, default: false
attribute :bypass_registration_checks, :boolean, default: false attribute :bypass_registration_checks, :boolean, default: false
attribute :date_of_birth, :date
def self.those_who_can(*any_of_privileges) def self.those_who_can(*any_of_privileges)
matching_role_ids = UserRole.that_can(*any_of_privileges).map(&:id) matching_role_ids = UserRole.that_can(*any_of_privileges).map(&:id)
@@ -151,17 +152,6 @@ class User < ApplicationRecord
Rails.env.local? Rails.env.local?
end 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 def role
if role_id.nil? if role_id.nil?
UserRole.everyone UserRole.everyone

View File

@@ -819,6 +819,8 @@ fr-CA:
preamble: Fournissez des informations détaillées sur le fonctionnement, la modération et le financement du serveur. 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. rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer.
title: À propos title: À propos
allow_referrer_origin:
title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic
appearance: appearance:
preamble: Personnaliser l'interface web de Mastodon. preamble: Personnaliser l'interface web de Mastodon.
title: Apparence title: Apparence
@@ -857,7 +859,7 @@ fr-CA:
local_feed: Fil local local_feed: Fil local
trends: Tendances trends: Tendances
registrations: 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. preamble: Affecte qui peut créer un compte sur votre serveur.
title: Inscriptions title: Inscriptions
registrations_mode: registrations_mode:

View File

@@ -819,6 +819,8 @@ fr:
preamble: Fournissez des informations détaillées sur le fonctionnement, la modération et le financement du serveur. 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. rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer.
title: À propos title: À propos
allow_referrer_origin:
title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic
appearance: appearance:
preamble: Personnaliser l'interface web de Mastodon. preamble: Personnaliser l'interface web de Mastodon.
title: Apparence title: Apparence
@@ -857,7 +859,7 @@ fr:
local_feed: Fil local local_feed: Fil local
trends: Tendances trends: Tendances
registrations: 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. preamble: Affecte qui peut créer un compte sur votre serveur.
title: Inscriptions title: Inscriptions
registrations_mode: registrations_mode:

View File

@@ -222,7 +222,7 @@ ru:
enable_user: Разморозка пользователей enable_user: Разморозка пользователей
memorialize_account: Присвоение пользователям статуса «мемориала» memorialize_account: Присвоение пользователям статуса «мемориала»
promote_user: Повышение пользователей promote_user: Повышение пользователей
publish_terms_of_service: Опубликование пользовательского соглашения publish_terms_of_service: Публикация пользовательского соглашения
reject_appeal: Отклонение обжалований reject_appeal: Отклонение обжалований
reject_user: Отклонение регистраций reject_user: Отклонение регистраций
remove_avatar_user: Удаление аватаров remove_avatar_user: Удаление аватаров
@@ -1016,9 +1016,9 @@ ru:
draft: Черновик draft: Черновик
generate: Использовать шаблон generate: Использовать шаблон
generates: generates:
action: Генерировать action: Сгенерировать
chance_to_review_html: "<strong>Сгенерированное пользовательское соглашение не будет опубликовано автоматически.</strong> У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить." chance_to_review_html: "<strong>Сгенерированное пользовательское соглашение не будет опубликовано автоматически.</strong> У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить."
explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях, и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов. explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов.
title: Создание пользовательского соглашения title: Создание пользовательского соглашения
going_live_on_html: Вступило в силу с %{date} going_live_on_html: Вступило в силу с %{date}
history: История history: История
@@ -1028,8 +1028,8 @@ ru:
notified_on_html: 'Дата уведомления пользователей: %{date}' notified_on_html: 'Дата уведомления пользователей: %{date}'
notify_users: Уведомить пользователей notify_users: Уведомить пользователей
preview: preview:
explanation_html: 'Сообщение будет отравлено <strong>%{display_count} пользователям</strong>, которые зарегистрировались до %{date}. В теле письма будет указан следующий текст:' explanation_html: 'Сообщение будет отравлено <strong>%{display_count} пользователям</strong>, которые зарегистрировались до %{date}. Письмо будет содержать следующий текст:'
send_preview: Отправить предпросмотр на %{email} send_preview: Отправить тестовое уведомление на %{email}
send_to_all: send_to_all:
few: Отправить %{display_count} сообщения few: Отправить %{display_count} сообщения
many: Отправить %{display_count} сообщений many: Отправить %{display_count} сообщений
@@ -2031,7 +2031,7 @@ ru:
terms_of_service_interstitial: terms_of_service_interstitial:
past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением. past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением.
review_link: Посмотреть пользовательское соглашение review_link: Посмотреть пользовательское соглашение
title: Изменяется пользовательское соглашение %{domain} title: Изменяется пользовательское соглашение на сервере %{domain}
themes: themes:
contrast: Mastodon (высококонтрастная) contrast: Mastodon (высококонтрастная)
default: Mastodon (тёмная) default: Mastodon (тёмная)
@@ -2098,12 +2098,12 @@ ru:
title: Выполнен вход title: Выполнен вход
terms_of_service_changed: terms_of_service_changed:
agreement: Продолжая использовать %{domain}, вы соглашаетесь с этими условиями. Если вы не согласны с новыми условиями, вы в любой момент можете удалить вашу учётную запись на %{domain}. agreement: Продолжая использовать %{domain}, вы соглашаетесь с этими условиями. Если вы не согласны с новыми условиями, вы в любой момент можете удалить вашу учётную запись на %{domain}.
changelog: 'Вот что обновление условий будет значит для вас в общих чертах:' changelog: 'Вот что обновление условий будет значить для вас в общих чертах:'
description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:' description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение сервера %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:'
description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу <strong>%{date}</strong>. Рекомендуем вам ознакомиться с <a href="%{path}" target="_blank">обновлёнными условиями</a>. description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение сервера %{domain}. Эти изменения вступят в силу <strong>%{date}</strong>. Рекомендуем вам ознакомиться с <a href="%{path}" target="_blank">обновлёнными условиями</a>.
sign_off: Ваш %{domain} sign_off: Ваш %{domain}
subject: Обновления наших условий использования subject: Мы обновляем наше пользовательское соглашение
subtitle: На %{domain} изменилось пользовательское соглашение subtitle: Изменяется пользовательское соглашение на сервере %{domain}
title: Важное обновление title: Важное обновление
warning: warning:
appeal: Обжаловать appeal: Обжаловать

View File

@@ -347,9 +347,7 @@ ar:
jurisdiction: الاختصاص القانوني jurisdiction: الاختصاص القانوني
min_age: الحد الإدنى للعمر min_age: الحد الإدنى للعمر
user: user:
date_of_birth_1i: يوم
date_of_birth_2i: شهر date_of_birth_2i: شهر
date_of_birth_3i: سنة
role: الدور role: الدور
time_zone: النطاق الزمني time_zone: النطاق الزمني
user_role: user_role:

View File

@@ -374,9 +374,7 @@ be:
jurisdiction: Юрысдыкцыя jurisdiction: Юрысдыкцыя
min_age: Мінімальны ўзрост min_age: Мінімальны ўзрост
user: user:
date_of_birth_1i: Дзень
date_of_birth_2i: Месяц date_of_birth_2i: Месяц
date_of_birth_3i: Год
role: Роля role: Роля
time_zone: Часавы пояс time_zone: Часавы пояс
user_role: user_role:

View File

@@ -354,9 +354,7 @@ bg:
jurisdiction: Законова юрисдикция jurisdiction: Законова юрисдикция
min_age: Минимална възраст min_age: Минимална възраст
user: user:
date_of_birth_1i: Ден
date_of_birth_2i: Месец date_of_birth_2i: Месец
date_of_birth_3i: Година
role: Роля role: Роля
time_zone: Часова зона time_zone: Часова зона
user_role: user_role:

View File

@@ -109,9 +109,7 @@ br:
domain: Domani domain: Domani
jurisdiction: Barnadurezh jurisdiction: Barnadurezh
user: user:
date_of_birth_1i: Devezh
date_of_birth_2i: Mizvezh date_of_birth_2i: Mizvezh
date_of_birth_3i: Bloavezh
role: Roll role: Roll
time_zone: Gwerzhid eur time_zone: Gwerzhid eur
user_role: user_role:

View File

@@ -353,9 +353,7 @@ ca:
jurisdiction: Jurisdicció jurisdiction: Jurisdicció
min_age: Edat mínima min_age: Edat mínima
user: user:
date_of_birth_1i: Dia
date_of_birth_2i: Mes date_of_birth_2i: Mes
date_of_birth_3i: Any
role: Rol role: Rol
time_zone: Zona horària time_zone: Zona horària
user_role: user_role:

View File

@@ -374,9 +374,7 @@ cs:
jurisdiction: Právní příslušnost jurisdiction: Právní příslušnost
min_age: Věková hranice min_age: Věková hranice
user: user:
date_of_birth_1i: Den
date_of_birth_2i: Měsíc date_of_birth_2i: Měsíc
date_of_birth_3i: Rok
role: Role role: Role
time_zone: Časové pásmo time_zone: Časové pásmo
user_role: user_role:

View File

@@ -376,9 +376,7 @@ cy:
jurisdiction: Awdurdodaeth gyfreithiol jurisdiction: Awdurdodaeth gyfreithiol
min_age: Isafswm oedran min_age: Isafswm oedran
user: user:
date_of_birth_1i: Dydd
date_of_birth_2i: Mis date_of_birth_2i: Mis
date_of_birth_3i: Blwyddyn
role: Rôl role: Rôl
time_zone: Cylchfa amser time_zone: Cylchfa amser
user_role: user_role:

View File

@@ -372,9 +372,7 @@ da:
jurisdiction: Juridisk jurisdiktion jurisdiction: Juridisk jurisdiktion
min_age: Minimumsalder min_age: Minimumsalder
user: user:
date_of_birth_1i: Dag
date_of_birth_2i: Måned date_of_birth_2i: Måned
date_of_birth_3i: År
role: Rolle role: Rolle
time_zone: Tidszone time_zone: Tidszone
user_role: user_role:

View File

@@ -372,9 +372,7 @@ de:
jurisdiction: Gerichtsstand jurisdiction: Gerichtsstand
min_age: Mindestalter min_age: Mindestalter
user: user:
date_of_birth_1i: Tag
date_of_birth_2i: Monat date_of_birth_2i: Monat
date_of_birth_3i: Jahr
role: Rolle role: Rolle
time_zone: Zeitzone time_zone: Zeitzone
user_role: user_role:

View File

@@ -372,9 +372,7 @@ el:
jurisdiction: Νομική δικαιοδοσία jurisdiction: Νομική δικαιοδοσία
min_age: Ελάχιστη ηλικία min_age: Ελάχιστη ηλικία
user: user:
date_of_birth_1i: Ημέρα
date_of_birth_2i: Μήνας date_of_birth_2i: Μήνας
date_of_birth_3i: Έτος
role: Ρόλος role: Ρόλος
time_zone: Ζώνη ώρας time_zone: Ζώνη ώρας
user_role: user_role:

View File

@@ -346,9 +346,7 @@ en-GB:
jurisdiction: Legal jurisdiction jurisdiction: Legal jurisdiction
min_age: Minimum age min_age: Minimum age
user: user:
date_of_birth_1i: Day
date_of_birth_2i: Month date_of_birth_2i: Month
date_of_birth_3i: Year
role: Role role: Role
time_zone: Time Zone time_zone: Time Zone
user_role: user_role:

View File

@@ -372,9 +372,9 @@ en:
jurisdiction: Legal jurisdiction jurisdiction: Legal jurisdiction
min_age: Minimum age min_age: Minimum age
user: user:
date_of_birth_1i: Day date_of_birth_1i: Year
date_of_birth_2i: Month date_of_birth_2i: Month
date_of_birth_3i: Year date_of_birth_3i: Day
role: Role role: Role
time_zone: Time zone time_zone: Time zone
user_role: user_role:

View File

@@ -353,9 +353,7 @@ eo:
jurisdiction: Laŭleĝa jurisdikcio jurisdiction: Laŭleĝa jurisdikcio
min_age: Minimuma aĝo min_age: Minimuma aĝo
user: user:
date_of_birth_1i: Tago
date_of_birth_2i: Monato date_of_birth_2i: Monato
date_of_birth_3i: Jaro
role: Rolo role: Rolo
time_zone: Horzono time_zone: Horzono
user_role: user_role:

View File

@@ -372,9 +372,7 @@ es-AR:
jurisdiction: Jurisdicción legal jurisdiction: Jurisdicción legal
min_age: Edad mínima min_age: Edad mínima
user: user:
date_of_birth_1i: Día
date_of_birth_2i: Mes date_of_birth_2i: Mes
date_of_birth_3i: Año
role: Rol role: Rol
time_zone: Zona horaria time_zone: Zona horaria
user_role: user_role:

View File

@@ -372,9 +372,7 @@ es-MX:
jurisdiction: Jurisdicción legal jurisdiction: Jurisdicción legal
min_age: Edad mínima min_age: Edad mínima
user: user:
date_of_birth_1i: Día
date_of_birth_2i: Mes date_of_birth_2i: Mes
date_of_birth_3i: Año
role: Rol role: Rol
time_zone: Zona horaria time_zone: Zona horaria
user_role: user_role:

View File

@@ -372,9 +372,7 @@ es:
jurisdiction: Jurisdicción legal jurisdiction: Jurisdicción legal
min_age: Edad mínima min_age: Edad mínima
user: user:
date_of_birth_1i: Día
date_of_birth_2i: Mes date_of_birth_2i: Mes
date_of_birth_3i: Año
role: Rol role: Rol
time_zone: Zona horaria time_zone: Zona horaria
user_role: user_role:

View File

@@ -372,9 +372,7 @@ et:
jurisdiction: Jurisdiktsioon jurisdiction: Jurisdiktsioon
min_age: Vanuse alampiir min_age: Vanuse alampiir
user: user:
date_of_birth_1i: Päev
date_of_birth_2i: Kuu date_of_birth_2i: Kuu
date_of_birth_3i: Aasta
role: Roll role: Roll
time_zone: Ajavöönd time_zone: Ajavöönd
user_role: user_role:

View File

@@ -325,9 +325,7 @@ eu:
terms_of_service_generator: terms_of_service_generator:
domain: Domeinua domain: Domeinua
user: user:
date_of_birth_1i: Eguna
date_of_birth_2i: Hilabetea date_of_birth_2i: Hilabetea
date_of_birth_3i: Urtea
role: Rola role: Rola
time_zone: Ordu zona time_zone: Ordu zona
user_role: user_role:

View File

@@ -372,9 +372,7 @@ fa:
jurisdiction: صلاحیت قانونی jurisdiction: صلاحیت قانونی
min_age: کمینهٔ زمان min_age: کمینهٔ زمان
user: user:
date_of_birth_1i: روز
date_of_birth_2i: ماه date_of_birth_2i: ماه
date_of_birth_3i: سال
role: نقش role: نقش
time_zone: منطقهٔ زمانی time_zone: منطقهٔ زمانی
user_role: user_role:

View File

@@ -372,9 +372,7 @@ fi:
jurisdiction: Lainkäyttöalue jurisdiction: Lainkäyttöalue
min_age: Vähimmäisikä min_age: Vähimmäisikä
user: user:
date_of_birth_1i: Päivä
date_of_birth_2i: Kuukausi date_of_birth_2i: Kuukausi
date_of_birth_3i: Vuosi
role: Rooli role: Rooli
time_zone: Aikavyöhyke time_zone: Aikavyöhyke
user_role: user_role:

View File

@@ -372,9 +372,7 @@ fo:
jurisdiction: Løgdømi jurisdiction: Løgdømi
min_age: Lægsti aldur min_age: Lægsti aldur
user: user:
date_of_birth_1i: Dagur
date_of_birth_2i: Mánaði date_of_birth_2i: Mánaði
date_of_birth_3i: Ár
role: Leiklutur role: Leiklutur
time_zone: Tíðarsona time_zone: Tíðarsona
user_role: user_role:

View File

@@ -152,6 +152,8 @@ fr-CA:
name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge 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 à … 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 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: webhook:
events: Sélectionnez les événements à envoyer events: Sélectionnez les événements à envoyer
template: Écrivez votre propre bloc JSON avec la possibilité dutiliser de linterpolation de variables. Laissez vide pour le bloc JSON par défaut. template: Écrivez votre propre bloc JSON avec la possibilité dutiliser de linterpolation de variables. Laissez vide pour le bloc JSON par défaut.
@@ -353,9 +355,7 @@ fr-CA:
jurisdiction: Juridiction jurisdiction: Juridiction
min_age: Âge minimum min_age: Âge minimum
user: user:
date_of_birth_1i: Jour
date_of_birth_2i: Mois date_of_birth_2i: Mois
date_of_birth_3i: Année
role: Rôle role: Rôle
time_zone: Fuseau horaire time_zone: Fuseau horaire
user_role: user_role:

View File

@@ -152,6 +152,8 @@ fr:
name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge 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 à … 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 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: webhook:
events: Sélectionnez les événements à envoyer events: Sélectionnez les événements à envoyer
template: Écrivez votre propre bloc JSON avec la possibilité dutiliser de linterpolation de variables. Laissez vider pour utiliser le bloc JSON par défaut. template: Écrivez votre propre bloc JSON avec la possibilité dutiliser de linterpolation de variables. Laissez vider pour utiliser le bloc JSON par défaut.
@@ -353,9 +355,7 @@ fr:
jurisdiction: Juridiction jurisdiction: Juridiction
min_age: Âge minimum min_age: Âge minimum
user: user:
date_of_birth_1i: Jour
date_of_birth_2i: Mois date_of_birth_2i: Mois
date_of_birth_3i: Année
role: Rôle role: Rôle
time_zone: Fuseau horaire time_zone: Fuseau horaire
user_role: user_role:

View File

@@ -349,9 +349,7 @@ fy:
jurisdiction: Rjochtsgebiet jurisdiction: Rjochtsgebiet
min_age: Minimum leeftiid min_age: Minimum leeftiid
user: user:
date_of_birth_1i: Dei
date_of_birth_2i: Moanne date_of_birth_2i: Moanne
date_of_birth_3i: Jier
role: Rol role: Rol
time_zone: Tiidsône time_zone: Tiidsône
user_role: user_role:

View File

@@ -375,9 +375,7 @@ ga:
jurisdiction: Dlínse dhlíthiúil jurisdiction: Dlínse dhlíthiúil
min_age: Aois íosta min_age: Aois íosta
user: user:
date_of_birth_1i:
date_of_birth_2i: date_of_birth_2i:
date_of_birth_3i: Bliain
role: Ról role: Ról
time_zone: Crios ama time_zone: Crios ama
user_role: user_role:

View File

@@ -373,9 +373,7 @@ gd:
jurisdiction: Uachdranas laghail jurisdiction: Uachdranas laghail
min_age: An aois as lugha min_age: An aois as lugha
user: user:
date_of_birth_1i: Latha
date_of_birth_2i: Mìos date_of_birth_2i: Mìos
date_of_birth_3i: Bliadhna
role: Dreuchd role: Dreuchd
time_zone: Roinn-tìde time_zone: Roinn-tìde
user_role: user_role:

View File

@@ -372,9 +372,7 @@ gl:
jurisdiction: Xurisdición legal jurisdiction: Xurisdición legal
min_age: Idade mínima min_age: Idade mínima
user: user:
date_of_birth_1i: Día
date_of_birth_2i: Mes date_of_birth_2i: Mes
date_of_birth_3i: Ano
role: Rol role: Rol
time_zone: Fuso horario time_zone: Fuso horario
user_role: user_role:

View File

@@ -374,9 +374,7 @@ he:
jurisdiction: איזור השיפוט jurisdiction: איזור השיפוט
min_age: גיל מינימלי min_age: גיל מינימלי
user: user:
date_of_birth_1i: יום
date_of_birth_2i: חודש date_of_birth_2i: חודש
date_of_birth_3i: שנה
role: תפקיד role: תפקיד
time_zone: אזור זמן time_zone: אזור זמן
user_role: user_role:

View File

@@ -371,9 +371,7 @@ hu:
jurisdiction: Joghatóság jurisdiction: Joghatóság
min_age: Minimális életkor min_age: Minimális életkor
user: user:
date_of_birth_1i: Nap
date_of_birth_2i: Hónap date_of_birth_2i: Hónap
date_of_birth_3i: Év
role: Szerep role: Szerep
time_zone: Időzóna time_zone: Időzóna
user_role: user_role:

View File

@@ -370,9 +370,7 @@ ia:
jurisdiction: Jurisdiction jurisdiction: Jurisdiction
min_age: Etate minime min_age: Etate minime
user: user:
date_of_birth_1i: Die
date_of_birth_2i: Mense date_of_birth_2i: Mense
date_of_birth_3i: Anno
role: Rolo role: Rolo
time_zone: Fuso horari time_zone: Fuso horari
user_role: user_role:

View File

@@ -372,9 +372,7 @@ is:
jurisdiction: Lögsagnarumdæmi jurisdiction: Lögsagnarumdæmi
min_age: Lágmarksaldur min_age: Lágmarksaldur
user: user:
date_of_birth_1i: Dagur
date_of_birth_2i: Mánuður date_of_birth_2i: Mánuður
date_of_birth_3i: Ár
role: Hlutverk role: Hlutverk
time_zone: Tímabelti time_zone: Tímabelti
user_role: user_role:

View File

@@ -372,9 +372,7 @@ it:
jurisdiction: Giurisdizione legale jurisdiction: Giurisdizione legale
min_age: Età minima min_age: Età minima
user: user:
date_of_birth_1i: Giorno
date_of_birth_2i: Mese date_of_birth_2i: Mese
date_of_birth_3i: Anno
role: Ruolo role: Ruolo
time_zone: Fuso orario time_zone: Fuso orario
user_role: user_role:

View File

@@ -348,9 +348,7 @@ ja:
jurisdiction: 裁判管轄 jurisdiction: 裁判管轄
min_age: 登録可能な最低年齢 min_age: 登録可能な最低年齢
user: user:
date_of_birth_1i:
date_of_birth_2i: date_of_birth_2i:
date_of_birth_3i:
role: ロール role: ロール
time_zone: タイムゾーン time_zone: タイムゾーン
user_role: user_role:

View File

@@ -158,9 +158,7 @@ kab:
terms_of_service_generator: terms_of_service_generator:
domain: Taɣult domain: Taɣult
user: user:
date_of_birth_1i: Ass
date_of_birth_2i: Ayyur date_of_birth_2i: Ayyur
date_of_birth_3i: Aseggas
role: Tamlilt role: Tamlilt
time_zone: Tamnaḍt tasragant time_zone: Tamnaḍt tasragant
user_role: user_role:

View File

@@ -78,6 +78,7 @@ ko:
featured_tag: featured_tag:
name: '이것들은 최근에 많이 쓰인 해시태그들입니다:' name: '이것들은 최근에 많이 쓰인 해시태그들입니다:'
filters: filters:
action: 게시물이 필터에 걸러질 때 어떤 동작을 수행할 지 고르세요
actions: actions:
blur: 텍스트는 숨기지 않고 그대로 둔 채 경고 뒤에 미디어를 숨김니다 blur: 텍스트는 숨기지 않고 그대로 둔 채 경고 뒤에 미디어를 숨김니다
hide: 필터에 걸러진 글을 처음부터 없었던 것처럼 완전히 가리기 hide: 필터에 걸러진 글을 처음부터 없었던 것처럼 완전히 가리기
@@ -366,9 +367,7 @@ ko:
jurisdiction: 법적 관할권 jurisdiction: 법적 관할권
min_age: 최소 연령 min_age: 최소 연령
user: user:
date_of_birth_1i:
date_of_birth_2i: date_of_birth_2i:
date_of_birth_3i:
role: 역할 role: 역할
time_zone: 시간대 time_zone: 시간대
user_role: user_role:

View File

@@ -313,9 +313,7 @@ lad:
domain: Domeno domain: Domeno
min_age: Edad minima min_age: Edad minima
user: user:
date_of_birth_1i: Diya
date_of_birth_2i: Mez date_of_birth_2i: Mez
date_of_birth_3i: Anyo
role: Rolo role: Rolo
time_zone: Zona de tiempo time_zone: Zona de tiempo
user_role: user_role:

View File

@@ -246,9 +246,7 @@ lt:
jurisdiction: Teisinis teismingumas jurisdiction: Teisinis teismingumas
min_age: Mažiausias amžius min_age: Mažiausias amžius
user: user:
date_of_birth_1i: Diena
date_of_birth_2i: Mėnuo date_of_birth_2i: Mėnuo
date_of_birth_3i: Metai
role: Vaidmuo role: Vaidmuo
time_zone: Laiko juosta time_zone: Laiko juosta
user_role: user_role:

View File

@@ -335,9 +335,7 @@ lv:
domain: Domēna vārds domain: Domēna vārds
min_age: Mazākais pieļaujamais vecums min_age: Mazākais pieļaujamais vecums
user: user:
date_of_birth_1i: Diena
date_of_birth_2i: Mēnesis date_of_birth_2i: Mēnesis
date_of_birth_3i: Gads
role: Loma role: Loma
time_zone: Laika josla time_zone: Laika josla
user_role: user_role:

View File

@@ -372,9 +372,7 @@ nl:
jurisdiction: Jurisdictie jurisdiction: Jurisdictie
min_age: Minimumleeftijd min_age: Minimumleeftijd
user: user:
date_of_birth_1i: Dag
date_of_birth_2i: Maand date_of_birth_2i: Maand
date_of_birth_3i: Jaar
role: Rol role: Rol
time_zone: Tijdzone time_zone: Tijdzone
user_role: user_role:

View File

@@ -372,9 +372,7 @@ nn:
jurisdiction: Rettskrins jurisdiction: Rettskrins
min_age: Minstealder min_age: Minstealder
user: user:
date_of_birth_1i: Dag
date_of_birth_2i: Månad date_of_birth_2i: Månad
date_of_birth_3i: År
role: Rolle role: Rolle
time_zone: Tidssone time_zone: Tidssone
user_role: user_role:

View File

@@ -370,9 +370,7 @@ pl:
jurisdiction: Jurysdykcja jurisdiction: Jurysdykcja
min_age: Wiek minimalny min_age: Wiek minimalny
user: user:
date_of_birth_1i: Dzień
date_of_birth_2i: Miesiąc date_of_birth_2i: Miesiąc
date_of_birth_3i: Rok
role: Rola role: Rola
time_zone: Strefa czasowa time_zone: Strefa czasowa
user_role: user_role:

View File

@@ -372,9 +372,7 @@ pt-BR:
jurisdiction: Jurisdição legal jurisdiction: Jurisdição legal
min_age: Idade mínima min_age: Idade mínima
user: user:
date_of_birth_1i: Dia
date_of_birth_2i: Mês date_of_birth_2i: Mês
date_of_birth_3i: Ano
role: Cargo role: Cargo
time_zone: Fuso horário time_zone: Fuso horário
user_role: user_role:

View File

@@ -372,9 +372,7 @@ pt-PT:
jurisdiction: Jurisdição legal jurisdiction: Jurisdição legal
min_age: Idade mínima min_age: Idade mínima
user: user:
date_of_birth_1i: Dia
date_of_birth_2i: Mês date_of_birth_2i: Mês
date_of_birth_3i: Ano
role: Função role: Função
time_zone: Fuso horário time_zone: Fuso horário
user_role: user_role:

View File

@@ -82,6 +82,7 @@ ru:
activity_api_enabled: Еженедельная выгрузка количества локальных постов, активных пользователей и новых регистраций activity_api_enabled: Еженедельная выгрузка количества локальных постов, активных пользователей и новых регистраций
app_icon: WEBP, PNG, GIF или JPG. Заменяет значок приложения на мобильных устройствах по умолчанию вашим значком. app_icon: WEBP, PNG, GIF или JPG. Заменяет значок приложения на мобильных устройствах по умолчанию вашим значком.
backups_retention_period: Пользователи могут запустить создание архива своих постов, чтобы скачать его позже. Если задать положительное значение, эти архивы будут автоматически удалены с вашего хранилища через указанное число дней. backups_retention_period: Пользователи могут запустить создание архива своих постов, чтобы скачать его позже. Если задать положительное значение, эти архивы будут автоматически удалены с вашего хранилища через указанное число дней.
bootstrap_timeline_accounts: Эти учётные записи будут закреплены в начале списка рекомендуемых профилей для новых пользователей. Список учётных записей нужно вводить через запятую.
closed_registrations_message: Отображается, когда регистрация закрыта closed_registrations_message: Отображается, когда регистрация закрыта
content_cache_retention_period: Все сообщения с других серверов (включая бусты и ответы) будут удалены через указанное количество дней, независимо от того, как локальный пользователь взаимодействовал с этими сообщениями. Это касается и тех сообщений, которые локальный пользователь пометил в закладки или избранное. Приватные упоминания между пользователями из разных инстансов также будут потеряны и не смогут быть восстановлены. Использование этой настройки предназначено для экземпляров специального назначения и нарушает многие ожидания пользователей при использовании в общих целях. content_cache_retention_period: Все сообщения с других серверов (включая бусты и ответы) будут удалены через указанное количество дней, независимо от того, как локальный пользователь взаимодействовал с этими сообщениями. Это касается и тех сообщений, которые локальный пользователь пометил в закладки или избранное. Приватные упоминания между пользователями из разных инстансов также будут потеряны и не смогут быть восстановлены. Использование этой настройки предназначено для экземпляров специального назначения и нарушает многие ожидания пользователей при использовании в общих целях.
custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon. custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon.
@@ -138,12 +139,12 @@ ru:
admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов. admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов.
arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты. arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты.
arbitration_website: Веб-форма или «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_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа.
dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше. dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше.
domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс. domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс.
jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо. jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо.
min_age: Не меньше минимального возраста, требуемого по закону в вашей юрисдикции. min_age: Не меньше минимального возраста, требуемого по закону в вашей стране.
user: user:
chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку
date_of_birth: date_of_birth:
@@ -350,17 +351,15 @@ ru:
terms_of_service_generator: terms_of_service_generator:
admin_email: Адрес электронной почты для юридических уведомлений admin_email: Адрес электронной почты для юридических уведомлений
arbitration_address: Почтовый адрес для уведомлений об арбитраже arbitration_address: Почтовый адрес для уведомлений об арбитраже
arbitration_website: Вебсайт для подачи уведомления об арбитраже arbitration_website: Веб-сайт для подачи уведомления об арбитраже
choice_of_law: Юрисдикция choice_of_law: Выбор права
dmca_address: Почтовый адрес для обращений правообладателей dmca_address: Почтовый адрес для обращений правообладателей
dmca_email: Адрес электронной почты для обращений правообладателей dmca_email: Адрес электронной почты для обращений правообладателей
domain: Доменное имя domain: Доменное имя
jurisdiction: Юрисдикция jurisdiction: Юрисдикция
min_age: Минимальный возраст min_age: Минимальный возраст
user: user:
date_of_birth_1i: День
date_of_birth_2i: Месяц date_of_birth_2i: Месяц
date_of_birth_3i: Год
role: Роль role: Роль
time_zone: Часовой пояс time_zone: Часовой пояс
user_role: user_role:

View File

@@ -344,9 +344,7 @@ si:
jurisdiction: නීතිමය අධිකරණ බලය jurisdiction: නීතිමය අධිකරණ බලය
min_age: අවම වයස min_age: අවම වයස
user: user:
date_of_birth_1i: දහවල
date_of_birth_2i: මාසය date_of_birth_2i: මාසය
date_of_birth_3i: වර්ෂය
role: භූමිකාව role: භූමිකාව
time_zone: වේලා කලාපය time_zone: වේලා කලාපය
user_role: user_role:

View File

@@ -340,9 +340,7 @@ sl:
jurisdiction: Pravna pristojnost jurisdiction: Pravna pristojnost
min_age: Najmanjša starost min_age: Najmanjša starost
user: user:
date_of_birth_1i: Dan
date_of_birth_2i: Mesec date_of_birth_2i: Mesec
date_of_birth_3i: Leto
role: Vloga role: Vloga
time_zone: Časovni pas time_zone: Časovni pas
user_role: user_role:

View File

@@ -371,9 +371,7 @@ sq:
jurisdiction: Juridiksion ligjor jurisdiction: Juridiksion ligjor
min_age: Mosha minimale min_age: Mosha minimale
user: user:
date_of_birth_1i: Ditë
date_of_birth_2i: Muaj date_of_birth_2i: Muaj
date_of_birth_3i: Vit
role: Rol role: Rol
time_zone: Zonë kohore time_zone: Zonë kohore
user_role: user_role:

View File

@@ -354,9 +354,7 @@ sv:
jurisdiction: Rättslig jurisdiktion jurisdiction: Rättslig jurisdiktion
min_age: Minimiålder min_age: Minimiålder
user: user:
date_of_birth_1i: Dag
date_of_birth_2i: Månad date_of_birth_2i: Månad
date_of_birth_3i: År
role: Roll role: Roll
time_zone: Tidszon time_zone: Tidszon
user_role: user_role:

View File

@@ -314,9 +314,7 @@ th:
terms_of_service_generator: terms_of_service_generator:
domain: โดเมน domain: โดเมน
user: user:
date_of_birth_1i: วัน
date_of_birth_2i: เดือน date_of_birth_2i: เดือน
date_of_birth_3i: ปี
role: บทบาท role: บทบาท
time_zone: โซนเวลา time_zone: โซนเวลา
user_role: user_role:

View File

@@ -372,9 +372,7 @@ tr:
jurisdiction: Yasal yetki alanı jurisdiction: Yasal yetki alanı
min_age: Minimum yaş min_age: Minimum yaş
user: user:
date_of_birth_1i: Gün
date_of_birth_2i: Ay date_of_birth_2i: Ay
date_of_birth_3i: Yıl
role: Rol role: Rol
time_zone: Zaman dilimi time_zone: Zaman dilimi
user_role: user_role:

View File

@@ -342,9 +342,7 @@ uk:
jurisdiction: Правова юрисдикція jurisdiction: Правова юрисдикція
min_age: Мінімальний вік min_age: Мінімальний вік
user: user:
date_of_birth_1i: День
date_of_birth_2i: Місяць date_of_birth_2i: Місяць
date_of_birth_3i: Рік
role: Роль role: Роль
time_zone: Часовий пояс time_zone: Часовий пояс
user_role: user_role:

View File

@@ -371,9 +371,7 @@ vi:
jurisdiction: Quyền tài phán pháp lý jurisdiction: Quyền tài phán pháp lý
min_age: Độ tuổi tối thiểu min_age: Độ tuổi tối thiểu
user: user:
date_of_birth_1i: Ngày
date_of_birth_2i: Tháng date_of_birth_2i: Tháng
date_of_birth_3i: Năm
role: Vai trò role: Vai trò
time_zone: Múi giờ time_zone: Múi giờ
user_role: user_role:

View File

@@ -371,9 +371,7 @@ zh-CN:
jurisdiction: 法律管辖区 jurisdiction: 法律管辖区
min_age: 最低年龄 min_age: 最低年龄
user: user:
date_of_birth_1i:
date_of_birth_2i: date_of_birth_2i:
date_of_birth_3i:
role: 角色 role: 角色
time_zone: 时区 time_zone: 时区
user_role: user_role:

View File

@@ -305,9 +305,7 @@ zh-HK:
terms_of_service_generator: terms_of_service_generator:
domain: 域名 domain: 域名
user: user:
date_of_birth_1i:
date_of_birth_2i: date_of_birth_2i:
date_of_birth_3i:
role: 角色 role: 角色
time_zone: 時區 time_zone: 時區
user_role: user_role:

View File

@@ -371,9 +371,7 @@ zh-TW:
jurisdiction: 司法管轄區 jurisdiction: 司法管轄區
min_age: 最低年齡 min_age: 最低年齡
user: user:
date_of_birth_1i:
date_of_birth_2i: date_of_birth_2i:
date_of_birth_3i:
role: 角色 role: 角色
time_zone: 時區 time_zone: 時區
user_role: user_role:

View File

@@ -59,7 +59,7 @@ services:
web: web:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
# build: . # build: .
image: ghcr.io/glitch-soc/mastodon:v4.5.0 image: ghcr.io/glitch-soc/mastodon:v4.5.1
restart: always restart: always
env_file: .env.production env_file: .env.production
command: bundle exec puma -C config/puma.rb command: bundle exec puma -C config/puma.rb
@@ -83,7 +83,7 @@ services:
# build: # build:
# dockerfile: ./streaming/Dockerfile # dockerfile: ./streaming/Dockerfile
# context: . # context: .
image: ghcr.io/glitch-soc/mastodon-streaming:v4.5.0 image: ghcr.io/glitch-soc/mastodon-streaming:v4.5.1
restart: always restart: always
env_file: .env.production env_file: .env.production
command: node ./streaming/index.js command: node ./streaming/index.js
@@ -102,7 +102,7 @@ services:
sidekiq: sidekiq:
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
# build: . # build: .
image: ghcr.io/glitch-soc/mastodon:v4.5.0 image: ghcr.io/glitch-soc/mastodon:v4.5.1
restart: always restart: always
env_file: .env.production env_file: .env.production
command: bundle exec sidekiq command: bundle exec sidekiq
@@ -115,7 +115,7 @@ services:
volumes: volumes:
- ./public/system:/mastodon/public/system - ./public/system:/mastodon/public/system
healthcheck: 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 ## Uncomment to enable federation with tor instances along with adding the following ENV variables
## http_hidden_proxy=http://privoxy:8118 ## http_hidden_proxy=http://privoxy:8118

View File

@@ -107,6 +107,7 @@ module ViteRails::TagHelpers::IntegrityExtension
stylesheet, stylesheet,
integrity: vite_manifest.integrity_hash_for_file(stylesheet), integrity: vite_manifest.integrity_hash_for_file(stylesheet),
media: media, media: media,
crossorigin: crossorigin,
**options **options
) )
end end

View File

@@ -67,6 +67,7 @@
"core-js": "^3.30.2", "core-js": "^3.30.2",
"cross-env": "^10.0.0", "cross-env": "^10.0.0",
"debug": "^4.4.1", "debug": "^4.4.1",
"delegated-events": "^1.1.2",
"detect-passive-events": "^2.0.3", "detect-passive-events": "^2.0.3",
"emoji-mart": "npm:emoji-mart-lazyload@latest", "emoji-mart": "npm:emoji-mart-lazyload@latest",
"emojibase": "^16.0.0", "emojibase": "^16.0.0",

View File

@@ -2765,6 +2765,7 @@ __metadata:
core-js: "npm:^3.30.2" core-js: "npm:^3.30.2"
cross-env: "npm:^10.0.0" cross-env: "npm:^10.0.0"
debug: "npm:^4.4.1" debug: "npm:^4.4.1"
delegated-events: "npm:^1.1.2"
detect-passive-events: "npm:^2.0.3" detect-passive-events: "npm:^2.0.3"
emoji-mart: "npm:emoji-mart-lazyload@latest" emoji-mart: "npm:emoji-mart-lazyload@latest"
emojibase: "npm:^16.0.0" emojibase: "npm:^16.0.0"
@@ -6397,6 +6398,15 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "denque@npm:^2.1.0":
version: 2.1.0 version: 2.1.0
resolution: "denque@npm:2.1.0" resolution: "denque@npm:2.1.0"
@@ -8881,13 +8891,13 @@ __metadata:
linkType: hard linkType: hard
"js-yaml@npm:^4.1.0": "js-yaml@npm:^4.1.0":
version: 4.1.0 version: 4.1.1
resolution: "js-yaml@npm:4.1.0" resolution: "js-yaml@npm:4.1.1"
dependencies: dependencies:
argparse: "npm:^2.0.1" argparse: "npm:^2.0.1"
bin: bin:
js-yaml: bin/js-yaml.js js-yaml: bin/js-yaml.js
checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7
languageName: node languageName: node
linkType: hard linkType: hard
@@ -12169,6 +12179,13 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "semver@npm:^5.6.0":
version: 5.7.2 version: 5.7.2
resolution: "semver@npm:5.7.2" resolution: "semver@npm:5.7.2"