mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-12-20 05:41:36 +00:00
Merge commit 'c87b05282909383353a9561e97b9f18a2db0766d' into glitch-soc/merge-upstream
This commit is contained in:
15
CHANGELOG.md
15
CHANGELOG.md
@@ -2,6 +2,21 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [4.5.1] - 2025-11-13
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fix Cmd/Ctrl + Enter not submitting Alt text modal on some browsers (#36866 by @diondiondion)
|
||||
- Fix posts coming from public/hashtag streaming being marked as unquotable (#36860 and #36869 by @ClearlyClaire)
|
||||
- Fix old previously-undiscovered posts being treated as new when receiving an `Update` (#36848 by @ClearlyClaire)
|
||||
- Fix blank screen in browsers that don't support `Intl.DisplayNames` (#36847 by @diondiondion)
|
||||
- Fix filters not being applied to quotes in detailed view (#36843 by @ClearlyClaire)
|
||||
- Fix scroll shift caused by fetch-all-replies alerts (#36807 by @diondiondion)
|
||||
- Fix dropdown menu not focusing first item when opened via keyboard (#36804 by @diondiondion)
|
||||
- Fix assets build issue on arch64 (#36781 by @ClearlyClaire)
|
||||
- Fix `/api/v1/statuses/:id/context` sometimes returing `Mastodon-Async-Refresh` without `result_count` (#36779 by @ClearlyClaire)
|
||||
- Fix prepared quote not being discarded with contents when replying (#36778 by @ClearlyClaire)
|
||||
|
||||
## [4.5.0] - 2025-11-06
|
||||
|
||||
### Added
|
||||
|
||||
@@ -96,8 +96,8 @@ GEM
|
||||
ast (2.4.3)
|
||||
attr_required (1.0.2)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1180.0)
|
||||
aws-sdk-core (3.236.0)
|
||||
aws-partitions (1.1181.0)
|
||||
aws-sdk-core (3.237.0)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
@@ -608,7 +608,7 @@ GEM
|
||||
premailer (~> 1.7, >= 1.7.9)
|
||||
prettyprint (0.2.0)
|
||||
prism (1.6.0)
|
||||
prometheus_exporter (2.3.0)
|
||||
prometheus_exporter (2.3.1)
|
||||
webrick
|
||||
propshaft (1.3.1)
|
||||
actionpack (>= 7.0.0)
|
||||
@@ -838,7 +838,7 @@ GEM
|
||||
stackprof (0.2.27)
|
||||
starry (0.2.0)
|
||||
base64
|
||||
stoplight (5.5.0)
|
||||
stoplight (5.6.0)
|
||||
zeitwerk
|
||||
stringio (3.1.7)
|
||||
strong_migrations (2.5.1)
|
||||
|
||||
@@ -2,25 +2,25 @@
|
||||
|
||||
class DateOfBirthInput < SimpleForm::Inputs::Base
|
||||
OPTIONS = [
|
||||
{ autocomplete: 'bday-day', maxlength: 2, pattern: '[0-9]+', placeholder: 'DD' }.freeze,
|
||||
{ autocomplete: 'bday-month', maxlength: 2, pattern: '[0-9]+', placeholder: 'MM' }.freeze,
|
||||
{ autocomplete: 'bday-year', maxlength: 4, pattern: '[0-9]+', placeholder: 'YYYY' }.freeze,
|
||||
{ autocomplete: 'bday-month', maxlength: 2, pattern: '[0-9]+', placeholder: 'MM' }.freeze,
|
||||
{ autocomplete: 'bday-day', maxlength: 2, pattern: '[0-9]+', placeholder: 'DD' }.freeze,
|
||||
].freeze
|
||||
|
||||
def input(wrapper_options = nil)
|
||||
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
|
||||
merged_input_options[:inputmode] = 'numeric'
|
||||
|
||||
values = (object.public_send(attribute_name) || '').split('.')
|
||||
values = (object.public_send(attribute_name) || '').to_s.split('-')
|
||||
|
||||
safe_join(Array.new(3) do |index|
|
||||
safe_join(2.downto(0).map do |index|
|
||||
options = merged_input_options.merge(OPTIONS[index]).merge id: generate_id(index), 'aria-label': I18n.t("simple_form.labels.user.date_of_birth_#{index + 1}i"), value: values[index]
|
||||
@builder.text_field("#{attribute_name}(#{index + 1}i)", options)
|
||||
end)
|
||||
end
|
||||
|
||||
def label_target
|
||||
"#{attribute_name}_1i"
|
||||
"#{attribute_name}_3i"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { createRoot } from 'react-dom/client';
|
||||
|
||||
import Rails from '@rails/ujs';
|
||||
import { decode, ValidationError } from 'blurhash';
|
||||
import { on } from 'delegated-events';
|
||||
|
||||
import ready from '../mastodon/ready';
|
||||
|
||||
@@ -24,10 +24,9 @@ const setAnnouncementEndsAttributes = (target: HTMLInputElement) => {
|
||||
}
|
||||
};
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'input[type="datetime-local"]#announcement_starts_at',
|
||||
on(
|
||||
'change',
|
||||
'input[type="datetime-local"]#announcement_starts_at',
|
||||
({ target }) => {
|
||||
if (target instanceof HTMLInputElement)
|
||||
setAnnouncementEndsAttributes(target);
|
||||
@@ -63,7 +62,7 @@ const hideSelectAll = () => {
|
||||
if (hiddenField) hiddenField.value = '0';
|
||||
};
|
||||
|
||||
Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
|
||||
on('change', '#batch_checkbox_all', ({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement)) return;
|
||||
|
||||
const selectAllMatchingElement = document.querySelector(
|
||||
@@ -85,7 +84,7 @@ Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
|
||||
}
|
||||
});
|
||||
|
||||
Rails.delegate(document, '.batch-table__select-all button', 'click', () => {
|
||||
on('click', '.batch-table__select-all button', () => {
|
||||
const hiddenField = document.querySelector<HTMLInputElement>(
|
||||
'#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>(
|
||||
'input#batch_checkbox_all',
|
||||
);
|
||||
@@ -140,14 +139,9 @@ Rails.delegate(document, batchCheckboxClassName, 'change', () => {
|
||||
}
|
||||
});
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'.filter-subset--with-select select',
|
||||
'change',
|
||||
({ target }) => {
|
||||
if (target instanceof HTMLSelectElement) target.form?.submit();
|
||||
},
|
||||
);
|
||||
on('change', '.filter-subset--with-select select', ({ target }) => {
|
||||
if (target instanceof HTMLSelectElement) target.form?.submit();
|
||||
});
|
||||
|
||||
const onDomainBlockSeverityChange = (target: HTMLSelectElement) => {
|
||||
const rejectMediaDiv = document.querySelector(
|
||||
@@ -168,11 +162,11 @@ const onDomainBlockSeverityChange = (target: HTMLSelectElement) => {
|
||||
}
|
||||
};
|
||||
|
||||
Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => {
|
||||
on('change', '#domain_block_severity', ({ target }) => {
|
||||
if (target instanceof HTMLSelectElement) onDomainBlockSeverityChange(target);
|
||||
});
|
||||
|
||||
const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => {
|
||||
function onEnableBootstrapTimelineAccountsChange(target: HTMLInputElement) {
|
||||
const bootstrapTimelineAccountsField =
|
||||
document.querySelector<HTMLInputElement>(
|
||||
'#form_admin_settings_bootstrap_timeline_accounts',
|
||||
@@ -194,12 +188,11 @@ const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => {
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'#form_admin_settings_enable_bootstrap_timeline_accounts',
|
||||
on(
|
||||
'change',
|
||||
'#form_admin_settings_enable_bootstrap_timeline_accounts',
|
||||
({ target }) => {
|
||||
if (target instanceof HTMLInputElement)
|
||||
onEnableBootstrapTimelineAccountsChange(target);
|
||||
@@ -239,11 +232,11 @@ const onChangeRegistrationMode = (target: HTMLSelectElement) => {
|
||||
});
|
||||
};
|
||||
|
||||
const convertUTCDateTimeToLocal = (value: string) => {
|
||||
function convertUTCDateTimeToLocal(value: string) {
|
||||
const date = new Date(value + 'Z');
|
||||
const twoChars = (x: number) => x.toString().padStart(2, '0');
|
||||
return `${date.getFullYear()}-${twoChars(date.getMonth() + 1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`;
|
||||
};
|
||||
}
|
||||
|
||||
function convertLocalDatetimeToUTC(value: string) {
|
||||
const date = new Date(value);
|
||||
@@ -251,14 +244,9 @@ function convertLocalDatetimeToUTC(value: string) {
|
||||
return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6);
|
||||
}
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'#form_admin_settings_registrations_mode',
|
||||
'change',
|
||||
({ target }) => {
|
||||
if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target);
|
||||
},
|
||||
);
|
||||
on('change', '#form_admin_settings_registrations_mode', ({ target }) => {
|
||||
if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target);
|
||||
});
|
||||
|
||||
async function mountReactComponent(element: Element) {
|
||||
const componentName = element.getAttribute('data-admin-component');
|
||||
@@ -305,7 +293,7 @@ ready(() => {
|
||||
if (registrationMode) onChangeRegistrationMode(registrationMode);
|
||||
|
||||
const checkAllElement = document.querySelector<HTMLInputElement>(
|
||||
'input#batch_checkbox_all',
|
||||
'#batch_checkbox_all',
|
||||
);
|
||||
if (checkAllElement) {
|
||||
const allCheckboxes = Array.from(
|
||||
@@ -318,7 +306,7 @@ ready(() => {
|
||||
}
|
||||
|
||||
document
|
||||
.querySelector('a#add-instance-button')
|
||||
.querySelector<HTMLAnchorElement>('a#add-instance-button')
|
||||
?.addEventListener('click', (e) => {
|
||||
const domain = document.querySelector<HTMLInputElement>(
|
||||
'input[type="text"]#by_domain',
|
||||
@@ -342,7 +330,7 @@ ready(() => {
|
||||
}
|
||||
});
|
||||
|
||||
Rails.delegate(document, 'form', 'submit', ({ target }) => {
|
||||
on('submit', 'form', ({ target }) => {
|
||||
if (target instanceof HTMLFormElement)
|
||||
target
|
||||
.querySelectorAll<HTMLInputElement>('input[type="datetime-local"]')
|
||||
|
||||
@@ -4,8 +4,8 @@ import { IntlMessageFormat } from 'intl-messageformat';
|
||||
import type { MessageDescriptor, PrimitiveType } from 'react-intl';
|
||||
import { defineMessages } from 'react-intl';
|
||||
|
||||
import Rails from '@rails/ujs';
|
||||
import axios from 'axios';
|
||||
import { on } from 'delegated-events';
|
||||
import { throttle } from 'lodash';
|
||||
|
||||
import { timeAgoString } from '../mastodon/components/relative_timestamp';
|
||||
@@ -175,10 +175,9 @@ function loaded() {
|
||||
});
|
||||
}
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'input#user_account_attributes_username',
|
||||
on(
|
||||
'input',
|
||||
'input#user_account_attributes_username',
|
||||
throttle(
|
||||
({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement)) return;
|
||||
@@ -202,60 +201,47 @@ function loaded() {
|
||||
),
|
||||
);
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'#user_password,#user_password_confirmation',
|
||||
'input',
|
||||
() => {
|
||||
const password = document.querySelector<HTMLInputElement>(
|
||||
'input#user_password',
|
||||
);
|
||||
const confirmation = document.querySelector<HTMLInputElement>(
|
||||
'input#user_password_confirmation',
|
||||
);
|
||||
if (!confirmation || !password) return;
|
||||
on('input', '#user_password,#user_password_confirmation', () => {
|
||||
const password = document.querySelector<HTMLInputElement>(
|
||||
'input#user_password',
|
||||
);
|
||||
const confirmation = document.querySelector<HTMLInputElement>(
|
||||
'input#user_password_confirmation',
|
||||
);
|
||||
if (!confirmation || !password) return;
|
||||
|
||||
if (
|
||||
confirmation.value &&
|
||||
confirmation.value.length > password.maxLength
|
||||
) {
|
||||
confirmation.setCustomValidity(
|
||||
formatMessage(messages.passwordExceedsLength),
|
||||
);
|
||||
} else if (password.value && password.value !== confirmation.value) {
|
||||
confirmation.setCustomValidity(
|
||||
formatMessage(messages.passwordDoesNotMatch),
|
||||
);
|
||||
} else {
|
||||
confirmation.setCustomValidity('');
|
||||
}
|
||||
},
|
||||
);
|
||||
if (confirmation.value && confirmation.value.length > password.maxLength) {
|
||||
confirmation.setCustomValidity(
|
||||
formatMessage(messages.passwordExceedsLength),
|
||||
);
|
||||
} else if (password.value && password.value !== confirmation.value) {
|
||||
confirmation.setCustomValidity(
|
||||
formatMessage(messages.passwordDoesNotMatch),
|
||||
);
|
||||
} else {
|
||||
confirmation.setCustomValidity('');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'#edit_profile input[type=file]',
|
||||
'change',
|
||||
({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement)) return;
|
||||
on('change', '#edit_profile input[type=file]', ({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement)) return;
|
||||
|
||||
const avatar = document.querySelector<HTMLImageElement>(
|
||||
`img#${target.id}-preview`,
|
||||
);
|
||||
const avatar = document.querySelector<HTMLImageElement>(
|
||||
`img#${target.id}-preview`,
|
||||
);
|
||||
|
||||
if (!avatar) return;
|
||||
if (!avatar) return;
|
||||
|
||||
let file: File | undefined;
|
||||
if (target.files) file = target.files[0];
|
||||
let file: File | undefined;
|
||||
if (target.files) file = target.files[0];
|
||||
|
||||
const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
|
||||
const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
|
||||
|
||||
if (url) avatar.src = url;
|
||||
},
|
||||
);
|
||||
if (url) avatar.src = url;
|
||||
});
|
||||
|
||||
Rails.delegate(document, '.input-copy input', 'click', ({ target }) => {
|
||||
on('click', '.input-copy input', ({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement)) return;
|
||||
|
||||
target.focus();
|
||||
@@ -263,7 +249,7 @@ Rails.delegate(document, '.input-copy input', 'click', ({ target }) => {
|
||||
target.setSelectionRange(0, target.value.length);
|
||||
});
|
||||
|
||||
Rails.delegate(document, '.input-copy button', 'click', ({ target }) => {
|
||||
on('click', '.input-copy button', ({ target }) => {
|
||||
if (!(target instanceof HTMLButtonElement)) return;
|
||||
|
||||
const input = target.parentNode?.querySelector<HTMLInputElement>(
|
||||
@@ -312,22 +298,22 @@ const toggleSidebar = () => {
|
||||
sidebar.classList.toggle('visible');
|
||||
};
|
||||
|
||||
Rails.delegate(document, '.sidebar__toggle__icon', 'click', () => {
|
||||
on('click', '.sidebar__toggle__icon', () => {
|
||||
toggleSidebar();
|
||||
});
|
||||
|
||||
Rails.delegate(document, '.sidebar__toggle__icon', 'keydown', (e) => {
|
||||
on('keydown', '.sidebar__toggle__icon', (e) => {
|
||||
if (e.key === ' ' || e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
toggleSidebar();
|
||||
}
|
||||
});
|
||||
|
||||
Rails.delegate(document, 'img.custom-emoji', 'mouseover', ({ target }) => {
|
||||
on('mouseover', 'img.custom-emoji', ({ target }) => {
|
||||
if (target instanceof HTMLImageElement && target.dataset.original)
|
||||
target.src = target.dataset.original;
|
||||
});
|
||||
Rails.delegate(document, 'img.custom-emoji', 'mouseout', ({ target }) => {
|
||||
on('mouseout', 'img.custom-emoji', ({ target }) => {
|
||||
if (target instanceof HTMLImageElement && target.dataset.static)
|
||||
target.src = target.dataset.static;
|
||||
});
|
||||
@@ -376,22 +362,17 @@ const setInputHint = (
|
||||
}
|
||||
};
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'#account_statuses_cleanup_policy_enabled',
|
||||
'change',
|
||||
({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement) || !target.form) return;
|
||||
on('change', '#account_statuses_cleanup_policy_enabled', ({ target }) => {
|
||||
if (!(target instanceof HTMLInputElement) || !target.form) return;
|
||||
|
||||
target.form
|
||||
.querySelectorAll<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select')
|
||||
.forEach((input) => {
|
||||
setInputDisabled(input, !target.checked);
|
||||
});
|
||||
},
|
||||
);
|
||||
target.form
|
||||
.querySelectorAll<
|
||||
HTMLInputElement | HTMLSelectElement
|
||||
>('input:not([type=hidden], #account_statuses_cleanup_policy_enabled), select')
|
||||
.forEach((input) => {
|
||||
setInputDisabled(input, !target.checked);
|
||||
});
|
||||
});
|
||||
|
||||
const updateDefaultQuotePrivacyFromPrivacy = (
|
||||
privacySelect: EventTarget | null,
|
||||
@@ -414,18 +395,13 @@ const updateDefaultQuotePrivacyFromPrivacy = (
|
||||
}
|
||||
};
|
||||
|
||||
Rails.delegate(
|
||||
document,
|
||||
'#user_settings_attributes_default_privacy',
|
||||
'change',
|
||||
({ target }) => {
|
||||
updateDefaultQuotePrivacyFromPrivacy(target);
|
||||
},
|
||||
);
|
||||
on('change', '#user_settings_attributes_default_privacy', ({ target }) => {
|
||||
updateDefaultQuotePrivacyFromPrivacy(target);
|
||||
});
|
||||
|
||||
// Empty the honeypot fields in JS in case something like an extension
|
||||
// automatically filled them.
|
||||
Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => {
|
||||
on('submit', '#registration_new_user,#new_user', () => {
|
||||
[
|
||||
'user_website',
|
||||
'user_confirm_password',
|
||||
@@ -439,7 +415,7 @@ Rails.delegate(document, '#registration_new_user,#new_user', 'submit', () => {
|
||||
});
|
||||
});
|
||||
|
||||
Rails.delegate(document, '.rules-list button', 'click', ({ target }) => {
|
||||
on('click', '.rules-list button', ({ target }) => {
|
||||
if (!(target instanceof HTMLElement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -675,8 +675,8 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
|
||||
|
||||
dispatch(useEmoji(suggestion));
|
||||
} else if (suggestion.type === 'hashtag') {
|
||||
completion = suggestion.name.slice(token.length - 1);
|
||||
startPosition = position + token.length;
|
||||
completion = token + suggestion.name.slice(token.length - 1);
|
||||
startPosition = position - 1;
|
||||
} else if (suggestion.type === 'account') {
|
||||
completion = `@${getState().getIn(['accounts', suggestion.id, 'acct'])}`;
|
||||
startPosition = position - 1;
|
||||
|
||||
@@ -112,7 +112,7 @@ export function normalizeStatus(status, normalOldStatus, { bogusQuotePolicy = fa
|
||||
}
|
||||
|
||||
if (normalOldStatus) {
|
||||
normalStatus.quote_approval ||= normalOldStatus.quote_approval;
|
||||
normalStatus.quote_approval ||= normalOldStatus.get('quote_approval');
|
||||
|
||||
const list = normalOldStatus.get('media_attachments');
|
||||
if (normalStatus.media_attachments && list) {
|
||||
|
||||
@@ -50,6 +50,7 @@ const AutosuggestTextarea = forwardRef(({
|
||||
onKeyUp,
|
||||
onKeyDown,
|
||||
onPaste,
|
||||
onDrop,
|
||||
onFocus,
|
||||
autoFocus = true,
|
||||
lang,
|
||||
@@ -153,6 +154,12 @@ const AutosuggestTextarea = forwardRef(({
|
||||
onPaste(e);
|
||||
}, [onPaste]);
|
||||
|
||||
const handleDrop = useCallback((e) => {
|
||||
if (onDrop) {
|
||||
onDrop(e);
|
||||
}
|
||||
}, [onDrop]);
|
||||
|
||||
// Show the suggestions again whenever they change and the textarea is focused
|
||||
useEffect(() => {
|
||||
if (suggestions.size > 0 && textareaRef.current === document.activeElement) {
|
||||
@@ -204,6 +211,7 @@ const AutosuggestTextarea = forwardRef(({
|
||||
onFocus={handleFocus}
|
||||
onBlur={handleBlur}
|
||||
onPaste={handlePaste}
|
||||
onDrop={handleDrop}
|
||||
dir='auto'
|
||||
aria-autocomplete='list'
|
||||
aria-label={placeholder}
|
||||
@@ -235,6 +243,7 @@ AutosuggestTextarea.propTypes = {
|
||||
onKeyUp: PropTypes.func,
|
||||
onKeyDown: PropTypes.func,
|
||||
onPaste: PropTypes.func.isRequired,
|
||||
onDrop: PropTypes.func,
|
||||
onFocus:PropTypes.func,
|
||||
autoFocus: PropTypes.bool,
|
||||
lang: PropTypes.string,
|
||||
|
||||
@@ -27,12 +27,14 @@ export const HandledLink: FC<HandledLinkProps & ComponentProps<'a'>> = ({
|
||||
}) => {
|
||||
// Handle hashtags
|
||||
if (
|
||||
text.startsWith('#') ||
|
||||
prevText?.endsWith('#') ||
|
||||
text.startsWith('#') ||
|
||||
prevText?.endsWith('#')
|
||||
(text.startsWith('#') ||
|
||||
prevText?.endsWith('#') ||
|
||||
text.startsWith('#') ||
|
||||
prevText?.endsWith('#')) &&
|
||||
!text.includes('%')
|
||||
) {
|
||||
const hashtag = text.slice(1).trim();
|
||||
|
||||
return (
|
||||
<Link
|
||||
className={classNames('mention hashtag', className)}
|
||||
@@ -69,7 +71,7 @@ export const HandledLink: FC<HandledLinkProps & ComponentProps<'a'>> = ({
|
||||
return (
|
||||
<a
|
||||
{...props}
|
||||
href={href}
|
||||
href={encodeURI(href)}
|
||||
title={href}
|
||||
className={classNames('unhandled-link', className)}
|
||||
target='_blank'
|
||||
|
||||
@@ -64,6 +64,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||
onSuggestionSelected: PropTypes.func.isRequired,
|
||||
onChangeSpoilerText: PropTypes.func.isRequired,
|
||||
onPaste: PropTypes.func.isRequired,
|
||||
onDrop: PropTypes.func.isRequired,
|
||||
onPickEmoji: PropTypes.func.isRequired,
|
||||
autoFocus: PropTypes.bool,
|
||||
withoutNavigation: PropTypes.bool,
|
||||
@@ -102,6 +103,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||
handleKeyDownPost = (e) => {
|
||||
if (e.key.toLowerCase() === 'enter' && (e.ctrlKey || e.metaKey)) {
|
||||
this.handleSubmit();
|
||||
e.preventDefault();
|
||||
}
|
||||
this.blurOnEscape(e);
|
||||
};
|
||||
@@ -248,7 +250,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||
};
|
||||
|
||||
render () {
|
||||
const { intl, onPaste, autoFocus, withoutNavigation, maxChars, isSubmitting } = this.props;
|
||||
const { intl, onPaste, onDrop, autoFocus, withoutNavigation, maxChars, isSubmitting } = this.props;
|
||||
const { highlighted } = this.state;
|
||||
|
||||
return (
|
||||
@@ -304,6 +306,7 @@ class ComposeForm extends ImmutablePureComponent {
|
||||
onSuggestionsClearRequested={this.onSuggestionsClearRequested}
|
||||
onSuggestionSelected={this.onSuggestionSelected}
|
||||
onPaste={onPaste}
|
||||
onDrop={onDrop}
|
||||
autoFocus={autoFocus}
|
||||
lang={this.props.lang}
|
||||
className='compose-form__input'
|
||||
|
||||
@@ -18,6 +18,23 @@ import ComposeForm from '../components/compose_form';
|
||||
|
||||
const urlLikeRegex = /^https?:\/\/[^\s]+\/[^\s]+$/i;
|
||||
|
||||
const processPasteOrDrop = (transfer, e, dispatch) => {
|
||||
if (transfer && transfer.files.length === 1) {
|
||||
dispatch(uploadCompose(transfer.files));
|
||||
e.preventDefault();
|
||||
} else if (transfer && transfer.files.length === 0) {
|
||||
const data = transfer.getData('text/plain');
|
||||
if (!data.match(urlLikeRegex)) return;
|
||||
|
||||
try {
|
||||
const url = new URL(data);
|
||||
dispatch(pasteLinkCompose({ url }));
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const mapStateToProps = state => ({
|
||||
text: state.getIn(['compose', 'text']),
|
||||
suggestions: state.getIn(['compose', 'suggestions']),
|
||||
@@ -85,20 +102,11 @@ const mapDispatchToProps = (dispatch, props) => ({
|
||||
},
|
||||
|
||||
onPaste (e) {
|
||||
if (e.clipboardData && e.clipboardData.files.length === 1) {
|
||||
dispatch(uploadCompose(e.clipboardData.files));
|
||||
e.preventDefault();
|
||||
} else if (e.clipboardData && e.clipboardData.files.length === 0) {
|
||||
const data = e.clipboardData.getData('text/plain');
|
||||
if (!data.match(urlLikeRegex)) return;
|
||||
processPasteOrDrop(e.clipboardData, e, dispatch);
|
||||
},
|
||||
|
||||
try {
|
||||
const url = new URL(data);
|
||||
dispatch(pasteLinkCompose({ url }));
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
}
|
||||
onDrop (e) {
|
||||
processPasteOrDrop(e.dataTransfer, e, dispatch);
|
||||
},
|
||||
|
||||
onPickEmoji (position, data, needsSpace) {
|
||||
|
||||
@@ -157,6 +157,8 @@
|
||||
"bundle_modal_error.close": "Tanca",
|
||||
"bundle_modal_error.message": "S'ha produït un error en carregar aquesta pantalla.",
|
||||
"bundle_modal_error.retry": "Torna-ho a provar",
|
||||
"carousel.current": "<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_modal.description": "No es pot crear un compte a {domain} ara mateix, però tingues en compte que no necessites específicament un compte a {domain} per a usar Mastodon.",
|
||||
"closed_registrations_modal.find_another_server": "Troba un altre servidor",
|
||||
@@ -173,6 +175,8 @@
|
||||
"column.edit_list": "Edita la llista",
|
||||
"column.favourites": "Favorits",
|
||||
"column.firehose": "Tuts en directe",
|
||||
"column.firehose_local": "Canal en directe per a aquest servidor",
|
||||
"column.firehose_singular": "Canal en directe",
|
||||
"column.follow_requests": "Peticions de seguir-te",
|
||||
"column.home": "Inici",
|
||||
"column.list_members": "Gestiona els membres de la llista",
|
||||
@@ -245,8 +249,13 @@
|
||||
"confirmations.missing_alt_text.secondary": "Publica-la igualment",
|
||||
"confirmations.missing_alt_text.title": "Hi voleu afegir text alternatiu?",
|
||||
"confirmations.mute.confirm": "Silencia",
|
||||
"confirmations.private_quote_notify.cancel": "Torna a l'edició",
|
||||
"confirmations.private_quote_notify.message": "La persona que citeu i altres mencionades rebran una notificació i podran veure la vostra publicació, encara que no us segueixen.",
|
||||
"confirmations.private_quote_notify.title": "Voleu compartir amb seguidors i usuaris mencionats?",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "No m'ho tornis a recordar",
|
||||
"confirmations.quiet_post_quote_info.got_it": "Entesos",
|
||||
"confirmations.quiet_post_quote_info.message": "Quan citeu una publicació pública en mode silenciós, la vostra publicació s'amagarà de les línies de temps de tendències.",
|
||||
"confirmations.quiet_post_quote_info.title": "Citació d'una publicació pública en mode silenciós",
|
||||
"confirmations.redraft.confirm": "Esborra i reescriu",
|
||||
"confirmations.redraft.message": "Segur que vols eliminar aquest tut i tornar a escriure'l? Es perdran tots els impulsos i els favorits, i les respostes al tut original quedaran aïllades.",
|
||||
"confirmations.redraft.title": "Esborrar i reescriure la publicació?",
|
||||
@@ -332,6 +341,7 @@
|
||||
"empty_column.bookmarked_statuses": "Encara no has marcat cap tut. Quan en marquis un, apareixerà aquí.",
|
||||
"empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!",
|
||||
"empty_column.direct": "Encara no tens mencions privades. Quan n'enviïs o en rebis una, et sortirà aquí.",
|
||||
"empty_column.disabled_feed": "Aquest canal ha estat desactivat per l'administració del vostre servidor.",
|
||||
"empty_column.domain_blocks": "Encara no hi ha dominis blocats.",
|
||||
"empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!",
|
||||
"empty_column.favourited_statuses": "Encara no has afavorit cap tut. Quan ho facis, apareixerà aquí.",
|
||||
@@ -357,6 +367,7 @@
|
||||
"explore.trending_statuses": "Tuts",
|
||||
"explore.trending_tags": "Etiquetes",
|
||||
"featured_carousel.header": "{count, plural, one {Publicació fixada} other {Publicacions fixades}}",
|
||||
"featured_carousel.slide": "Publicació {current, number} de {max, number}",
|
||||
"filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquest tut. Si també vols que el tut es filtri en aquest context, hauràs d'editar el filtre.",
|
||||
"filter_modal.added.context_mismatch_title": "El context no coincideix!",
|
||||
"filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.",
|
||||
@@ -456,6 +467,7 @@
|
||||
"ignore_notifications_modal.not_following_title": "Voleu ignorar les notificacions de qui no seguiu?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Voleu ignorar les notificacions de mencions privades no sol·licitades?",
|
||||
"info_button.label": "Ajuda",
|
||||
"info_button.what_is_alt_text": "<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.go": "Endavant",
|
||||
"interaction_modal.no_account_yet": "Encara no teniu cap compte?",
|
||||
@@ -1000,10 +1012,14 @@
|
||||
"video.volume_down": "Abaixa el volum",
|
||||
"video.volume_up": "Apuja el volum",
|
||||
"visibility_modal.button_title": "Establiu la visibilitat",
|
||||
"visibility_modal.direct_quote_warning.text": "Si deseu la configuració actual, la cita incrustada es convertirà en un enllaç.",
|
||||
"visibility_modal.direct_quote_warning.title": "Les cites no es poden incrustar a les mencions privades",
|
||||
"visibility_modal.header": "Visibilitat i interacció",
|
||||
"visibility_modal.helper.direct_quoting": "No es poden citar mencions privades fetes a Mastondon.",
|
||||
"visibility_modal.helper.privacy_editing": "La visibilitat no es pot canviar després de publicar una publicació.",
|
||||
"visibility_modal.helper.privacy_private_self_quote": "Les autocites de publicacions privades no es poden fer públiques.",
|
||||
"visibility_modal.helper.private_quoting": "No es poden citar publicacions fetes a Mastodon només per a seguidors.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quan la gent et citi les seves publicacions estaran amagades de les línies de temps de tendències.",
|
||||
"visibility_modal.helper.unlisted_quoting": "Quan la gent us citi, les seves publicacions quedaran amagades de les línies de temps de tendències.",
|
||||
"visibility_modal.instructions": "Controleu qui pot interactuar amb aquesta publicació. També podeu aplicar la configuració a totes les publicacions futures navegant a <link>Preferències > Valors per defecte de publicació</link>.",
|
||||
"visibility_modal.privacy_label": "Visibilitat",
|
||||
"visibility_modal.quote_followers": "Només seguidors",
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
"alt_text_modal.cancel": "Abbrechen",
|
||||
"alt_text_modal.change_thumbnail": "Vorschaubild ändern",
|
||||
"alt_text_modal.describe_for_people_with_hearing_impairments": "Beschreibe den Inhalt für Menschen mit Schwerhörigkeit …",
|
||||
"alt_text_modal.describe_for_people_with_visual_impairments": "Beschreibe den Inhalt für Menschen mit Sehschwäche …",
|
||||
"alt_text_modal.describe_for_people_with_visual_impairments": "Beschreibe den Inhalt für Menschen, die blind oder sehbehindert sind …",
|
||||
"alt_text_modal.done": "Fertig",
|
||||
"announcement.announcement": "Ankündigung",
|
||||
"annual_report.summary.archetype.booster": "Trendjäger*in",
|
||||
@@ -245,7 +245,7 @@
|
||||
"confirmations.logout.message": "Möchtest du dich wirklich abmelden?",
|
||||
"confirmations.logout.title": "Abmelden?",
|
||||
"confirmations.missing_alt_text.confirm": "Bildbeschreibung hinzufügen",
|
||||
"confirmations.missing_alt_text.message": "Dein Beitrag enthält Medien ohne Bildbeschreibung. Mit Alt-Texten erreichst du auch Menschen mit einer Sehschwäche.",
|
||||
"confirmations.missing_alt_text.message": "Dein Beitrag enthält Medien ohne Bildbeschreibung. Mit ALT-Texten erreichst Du auch Menschen, die blind oder sehbehindert sind.",
|
||||
"confirmations.missing_alt_text.secondary": "Trotzdem veröffentlichen",
|
||||
"confirmations.missing_alt_text.title": "Bildbeschreibung hinzufügen?",
|
||||
"confirmations.mute.confirm": "Stummschalten",
|
||||
@@ -470,7 +470,7 @@
|
||||
"ignore_notifications_modal.not_following_title": "Benachrichtigungen von Profilen ignorieren, denen du nicht folgst?",
|
||||
"ignore_notifications_modal.private_mentions_title": "Benachrichtigungen von unerwünschten privaten Erwähnungen ignorieren?",
|
||||
"info_button.label": "Hilfe",
|
||||
"info_button.what_is_alt_text": "<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.go": "Los",
|
||||
"interaction_modal.no_account_yet": "Du hast noch kein Konto?",
|
||||
|
||||
@@ -1029,7 +1029,7 @@
|
||||
"visibility_modal.helper.unlisted_quoting": "Cuando otras cuentas te citen, sus publicaciones también se ocultarán de las líneas temporales de tendencias.",
|
||||
"visibility_modal.instructions": "Controlá quién puede interactuar con este mensaje. También podés aplicar los ajustes para todos los mensajes futuros accediendo a <link>«Configuración» > «Configuración predeterminada de mensajes»</link>.",
|
||||
"visibility_modal.privacy_label": "Visibilidad",
|
||||
"visibility_modal.quote_followers": "Solo para seguidores",
|
||||
"visibility_modal.quote_followers": "Solo seguidores",
|
||||
"visibility_modal.quote_label": "Quién puede citar",
|
||||
"visibility_modal.quote_nobody": "Solo yo",
|
||||
"visibility_modal.quote_public": "Cualquier cuenta",
|
||||
|
||||
@@ -903,6 +903,7 @@
|
||||
"status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
|
||||
"status.embed": "Faigh cód leabú",
|
||||
"status.favourite": "Is fearr leat",
|
||||
"status.favourites_count": "{count, plural,\n one {{counter} cheanán}\n two {{counter} cheanáin}\n few {{counter} ceanáin}\n many {{counter} ceanán}\n other {{counter} ceanáin}\n}",
|
||||
"status.filter": "Déan scagadh ar an bpostáil seo",
|
||||
"status.history.created": "Chruthaigh {name} {date}",
|
||||
"status.history.edited": "Curtha in eagar ag {name} in {date}",
|
||||
@@ -937,12 +938,14 @@
|
||||
"status.quotes.empty": "Níl an post seo luaite ag aon duine go fóill. Nuair a dhéanann duine é, taispeánfar anseo é.",
|
||||
"status.quotes.local_other_disclaimer": "Ní thaispeánfar sleachta ar dhiúltaigh an t-údar dóibh.",
|
||||
"status.quotes.remote_other_disclaimer": "Níl ráthaíocht ann go dtaispeánfar anseo ach sleachta ó {domain}. Ní thaispeánfar sleachta ar dhiúltaigh an t-údar dóibh.",
|
||||
"status.quotes_count": "{count, plural,\n one {{counter} athfhriotal}\n two {{counter} athfhriotail}\n few {{counter} athfhriotail}\n many {{counter} athfhriotal}\n other {{counter} athfhriotail}\n}",
|
||||
"status.read_more": "Léan a thuilleadh",
|
||||
"status.reblog": "Treisiú",
|
||||
"status.reblog_or_quote": "Borradh nó luachan",
|
||||
"status.reblog_private": "Roinn arís le do leanúna",
|
||||
"status.reblogged_by": "Mhol {name}",
|
||||
"status.reblogs.empty": "Níor mhol éinne an phostáil seo fós. Nuair a mholfaidh duine éigin í, taispeánfar anseo é sin.",
|
||||
"status.reblogs_count": "{count, plural,\n one {{counter} athfhriotal}\n two {{counter} athfhriotail}\n few {{counter} athfhriotail}\n many {{counter} athfhriotal}\n other {{counter} athfhriotail}\n}",
|
||||
"status.redraft": "Scrios ⁊ athdhréachtaigh",
|
||||
"status.remove_bookmark": "Bain leabharmharc",
|
||||
"status.remove_favourite": "Bain ó cheanáin",
|
||||
|
||||
@@ -903,6 +903,7 @@
|
||||
"status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
|
||||
"status.embed": "O código a incluír",
|
||||
"status.favourite": "Favorecer",
|
||||
"status.favourites_count": "{count, plural, one {{counter} favorecemento} other {{counter} favorecementos}}",
|
||||
"status.filter": "Filtrar esta publicación",
|
||||
"status.history.created": "{name} creouno o {date}",
|
||||
"status.history.edited": "{name} editouno o {date}",
|
||||
@@ -937,12 +938,14 @@
|
||||
"status.quotes.empty": "Aínda ninguén citou esta publicación. Cando alguén o faga aparecerá aquí.",
|
||||
"status.quotes.local_other_disclaimer": "Non se mostrarán as citas rexeitadas pola autora.",
|
||||
"status.quotes.remote_other_disclaimer": "Só se garante que se mostren as citas do dominio {domain}. Non se mostrarán as citas rexeitadas pola persoa autora.",
|
||||
"status.quotes_count": "{count, plural, one {{counter} cita} other {{counter} citas}}",
|
||||
"status.read_more": "Ler máis",
|
||||
"status.reblog": "Promover",
|
||||
"status.reblog_or_quote": "Promover ou citar",
|
||||
"status.reblog_private": "Volver a compartir coas túas seguidoras",
|
||||
"status.reblogged_by": "{name} promoveu",
|
||||
"status.reblogs.empty": "Aínda ninguén promoveu esta publicación. Cando alguén o faga, amosarase aquí.",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} promoción} other {{counter} promocións}}",
|
||||
"status.redraft": "Eliminar e reescribir",
|
||||
"status.remove_bookmark": "Eliminar marcador",
|
||||
"status.remove_favourite": "Retirar das favoritas",
|
||||
|
||||
@@ -880,6 +880,7 @@
|
||||
"status.quote_error.filtered": "あなたのフィルター設定によって非表示になっています",
|
||||
"status.quote_error.pending_approval": "承認待ちの投稿",
|
||||
"status.quote_noun": "引用",
|
||||
"status.quote_policy_change": "引用できるユーザーの変更",
|
||||
"status.quote_post_author": "{name} の投稿を引用",
|
||||
"status.quote_private": "非公開の投稿は引用できません",
|
||||
"status.quotes.local_other_disclaimer": "投稿者が拒否した引用は表示されません。",
|
||||
|
||||
@@ -252,6 +252,7 @@
|
||||
"confirmations.private_quote_notify.cancel": "편집으로 돌아가기",
|
||||
"confirmations.private_quote_notify.confirm": "게시",
|
||||
"confirmations.private_quote_notify.do_not_show_again": "이 메시지를 다시 표시하지 않음",
|
||||
"confirmations.private_quote_notify.message": "인용하려는 사람과 멘션된 사람들은 나를 팔로우하지 않더라도 게시물에 대한 알림을 받으며 내용을 볼 수 있습니다.",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "다시 보지 않기",
|
||||
"confirmations.quiet_post_quote_info.got_it": "알겠습니다",
|
||||
"confirmations.quiet_post_quote_info.message": "조용한 공개 게시물을 인용하면 그 게시물은 유행 타임라인에서 나타나지 않을 것입니다.",
|
||||
|
||||
@@ -639,7 +639,7 @@
|
||||
"privacy.private.long": "Tikai Tavi sekotāji",
|
||||
"privacy.private.short": "Sekotāji",
|
||||
"privacy.public.long": "Jebkurš Mastodon un ārpus tā",
|
||||
"privacy.public.short": "Redzams visiem",
|
||||
"privacy.public.short": "Publisks",
|
||||
"privacy.quote.anyone": "{visibility}, jebkurš var citēt",
|
||||
"privacy.quote.disabled": "{visibility}, aizliegta citēšana",
|
||||
"privacy.quote.limited": "{visibility}, ierobežota citēšana",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"about.default_locale": "Padrão",
|
||||
"about.disclaimer": "Mastodon é um software de código aberto e livre, e uma marca registrada de Mastodon gGmbH.",
|
||||
"about.domain_blocks.no_reason_available": "Razão não disponível",
|
||||
"about.domain_blocks.preamble": "O Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor em específico.",
|
||||
"about.domain_blocks.preamble": "O \"Mastodon\" geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no \"fediverso\". Estas são as exceções deste servidor em específico.",
|
||||
"about.domain_blocks.silenced.explanation": "Você geralmente não verá perfis e conteúdo deste servidor, a menos que você o procure explicitamente ou opte por seguir.",
|
||||
"about.domain_blocks.silenced.title": "Limitado",
|
||||
"about.domain_blocks.suspended.explanation": "Nenhum dado desse servidor será processado, armazenado ou trocado, impossibilitando qualquer interação ou comunicação com os usuários deste servidor.",
|
||||
@@ -36,7 +36,7 @@
|
||||
"account.familiar_followers_two": "Seguido por {name1} e {name2}",
|
||||
"account.featured": "Em destaque",
|
||||
"account.featured.accounts": "Perfis",
|
||||
"account.featured.hashtags": "Hashtags",
|
||||
"account.featured.hashtags": "\"Hashtags\"",
|
||||
"account.featured_tags.last_status_at": "Última publicação em {date}",
|
||||
"account.featured_tags.last_status_never": "Sem publicações",
|
||||
"account.follow": "Seguir",
|
||||
@@ -49,7 +49,7 @@
|
||||
"account.followers": "Seguidores",
|
||||
"account.followers.empty": "Nada aqui.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
|
||||
"account.followers_you_know_counter": "{counter} que você sabe",
|
||||
"account.followers_you_know_counter": "{counter} que você conhece",
|
||||
"account.following": "Seguindo",
|
||||
"account.following_counter": "{count, plural, one {{counter} seguindo} other {{counter} seguindo}}",
|
||||
"account.follows.empty": "Nada aqui.",
|
||||
@@ -903,6 +903,7 @@
|
||||
"status.edited_x_times": "Editado {count, plural, one {{count} hora} other {{count} vezes}}",
|
||||
"status.embed": "Obter código de incorporação",
|
||||
"status.favourite": "Favorita",
|
||||
"status.favourites_count": "{count, plural, one {{counter} favorito} other {{counter} favoritos}}",
|
||||
"status.filter": "Filtrar esta publicação",
|
||||
"status.history.created": "{name} criou {date}",
|
||||
"status.history.edited": "{name} editou {date}",
|
||||
@@ -937,12 +938,14 @@
|
||||
"status.quotes.empty": "Ninguém citou essa publicação até agora. Quando alguém citar aparecerá aqui.",
|
||||
"status.quotes.local_other_disclaimer": "Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.quotes.remote_other_disclaimer": "Apenas citações do {domain} têm a garantia de serem exibidas aqui. Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.quotes_count": "{count, plural, one {{counter} mencionar} other {{counter} menções}}",
|
||||
"status.read_more": "Ler mais",
|
||||
"status.reblog": "Dar boost",
|
||||
"status.reblog_or_quote": "Acelerar ou citar",
|
||||
"status.reblog_private": "Compartilhar novamente com seus seguidores",
|
||||
"status.reblogged_by": "{name} deu boost",
|
||||
"status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} impulsionar} other {{counter} impulsionados}}",
|
||||
"status.redraft": "Excluir e rascunhar",
|
||||
"status.remove_bookmark": "Remover do Salvos",
|
||||
"status.remove_favourite": "Remover dos favoritos",
|
||||
|
||||
@@ -131,11 +131,12 @@ class User < ApplicationRecord
|
||||
|
||||
delegate :can?, to: :role
|
||||
|
||||
attr_reader :invite_code, :date_of_birth
|
||||
attr_reader :invite_code
|
||||
attr_writer :current_account
|
||||
|
||||
attribute :external, :boolean, default: false
|
||||
attribute :bypass_registration_checks, :boolean, default: false
|
||||
attribute :date_of_birth, :date
|
||||
|
||||
def self.those_who_can(*any_of_privileges)
|
||||
matching_role_ids = UserRole.that_can(*any_of_privileges).map(&:id)
|
||||
@@ -151,17 +152,6 @@ class User < ApplicationRecord
|
||||
Rails.env.local?
|
||||
end
|
||||
|
||||
def date_of_birth=(hash_or_string)
|
||||
@date_of_birth = begin
|
||||
if hash_or_string.is_a?(Hash)
|
||||
day, month, year = hash_or_string.values_at(1, 2, 3)
|
||||
"#{day}.#{month}.#{year}"
|
||||
else
|
||||
hash_or_string
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def role
|
||||
if role_id.nil?
|
||||
UserRole.everyone
|
||||
|
||||
@@ -819,6 +819,8 @@ fr-CA:
|
||||
preamble: Fournissez des informations détaillées sur le fonctionnement, la modération et le financement du serveur.
|
||||
rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer.
|
||||
title: À propos
|
||||
allow_referrer_origin:
|
||||
title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic
|
||||
appearance:
|
||||
preamble: Personnaliser l'interface web de Mastodon.
|
||||
title: Apparence
|
||||
@@ -857,7 +859,7 @@ fr-CA:
|
||||
local_feed: Fil local
|
||||
trends: Tendances
|
||||
registrations:
|
||||
moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde!
|
||||
moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde !
|
||||
preamble: Affecte qui peut créer un compte sur votre serveur.
|
||||
title: Inscriptions
|
||||
registrations_mode:
|
||||
|
||||
@@ -819,6 +819,8 @@ fr:
|
||||
preamble: Fournissez des informations détaillées sur le fonctionnement, la modération et le financement du serveur.
|
||||
rules_hint: Il y a un espace dédié pour les règles auxquelles vos utilisateurs sont invités à adhérer.
|
||||
title: À propos
|
||||
allow_referrer_origin:
|
||||
title: Autoriser les sites externes à voir votre serveur Mastodon comme une source de trafic
|
||||
appearance:
|
||||
preamble: Personnaliser l'interface web de Mastodon.
|
||||
title: Apparence
|
||||
@@ -857,7 +859,7 @@ fr:
|
||||
local_feed: Fil local
|
||||
trends: Tendances
|
||||
registrations:
|
||||
moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde!
|
||||
moderation_recommandation: Veuillez vous assurer d'avoir une équipe de modération adéquate et réactive avant d'ouvrir les inscriptions à tout le monde !
|
||||
preamble: Affecte qui peut créer un compte sur votre serveur.
|
||||
title: Inscriptions
|
||||
registrations_mode:
|
||||
|
||||
@@ -222,7 +222,7 @@ ru:
|
||||
enable_user: Разморозка пользователей
|
||||
memorialize_account: Присвоение пользователям статуса «мемориала»
|
||||
promote_user: Повышение пользователей
|
||||
publish_terms_of_service: Опубликование пользовательского соглашения
|
||||
publish_terms_of_service: Публикация пользовательского соглашения
|
||||
reject_appeal: Отклонение обжалований
|
||||
reject_user: Отклонение регистраций
|
||||
remove_avatar_user: Удаление аватаров
|
||||
@@ -1016,9 +1016,9 @@ ru:
|
||||
draft: Черновик
|
||||
generate: Использовать шаблон
|
||||
generates:
|
||||
action: Генерировать
|
||||
action: Сгенерировать
|
||||
chance_to_review_html: "<strong>Сгенерированное пользовательское соглашение не будет опубликовано автоматически.</strong> У вас будет возможность просмотреть результат. Введите все необходимые сведения, чтобы продолжить."
|
||||
explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях, и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов.
|
||||
explanation_html: Шаблон пользовательского соглашения приводится исключительно в ознакомительных целях и не может рассматриваться как юридическая консультация по тому или иному вопросу. Обратитесь к своему юрисконсульту насчёт вашей ситуации и имеющихся правовых вопросов.
|
||||
title: Создание пользовательского соглашения
|
||||
going_live_on_html: Вступило в силу с %{date}
|
||||
history: История
|
||||
@@ -1028,8 +1028,8 @@ ru:
|
||||
notified_on_html: 'Дата уведомления пользователей: %{date}'
|
||||
notify_users: Уведомить пользователей
|
||||
preview:
|
||||
explanation_html: 'Сообщение будет отравлено <strong>%{display_count} пользователям</strong>, которые зарегистрировались до %{date}. В теле письма будет указан следующий текст:'
|
||||
send_preview: Отправить предпросмотр на %{email}
|
||||
explanation_html: 'Сообщение будет отравлено <strong>%{display_count} пользователям</strong>, которые зарегистрировались до %{date}. Письмо будет содержать следующий текст:'
|
||||
send_preview: Отправить тестовое уведомление на %{email}
|
||||
send_to_all:
|
||||
few: Отправить %{display_count} сообщения
|
||||
many: Отправить %{display_count} сообщений
|
||||
@@ -2031,7 +2031,7 @@ ru:
|
||||
terms_of_service_interstitial:
|
||||
past_preamble_html: Мы изменили наше пользовательское соглашение с момента вашего последнего посещения. Мы рекомендуем вам ознакомиться с обновленным соглашением.
|
||||
review_link: Посмотреть пользовательское соглашение
|
||||
title: Изменяется пользовательское соглашение %{domain}
|
||||
title: Изменяется пользовательское соглашение на сервере %{domain}
|
||||
themes:
|
||||
contrast: Mastodon (высококонтрастная)
|
||||
default: Mastodon (тёмная)
|
||||
@@ -2098,12 +2098,12 @@ ru:
|
||||
title: Выполнен вход
|
||||
terms_of_service_changed:
|
||||
agreement: Продолжая использовать %{domain}, вы соглашаетесь с этими условиями. Если вы не согласны с новыми условиями, вы в любой момент можете удалить вашу учётную запись на %{domain}.
|
||||
changelog: 'Вот что обновление условий будет значит для вас в общих чертах:'
|
||||
description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:'
|
||||
description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение %{domain}. Эти изменения вступят в силу <strong>%{date}</strong>. Рекомендуем вам ознакомиться с <a href="%{path}" target="_blank">обновлёнными условиями</a>.
|
||||
changelog: 'Вот что обновление условий будет значить для вас в общих чертах:'
|
||||
description: 'Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение сервера %{domain}. Эти изменения вступят в силу %{date}. Рекомендуем вам ознакомиться с обновлёнными условиями по ссылке:'
|
||||
description_html: Вы получили это сообщение, потому что мы внесли некоторые изменения в пользовательское соглашение сервера %{domain}. Эти изменения вступят в силу <strong>%{date}</strong>. Рекомендуем вам ознакомиться с <a href="%{path}" target="_blank">обновлёнными условиями</a>.
|
||||
sign_off: Ваш %{domain}
|
||||
subject: Обновления наших условий использования
|
||||
subtitle: На %{domain} изменилось пользовательское соглашение
|
||||
subject: Мы обновляем наше пользовательское соглашение
|
||||
subtitle: Изменяется пользовательское соглашение на сервере %{domain}
|
||||
title: Важное обновление
|
||||
warning:
|
||||
appeal: Обжаловать
|
||||
|
||||
@@ -347,9 +347,7 @@ ar:
|
||||
jurisdiction: الاختصاص القانوني
|
||||
min_age: الحد الإدنى للعمر
|
||||
user:
|
||||
date_of_birth_1i: يوم
|
||||
date_of_birth_2i: شهر
|
||||
date_of_birth_3i: سنة
|
||||
role: الدور
|
||||
time_zone: النطاق الزمني
|
||||
user_role:
|
||||
|
||||
@@ -374,9 +374,7 @@ be:
|
||||
jurisdiction: Юрысдыкцыя
|
||||
min_age: Мінімальны ўзрост
|
||||
user:
|
||||
date_of_birth_1i: Дзень
|
||||
date_of_birth_2i: Месяц
|
||||
date_of_birth_3i: Год
|
||||
role: Роля
|
||||
time_zone: Часавы пояс
|
||||
user_role:
|
||||
|
||||
@@ -354,9 +354,7 @@ bg:
|
||||
jurisdiction: Законова юрисдикция
|
||||
min_age: Минимална възраст
|
||||
user:
|
||||
date_of_birth_1i: Ден
|
||||
date_of_birth_2i: Месец
|
||||
date_of_birth_3i: Година
|
||||
role: Роля
|
||||
time_zone: Часова зона
|
||||
user_role:
|
||||
|
||||
@@ -109,9 +109,7 @@ br:
|
||||
domain: Domani
|
||||
jurisdiction: Barnadurezh
|
||||
user:
|
||||
date_of_birth_1i: Devezh
|
||||
date_of_birth_2i: Mizvezh
|
||||
date_of_birth_3i: Bloavezh
|
||||
role: Roll
|
||||
time_zone: Gwerzhid eur
|
||||
user_role:
|
||||
|
||||
@@ -353,9 +353,7 @@ ca:
|
||||
jurisdiction: Jurisdicció
|
||||
min_age: Edat mínima
|
||||
user:
|
||||
date_of_birth_1i: Dia
|
||||
date_of_birth_2i: Mes
|
||||
date_of_birth_3i: Any
|
||||
role: Rol
|
||||
time_zone: Zona horària
|
||||
user_role:
|
||||
|
||||
@@ -374,9 +374,7 @@ cs:
|
||||
jurisdiction: Právní příslušnost
|
||||
min_age: Věková hranice
|
||||
user:
|
||||
date_of_birth_1i: Den
|
||||
date_of_birth_2i: Měsíc
|
||||
date_of_birth_3i: Rok
|
||||
role: Role
|
||||
time_zone: Časové pásmo
|
||||
user_role:
|
||||
|
||||
@@ -376,9 +376,7 @@ cy:
|
||||
jurisdiction: Awdurdodaeth gyfreithiol
|
||||
min_age: Isafswm oedran
|
||||
user:
|
||||
date_of_birth_1i: Dydd
|
||||
date_of_birth_2i: Mis
|
||||
date_of_birth_3i: Blwyddyn
|
||||
role: Rôl
|
||||
time_zone: Cylchfa amser
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ da:
|
||||
jurisdiction: Juridisk jurisdiktion
|
||||
min_age: Minimumsalder
|
||||
user:
|
||||
date_of_birth_1i: Dag
|
||||
date_of_birth_2i: Måned
|
||||
date_of_birth_3i: År
|
||||
role: Rolle
|
||||
time_zone: Tidszone
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ de:
|
||||
jurisdiction: Gerichtsstand
|
||||
min_age: Mindestalter
|
||||
user:
|
||||
date_of_birth_1i: Tag
|
||||
date_of_birth_2i: Monat
|
||||
date_of_birth_3i: Jahr
|
||||
role: Rolle
|
||||
time_zone: Zeitzone
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ el:
|
||||
jurisdiction: Νομική δικαιοδοσία
|
||||
min_age: Ελάχιστη ηλικία
|
||||
user:
|
||||
date_of_birth_1i: Ημέρα
|
||||
date_of_birth_2i: Μήνας
|
||||
date_of_birth_3i: Έτος
|
||||
role: Ρόλος
|
||||
time_zone: Ζώνη ώρας
|
||||
user_role:
|
||||
|
||||
@@ -346,9 +346,7 @@ en-GB:
|
||||
jurisdiction: Legal jurisdiction
|
||||
min_age: Minimum age
|
||||
user:
|
||||
date_of_birth_1i: Day
|
||||
date_of_birth_2i: Month
|
||||
date_of_birth_3i: Year
|
||||
role: Role
|
||||
time_zone: Time Zone
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,9 @@ en:
|
||||
jurisdiction: Legal jurisdiction
|
||||
min_age: Minimum age
|
||||
user:
|
||||
date_of_birth_1i: Day
|
||||
date_of_birth_1i: Year
|
||||
date_of_birth_2i: Month
|
||||
date_of_birth_3i: Year
|
||||
date_of_birth_3i: Day
|
||||
role: Role
|
||||
time_zone: Time zone
|
||||
user_role:
|
||||
|
||||
@@ -353,9 +353,7 @@ eo:
|
||||
jurisdiction: Laŭleĝa jurisdikcio
|
||||
min_age: Minimuma aĝo
|
||||
user:
|
||||
date_of_birth_1i: Tago
|
||||
date_of_birth_2i: Monato
|
||||
date_of_birth_3i: Jaro
|
||||
role: Rolo
|
||||
time_zone: Horzono
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ es-AR:
|
||||
jurisdiction: Jurisdicción legal
|
||||
min_age: Edad mínima
|
||||
user:
|
||||
date_of_birth_1i: Día
|
||||
date_of_birth_2i: Mes
|
||||
date_of_birth_3i: Año
|
||||
role: Rol
|
||||
time_zone: Zona horaria
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ es-MX:
|
||||
jurisdiction: Jurisdicción legal
|
||||
min_age: Edad mínima
|
||||
user:
|
||||
date_of_birth_1i: Día
|
||||
date_of_birth_2i: Mes
|
||||
date_of_birth_3i: Año
|
||||
role: Rol
|
||||
time_zone: Zona horaria
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ es:
|
||||
jurisdiction: Jurisdicción legal
|
||||
min_age: Edad mínima
|
||||
user:
|
||||
date_of_birth_1i: Día
|
||||
date_of_birth_2i: Mes
|
||||
date_of_birth_3i: Año
|
||||
role: Rol
|
||||
time_zone: Zona horaria
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ et:
|
||||
jurisdiction: Jurisdiktsioon
|
||||
min_age: Vanuse alampiir
|
||||
user:
|
||||
date_of_birth_1i: Päev
|
||||
date_of_birth_2i: Kuu
|
||||
date_of_birth_3i: Aasta
|
||||
role: Roll
|
||||
time_zone: Ajavöönd
|
||||
user_role:
|
||||
|
||||
@@ -325,9 +325,7 @@ eu:
|
||||
terms_of_service_generator:
|
||||
domain: Domeinua
|
||||
user:
|
||||
date_of_birth_1i: Eguna
|
||||
date_of_birth_2i: Hilabetea
|
||||
date_of_birth_3i: Urtea
|
||||
role: Rola
|
||||
time_zone: Ordu zona
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ fa:
|
||||
jurisdiction: صلاحیت قانونی
|
||||
min_age: کمینهٔ زمان
|
||||
user:
|
||||
date_of_birth_1i: روز
|
||||
date_of_birth_2i: ماه
|
||||
date_of_birth_3i: سال
|
||||
role: نقش
|
||||
time_zone: منطقهٔ زمانی
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ fi:
|
||||
jurisdiction: Lainkäyttöalue
|
||||
min_age: Vähimmäisikä
|
||||
user:
|
||||
date_of_birth_1i: Päivä
|
||||
date_of_birth_2i: Kuukausi
|
||||
date_of_birth_3i: Vuosi
|
||||
role: Rooli
|
||||
time_zone: Aikavyöhyke
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ fo:
|
||||
jurisdiction: Løgdømi
|
||||
min_age: Lægsti aldur
|
||||
user:
|
||||
date_of_birth_1i: Dagur
|
||||
date_of_birth_2i: Mánaði
|
||||
date_of_birth_3i: Ár
|
||||
role: Leiklutur
|
||||
time_zone: Tíðarsona
|
||||
user_role:
|
||||
|
||||
@@ -152,6 +152,8 @@ fr-CA:
|
||||
name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge
|
||||
permissions_as_keys: Les utilisateur·rice·s ayant ce rôle auront accès à …
|
||||
position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Mais certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure
|
||||
username_block:
|
||||
comparison: Veuillez garder à l'esprit le problème de Scunthorpe lors du blocage des correspondances partielles
|
||||
webhook:
|
||||
events: Sélectionnez les événements à envoyer
|
||||
template: Écrivez votre propre bloc JSON avec la possibilité d’utiliser de l’interpolation de variables. Laissez vide pour le bloc JSON par défaut.
|
||||
@@ -353,9 +355,7 @@ fr-CA:
|
||||
jurisdiction: Juridiction
|
||||
min_age: Âge minimum
|
||||
user:
|
||||
date_of_birth_1i: Jour
|
||||
date_of_birth_2i: Mois
|
||||
date_of_birth_3i: Année
|
||||
role: Rôle
|
||||
time_zone: Fuseau horaire
|
||||
user_role:
|
||||
|
||||
@@ -152,6 +152,8 @@ fr:
|
||||
name: Nom public du rôle, si le rôle est configuré pour être affiché avec un badge
|
||||
permissions_as_keys: Les utilisateur·rice·s ayant ce rôle auront accès à …
|
||||
position: Dans certaines situations, un rôle supérieur peut trancher la résolution d'un conflit. Mais certaines opérations ne peuvent être effectuées que sur des rôles ayant une priorité inférieure
|
||||
username_block:
|
||||
comparison: Veuillez garder à l'esprit le problème de Scunthorpe lors du blocage des correspondances partielles
|
||||
webhook:
|
||||
events: Sélectionnez les événements à envoyer
|
||||
template: Écrivez votre propre bloc JSON avec la possibilité d’utiliser de l’interpolation de variables. Laissez vider pour utiliser le bloc JSON par défaut.
|
||||
@@ -353,9 +355,7 @@ fr:
|
||||
jurisdiction: Juridiction
|
||||
min_age: Âge minimum
|
||||
user:
|
||||
date_of_birth_1i: Jour
|
||||
date_of_birth_2i: Mois
|
||||
date_of_birth_3i: Année
|
||||
role: Rôle
|
||||
time_zone: Fuseau horaire
|
||||
user_role:
|
||||
|
||||
@@ -349,9 +349,7 @@ fy:
|
||||
jurisdiction: Rjochtsgebiet
|
||||
min_age: Minimum leeftiid
|
||||
user:
|
||||
date_of_birth_1i: Dei
|
||||
date_of_birth_2i: Moanne
|
||||
date_of_birth_3i: Jier
|
||||
role: Rol
|
||||
time_zone: Tiidsône
|
||||
user_role:
|
||||
|
||||
@@ -375,9 +375,7 @@ ga:
|
||||
jurisdiction: Dlínse dhlíthiúil
|
||||
min_age: Aois íosta
|
||||
user:
|
||||
date_of_birth_1i: Lá
|
||||
date_of_birth_2i: Mí
|
||||
date_of_birth_3i: Bliain
|
||||
role: Ról
|
||||
time_zone: Crios ama
|
||||
user_role:
|
||||
|
||||
@@ -373,9 +373,7 @@ gd:
|
||||
jurisdiction: Uachdranas laghail
|
||||
min_age: An aois as lugha
|
||||
user:
|
||||
date_of_birth_1i: Latha
|
||||
date_of_birth_2i: Mìos
|
||||
date_of_birth_3i: Bliadhna
|
||||
role: Dreuchd
|
||||
time_zone: Roinn-tìde
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ gl:
|
||||
jurisdiction: Xurisdición legal
|
||||
min_age: Idade mínima
|
||||
user:
|
||||
date_of_birth_1i: Día
|
||||
date_of_birth_2i: Mes
|
||||
date_of_birth_3i: Ano
|
||||
role: Rol
|
||||
time_zone: Fuso horario
|
||||
user_role:
|
||||
|
||||
@@ -374,9 +374,7 @@ he:
|
||||
jurisdiction: איזור השיפוט
|
||||
min_age: גיל מינימלי
|
||||
user:
|
||||
date_of_birth_1i: יום
|
||||
date_of_birth_2i: חודש
|
||||
date_of_birth_3i: שנה
|
||||
role: תפקיד
|
||||
time_zone: אזור זמן
|
||||
user_role:
|
||||
|
||||
@@ -371,9 +371,7 @@ hu:
|
||||
jurisdiction: Joghatóság
|
||||
min_age: Minimális életkor
|
||||
user:
|
||||
date_of_birth_1i: Nap
|
||||
date_of_birth_2i: Hónap
|
||||
date_of_birth_3i: Év
|
||||
role: Szerep
|
||||
time_zone: Időzóna
|
||||
user_role:
|
||||
|
||||
@@ -370,9 +370,7 @@ ia:
|
||||
jurisdiction: Jurisdiction
|
||||
min_age: Etate minime
|
||||
user:
|
||||
date_of_birth_1i: Die
|
||||
date_of_birth_2i: Mense
|
||||
date_of_birth_3i: Anno
|
||||
role: Rolo
|
||||
time_zone: Fuso horari
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ is:
|
||||
jurisdiction: Lögsagnarumdæmi
|
||||
min_age: Lágmarksaldur
|
||||
user:
|
||||
date_of_birth_1i: Dagur
|
||||
date_of_birth_2i: Mánuður
|
||||
date_of_birth_3i: Ár
|
||||
role: Hlutverk
|
||||
time_zone: Tímabelti
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ it:
|
||||
jurisdiction: Giurisdizione legale
|
||||
min_age: Età minima
|
||||
user:
|
||||
date_of_birth_1i: Giorno
|
||||
date_of_birth_2i: Mese
|
||||
date_of_birth_3i: Anno
|
||||
role: Ruolo
|
||||
time_zone: Fuso orario
|
||||
user_role:
|
||||
|
||||
@@ -348,9 +348,7 @@ ja:
|
||||
jurisdiction: 裁判管轄
|
||||
min_age: 登録可能な最低年齢
|
||||
user:
|
||||
date_of_birth_1i: 日
|
||||
date_of_birth_2i: 月
|
||||
date_of_birth_3i: 年
|
||||
role: ロール
|
||||
time_zone: タイムゾーン
|
||||
user_role:
|
||||
|
||||
@@ -158,9 +158,7 @@ kab:
|
||||
terms_of_service_generator:
|
||||
domain: Taɣult
|
||||
user:
|
||||
date_of_birth_1i: Ass
|
||||
date_of_birth_2i: Ayyur
|
||||
date_of_birth_3i: Aseggas
|
||||
role: Tamlilt
|
||||
time_zone: Tamnaḍt tasragant
|
||||
user_role:
|
||||
|
||||
@@ -78,6 +78,7 @@ ko:
|
||||
featured_tag:
|
||||
name: '이것들은 최근에 많이 쓰인 해시태그들입니다:'
|
||||
filters:
|
||||
action: 게시물이 필터에 걸러질 때 어떤 동작을 수행할 지 고르세요
|
||||
actions:
|
||||
blur: 텍스트는 숨기지 않고 그대로 둔 채 경고 뒤에 미디어를 숨김니다
|
||||
hide: 필터에 걸러진 글을 처음부터 없었던 것처럼 완전히 가리기
|
||||
@@ -366,9 +367,7 @@ ko:
|
||||
jurisdiction: 법적 관할권
|
||||
min_age: 최소 연령
|
||||
user:
|
||||
date_of_birth_1i: 일
|
||||
date_of_birth_2i: 월
|
||||
date_of_birth_3i: 년
|
||||
role: 역할
|
||||
time_zone: 시간대
|
||||
user_role:
|
||||
|
||||
@@ -313,9 +313,7 @@ lad:
|
||||
domain: Domeno
|
||||
min_age: Edad minima
|
||||
user:
|
||||
date_of_birth_1i: Diya
|
||||
date_of_birth_2i: Mez
|
||||
date_of_birth_3i: Anyo
|
||||
role: Rolo
|
||||
time_zone: Zona de tiempo
|
||||
user_role:
|
||||
|
||||
@@ -246,9 +246,7 @@ lt:
|
||||
jurisdiction: Teisinis teismingumas
|
||||
min_age: Mažiausias amžius
|
||||
user:
|
||||
date_of_birth_1i: Diena
|
||||
date_of_birth_2i: Mėnuo
|
||||
date_of_birth_3i: Metai
|
||||
role: Vaidmuo
|
||||
time_zone: Laiko juosta
|
||||
user_role:
|
||||
|
||||
@@ -335,9 +335,7 @@ lv:
|
||||
domain: Domēna vārds
|
||||
min_age: Mazākais pieļaujamais vecums
|
||||
user:
|
||||
date_of_birth_1i: Diena
|
||||
date_of_birth_2i: Mēnesis
|
||||
date_of_birth_3i: Gads
|
||||
role: Loma
|
||||
time_zone: Laika josla
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ nl:
|
||||
jurisdiction: Jurisdictie
|
||||
min_age: Minimumleeftijd
|
||||
user:
|
||||
date_of_birth_1i: Dag
|
||||
date_of_birth_2i: Maand
|
||||
date_of_birth_3i: Jaar
|
||||
role: Rol
|
||||
time_zone: Tijdzone
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ nn:
|
||||
jurisdiction: Rettskrins
|
||||
min_age: Minstealder
|
||||
user:
|
||||
date_of_birth_1i: Dag
|
||||
date_of_birth_2i: Månad
|
||||
date_of_birth_3i: År
|
||||
role: Rolle
|
||||
time_zone: Tidssone
|
||||
user_role:
|
||||
|
||||
@@ -370,9 +370,7 @@ pl:
|
||||
jurisdiction: Jurysdykcja
|
||||
min_age: Wiek minimalny
|
||||
user:
|
||||
date_of_birth_1i: Dzień
|
||||
date_of_birth_2i: Miesiąc
|
||||
date_of_birth_3i: Rok
|
||||
role: Rola
|
||||
time_zone: Strefa czasowa
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ pt-BR:
|
||||
jurisdiction: Jurisdição legal
|
||||
min_age: Idade mínima
|
||||
user:
|
||||
date_of_birth_1i: Dia
|
||||
date_of_birth_2i: Mês
|
||||
date_of_birth_3i: Ano
|
||||
role: Cargo
|
||||
time_zone: Fuso horário
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ pt-PT:
|
||||
jurisdiction: Jurisdição legal
|
||||
min_age: Idade mínima
|
||||
user:
|
||||
date_of_birth_1i: Dia
|
||||
date_of_birth_2i: Mês
|
||||
date_of_birth_3i: Ano
|
||||
role: Função
|
||||
time_zone: Fuso horário
|
||||
user_role:
|
||||
|
||||
@@ -82,6 +82,7 @@ ru:
|
||||
activity_api_enabled: Еженедельная выгрузка количества локальных постов, активных пользователей и новых регистраций
|
||||
app_icon: WEBP, PNG, GIF или JPG. Заменяет значок приложения на мобильных устройствах по умолчанию вашим значком.
|
||||
backups_retention_period: Пользователи могут запустить создание архива своих постов, чтобы скачать его позже. Если задать положительное значение, эти архивы будут автоматически удалены с вашего хранилища через указанное число дней.
|
||||
bootstrap_timeline_accounts: Эти учётные записи будут закреплены в начале списка рекомендуемых профилей для новых пользователей. Список учётных записей нужно вводить через запятую.
|
||||
closed_registrations_message: Отображается, когда регистрация закрыта
|
||||
content_cache_retention_period: Все сообщения с других серверов (включая бусты и ответы) будут удалены через указанное количество дней, независимо от того, как локальный пользователь взаимодействовал с этими сообщениями. Это касается и тех сообщений, которые локальный пользователь пометил в закладки или избранное. Приватные упоминания между пользователями из разных инстансов также будут потеряны и не смогут быть восстановлены. Использование этой настройки предназначено для экземпляров специального назначения и нарушает многие ожидания пользователей при использовании в общих целях.
|
||||
custom_css: Вы можете применять пользовательские стили в веб-версии Mastodon.
|
||||
@@ -138,12 +139,12 @@ ru:
|
||||
admin_email: Юридические уведомления включают в себя встречные уведомления, постановления суда, запросы на удаление и запросы правоохранительных органов.
|
||||
arbitration_address: Может совпадать с почтовым адресом, указанным выше, либо «N/A» в случае электронной почты.
|
||||
arbitration_website: Веб-форма или «N/A» в случае электронной почты.
|
||||
choice_of_law: Город, регион, территория или государство, внутреннее материальное право которого регулирует любые претензии.
|
||||
choice_of_law: Город, регион, территория или государство, внутреннее материальное право которого будет регулировать любые претензии.
|
||||
dmca_address: Находящиеся в США операторы должны использовать адрес, зарегистрированный в DMCA Designated Agent Directory. Использовать абонентский ящик возможно при обращении в соответствующей просьбой, для чего нужно с помощью DMCA Designated Agent Post Office Box Waiver Request написать сообщение в Copyright Office и объяснить, что вы занимаетесь модерацией контента из дома и опасаетесь мести за свои действия, поэтому должны использовать абонентский ящик, чтобы убрать ваш домашний адрес из общего доступа.
|
||||
dmca_email: Может совпадать с адресом электронной почты для юридических уведомлений, указанным выше.
|
||||
domain: Имя, позволяющее уникально идентифицировать ваш онлайн-ресурс.
|
||||
jurisdiction: Впишите страну, где находится лицо, оплачивающее счета. Если это компания либо организация, впишите страну инкорпорации, включая город, регион, территорию или штат, если это необходимо.
|
||||
min_age: Не меньше минимального возраста, требуемого по закону в вашей юрисдикции.
|
||||
min_age: Не меньше минимального возраста, требуемого по закону в вашей стране.
|
||||
user:
|
||||
chosen_languages: Отметьте языки, на которых вы желаете видеть посты в публичных лентах. Оставьте выбор пустым, чтобы не фильтровать посты по языку
|
||||
date_of_birth:
|
||||
@@ -350,17 +351,15 @@ ru:
|
||||
terms_of_service_generator:
|
||||
admin_email: Адрес электронной почты для юридических уведомлений
|
||||
arbitration_address: Почтовый адрес для уведомлений об арбитраже
|
||||
arbitration_website: Вебсайт для подачи уведомления об арбитраже
|
||||
choice_of_law: Юрисдикция
|
||||
arbitration_website: Веб-сайт для подачи уведомления об арбитраже
|
||||
choice_of_law: Выбор права
|
||||
dmca_address: Почтовый адрес для обращений правообладателей
|
||||
dmca_email: Адрес электронной почты для обращений правообладателей
|
||||
domain: Доменное имя
|
||||
jurisdiction: Юрисдикция
|
||||
min_age: Минимальный возраст
|
||||
user:
|
||||
date_of_birth_1i: День
|
||||
date_of_birth_2i: Месяц
|
||||
date_of_birth_3i: Год
|
||||
role: Роль
|
||||
time_zone: Часовой пояс
|
||||
user_role:
|
||||
|
||||
@@ -344,9 +344,7 @@ si:
|
||||
jurisdiction: නීතිමය අධිකරණ බලය
|
||||
min_age: අවම වයස
|
||||
user:
|
||||
date_of_birth_1i: දහවල
|
||||
date_of_birth_2i: මාසය
|
||||
date_of_birth_3i: වර්ෂය
|
||||
role: භූමිකාව
|
||||
time_zone: වේලා කලාපය
|
||||
user_role:
|
||||
|
||||
@@ -340,9 +340,7 @@ sl:
|
||||
jurisdiction: Pravna pristojnost
|
||||
min_age: Najmanjša starost
|
||||
user:
|
||||
date_of_birth_1i: Dan
|
||||
date_of_birth_2i: Mesec
|
||||
date_of_birth_3i: Leto
|
||||
role: Vloga
|
||||
time_zone: Časovni pas
|
||||
user_role:
|
||||
|
||||
@@ -371,9 +371,7 @@ sq:
|
||||
jurisdiction: Juridiksion ligjor
|
||||
min_age: Mosha minimale
|
||||
user:
|
||||
date_of_birth_1i: Ditë
|
||||
date_of_birth_2i: Muaj
|
||||
date_of_birth_3i: Vit
|
||||
role: Rol
|
||||
time_zone: Zonë kohore
|
||||
user_role:
|
||||
|
||||
@@ -354,9 +354,7 @@ sv:
|
||||
jurisdiction: Rättslig jurisdiktion
|
||||
min_age: Minimiålder
|
||||
user:
|
||||
date_of_birth_1i: Dag
|
||||
date_of_birth_2i: Månad
|
||||
date_of_birth_3i: År
|
||||
role: Roll
|
||||
time_zone: Tidszon
|
||||
user_role:
|
||||
|
||||
@@ -314,9 +314,7 @@ th:
|
||||
terms_of_service_generator:
|
||||
domain: โดเมน
|
||||
user:
|
||||
date_of_birth_1i: วัน
|
||||
date_of_birth_2i: เดือน
|
||||
date_of_birth_3i: ปี
|
||||
role: บทบาท
|
||||
time_zone: โซนเวลา
|
||||
user_role:
|
||||
|
||||
@@ -372,9 +372,7 @@ tr:
|
||||
jurisdiction: Yasal yetki alanı
|
||||
min_age: Minimum yaş
|
||||
user:
|
||||
date_of_birth_1i: Gün
|
||||
date_of_birth_2i: Ay
|
||||
date_of_birth_3i: Yıl
|
||||
role: Rol
|
||||
time_zone: Zaman dilimi
|
||||
user_role:
|
||||
|
||||
@@ -342,9 +342,7 @@ uk:
|
||||
jurisdiction: Правова юрисдикція
|
||||
min_age: Мінімальний вік
|
||||
user:
|
||||
date_of_birth_1i: День
|
||||
date_of_birth_2i: Місяць
|
||||
date_of_birth_3i: Рік
|
||||
role: Роль
|
||||
time_zone: Часовий пояс
|
||||
user_role:
|
||||
|
||||
@@ -371,9 +371,7 @@ vi:
|
||||
jurisdiction: Quyền tài phán pháp lý
|
||||
min_age: Độ tuổi tối thiểu
|
||||
user:
|
||||
date_of_birth_1i: Ngày
|
||||
date_of_birth_2i: Tháng
|
||||
date_of_birth_3i: Năm
|
||||
role: Vai trò
|
||||
time_zone: Múi giờ
|
||||
user_role:
|
||||
|
||||
@@ -371,9 +371,7 @@ zh-CN:
|
||||
jurisdiction: 法律管辖区
|
||||
min_age: 最低年龄
|
||||
user:
|
||||
date_of_birth_1i: 日
|
||||
date_of_birth_2i: 月
|
||||
date_of_birth_3i: 年
|
||||
role: 角色
|
||||
time_zone: 时区
|
||||
user_role:
|
||||
|
||||
@@ -305,9 +305,7 @@ zh-HK:
|
||||
terms_of_service_generator:
|
||||
domain: 域名
|
||||
user:
|
||||
date_of_birth_1i: 日
|
||||
date_of_birth_2i: 月
|
||||
date_of_birth_3i: 年
|
||||
role: 角色
|
||||
time_zone: 時區
|
||||
user_role:
|
||||
|
||||
@@ -371,9 +371,7 @@ zh-TW:
|
||||
jurisdiction: 司法管轄區
|
||||
min_age: 最低年齡
|
||||
user:
|
||||
date_of_birth_1i: 日
|
||||
date_of_birth_2i: 月
|
||||
date_of_birth_3i: 年
|
||||
role: 角色
|
||||
time_zone: 時區
|
||||
user_role:
|
||||
|
||||
@@ -59,7 +59,7 @@ services:
|
||||
web:
|
||||
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||
# build: .
|
||||
image: ghcr.io/glitch-soc/mastodon:v4.5.0
|
||||
image: ghcr.io/glitch-soc/mastodon:v4.5.1
|
||||
restart: always
|
||||
env_file: .env.production
|
||||
command: bundle exec puma -C config/puma.rb
|
||||
@@ -83,7 +83,7 @@ services:
|
||||
# build:
|
||||
# dockerfile: ./streaming/Dockerfile
|
||||
# context: .
|
||||
image: ghcr.io/glitch-soc/mastodon-streaming:v4.5.0
|
||||
image: ghcr.io/glitch-soc/mastodon-streaming:v4.5.1
|
||||
restart: always
|
||||
env_file: .env.production
|
||||
command: node ./streaming/index.js
|
||||
@@ -102,7 +102,7 @@ services:
|
||||
sidekiq:
|
||||
# You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
|
||||
# build: .
|
||||
image: ghcr.io/glitch-soc/mastodon:v4.5.0
|
||||
image: ghcr.io/glitch-soc/mastodon:v4.5.1
|
||||
restart: always
|
||||
env_file: .env.production
|
||||
command: bundle exec sidekiq
|
||||
@@ -115,7 +115,7 @@ services:
|
||||
volumes:
|
||||
- ./public/system:/mastodon/public/system
|
||||
healthcheck:
|
||||
test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ [78]' || false"]
|
||||
test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 8' || false"]
|
||||
|
||||
## Uncomment to enable federation with tor instances along with adding the following ENV variables
|
||||
## http_hidden_proxy=http://privoxy:8118
|
||||
|
||||
@@ -107,6 +107,7 @@ module ViteRails::TagHelpers::IntegrityExtension
|
||||
stylesheet,
|
||||
integrity: vite_manifest.integrity_hash_for_file(stylesheet),
|
||||
media: media,
|
||||
crossorigin: crossorigin,
|
||||
**options
|
||||
)
|
||||
end
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
"core-js": "^3.30.2",
|
||||
"cross-env": "^10.0.0",
|
||||
"debug": "^4.4.1",
|
||||
"delegated-events": "^1.1.2",
|
||||
"detect-passive-events": "^2.0.3",
|
||||
"emoji-mart": "npm:emoji-mart-lazyload@latest",
|
||||
"emojibase": "^16.0.0",
|
||||
|
||||
23
yarn.lock
23
yarn.lock
@@ -2765,6 +2765,7 @@ __metadata:
|
||||
core-js: "npm:^3.30.2"
|
||||
cross-env: "npm:^10.0.0"
|
||||
debug: "npm:^4.4.1"
|
||||
delegated-events: "npm:^1.1.2"
|
||||
detect-passive-events: "npm:^2.0.3"
|
||||
emoji-mart: "npm:emoji-mart-lazyload@latest"
|
||||
emojibase: "npm:^16.0.0"
|
||||
@@ -6397,6 +6398,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"delegated-events@npm:^1.1.2":
|
||||
version: 1.1.2
|
||||
resolution: "delegated-events@npm:1.1.2"
|
||||
dependencies:
|
||||
selector-set: "npm:^1.1.5"
|
||||
checksum: 10c0/b295a6d6c6cef4b9312bfd4132ac3a1255f3c2fadf3692a04cf7ddf8f0d472bfce9de06323faa75e922d20e5674d45022e1a5378b8500cd7d573ffa0cf7ca602
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"denque@npm:^2.1.0":
|
||||
version: 2.1.0
|
||||
resolution: "denque@npm:2.1.0"
|
||||
@@ -8881,13 +8891,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"js-yaml@npm:^4.1.0":
|
||||
version: 4.1.0
|
||||
resolution: "js-yaml@npm:4.1.0"
|
||||
version: 4.1.1
|
||||
resolution: "js-yaml@npm:4.1.1"
|
||||
dependencies:
|
||||
argparse: "npm:^2.0.1"
|
||||
bin:
|
||||
js-yaml: bin/js-yaml.js
|
||||
checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f
|
||||
checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -12169,6 +12179,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"selector-set@npm:^1.1.5":
|
||||
version: 1.1.5
|
||||
resolution: "selector-set@npm:1.1.5"
|
||||
checksum: 10c0/4835907846eb8496c2cc4e5ce48355cce1ef3b55e82789542739dcdc71ebfb756e133d1d7f7ec9f0cf4b1c11fc0375a1d3b99a482d9c973493ca85a6d4b012ab
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"semver@npm:^5.6.0":
|
||||
version: 5.7.2
|
||||
resolution: "semver@npm:5.7.2"
|
||||
|
||||
Reference in New Issue
Block a user