Merge branch 'main' into fix-10609-poll-options

This commit is contained in:
Zee Aslam 2025-06-26 12:17:40 -04:00 committed by GitHub
commit 0e66f139c8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
48 changed files with 591 additions and 262 deletions

View File

@ -81,3 +81,6 @@ AUTHORS.md
# Process a few selected JS files # Process a few selected JS files
!lint-staged.config.js !lint-staged.config.js
# Ignore config YAML files that include ERB/ruby code prettier does not understand
/config/email.yml

View File

@ -18,7 +18,7 @@ import { useIdentity } from 'mastodon/identity_context';
import { useAppHistory } from './router'; import { useAppHistory } from './router';
const messages = defineMessages({ export const messages = defineMessages({
show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' },
hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' }, hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' },
moveLeft: { moveLeft: {

View File

@ -1,53 +0,0 @@
import PropTypes from 'prop-types';
import { PureComponent } from 'react';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import SettingsIcon from '@/material-icons/400-20px/settings.svg?react';
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
import { requestBrowserPermission } from 'mastodon/actions/notifications';
import { changeSetting } from 'mastodon/actions/settings';
import { Button } from 'mastodon/components/button';
import { Icon } from 'mastodon/components/icon';
import { IconButton } from 'mastodon/components/icon_button';
const messages = defineMessages({
close: { id: 'lightbox.close', defaultMessage: 'Close' },
});
class NotificationsPermissionBanner extends PureComponent {
static propTypes = {
dispatch: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
};
handleClick = () => {
this.props.dispatch(requestBrowserPermission());
};
handleClose = () => {
this.props.dispatch(changeSetting(['notifications', 'dismissPermissionBanner'], true));
};
render () {
const { intl } = this.props;
return (
<div className='notifications-permission-banner'>
<div className='notifications-permission-banner__close'>
<IconButton icon='times' iconComponent={CloseIcon} onClick={this.handleClose} title={intl.formatMessage(messages.close)} />
</div>
<h2><FormattedMessage id='notifications_permission_banner.title' defaultMessage='Never miss a thing' /></h2>
<p><FormattedMessage id='notifications_permission_banner.how_to_control' defaultMessage="To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled." values={{ icon: <Icon id='sliders' icon={SettingsIcon} /> }} /></p>
<Button onClick={this.handleClick}><FormattedMessage id='notifications_permission_banner.enable' defaultMessage='Enable desktop notifications' /></Button>
</div>
);
}
}
export default connect()(injectIntl(NotificationsPermissionBanner));

View File

@ -0,0 +1,74 @@
import { useCallback } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { useAppDispatch } from '@/mastodon/store';
import CloseIcon from '@/material-icons/400-24px/close.svg?react';
import UnfoldMoreIcon from '@/material-icons/400-24px/unfold_more.svg?react';
import { requestBrowserPermission } from 'mastodon/actions/notifications';
import { changeSetting } from 'mastodon/actions/settings';
import { Button } from 'mastodon/components/button';
import { messages as columnHeaderMessages } from 'mastodon/components/column_header';
import { Icon } from 'mastodon/components/icon';
import { IconButton } from 'mastodon/components/icon_button';
const messages = defineMessages({
close: { id: 'lightbox.close', defaultMessage: 'Close' },
});
const NotificationsPermissionBanner: React.FC = () => {
const intl = useIntl();
const dispatch = useAppDispatch();
const handleClick = useCallback(() => {
dispatch(requestBrowserPermission());
}, [dispatch]);
const handleClose = useCallback(() => {
dispatch(changeSetting(['notifications', 'dismissPermissionBanner'], true));
}, [dispatch]);
return (
<div className='notifications-permission-banner'>
<div className='notifications-permission-banner__close'>
<IconButton
icon='times'
iconComponent={CloseIcon}
onClick={handleClose}
title={intl.formatMessage(messages.close)}
/>
</div>
<h2>
<FormattedMessage
id='notifications_permission_banner.title'
defaultMessage='Never miss a thing'
/>
</h2>
<p>
<FormattedMessage
id='notifications_permission_banner.how_to_control'
defaultMessage="To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled."
values={{
icon: (
<Icon
id='sliders'
icon={UnfoldMoreIcon}
aria-label={intl.formatMessage(columnHeaderMessages.show)}
/>
),
}}
/>
</p>
<Button onClick={handleClick}>
<FormattedMessage
id='notifications_permission_banner.enable'
defaultMessage='Enable desktop notifications'
/>
</Button>
</div>
);
};
// eslint-disable-next-line import/no-default-export
export default NotificationsPermissionBanner;

View File

@ -13,6 +13,7 @@ export const ConfirmationModal: React.FC<
title: React.ReactNode; title: React.ReactNode;
message: React.ReactNode; message: React.ReactNode;
confirm: React.ReactNode; confirm: React.ReactNode;
cancel?: React.ReactNode;
secondary?: React.ReactNode; secondary?: React.ReactNode;
onSecondary?: () => void; onSecondary?: () => void;
onConfirm: () => void; onConfirm: () => void;
@ -22,6 +23,7 @@ export const ConfirmationModal: React.FC<
title, title,
message, message,
confirm, confirm,
cancel,
onClose, onClose,
onConfirm, onConfirm,
secondary, secondary,
@ -57,10 +59,12 @@ export const ConfirmationModal: React.FC<
<div className='safety-action-modal__bottom'> <div className='safety-action-modal__bottom'>
<div className='safety-action-modal__actions'> <div className='safety-action-modal__actions'>
<button onClick={handleCancel} className='link-button'> <button onClick={handleCancel} className='link-button'>
<FormattedMessage {cancel ?? (
id='confirmation_modal.cancel' <FormattedMessage
defaultMessage='Cancel' id='confirmation_modal.cancel'
/> defaultMessage='Cancel'
/>
)}
</button> </button>
{secondary && ( {secondary && (

View File

@ -0,0 +1,104 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { replyCompose } from 'mastodon/actions/compose';
import { editStatus } from 'mastodon/actions/statuses';
import type { Status } from 'mastodon/models/status';
import { useAppDispatch, useAppSelector } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const editMessages = defineMessages({
title: {
id: 'confirmations.discard_draft.edit.title',
defaultMessage: 'Discard changes to your post?',
},
message: {
id: 'confirmations.discard_draft.edit.message',
defaultMessage:
'Continuing will discard any changes you have made to the post you are currently editing.',
},
cancel: {
id: 'confirmations.discard_draft.edit.cancel',
defaultMessage: 'Resume editing',
},
});
const postMessages = defineMessages({
title: {
id: 'confirmations.discard_draft.post.title',
defaultMessage: 'Discard your draft post?',
},
message: {
id: 'confirmations.discard_draft.post.message',
defaultMessage:
'Continuing will discard the post you are currently composing.',
},
cancel: {
id: 'confirmations.discard_draft.post.cancel',
defaultMessage: 'Resume draft',
},
});
const messages = defineMessages({
confirm: {
id: 'confirmations.discard_draft.confirm',
defaultMessage: 'Discard and continue',
},
});
const DiscardDraftConfirmationModal: React.FC<
{
onConfirm: () => void;
} & BaseConfirmationModalProps
> = ({ onConfirm, onClose }) => {
const intl = useIntl();
const isEditing = useAppSelector((state) => !!state.compose.get('id'));
const contextualMessages = isEditing ? editMessages : postMessages;
return (
<ConfirmationModal
title={intl.formatMessage(contextualMessages.title)}
message={intl.formatMessage(contextualMessages.message)}
cancel={intl.formatMessage(contextualMessages.cancel)}
confirm={intl.formatMessage(messages.confirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};
export const ConfirmReplyModal: React.FC<
{
status: Status;
} & BaseConfirmationModalProps
> = ({ status, onClose }) => {
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(replyCompose(status));
}, [dispatch, status]);
return (
<DiscardDraftConfirmationModal onConfirm={onConfirm} onClose={onClose} />
);
};
export const ConfirmEditStatusModal: React.FC<
{
statusId: string;
} & BaseConfirmationModalProps
> = ({ statusId, onClose }) => {
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(editStatus(statusId));
}, [dispatch, statusId]);
return (
<DiscardDraftConfirmationModal onConfirm={onConfirm} onClose={onClose} />
);
};

View File

@ -1,45 +0,0 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { editStatus } from 'mastodon/actions/statuses';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
editTitle: {
id: 'confirmations.edit.title',
defaultMessage: 'Overwrite post?',
},
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: {
id: 'confirmations.edit.message',
defaultMessage:
'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?',
},
});
export const ConfirmEditStatusModal: React.FC<
{
statusId: string;
} & BaseConfirmationModalProps
> = ({ statusId, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(editStatus(statusId));
}, [dispatch, statusId]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.editTitle)}
message={intl.formatMessage(messages.editMessage)}
confirm={intl.formatMessage(messages.editConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View File

@ -1,8 +1,10 @@
export { ConfirmationModal } from './confirmation_modal'; export { ConfirmationModal } from './confirmation_modal';
export { ConfirmDeleteStatusModal } from './delete_status'; export { ConfirmDeleteStatusModal } from './delete_status';
export { ConfirmDeleteListModal } from './delete_list'; export { ConfirmDeleteListModal } from './delete_list';
export { ConfirmReplyModal } from './reply'; export {
export { ConfirmEditStatusModal } from './edit_status'; ConfirmReplyModal,
ConfirmEditStatusModal,
} from './discard_draft_confirmation';
export { ConfirmUnfollowModal } from './unfollow'; export { ConfirmUnfollowModal } from './unfollow';
export { ConfirmClearNotificationsModal } from './clear_notifications'; export { ConfirmClearNotificationsModal } from './clear_notifications';
export { ConfirmLogOutModal } from './log_out'; export { ConfirmLogOutModal } from './log_out';

View File

@ -1,46 +0,0 @@
import { useCallback } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { replyCompose } from 'mastodon/actions/compose';
import type { Status } from 'mastodon/models/status';
import { useAppDispatch } from 'mastodon/store';
import type { BaseConfirmationModalProps } from './confirmation_modal';
import { ConfirmationModal } from './confirmation_modal';
const messages = defineMessages({
replyTitle: {
id: 'confirmations.reply.title',
defaultMessage: 'Overwrite post?',
},
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: {
id: 'confirmations.reply.message',
defaultMessage:
'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?',
},
});
export const ConfirmReplyModal: React.FC<
{
status: Status;
} & BaseConfirmationModalProps
> = ({ status, onClose }) => {
const intl = useIntl();
const dispatch = useAppDispatch();
const onConfirm = useCallback(() => {
dispatch(replyCompose(status));
}, [dispatch, status]);
return (
<ConfirmationModal
title={intl.formatMessage(messages.replyTitle)}
message={intl.formatMessage(messages.replyMessage)}
confirm={intl.formatMessage(messages.replyConfirm)}
onConfirm={onConfirm}
onClose={onClose}
/>
);
};

View File

@ -24,7 +24,7 @@
"account.blocking": "Blokering", "account.blocking": "Blokering",
"account.cancel_follow_request": "Annullér anmodning om at følge", "account.cancel_follow_request": "Annullér anmodning om at følge",
"account.copy": "Kopiér link til profil", "account.copy": "Kopiér link til profil",
"account.direct": "Privat omtale @{name}", "account.direct": "Nævn @{name} privat",
"account.disable_notifications": "Advisér mig ikke længere, når @{name} poster", "account.disable_notifications": "Advisér mig ikke længere, når @{name} poster",
"account.domain_blocking": "Blokerer domæne", "account.domain_blocking": "Blokerer domæne",
"account.edit_profile": "Redigér profil", "account.edit_profile": "Redigér profil",
@ -121,7 +121,7 @@
"annual_report.summary.highlighted_post.by_replies": "mest besvarede indlæg", "annual_report.summary.highlighted_post.by_replies": "mest besvarede indlæg",
"annual_report.summary.highlighted_post.possessive": "{name}s", "annual_report.summary.highlighted_post.possessive": "{name}s",
"annual_report.summary.most_used_app.most_used_app": "mest benyttede app", "annual_report.summary.most_used_app.most_used_app": "mest benyttede app",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede etiket", "annual_report.summary.most_used_hashtag.most_used_hashtag": "mest benyttede hashtag",
"annual_report.summary.most_used_hashtag.none": "Intet", "annual_report.summary.most_used_hashtag.none": "Intet",
"annual_report.summary.new_posts.new_posts": "nye indlæg", "annual_report.summary.new_posts.new_posts": "nye indlæg",
"annual_report.summary.percentile.text": "<topLabel>Det betyder, at man er i top</topLabel><percentage></percentage><bottomLabel>af {domain}-brugere.</bottomLabel>", "annual_report.summary.percentile.text": "<topLabel>Det betyder, at man er i top</topLabel><percentage></percentage><bottomLabel>af {domain}-brugere.</bottomLabel>",
@ -194,10 +194,10 @@
"compose.saved.body": "Indlæg gemt.", "compose.saved.body": "Indlæg gemt.",
"compose_form.direct_message_warning_learn_more": "Få mere at vide", "compose_form.direct_message_warning_learn_more": "Få mere at vide",
"compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.", "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende-krypteret. Del derfor ikke sensitiv information via Mastodon.",
"compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under nogen etiket, da kun offentlige indlæg er søgbare via etiketter.", "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.",
"compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.", "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.",
"compose_form.lock_disclaimer.lock": "låst", "compose_form.lock_disclaimer.lock": "låst",
"compose_form.placeholder": "Hvad tænker du på?", "compose_form.placeholder": "Hvad har du på hjertet?",
"compose_form.poll.duration": "Afstemningens varighed", "compose_form.poll.duration": "Afstemningens varighed",
"compose_form.poll.multiple": "Multivalg", "compose_form.poll.multiple": "Multivalg",
"compose_form.poll.option_placeholder": "Valgmulighed {number}", "compose_form.poll.option_placeholder": "Valgmulighed {number}",
@ -205,7 +205,7 @@
"compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype", "compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype",
"compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype", "compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
"compose_form.poll.type": "Stil", "compose_form.poll.type": "Stil",
"compose_form.publish": "Indsend", "compose_form.publish": "Slå op",
"compose_form.reply": "Svar", "compose_form.reply": "Svar",
"compose_form.save_changes": "Opdatér", "compose_form.save_changes": "Opdatér",
"compose_form.spoiler.marked": "Fjern emnefelt", "compose_form.spoiler.marked": "Fjern emnefelt",
@ -305,8 +305,8 @@
"emoji_button.search_results": "Søgeresultater", "emoji_button.search_results": "Søgeresultater",
"emoji_button.symbols": "Symboler", "emoji_button.symbols": "Symboler",
"emoji_button.travel": "Rejser og steder", "emoji_button.travel": "Rejser og steder",
"empty_column.account_featured.me": "Intet fremhævet endnu. Vidste du, at man kan fremhæve sine mest brugte hashtags og endda en vens konti på sin profil?", "empty_column.account_featured.me": "Intet fremhævet endnu. Vidste du, at man kan fremhæve sine mest brugte hashtags og endda din vens konti på din profil?",
"empty_column.account_featured.other": "{acct} har ikke fremhævet noget endnu. Vidste du, at man kan fremhæve sine mest brugte hashtags og endda en vens konti på sin profil?", "empty_column.account_featured.other": "{acct} har ikke fremhævet noget endnu. Vidste du, at du kan fremhæve dine mest brugte hashtags og endda din vens konti på din profil?",
"empty_column.account_featured_other.unknown": "Denne konto har ikke fremhævet noget endnu.", "empty_column.account_featured_other.unknown": "Denne konto har ikke fremhævet noget endnu.",
"empty_column.account_hides_collections": "Brugeren har valgt ikke at gøre denne information tilgængelig", "empty_column.account_hides_collections": "Brugeren har valgt ikke at gøre denne information tilgængelig",
"empty_column.account_suspended": "Konto suspenderet", "empty_column.account_suspended": "Konto suspenderet",
@ -321,8 +321,8 @@
"empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.", "empty_column.favourited_statuses": "Du har endnu ingen favoritindlæg. Når du føjer et opslag til favoritter, vil det dukke op her.",
"empty_column.favourites": "Ingen har endnu føjet dette indlæg til favoritter. Når nogen gør det, vil det dukke op her.", "empty_column.favourites": "Ingen har endnu føjet dette indlæg til favoritter. Når nogen gør det, vil det dukke op her.",
"empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op her.", "empty_column.follow_requests": "Du har endnu ingen følgeanmodninger. Når du modtager én, vil den dukke op her.",
"empty_column.followed_tags": "Ingen etiketter følges endnu. Når det sker, vil de fremgå her.", "empty_column.followed_tags": "Ingen hashtags følges endnu. Når det sker, vil de fremgå her.",
"empty_column.hashtag": "Der er intet med denne etiket endnu.", "empty_column.hashtag": "Der er intet med dette hashtag endnu.",
"empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at fylde den op.", "empty_column.home": "Din hjemmetidslinje er tom! Følg nogle personer, for at fylde den op.",
"empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå her.", "empty_column.list": "Der er ikke noget på denne liste endnu. Når medlemmer af listen udgiver nye indlæg vil de fremgå her.",
"empty_column.mutes": "Du har endnu ikke skjult nogle brugere.", "empty_column.mutes": "Du har endnu ikke skjult nogle brugere.",
@ -336,9 +336,10 @@
"errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til udklipsholderen", "errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til udklipsholderen",
"errors.unexpected_crash.report_issue": "Anmeld problem", "errors.unexpected_crash.report_issue": "Anmeld problem",
"explore.suggested_follows": "Personer", "explore.suggested_follows": "Personer",
"explore.title": "Trender",
"explore.trending_links": "Nyheder", "explore.trending_links": "Nyheder",
"explore.trending_statuses": "Indlæg", "explore.trending_statuses": "Indlæg",
"explore.trending_tags": "Etiketter", "explore.trending_tags": "Hashtags",
"featured_carousel.header": "{count, plural, one {Fastgjort indlæg} other {Fastgjorte indlæg}}", "featured_carousel.header": "{count, plural, one {Fastgjort indlæg} other {Fastgjorte indlæg}}",
"featured_carousel.next": "Næste", "featured_carousel.next": "Næste",
"featured_carousel.post": "Indlæg", "featured_carousel.post": "Indlæg",
@ -384,7 +385,7 @@
"follow_suggestions.similar_to_recently_followed_longer": "Svarende til profiler, som for nylig er fulgt", "follow_suggestions.similar_to_recently_followed_longer": "Svarende til profiler, som for nylig er fulgt",
"follow_suggestions.view_all": "Vis alle", "follow_suggestions.view_all": "Vis alle",
"follow_suggestions.who_to_follow": "Hvem, som skal følges", "follow_suggestions.who_to_follow": "Hvem, som skal følges",
"followed_tags": "Etiketter, som følges", "followed_tags": "Hashtag, som følges",
"footer.about": "Om", "footer.about": "Om",
"footer.directory": "Profiloversigt", "footer.directory": "Profiloversigt",
"footer.get_app": "Hent appen", "footer.get_app": "Hent appen",
@ -402,7 +403,7 @@
"hashtag.column_header.tag_mode.any": "eller {additional}", "hashtag.column_header.tag_mode.any": "eller {additional}",
"hashtag.column_header.tag_mode.none": "uden {additional}", "hashtag.column_header.tag_mode.none": "uden {additional}",
"hashtag.column_settings.select.no_options_message": "Ingen forslag fundet", "hashtag.column_settings.select.no_options_message": "Ingen forslag fundet",
"hashtag.column_settings.select.placeholder": "Angiv etiketter…", "hashtag.column_settings.select.placeholder": "Angiv hashtags…",
"hashtag.column_settings.tag_mode.all": "Alle disse", "hashtag.column_settings.tag_mode.all": "Alle disse",
"hashtag.column_settings.tag_mode.any": "Nogle af disse", "hashtag.column_settings.tag_mode.any": "Nogle af disse",
"hashtag.column_settings.tag_mode.none": "Ingen af disse", "hashtag.column_settings.tag_mode.none": "Ingen af disse",
@ -411,10 +412,10 @@
"hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}", "hashtag.counter_by_uses": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}}",
"hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag", "hashtag.counter_by_uses_today": "{count, plural, one {{counter} indlæg} other {{counter} indlæg}} i dag",
"hashtag.feature": "Fremhæv på profil", "hashtag.feature": "Fremhæv på profil",
"hashtag.follow": "Følg etiket", "hashtag.follow": "Følg hashtag",
"hashtag.mute": "Tavsgør #{hashtag}", "hashtag.mute": "Tavsgør #{hashtag}",
"hashtag.unfeature": "Fremhæv ikke på profil", "hashtag.unfeature": "Fremhæv ikke på profil",
"hashtag.unfollow": "Stop med at følge etiket", "hashtag.unfollow": "Følg ikke længere hashtag",
"hashtags.and_other": "…og {count, plural, one {}other {# flere}}", "hashtags.and_other": "…og {count, plural, one {}other {# flere}}",
"hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.", "hints.profiles.followers_may_be_missing": "Der kan mangle følgere for denne profil.",
"hints.profiles.follows_may_be_missing": "Fulgte kan mangle for denne profil.", "hints.profiles.follows_may_be_missing": "Fulgte kan mangle for denne profil.",
@ -442,7 +443,7 @@
"ignore_notifications_modal.new_accounts_title": "Ignorér notifikationer fra nye konti?", "ignore_notifications_modal.new_accounts_title": "Ignorér notifikationer fra nye konti?",
"ignore_notifications_modal.not_followers_title": "Ignorér notifikationer fra folk, som ikke er følgere?", "ignore_notifications_modal.not_followers_title": "Ignorér notifikationer fra folk, som ikke er følgere?",
"ignore_notifications_modal.not_following_title": "Ignorér notifikationer fra folk, man ikke følger?", "ignore_notifications_modal.not_following_title": "Ignorér notifikationer fra folk, man ikke følger?",
"ignore_notifications_modal.private_mentions_title": "Ignorér notifikationer fra uopfordrede Private omtaler?", "ignore_notifications_modal.private_mentions_title": "Ignorér notifikationer fra uopfordrede private omtaler?",
"info_button.label": "Hjælp", "info_button.label": "Hjælp",
"info_button.what_is_alt_text": "<h1>Hvad er alt-tekst?</h1> <p>Alt-tekst leverer billedbeskrivelser til folk med synsnedsættelser, lav båndbredde-forbindelser eller med ønske om ekstra kontekst.</p> <p>Tilgængelighed og forståelse kan forbedres for alle ved at skrive klar, kortfattet og objektiv alt-tekst.</p> <ul> <li>Fang vigtige elementer</li> <li>Opsummér tekst i billeder</li> <li>Brug almindelig sætningsstruktur</li> <li>Undgå overflødig information</li> <li>Fokusér på tendenser og centrale resultater i kompleks grafik (såsom diagrammer eller kort)</li> </ul>", "info_button.what_is_alt_text": "<h1>Hvad er alt-tekst?</h1> <p>Alt-tekst leverer billedbeskrivelser til folk med synsnedsættelser, lav båndbredde-forbindelser eller med ønske om ekstra kontekst.</p> <p>Tilgængelighed og forståelse kan forbedres for alle ved at skrive klar, kortfattet og objektiv alt-tekst.</p> <ul> <li>Fang vigtige elementer</li> <li>Opsummér tekst i billeder</li> <li>Brug almindelig sætningsstruktur</li> <li>Undgå overflødig information</li> <li>Fokusér på tendenser og centrale resultater i kompleks grafik (såsom diagrammer eller kort)</li> </ul>",
"interaction_modal.action.favourite": "For at fortsætte, skal du føje til favoritter fra din konto.", "interaction_modal.action.favourite": "For at fortsætte, skal du føje til favoritter fra din konto.",
@ -558,7 +559,7 @@
"navigation_bar.favourites": "Favoritter", "navigation_bar.favourites": "Favoritter",
"navigation_bar.filters": "Skjulte ord", "navigation_bar.filters": "Skjulte ord",
"navigation_bar.follow_requests": "Følgeanmodninger", "navigation_bar.follow_requests": "Følgeanmodninger",
"navigation_bar.followed_tags": "Etiketter, som følges", "navigation_bar.followed_tags": "Hashtag, som følges",
"navigation_bar.follows_and_followers": "Følges og følgere", "navigation_bar.follows_and_followers": "Følges og følgere",
"navigation_bar.import_export": "Import og eksport", "navigation_bar.import_export": "Import og eksport",
"navigation_bar.lists": "Lister", "navigation_bar.lists": "Lister",
@ -574,7 +575,9 @@
"navigation_bar.search": "Søg", "navigation_bar.search": "Søg",
"navigation_bar.search_trends": "Søg/Populære", "navigation_bar.search_trends": "Søg/Populære",
"navigation_panel.collapse_followed_tags": "Sammenfold menuen Fulgte hashtags", "navigation_panel.collapse_followed_tags": "Sammenfold menuen Fulgte hashtags",
"navigation_panel.collapse_lists": "Luk listemenu",
"navigation_panel.expand_followed_tags": "Udfold menuen Fulgte hashtags", "navigation_panel.expand_followed_tags": "Udfold menuen Fulgte hashtags",
"navigation_panel.expand_lists": "Udvid listemenu",
"not_signed_in_indicator.not_signed_in": "Log ind for at tilgå denne ressource.", "not_signed_in_indicator.not_signed_in": "Log ind for at tilgå denne ressource.",
"notification.admin.report": "{name} anmeldte {target}", "notification.admin.report": "{name} anmeldte {target}",
"notification.admin.report_account": "{name} anmeldte {count, plural, one {et indlæg} other {# indlæg}} fra {target} angående {category}", "notification.admin.report_account": "{name} anmeldte {count, plural, one {et indlæg} other {# indlæg}} fra {target} angående {category}",
@ -703,7 +706,7 @@
"onboarding.profile.display_name": "Vist navn", "onboarding.profile.display_name": "Vist navn",
"onboarding.profile.display_name_hint": "Dit fulde navn eller dit sjove navn…", "onboarding.profile.display_name_hint": "Dit fulde navn eller dit sjove navn…",
"onboarding.profile.note": "Bio", "onboarding.profile.note": "Bio",
"onboarding.profile.note_hint": "Man kan @omtale andre personer eller #etiketter…", "onboarding.profile.note_hint": "Du kan @omtale andre personer eller #hashtags…",
"onboarding.profile.save_and_continue": "Gem og fortsæt", "onboarding.profile.save_and_continue": "Gem og fortsæt",
"onboarding.profile.title": "Profilopsætning", "onboarding.profile.title": "Profilopsætning",
"onboarding.profile.upload_avatar": "Upload profilbillede", "onboarding.profile.upload_avatar": "Upload profilbillede",
@ -728,9 +731,9 @@
"privacy.private.short": "Følgere", "privacy.private.short": "Følgere",
"privacy.public.long": "Alle på og udenfor Mastodon", "privacy.public.long": "Alle på og udenfor Mastodon",
"privacy.public.short": "Offentlig", "privacy.public.short": "Offentlig",
"privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i tidslinjer, under etiketter, udforsk eller Mastodon-søgning, selv hvis du ellers har sagt at dine opslag godt må være søgbare.", "privacy.unlisted.additional": "Dette er præcis som offentlig adfærd, dog vises indlægget ikke i live feeds/hashtags, udforsk eller Mastodon-søgning, selv hvis valget gælder hele kontoen.",
"privacy.unlisted.long": "Færre algoritmiske fanfarer", "privacy.unlisted.long": "Færre algoritmiske fanfarer",
"privacy.unlisted.short": "Stille offentligt", "privacy.unlisted.short": "Offentlig (stille)",
"privacy_policy.last_updated": "Senest opdateret {date}", "privacy_policy.last_updated": "Senest opdateret {date}",
"privacy_policy.title": "Privatlivspolitik", "privacy_policy.title": "Privatlivspolitik",
"recommended": "Anbefalet", "recommended": "Anbefalet",
@ -801,14 +804,15 @@
"report_notification.categories.violation": "Regelovertrædelse", "report_notification.categories.violation": "Regelovertrædelse",
"report_notification.categories.violation_sentence": "regelovertrædelse", "report_notification.categories.violation_sentence": "regelovertrædelse",
"report_notification.open": "Åbn anmeldelse", "report_notification.open": "Åbn anmeldelse",
"search.clear": "Ryd søgning",
"search.no_recent_searches": "Ingen seneste søgninger", "search.no_recent_searches": "Ingen seneste søgninger",
"search.placeholder": "Søg", "search.placeholder": "Søg",
"search.quick_action.account_search": "Profiler matchende {x}", "search.quick_action.account_search": "Profiler matchende {x}",
"search.quick_action.go_to_account": "Gå til profilen {x}", "search.quick_action.go_to_account": "Gå til profilen {x}",
"search.quick_action.go_to_hashtag": "Gå til etiketten {x}", "search.quick_action.go_to_hashtag": "Gå til hashtagget {x}",
"search.quick_action.open_url": "Åbn URL i Mastodon", "search.quick_action.open_url": "Åbn URL i Mastodon",
"search.quick_action.status_search": "Indlæg matchende {x}", "search.quick_action.status_search": "Indlæg matchende {x}",
"search.search_or_paste": "Søg efter eller angiv URL", "search.search_or_paste": "Søg eller indsæt URL",
"search_popout.full_text_search_disabled_message": "Utilgængelig på {domain}.", "search_popout.full_text_search_disabled_message": "Utilgængelig på {domain}.",
"search_popout.full_text_search_logged_out_message": "Kun tilgængelig, når logget ind.", "search_popout.full_text_search_logged_out_message": "Kun tilgængelig, når logget ind.",
"search_popout.language_code": "ISO-sprogkode", "search_popout.language_code": "ISO-sprogkode",
@ -819,9 +823,9 @@
"search_popout.user": "bruger", "search_popout.user": "bruger",
"search_results.accounts": "Profiler", "search_results.accounts": "Profiler",
"search_results.all": "Alle", "search_results.all": "Alle",
"search_results.hashtags": "Etiketter", "search_results.hashtags": "Hashtags",
"search_results.no_results": "Ingen resultater.", "search_results.no_results": "Ingen resultater.",
"search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller etiketter.", "search_results.no_search_yet": "Prøv at søge efter indlæg, profiler eller hashtags.",
"search_results.see_all": "Vis alle", "search_results.see_all": "Vis alle",
"search_results.statuses": "Indlæg", "search_results.statuses": "Indlæg",
"search_results.title": "Søg efter \"{q}\"", "search_results.title": "Søg efter \"{q}\"",
@ -846,7 +850,7 @@
"status.copy": "Kopiér link til indlæg", "status.copy": "Kopiér link til indlæg",
"status.delete": "Slet", "status.delete": "Slet",
"status.detailed_status": "Detaljeret samtalevisning", "status.detailed_status": "Detaljeret samtalevisning",
"status.direct": "Privat omtale @{name}", "status.direct": "Nævn @{name} privat",
"status.direct_indicator": "Privat omtale", "status.direct_indicator": "Privat omtale",
"status.edit": "Redigér", "status.edit": "Redigér",
"status.edited": "Senest redigeret {date}", "status.edited": "Senest redigeret {date}",
@ -903,7 +907,10 @@
"subscribed_languages.save": "Gem ændringer", "subscribed_languages.save": "Gem ændringer",
"subscribed_languages.target": "Skift abonnementssprog for {target}", "subscribed_languages.target": "Skift abonnementssprog for {target}",
"tabs_bar.home": "Hjem", "tabs_bar.home": "Hjem",
"tabs_bar.menu": "Menu",
"tabs_bar.notifications": "Notifikationer", "tabs_bar.notifications": "Notifikationer",
"tabs_bar.publish": "Nyt indlæg",
"tabs_bar.search": "Søg",
"terms_of_service.effective_as_of": "Gældende pr. {date}", "terms_of_service.effective_as_of": "Gældende pr. {date}",
"terms_of_service.title": "Tjenestevilkår", "terms_of_service.title": "Tjenestevilkår",
"terms_of_service.upcoming_changes_on": "Kommende ændringer pr. {date}", "terms_of_service.upcoming_changes_on": "Kommende ændringer pr. {date}",

View File

@ -219,11 +219,15 @@
"confirmations.delete_list.confirm": "Delete", "confirmations.delete_list.confirm": "Delete",
"confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
"confirmations.delete_list.title": "Delete list?", "confirmations.delete_list.title": "Delete list?",
"confirmations.discard_draft.confirm": "Discard and continue",
"confirmations.discard_draft.edit.cancel": "Resume editing",
"confirmations.discard_draft.edit.message": "Continuing will discard any changes you have made to the post you are currently editing.",
"confirmations.discard_draft.edit.title": "Discard changes to your post?",
"confirmations.discard_draft.post.cancel": "Resume draft",
"confirmations.discard_draft.post.message": "Continuing will discard the post you are currently composing.",
"confirmations.discard_draft.post.title": "Discard your draft post?",
"confirmations.discard_edit_media.confirm": "Discard", "confirmations.discard_edit_media.confirm": "Discard",
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.edit.confirm": "Edit",
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.edit.title": "Overwrite post?",
"confirmations.follow_to_list.confirm": "Follow and add to list", "confirmations.follow_to_list.confirm": "Follow and add to list",
"confirmations.follow_to_list.message": "You need to be following {name} to add them to a list.", "confirmations.follow_to_list.message": "You need to be following {name} to add them to a list.",
"confirmations.follow_to_list.title": "Follow user?", "confirmations.follow_to_list.title": "Follow user?",
@ -241,9 +245,6 @@
"confirmations.remove_from_followers.confirm": "Remove follower", "confirmations.remove_from_followers.confirm": "Remove follower",
"confirmations.remove_from_followers.message": "{name} will stop following you. Are you sure you want to proceed?", "confirmations.remove_from_followers.message": "{name} will stop following you. Are you sure you want to proceed?",
"confirmations.remove_from_followers.title": "Remove follower?", "confirmations.remove_from_followers.title": "Remove follower?",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.reply.title": "Overwrite post?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"confirmations.unfollow.title": "Unfollow user?", "confirmations.unfollow.title": "Unfollow user?",

View File

@ -569,6 +569,7 @@
"navigation_bar.mutes": "کاربران خموشانده", "navigation_bar.mutes": "کاربران خموشانده",
"navigation_bar.opened_in_classic_interface": "فرسته‌ها، حساب‌ها و دیگر صفحه‌های خاص به طور پیش‌گزیده در میانای وب کلاسیک گشوده می‌شوند.", "navigation_bar.opened_in_classic_interface": "فرسته‌ها، حساب‌ها و دیگر صفحه‌های خاص به طور پیش‌گزیده در میانای وب کلاسیک گشوده می‌شوند.",
"navigation_bar.preferences": "ترجیحات", "navigation_bar.preferences": "ترجیحات",
"navigation_bar.privacy_and_reach": "محرمانگی و دسترسی",
"navigation_bar.search": "جست‌وجو", "navigation_bar.search": "جست‌وجو",
"navigation_bar.search_trends": "جستجو \\ پرطرفدار", "navigation_bar.search_trends": "جستجو \\ پرطرفدار",
"not_signed_in_indicator.not_signed_in": "برای دسترسی به این منبع باید وارد شوید.", "not_signed_in_indicator.not_signed_in": "برای دسترسی به این منبع باید وارد شوید.",

View File

@ -804,6 +804,7 @@
"report_notification.categories.violation": "Sääntörikkomus", "report_notification.categories.violation": "Sääntörikkomus",
"report_notification.categories.violation_sentence": "sääntörikkomus", "report_notification.categories.violation_sentence": "sääntörikkomus",
"report_notification.open": "Avaa raportti", "report_notification.open": "Avaa raportti",
"search.clear": "Tyhjennä haku",
"search.no_recent_searches": "Ei viimeaikaisia hakuja", "search.no_recent_searches": "Ei viimeaikaisia hakuja",
"search.placeholder": "Hae", "search.placeholder": "Hae",
"search.quick_action.account_search": "Profiilit haulla {x}", "search.quick_action.account_search": "Profiilit haulla {x}",

View File

@ -563,6 +563,8 @@
"navigation_bar.follows_and_followers": "Ag leanúint agus do do leanúint", "navigation_bar.follows_and_followers": "Ag leanúint agus do do leanúint",
"navigation_bar.import_export": "Allmhairiú agus onnmhairiú", "navigation_bar.import_export": "Allmhairiú agus onnmhairiú",
"navigation_bar.lists": "Liostaí", "navigation_bar.lists": "Liostaí",
"navigation_bar.live_feed_local": "Fotha beo (áitiúil)",
"navigation_bar.live_feed_public": "Fotha beo (poiblí)",
"navigation_bar.logout": "Logáil Amach", "navigation_bar.logout": "Logáil Amach",
"navigation_bar.moderation": "Measarthacht", "navigation_bar.moderation": "Measarthacht",
"navigation_bar.more": "Tuilleadh", "navigation_bar.more": "Tuilleadh",
@ -802,6 +804,7 @@
"report_notification.categories.violation": "Sárú rialach", "report_notification.categories.violation": "Sárú rialach",
"report_notification.categories.violation_sentence": "sárú riail", "report_notification.categories.violation_sentence": "sárú riail",
"report_notification.open": "Oscail tuairisc", "report_notification.open": "Oscail tuairisc",
"search.clear": "Glan an cuardach",
"search.no_recent_searches": "Níl aon chuardach le déanaí", "search.no_recent_searches": "Níl aon chuardach le déanaí",
"search.placeholder": "Cuardaigh", "search.placeholder": "Cuardaigh",
"search.quick_action.account_search": "Próifílí a mheaitseálann {x}", "search.quick_action.account_search": "Próifílí a mheaitseálann {x}",

View File

@ -573,7 +573,10 @@
"navigation_bar.preferences": "Preferências", "navigation_bar.preferences": "Preferências",
"navigation_bar.privacy_and_reach": "Privacidade e alcance", "navigation_bar.privacy_and_reach": "Privacidade e alcance",
"navigation_bar.search": "Pesquisar", "navigation_bar.search": "Pesquisar",
"navigation_bar.search_trends": "Pesquisar / Em destaque",
"navigation_panel.collapse_followed_tags": "Recolher o menu de etiquetas seguidas",
"navigation_panel.collapse_lists": "Recolher lista de menu", "navigation_panel.collapse_lists": "Recolher lista de menu",
"navigation_panel.expand_followed_tags": "Expandir o menu de etiquetas seguidas",
"navigation_panel.expand_lists": "Expandir lista de menu", "navigation_panel.expand_lists": "Expandir lista de menu",
"not_signed_in_indicator.not_signed_in": "Tens de iniciar a sessão para utilizares esta funcionalidade.", "not_signed_in_indicator.not_signed_in": "Tens de iniciar a sessão para utilizares esta funcionalidade.",
"notification.admin.report": "{name} denunciou {target}", "notification.admin.report": "{name} denunciou {target}",

View File

@ -804,6 +804,7 @@
"report_notification.categories.violation": "Kural ihlali", "report_notification.categories.violation": "Kural ihlali",
"report_notification.categories.violation_sentence": "kural ihlali", "report_notification.categories.violation_sentence": "kural ihlali",
"report_notification.open": "Bildirim aç", "report_notification.open": "Bildirim aç",
"search.clear": "Aramayı temizle",
"search.no_recent_searches": "Son arama yok", "search.no_recent_searches": "Son arama yok",
"search.placeholder": "Ara", "search.placeholder": "Ara",
"search.quick_action.account_search": "Eşleşen profiller {x}", "search.quick_action.account_search": "Eşleşen profiller {x}",

View File

@ -35,7 +35,7 @@ class SearchQueryTransformer < Parslet::Transform
private private
def clauses_by_operator def clauses_by_operator
@clauses_by_operator ||= @clauses.compact.chunk(&:operator).to_h @clauses_by_operator ||= @clauses.compact.group_by(&:operator)
end end
def flags_from_clauses! def flags_from_clauses!

View File

@ -40,4 +40,3 @@
.content__heading__actions .content__heading__actions
= link_to t('admin.terms_of_service.create'), admin_terms_of_service_draft_path, class: 'button' = link_to t('admin.terms_of_service.create'), admin_terms_of_service_draft_path, class: 'button'
= link_to t('admin.terms_of_service.generate'), admin_terms_of_service_generate_path, class: 'button button-secondary'

View File

@ -35,6 +35,7 @@ require_relative '../lib/paperclip/response_with_limit_adapter'
require_relative '../lib/terrapin/multi_pipe_extensions' require_relative '../lib/terrapin/multi_pipe_extensions'
require_relative '../lib/mastodon/middleware/public_file_server' require_relative '../lib/mastodon/middleware/public_file_server'
require_relative '../lib/mastodon/middleware/socket_cleanup' require_relative '../lib/mastodon/middleware/socket_cleanup'
require_relative '../lib/mastodon/email_configuration_helper'
require_relative '../lib/mastodon/feature' require_relative '../lib/mastodon/feature'
require_relative '../lib/mastodon/snowflake' require_relative '../lib/mastodon/snowflake'
require_relative '../lib/mastodon/version' require_relative '../lib/mastodon/version'
@ -104,6 +105,7 @@ module Mastodon
config.x.cache_buster = config_for(:cache_buster) config.x.cache_buster = config_for(:cache_buster)
config.x.captcha = config_for(:captcha) config.x.captcha = config_for(:captcha)
config.x.email = config_for(:email)
config.x.mastodon = config_for(:mastodon) config.x.mastodon = config_for(:mastodon)
config.x.omniauth = config_for(:omniauth) config.x.omniauth = config_for(:omniauth)
config.x.translation = config_for(:translation) config.x.translation = config_for(:translation)

21
config/email.yml Normal file
View File

@ -0,0 +1,21 @@
# Note that these settings only apply in `production` even when other
# keys are added here.
production:
delivery_method: <%= ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp') %>
from_address: <%= ENV.fetch('SMTP_FROM_ADDRESS', 'notifications@localhost') %>
reply_to: <%= ENV.fetch('SMTP_REPLY_TO', nil) %>
return_path: <%= ENV.fetch('SMTP_RETURN_PATH', nil) %>
smtp_settings:
port: <%= ENV.fetch('SMTP_PORT', nil) %>
address: <%= ENV.fetch('SMTP_SERVER', nil) %>
user_name: <%= ENV.fetch('SMTP_LOGIN', nil) %>
password: <%= ENV.fetch('SMTP_PASSWORD', nil) %>
domain: <%= ENV.fetch('SMTP_DOMAIN', ENV.fetch('LOCAL_DOMAIN', nil)) %>
authentication: <%= ENV.fetch('SMTP_AUTH_METHOD', 'plain') %>
ca_file: <%= ENV.fetch('SMTP_CA_FILE', '/etc/ssl/certs/ca-certificates.crt') %>
openssl_verify_mode: <%= ENV.fetch('SMTP_OPENSSL_VERIFY_MODE', nil) %>
enable_starttls: <%= ENV.fetch('SMTP_ENABLE_STARTTLS', nil) %>
enable_starttls_auto: <%= ENV.fetch('SMTP_ENABLE_STARTTLS_AUTO', true) != 'false' %>
tls: <%= ENV.fetch('SMTP_TLS', false) == 'true' ? true : nil %>
ssl: <%= ENV.fetch('SMTP_SSL', false) == 'true' ? true : nil %>
read_timeout: 20

View File

@ -99,7 +99,7 @@ Rails.application.configure do
config.action_mailer.perform_caching = false config.action_mailer.perform_caching = false
# E-mails # E-mails
outgoing_email_address = ENV.fetch('SMTP_FROM_ADDRESS', 'notifications@localhost') outgoing_email_address = config.x.email.from_address
outgoing_email_domain = Mail::Address.new(outgoing_email_address).domain outgoing_email_domain = Mail::Address.new(outgoing_email_address).domain
config.action_mailer.default_options = { config.action_mailer.default_options = {
@ -107,40 +107,12 @@ Rails.application.configure do
message_id: -> { "<#{Mail.random_tag}@#{outgoing_email_domain}>" }, message_id: -> { "<#{Mail.random_tag}@#{outgoing_email_domain}>" },
} }
config.action_mailer.default_options[:reply_to] = ENV['SMTP_REPLY_TO'] if ENV['SMTP_REPLY_TO'].present? config.action_mailer.default_options[:reply_to] = config.x.email.reply_to if config.x.email.reply_to.present?
config.action_mailer.default_options[:return_path] = ENV['SMTP_RETURN_PATH'] if ENV['SMTP_RETURN_PATH'].present? config.action_mailer.default_options[:return_path] = config.x.email.return_path if config.x.email.return_path.present?
enable_starttls = nil config.action_mailer.smtp_settings = Mastodon::EmailConfigurationHelper.smtp_settings(config.x.email.smtp_settings)
enable_starttls_auto = nil
case ENV.fetch('SMTP_ENABLE_STARTTLS', nil) config.action_mailer.delivery_method = config.x.email.delivery_method.to_sym
when 'always'
enable_starttls = true
when 'never'
enable_starttls = false
when 'auto'
enable_starttls_auto = true
else
enable_starttls_auto = ENV['SMTP_ENABLE_STARTTLS_AUTO'] != 'false'
end
config.action_mailer.smtp_settings = {
port: ENV.fetch('SMTP_PORT', nil),
address: ENV.fetch('SMTP_SERVER', nil),
user_name: ENV['SMTP_LOGIN'].presence,
password: ENV['SMTP_PASSWORD'].presence,
domain: ENV['SMTP_DOMAIN'] || ENV.fetch('LOCAL_DOMAIN', nil),
authentication: ENV['SMTP_AUTH_METHOD'] == 'none' ? nil : ENV['SMTP_AUTH_METHOD'] || :plain,
ca_file: ENV['SMTP_CA_FILE'].presence || '/etc/ssl/certs/ca-certificates.crt',
openssl_verify_mode: ENV.fetch('SMTP_OPENSSL_VERIFY_MODE', nil),
enable_starttls: enable_starttls,
enable_starttls_auto: enable_starttls_auto,
tls: ENV['SMTP_TLS'].presence && ENV['SMTP_TLS'] == 'true',
ssl: ENV['SMTP_SSL'].presence && ENV['SMTP_SSL'] == 'true',
read_timeout: 20,
}
config.action_mailer.delivery_method = ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp').to_sym
config.action_dispatch.default_headers = { config.action_dispatch.default_headers = {
'Server' => 'Mastodon', 'Server' => 'Mastodon',

View File

@ -71,6 +71,7 @@ ignore_unused:
- 'mail_subscriptions.unsubscribe.emails.*' - 'mail_subscriptions.unsubscribe.emails.*'
- 'preferences.other' # some locales are missing other keys, therefore leading i18n-tasks to detect `preferences` as plural and not finding use - 'preferences.other' # some locales are missing other keys, therefore leading i18n-tasks to detect `preferences` as plural and not finding use
- 'edit_profile.other' # some locales are missing other keys, therefore leading i18n-tasks to detect `preferences` as plural and not finding use - 'edit_profile.other' # some locales are missing other keys, therefore leading i18n-tasks to detect `preferences` as plural and not finding use
- 'admin.terms_of_service.generate' # temporarily disabled
ignore_inconsistent_interpolations: ignore_inconsistent_interpolations:
- '*.one' - '*.one'

View File

@ -3,30 +3,30 @@ ru:
activerecord: activerecord:
attributes: attributes:
poll: poll:
expires_at: Срок окончания голосования expires_at: Продолжительность опроса
options: Варианты options: Варианты ответа
user: user:
agreement: Соглашение с условиями сервиса agreement: Пользовательское соглашение
email: Адрес эл. почты email: Адрес электронной почты
locale: Язык locale: Язык
password: Пароль password: Пароль
user/account: user/account:
username: Имя пользователя username: Имя пользователя
user/invite_request: user/invite_request:
text: Причина text: Текст заявки на регистрацию
errors: errors:
attributes: attributes:
domain: domain:
invalid: не является действующим доменным именем invalid: не является корректным доменным именем
messages: messages:
invalid_domain_on_line: "%{value} Не является действительным доменным именем" invalid_domain_on_line: "%{value} не является корректным доменным именем"
models: models:
account: account:
attributes: attributes:
fields: fields:
fields_with_values_missing_labels: содержит значения с отсутствующими ключами fields_with_values_missing_labels: содержит значения с отсутствующими ключами
username: username:
invalid: только буквы, цифры и символ подчёркивания invalid: может содержать только буквы, цифры и символы подчёркивания
reserved: зарезервировано reserved: зарезервировано
admin/webhook: admin/webhook:
attributes: attributes:

View File

@ -578,6 +578,13 @@ da:
all: Alle all: Alle
limited: Begrænset limited: Begrænset
title: Moderation title: Moderation
moderation_notes:
create: Tilføj moderationsnotat
created_msg: Instansmoderationsnotat oprettet!
description_html: Se og skriv notater til andre moderatorer og dit fremtidige jeg
destroyed_msg: Instansmoderationsnotat slettet!
placeholder: Oplysninger om denne instans, foretaget handlinger eller andet, som kan assistere ved fremtidige instansmoderationer.
title: Moderationsnotater
private_comment: Privat kommentar private_comment: Privat kommentar
public_comment: Offentlig kommentar public_comment: Offentlig kommentar
purge: Udrens purge: Udrens
@ -770,7 +777,7 @@ da:
manage_settings: Håndtere indstillinger manage_settings: Håndtere indstillinger
manage_settings_description: Tillader brugere at ændre webstedsindstillinger manage_settings_description: Tillader brugere at ændre webstedsindstillinger
manage_taxonomies: Håndtere taksonomier manage_taxonomies: Håndtere taksonomier
manage_taxonomies_description: Tillader brugere at gennemse tenderende indhold og opdatere etiket-indstillinger manage_taxonomies_description: Giver brugerne mulighed for at gennemgå trendende indhold og opdatere hashtag-indstillinger
manage_user_access: Håndtere brugeradgang manage_user_access: Håndtere brugeradgang
manage_user_access_description: Tillader brugere at deaktivere andre brugeres tofaktorgodkendelse, skifte deres e-mailadresse og nulstille deres adgangskode manage_user_access_description: Tillader brugere at deaktivere andre brugeres tofaktorgodkendelse, skifte deres e-mailadresse og nulstille deres adgangskode
manage_users: Håndtere brugere manage_users: Håndtere brugere
@ -971,7 +978,7 @@ da:
reset: Nulstil reset: Nulstil
review: Gennmgangsstatus review: Gennmgangsstatus
search: Søg search: Søg
title: Etiketter title: Hashtags
updated_msg: Hashtag-indstillinger opdateret updated_msg: Hashtag-indstillinger opdateret
terms_of_service: terms_of_service:
back: Tilbage til Tjenestevilkår back: Tilbage til Tjenestevilkår
@ -1061,14 +1068,14 @@ da:
tag_servers_dimension: Topservere tag_servers_dimension: Topservere
tag_servers_measure: forskellige servere tag_servers_measure: forskellige servere
tag_uses_measure: anvendelser i alt tag_uses_measure: anvendelser i alt
description_html: Disse er etiketter, som pt. vises i en masse indlæg, som serveren ser. Det kan hjælpe brugerne til at finde ud af, hvad folk taler mest om pt. Ingen etiketter vises offentligt, før man godkender dem. description_html: Disse er hashtags, som pt. vises i en masse indlæg, som din server ser. Det kan hjælpe dine brugere til at finde ud af, hvad folk taler mest om pt. Ingen hashtags vises offentligt, før du godkender dem.
listable: Kan foreslås listable: Kan foreslås
no_tag_selected: Intet tag ændret (da intet var valgt) no_tag_selected: Intet tag ændret (da intet var valgt)
not_listable: Foreslås ikke not_listable: Foreslås ikke
not_trendable: Vises ikke under tendenser not_trendable: Vises ikke under tendenser
not_usable: Kan ikke anvendes not_usable: Kan ikke anvendes
peaked_on_and_decaying: Toppede pr. %{date}, nu for nedadgående peaked_on_and_decaying: Toppede pr. %{date}, nu for nedadgående
title: Populære etiketter title: Populære hashtags
trendable: Kan vises under tendenser trendable: Kan vises under tendenser
trending_rank: 'Populær #%{rank}' trending_rank: 'Populær #%{rank}'
usable: Kan anvendes usable: Kan anvendes
@ -1140,7 +1147,7 @@ da:
new_trending_statuses: new_trending_statuses:
title: Populære opslag title: Populære opslag
new_trending_tags: new_trending_tags:
title: Populære etiketter title: Populære hashtags
subject: Nye tendenser klar til gennemgang på %{instance} subject: Nye tendenser klar til gennemgang på %{instance}
aliases: aliases:
add_new: Opret alias add_new: Opret alias
@ -1151,7 +1158,7 @@ da:
remove: Fjern aliaslinkning remove: Fjern aliaslinkning
appearance: appearance:
advanced_web_interface: Avanceret webgrænseflade advanced_web_interface: Avanceret webgrænseflade
advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede netgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, fødereret tidslinje, et hvilket som helst antal lister og etiketter.' advanced_web_interface_hint: 'Ønsker du udnytte hele skærmbredden, lader den avancerede webgrænseflade dig opsætte mange forskellige kolonner for at se så meget information på samme tid som ønsket: Hjem, notifikationer, federeret tidslinje, et hvilket som helst antal lister og hashtags.'
animations_and_accessibility: Animationer og tilgængelighed animations_and_accessibility: Animationer og tilgængelighed
confirmation_dialogs: Bekræftelsesdialoger confirmation_dialogs: Bekræftelsesdialoger
discovery: Opdagelse discovery: Opdagelse
@ -1378,8 +1385,8 @@ da:
featured_tags: featured_tags:
add_new: Tilføj nyt add_new: Tilføj nyt
errors: errors:
limit: Det maksimale antal etiketter er allerede fremhævet limit: Det maksimale antal hashtags er allerede fremhævet
hint_html: "<strong>Hvad er fremhævede etiketter?</strong> De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse etiketter. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter." hint_html: "<strong>Hvad er fremhævede hashtags?</strong> De vises i en fremtrædende position på din offentlige profil og giver folk mulighed for at gennemse dine offentlige indlæg specifikt under disse hashtags. De er et fantastisk værktøj til at holde styr på kreative værker eller langsigtede projekter."
filters: filters:
contexts: contexts:
account: Profiler account: Profiler
@ -1691,14 +1698,14 @@ da:
errors: errors:
already_voted: Du har allerede stemt i denne afstemning already_voted: Du har allerede stemt i denne afstemning
duplicate_options: indeholder dubletvalg duplicate_options: indeholder dubletvalg
duration_too_long: er for lang en varighed duration_too_long: er for langt ude i fremtiden
duration_too_short: er for kort en varighed duration_too_short: er for kort
expired: Afstemningen er allerede afsluttet expired: Afstemningen er allerede afsluttet
invalid_choice: Den valgte stemmemulighed findes ikke invalid_choice: Den valgte stemmemulighed findes ikke
over_character_limit: må maks. udgøre %{max} tegn hver over_character_limit: må maks. udgøre %{max} tegn hver
self_vote: Du kan ikke stemme i dine egne afstemninger self_vote: Du kan ikke stemme i dine egne afstemninger
too_few_options: skal have flere end ét valg too_few_options: skal have flere end ét valg
too_many_options: for mange svar (maks. %{max}) too_many_options: må maks. indeholde %{max} valg
preferences: preferences:
other: Andet other: Andet
posting_defaults: Standarder for indlæg posting_defaults: Standarder for indlæg
@ -1751,7 +1758,7 @@ da:
content_warning: 'Indholdsadvarsel:' content_warning: 'Indholdsadvarsel:'
descriptions: descriptions:
account: Offentlige indlæg fra @%{acct} account: Offentlige indlæg fra @%{acct}
tag: 'Offentlige indlæg etiketteret #%{hashtag}' tag: 'Offentlige indlæg tagget #%{hashtag}'
scheduled_statuses: scheduled_statuses:
over_daily_limit: Den daglige grænse på %{limit} planlagte indlæg er nået over_daily_limit: Den daglige grænse på %{limit} planlagte indlæg er nået
over_total_limit: Grænsen på %{limit} planlagte indlæg er nået over_total_limit: Grænsen på %{limit} planlagte indlæg er nået
@ -1816,7 +1823,7 @@ da:
development: Udvikling development: Udvikling
edit_profile: Redigér profil edit_profile: Redigér profil
export: Eksport export: Eksport
featured_tags: Udvalgte etiketter featured_tags: Fremhævede hashtags
import: Import import: Import
import_and_export: Import og eksport import_and_export: Import og eksport
migrate: Kontomigrering migrate: Kontomigrering
@ -1856,7 +1863,7 @@ da:
content_warning: 'Indholdsadvarsel: %{warning}' content_warning: 'Indholdsadvarsel: %{warning}'
default_language: Samme som UI-sproget default_language: Samme som UI-sproget
disallowed_hashtags: disallowed_hashtags:
one: 'indeholdte en ikke tilladt etiket: %{tags}' one: 'indeholdte et ikke tilladt hashtag: %{tags}'
other: 'indeholdte de ikke tilladte etiketter: %{tags}' other: 'indeholdte de ikke tilladte etiketter: %{tags}'
edited_at_html: Redigeret %{date} edited_at_html: Redigeret %{date}
errors: errors:
@ -2063,8 +2070,8 @@ da:
one: "%{people} person de seneste 2 dage" one: "%{people} person de seneste 2 dage"
other: "%{people} personer de seneste 2 dage" other: "%{people} personer de seneste 2 dage"
hashtags_subtitle: Udforsk de seneste 2 dages tendenser hashtags_subtitle: Udforsk de seneste 2 dages tendenser
hashtags_title: Populære etiketter hashtags_title: Populære hashtags
hashtags_view_more: Se flere populære etiketter hashtags_view_more: Se flere populære hashtags
post_action: Skriv post_action: Skriv
post_step: Sig hej til verden med tekst, fotos, videoer eller afstemninger. post_step: Sig hej til verden med tekst, fotos, videoer eller afstemninger.
post_title: Opret det første indlæg post_title: Opret det første indlæg

View File

@ -578,6 +578,13 @@ de:
all: Alle all: Alle
limited: Eingeschränkt limited: Eingeschränkt
title: Server title: Server
moderation_notes:
create: Moderationsnotiz hinzufügen
created_msg: Moderationsnotiz für diesen Server erfolgreich erstellt!
description_html: Hinterlasse Notizen für dich und deine Moderator*innen
destroyed_msg: Moderationsnotiz für diesen Server erfolgreich entfernt!
placeholder: Informationen über diesen Server, ergriffene Maßnahmen oder andere Sachverhalte, die in Zukunft nützlich sein könnten.
title: Moderationsnotizen
private_comment: Privater Kommentar private_comment: Privater Kommentar
public_comment: Öffentlicher Kommentar public_comment: Öffentlicher Kommentar
purge: Säubern purge: Säubern

View File

@ -578,6 +578,13 @@ es-AR:
all: Todas all: Todas
limited: Limitadas limited: Limitadas
title: Moderación title: Moderación
moderation_notes:
create: Agregar nota de moderación
created_msg: "¡Nota de moderación de instancia creada!"
description_html: Ver y dejar notas para otros moderadores y a tu yo futuro
destroyed_msg: "¡Nota de moderación de instancia eliminada con éxito!"
placeholder: Información sobre esta instancia, acciones tomadas o cualquier otra cosa que te ayude a moderar esta instancia en el futuro.
title: Notas de moderación
private_comment: Comentario privado private_comment: Comentario privado
public_comment: Comentario público public_comment: Comentario público
purge: Purgar purge: Purgar

View File

@ -578,6 +578,13 @@ es-MX:
all: Todos all: Todos
limited: Limitado limited: Limitado
title: Moderación title: Moderación
moderation_notes:
create: Añadir nota de moderación
created_msg: "¡Nota de moderación de instancia creada!"
description_html: Ver y dejar notas para otros moderadores y a tu yo futuro
destroyed_msg: "¡Nota de moderación de instancia eliminada con éxito!"
placeholder: Información sobre esta instancia, acciones tomadas o cualquier otra cosa que te ayude a moderar esta instancia en el futuro.
title: Notas de Moderación
private_comment: Comentario privado private_comment: Comentario privado
public_comment: Comentario público public_comment: Comentario público
purge: Purgar purge: Purgar

View File

@ -578,6 +578,13 @@ es:
all: Todos all: Todos
limited: Limitado limited: Limitado
title: Moderación title: Moderación
moderation_notes:
create: Añadir nota de moderación
created_msg: "¡Nota de moderación de instancia creada!"
description_html: Ver y dejar notas para otros moderadores y a tu yo futuro
destroyed_msg: "¡Nota de moderación de instancia eliminada con éxito!"
placeholder: Información sobre esta instancia, acciones tomadas o cualquier otra cosa que te ayude a moderar esta instancia en el futuro.
title: Notas de Moderación
private_comment: Comentario privado private_comment: Comentario privado
public_comment: Comentario público public_comment: Comentario público
purge: Purgar purge: Purgar

View File

@ -786,6 +786,7 @@ fa:
title: نقش‌ها title: نقش‌ها
rules: rules:
add_new: افزودن قانون add_new: افزودن قانون
add_translation: افزودن ترجمه
delete: حذف delete: حذف
description_html: در حالی که اکثر افراد ادعا می‌کنند که شرایط استفاده را خوانده و پذیرفته‌اند، افراد معمولا تا پیش از بروز مشکل این متن را مطالعه نمی‌کنند. <strong>پیدا کردن قوانین کارساز‌تان را با تبدیل‌شان به صورت فهرست برای کاربران تسهیل کنید.</strong> سعی کنید هر قانون را کوتاه و ساده نگاه دارید اما از آن طرف هم تلاش نکنید که آن‌ها به تعداد زیادی مورد جدا از هم تقسیم کنید. description_html: در حالی که اکثر افراد ادعا می‌کنند که شرایط استفاده را خوانده و پذیرفته‌اند، افراد معمولا تا پیش از بروز مشکل این متن را مطالعه نمی‌کنند. <strong>پیدا کردن قوانین کارساز‌تان را با تبدیل‌شان به صورت فهرست برای کاربران تسهیل کنید.</strong> سعی کنید هر قانون را کوتاه و ساده نگاه دارید اما از آن طرف هم تلاش نکنید که آن‌ها به تعداد زیادی مورد جدا از هم تقسیم کنید.
edit: ویرایش قانون edit: ویرایش قانون
@ -816,6 +817,7 @@ fa:
discovery: discovery:
follow_recommendations: پیروی از پیشنهادها follow_recommendations: پیروی از پیشنهادها
preamble: ارائه محتوای جالب در جذب کاربران جدیدی که ممکن است کسی ماستودون را نشناسند، مفید است. نحوه عملکرد ویژگی‌های کشف مختلف روی سرور خود را کنترل کنید. preamble: ارائه محتوای جالب در جذب کاربران جدیدی که ممکن است کسی ماستودون را نشناسند، مفید است. نحوه عملکرد ویژگی‌های کشف مختلف روی سرور خود را کنترل کنید.
privacy: محرمانگی
profile_directory: شاخهٔ نمایه profile_directory: شاخهٔ نمایه
public_timelines: خط زمانی‌های عمومی public_timelines: خط زمانی‌های عمومی
publish_statistics: انتشار آمار publish_statistics: انتشار آمار

View File

@ -576,6 +576,13 @@ fi:
all: Kaikki all: Kaikki
limited: Rajoitettu limited: Rajoitettu
title: Moderointi title: Moderointi
moderation_notes:
create: Lisää moderointimuistiinpano
created_msg: Instanssin moderointimuistiinpanon luonti onnistui!
description_html: Tarkastele ja jätä muistiinpanoja muille moderaattoreille ja itsellesi tulevaisuuteen
destroyed_msg: Instanssin moderointimuistiinpano poistettu!
placeholder: Tietoa tästä instanssista, tehdyistä toimista tai muusta sellaisesta, joka auttaa moderoimaan tätä instanssia tulevaisuudessa.
title: Moderointimuistiinpanot
private_comment: Yksityinen kommentti private_comment: Yksityinen kommentti
public_comment: Julkinen kommentti public_comment: Julkinen kommentti
purge: Tyhjennä purge: Tyhjennä

View File

@ -578,6 +578,13 @@ fo:
all: Allir all: Allir
limited: Avmarkaðir limited: Avmarkaðir
title: Umsjón title: Umsjón
moderation_notes:
create: Legg umsjónarviðmerking afturat
created_msg: Umsjónarviðmerking fyri hesa eindina stovnað!
description_html: Vís ella skriva viðmerkingar til onnur umsjónarfólk ella teg sjálva/n í framtíðini
destroyed_msg: Umsjónarviðmerking fyri hesa eindina strikað!
placeholder: Upplýsingar um hesa eindina, framdar atgerðir ella eitthvørt annað, sum kann hjálpa tær við umsjónini av hesi eindini í framtíðini.
title: Umsjónarviðmerkingar
private_comment: Privat viðmerking private_comment: Privat viðmerking
public_comment: Sjónlig viðmerking public_comment: Sjónlig viðmerking
purge: Reinsa purge: Reinsa

View File

@ -611,6 +611,13 @@ ga:
all: Uile all: Uile
limited: Teoranta limited: Teoranta
title: Measarthacht title: Measarthacht
moderation_notes:
create: Cuir Nóta Modhnóireachta leis
created_msg: Cruthaíodh nóta modhnóireachta an cháis go rathúil!
description_html: Féach ar nótaí agus fág iad do mhodhnóirí eile agus do do dhuine féin sa todhchaí
destroyed_msg: Scriosadh nóta modhnóireachta an cháis go rathúil!
placeholder: Faisnéis faoin gcás seo, gníomhartha a rinneadh, nó aon rud eile a chabhróidh leat an cás seo a mhodhnú amach anseo.
title: Nótaí Modhnóireachta
private_comment: Trácht príobháideach private_comment: Trácht príobháideach
public_comment: Trácht poiblí public_comment: Trácht poiblí
purge: Glan purge: Glan

View File

@ -578,6 +578,13 @@ gl:
all: Todo all: Todo
limited: Limitado limited: Limitado
title: Moderación title: Moderación
moderation_notes:
create: Engadir nota de moderación
created_msg: Creouse correctamente a nota de moderación da instancia!
description_html: Ver e deixar notas de referencia para ti e outras moderadoras
destroyed_msg: Eliminouse correctamente a nota de moderación!
placeholder: Información sobre esta instancia, accións realizadas, ou calquera outra cousa que che axude no futuro a moderar esta instancia.
title: Notas de moderación
private_comment: Comentario privado private_comment: Comentario privado
public_comment: Comentario público public_comment: Comentario público
purge: Purgar purge: Purgar

View File

@ -600,6 +600,13 @@ he:
all: הכל all: הכל
limited: מוגבלים limited: מוגבלים
title: ניהול דיון title: ניהול דיון
moderation_notes:
create: הוספת הערות מנחה דיונים
created_msg: הודעת מנחה לגבי שרת נוצרה בהצלחה!
description_html: צפייה והשארת הערות עבור מנחים אחרים או לעצמך לעתיד
destroyed_msg: הודעת מנחה לגבי שרת נמחקה בהצלחה!
placeholder: מידע לגבי שרת זה, פעולות שננקטו, או כל מידע אחר שיסייע לך להחליט כיצד למתן הודעות משרת זה בעתיד.
title: הודעות מנחה דיונים
private_comment: הערה פרטית private_comment: הערה פרטית
public_comment: תגובה פומבית public_comment: תגובה פומבית
purge: טיהור purge: טיהור

View File

@ -578,6 +578,13 @@ hu:
all: Mind all: Mind
limited: Korlátozott limited: Korlátozott
title: Moderáció title: Moderáció
moderation_notes:
create: Moderátori megjegyzés hozzáadása
created_msg: A példány moderátori megjegyzése sikeresen létrehozva!
description_html: Megtekintés, és megjegyzések hagyása más moderátoroknak és saját magának
destroyed_msg: A példány moderátori megjegyzése sikeresen törölve!
placeholder: Információk erről a példányról, a végzett műveletekről vagy bármi másról, amely segít a példány jövőbeli moderációjában.
title: Moderátori megjegyzések
private_comment: Privát megjegyzés private_comment: Privát megjegyzés
public_comment: Nyilvános megjegyzés public_comment: Nyilvános megjegyzés
purge: Végleges törlés purge: Végleges törlés

View File

@ -569,6 +569,12 @@ ko:
all: 모두 all: 모두
limited: 제한 limited: 제한
title: 중재 title: 중재
moderation_notes:
create: 중재 참고사항 추가
created_msg: 서버 중재 참고사항을 만들었습니다!
description_html: 확인하고 다른 중재자나 미래의 자신을 위해 참고사항을 작성합니다
destroyed_msg: 서버 중재 참고사항을 삭제했습니다!
title: 중재 참고사항
private_comment: 비공개 주석 private_comment: 비공개 주석
public_comment: 공개 주석 public_comment: 공개 주석
purge: 퍼지 purge: 퍼지

View File

@ -578,6 +578,13 @@ nl:
all: Alles all: Alles
limited: Beperkt limited: Beperkt
title: Moderatie title: Moderatie
moderation_notes:
create: Moderatie-opmerking aanmaken
created_msg: Aanmaken van servermoderatie-opmerking geslaagd!
description_html: Opmerkingen bekijken, en voor jezelf en andere moderatoren achterlaten
destroyed_msg: Verwijderen van servermoderatie-opmerking geslaagd!
placeholder: Informatie over deze server, genomen acties of iets anders die jou kunnen helpen om deze server in de toekomst te moderen.
title: Moderatie-opmerkingen
private_comment: Privé-opmerking private_comment: Privé-opmerking
public_comment: Openbare opmerking public_comment: Openbare opmerking
purge: Volledig verwijderen purge: Volledig verwijderen
@ -683,7 +690,7 @@ nl:
delete: Verwijderen delete: Verwijderen
placeholder: Beschrijf welke maatregelen zijn genomen of andere gerelateerde opmerkingen... placeholder: Beschrijf welke maatregelen zijn genomen of andere gerelateerde opmerkingen...
title: Opmerkingen title: Opmerkingen
notes_description_html: Bekijk en laat opmerkingen achter voor andere moderatoren en voor jouw toekomstige zelf notes_description_html: Opmerkingen bekijken, en voor jezelf en andere moderatoren achterlaten
processed_msg: 'Rapportage #%{id} succesvol afgehandeld' processed_msg: 'Rapportage #%{id} succesvol afgehandeld'
quick_actions_description_html: 'Neem een snelle maatregel of scroll naar beneden om de gerapporteerde inhoud te bekijken:' quick_actions_description_html: 'Neem een snelle maatregel of scroll naar beneden om de gerapporteerde inhoud te bekijken:'
remote_user_placeholder: de externe gebruiker van %{instance} remote_user_placeholder: de externe gebruiker van %{instance}

View File

@ -578,6 +578,13 @@ pt-PT:
all: Todas all: Todas
limited: Limitadas limited: Limitadas
title: Moderação title: Moderação
moderation_notes:
create: Adicionar Nota de Moderação
created_msg: Nota de moderação da instância criada com sucesso!
description_html: Ver e deixar notas para outros moderadores e para referência futura
destroyed_msg: Nota de moderação da instância eliminada com sucesso!
placeholder: Informações sobre esta instância, ações tomadas ou qualquer outra informação que o ajude na moderação desta instância no futuro.
title: Notas de Moderação
private_comment: Comentário privado private_comment: Comentário privado
public_comment: Comentário público public_comment: Comentário público
purge: Purgar purge: Purgar

View File

@ -1733,15 +1733,15 @@ ru:
polls: polls:
errors: errors:
already_voted: Вы уже голосовали в этом опросе already_voted: Вы уже голосовали в этом опросе
duplicate_options: содержит одинаковые варианты duplicate_options: не должны повторяться
duration_too_long: слишком далеко в будущем duration_too_long: слишком велика
duration_too_short: слишком короткий срок duration_too_short: слишком мала
expired: Опрос уже завершился expired: Опрос уже завершился
invalid_choice: Выбранного варианта голосования не существует invalid_choice: Выбранного варианта голосования не существует
over_character_limit: каждый не вариант не может быть длиннее %{max} символов over_character_limit: не должны превышать %{max} символов
self_vote: Вы не можете голосовать в своих опросах self_vote: Вы не можете голосовать в своих опросах
too_few_options: должно быть больше 1 варианта too_few_options: должны содержать не меньше двух опций
too_many_options: может содержать не больше %{max} вариантов too_many_options: должны ограничиваться максимум %{max} опциями
preferences: preferences:
other: Остальное other: Остальное
posting_defaults: Настройки отправки по умолчанию posting_defaults: Настройки отправки по умолчанию

View File

@ -8,7 +8,7 @@ da:
display_name: Dit fulde navn eller dit sjove navn. display_name: Dit fulde navn eller dit sjove navn.
fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til. fields: Din hjemmeside, dine pronominer, din alder, eller hvad du har lyst til.
indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset. indexable: Dine offentlige indlæg vil kunne vises i Mastodon-søgeresultater. Folk, som har interageret med dem, vil kunne finde dem uanset.
note: 'Du kan @omtale andre personer eller #etiketter.' note: 'Du kan @omtale andre personer eller #hashtags.'
show_collections: Folk vil ikke kunne tjekke dine Følger og Følgere. Folk, du selv følger, vil stadig kunne se dette. show_collections: Folk vil ikke kunne tjekke dine Følger og Følgere. Folk, du selv følger, vil stadig kunne se dette.
unlocked: Man vil kunne følges af folk uden først at godkende dem. Ønsker man at gennemgå Følg-anmodninger og individuelt acceptere/afvise nye følgere, så fjern markeringen. unlocked: Man vil kunne følges af folk uden først at godkende dem. Ønsker man at gennemgå Følg-anmodninger og individuelt acceptere/afvise nye følgere, så fjern markeringen.
account_alias: account_alias:
@ -16,7 +16,7 @@ da:
account_migration: account_migration:
acct: Angiv brugernavn@domain for den konto, hvortil du vil flytte acct: Angiv brugernavn@domain for den konto, hvortil du vil flytte
account_warning_preset: account_warning_preset:
text: Du kan bruge indlægssyntaks, såsom URL'er, etiketter og omtaler text: Du kan bruge indlægssyntaks, såsom URL'er, hashtags og omtaler
title: Valgfri. Ikke synlig for modtageren title: Valgfri. Ikke synlig for modtageren
admin_account_action: admin_account_action:
include_statuses: Brugeren vil se, hvilke indlæg, som har forårsaget modereringen/advarslen include_statuses: Brugeren vil se, hvilke indlæg, som har forårsaget modereringen/advarslen
@ -72,7 +72,7 @@ da:
domain: Dette kan være domænenavnet vist i den benyttede i e-mailadresse eller MX-post. Begge tjekkes under tilmelding. domain: Dette kan være domænenavnet vist i den benyttede i e-mailadresse eller MX-post. Begge tjekkes under tilmelding.
with_dns_records: Et forsøg på at opløse det givne domænes DNS-poster foretages, og resultaterne blokeres ligeledes with_dns_records: Et forsøg på at opløse det givne domænes DNS-poster foretages, og resultaterne blokeres ligeledes
featured_tag: featured_tag:
name: 'Her er nogle af dine hyppigst brugte etiketter:' name: 'Her er nogle af dine hyppigst brugte hashtags:'
filters: filters:
action: Vælg handlingen til eksekvering, når et indlæg matcher filteret action: Vælg handlingen til eksekvering, når et indlæg matcher filteret
actions: actions:
@ -105,7 +105,7 @@ da:
thumbnail: Et ca. 2:1 billede vist sammen med serveroplysningerne. thumbnail: Et ca. 2:1 billede vist sammen med serveroplysningerne.
timeline_preview: Udloggede besøgende kan gennemse serverens seneste offentlige indlæg. timeline_preview: Udloggede besøgende kan gennemse serverens seneste offentlige indlæg.
trendable_by_default: Spring manuel gennemgang af trendindhold over. Individuelle elementer kan stadig fjernes fra trends efter kendsgerningen. trendable_by_default: Spring manuel gennemgang af trendindhold over. Individuelle elementer kan stadig fjernes fra trends efter kendsgerningen.
trends: Tendenser viser, hvilke indlæg, etiketter og nyheder opnår momentum på serveren. trends: Tendenser viser, hvilke indlæg, hashtags og nyheder opnår momentum på serveren.
trends_as_landing_page: Vis tendensindhold til udloggede brugere og besøgende i stedet for en beskrivelse af denne server. Kræver, at tendenser er aktiveret. trends_as_landing_page: Vis tendensindhold til udloggede brugere og besøgende i stedet for en beskrivelse af denne server. Kræver, at tendenser er aktiveret.
form_challenge: form_challenge:
current_password: Du bevæger dig ind på et sikkert område current_password: Du bevæger dig ind på et sikkert område
@ -339,10 +339,10 @@ da:
indexable: Inkludér profilside i søgemaskiner indexable: Inkludér profilside i søgemaskiner
show_application: Vis, fra hvilken app et indlæg er sendt show_application: Vis, fra hvilken app et indlæg er sendt
tag: tag:
listable: Tillad visning af denne etiket i søgninger og forslag listable: Tillad visning af dette hashtag i søgninger og forslag
name: Hashtag name: Hashtag
trendable: Tillad visning af denne etiket under tendenser trendable: Tillad visning af dette hashtag under trends
usable: Tillad indlæg at benytte denne etiket lokalt usable: Tillad indlæg at benytte dette hashtag lokalt
terms_of_service: terms_of_service:
changelog: Hvad der er ændret? changelog: Hvad der er ændret?
effective_date: Ikrafttrædelsesdato effective_date: Ikrafttrædelsesdato

View File

@ -578,6 +578,13 @@ tr:
all: Tümü all: Tümü
limited: Sınırlı limited: Sınırlı
title: Denetim title: Denetim
moderation_notes:
create: Denetleme Notu Ekle
created_msg: Sunucu denetleme notu başarıyla oluşturuldu!
description_html: Kendiniz ve diğer moderatörler için not bırakın veya notları görüntüleyin
destroyed_msg: Sunucu denetleme notu başarıyla silindi!
placeholder: Bu sunucu hakkında bilgi, gerçekleştirilen eylemler veya ileride bu sunucunun denetimi için işinize yarayabilecek herhangi bir şey.
title: Denetleme Notları
private_comment: Özel yorum private_comment: Özel yorum
public_comment: Genel yorum public_comment: Genel yorum
purge: Temizle purge: Temizle

View File

@ -570,6 +570,9 @@ uk:
all: Усі all: Усі
limited: Обмежені limited: Обмежені
title: Модерація title: Модерація
moderation_notes:
create: Додати нотатку модерації
title: Нотатки модераторів
private_comment: Приватний коментар private_comment: Приватний коментар
public_comment: Публічний коментар public_comment: Публічний коментар
purge: Очисти purge: Очисти

View File

@ -567,6 +567,13 @@ vi:
all: Tất cả all: Tất cả
limited: Hạn chế limited: Hạn chế
title: Kiểm duyệt title: Kiểm duyệt
moderation_notes:
create: Thêm Lưu ý kiểm duyệt
created_msg: Thêm lưu ý kiểm duyệt máy chủ thành công!
description_html: Xem và để lại lưu ý cho các kiểm duyệt viên khác
destroyed_msg: Xóa lưu ý kiểm duyệt máy chủ thành công!
placeholder: Thông tin về máy chủ này, hành động trước đây, hoặc bất cứ lưu ý giúp bạn kiểm duyệt máy chủ này trong tương lai.
title: Lưu ý kiểm duyệt
private_comment: Bình luận riêng private_comment: Bình luận riêng
public_comment: Bình luận công khai public_comment: Bình luận công khai
purge: Thanh trừng purge: Thanh trừng

View File

@ -567,6 +567,13 @@ zh-TW:
all: 全部 all: 全部
limited: 限制 limited: 限制
title: 管管 title: 管管
moderation_notes:
create: 新增站務筆記
created_msg: 已成功新增站點管理筆記!
description_html: 檢視或替其他管理員與未來的自己留下筆記
destroyed_msg: 已成功刪除站點管理筆記!
placeholder: 關於此站點之資訊、已採取行動、或任何協助您將來管理此站點之事項。
title: 站務筆記
private_comment: 私人留言 private_comment: 私人留言
public_comment: 公開留言 public_comment: 公開留言
purge: 清除 purge: 清除

View File

@ -0,0 +1,33 @@
# frozen_string_literal: true
module Mastodon
module EmailConfigurationHelper
module_function
# Convert smtp settings from environment variables (or defaults in
# `config/email.yml`) into the format that `ActionMailer` understands
def smtp_settings(config)
enable_starttls = nil
enable_starttls_auto = nil
case config[:enable_starttls]
when 'always'
enable_starttls = true
when 'never'
enable_starttls = false
when 'auto'
enable_starttls_auto = true
else
enable_starttls_auto = config[:enable_starttls_auto] != 'false'
end
authentication = config[:authentication] == 'none' ? nil : (config[:authentication] || 'plain')
config.merge(
authentication:,
enable_starttls:,
enable_starttls_auto:
)
end
end
end

View File

@ -0,0 +1,98 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Mastodon::EmailConfigurationHelper do
describe '#smtp_settings' do
subject { described_class }
let(:converted_settings) { subject.smtp_settings(configuration) }
let(:base_configuration) do
{
address: 'localhost',
port: 25,
user_name: 'mastodon',
password: 'mastodon',
}
end
context 'when `enable_starttls` is "always"' do
let(:configuration) do
base_configuration.merge({ enable_starttls: 'always' })
end
it 'converts this to `true`' do
expect(converted_settings[:enable_starttls]).to be true
end
end
context 'when `enable_starttls` is "never"' do
let(:configuration) do
base_configuration.merge({ enable_starttls: 'never' })
end
it 'converts this to `false`' do
expect(converted_settings[:enable_starttls]).to be false
end
end
context 'when `enable_starttls` is "auto"' do
let(:configuration) do
base_configuration.merge({ enable_starttls: 'auto' })
end
it 'sets `enable_starttls_auto` instead' do
expect(converted_settings[:enable_starttls]).to be_nil
expect(converted_settings[:enable_starttls_auto]).to be true
end
end
context 'when `enable_starttls` is unset' do
context 'when `enable_starttls_auto` is unset' do
let(:configuration) { base_configuration }
it 'sets `enable_starttls_auto` to `true`' do
expect(converted_settings[:enable_starttls_auto]).to be true
end
end
context 'when `enable_starttls_auto` is set to "false"' do
let(:configuration) do
base_configuration.merge({ enable_starttls_auto: 'false' })
end
it 'sets `enable_starttls_auto` to `false`' do
expect(converted_settings[:enable_starttls_auto]).to be false
end
end
end
context 'when `authentication` is set to "none"' do
let(:configuration) do
base_configuration.merge({ authentication: 'none' })
end
it 'sets `authentication` to `nil`' do
expect(converted_settings[:authentication]).to be_nil
end
end
context 'when `authentication` is set to `login`' do
let(:configuration) do
base_configuration.merge({ authentication: 'login' })
end
it 'is left as-is' do
expect(converted_settings[:authentication]).to eq 'login'
end
end
context 'when `authentication` is unset' do
let(:configuration) { base_configuration }
it 'sets `authentication` to "plain"' do
expect(converted_settings[:authentication]).to eq 'plain'
end
end
end
end

View File

@ -129,4 +129,24 @@ RSpec.describe SearchQueryTransformer do
end end
end end
end end
context 'with multiple prefix clauses before a search term' do
let(:query) { 'from:me has:media foo' }
it 'transforms clauses' do
expect(subject.send(:must_clauses).map(&:term)).to contain_exactly('foo')
expect(subject.send(:must_not_clauses)).to be_empty
expect(subject.send(:filter_clauses).map(&:prefix)).to contain_exactly('from', 'has')
end
end
context 'with a search term between two prefix clauses' do
let(:query) { 'from:me foo has:media' }
it 'transforms clauses' do
expect(subject.send(:must_clauses).map(&:term)).to contain_exactly('foo')
expect(subject.send(:must_not_clauses)).to be_empty
expect(subject.send(:filter_clauses).map(&:prefix)).to contain_exactly('from', 'has')
end
end
end end

View File

@ -1283,15 +1283,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/postcss-cascade-layers@npm:^5.0.1": "@csstools/postcss-cascade-layers@npm:^5.0.2":
version: 5.0.1 version: 5.0.2
resolution: "@csstools/postcss-cascade-layers@npm:5.0.1" resolution: "@csstools/postcss-cascade-layers@npm:5.0.2"
dependencies: dependencies:
"@csstools/selector-specificity": "npm:^5.0.0" "@csstools/selector-specificity": "npm:^5.0.0"
postcss-selector-parser: "npm:^7.0.0" postcss-selector-parser: "npm:^7.0.0"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/5cc3c6f220d9216f7ab16e716a20d6db845f127c917521e6236342bfa871accd63eb662a04c1e24a28e396412dcb47b1c4abccc490b88e4010cd704d14a702f1 checksum: 10c0/dd8e29cfd3a93932fa35e3a59aa62fd2e720772d450f40f38f65ce1e736e2fe839635eb6f033abcc8ee8bc2856161a297f4458b352b26d2216856feb03176612
languageName: node languageName: node
linkType: hard linkType: hard
@ -10533,10 +10533,10 @@ __metadata:
linkType: hard linkType: hard
"postcss-preset-env@npm:^10.1.5": "postcss-preset-env@npm:^10.1.5":
version: 10.2.3 version: 10.2.4
resolution: "postcss-preset-env@npm:10.2.3" resolution: "postcss-preset-env@npm:10.2.4"
dependencies: dependencies:
"@csstools/postcss-cascade-layers": "npm:^5.0.1" "@csstools/postcss-cascade-layers": "npm:^5.0.2"
"@csstools/postcss-color-function": "npm:^4.0.10" "@csstools/postcss-color-function": "npm:^4.0.10"
"@csstools/postcss-color-mix-function": "npm:^3.0.10" "@csstools/postcss-color-mix-function": "npm:^3.0.10"
"@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.0" "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.0"
@ -10602,7 +10602,7 @@ __metadata:
postcss-selector-not: "npm:^8.0.1" postcss-selector-not: "npm:^8.0.1"
peerDependencies: peerDependencies:
postcss: ^8.4 postcss: ^8.4
checksum: 10c0/f3d2ea8b95083acad2cf74aca93904dd3158639bf692d1d471598b538e0c6b4447ae306e7bc1c2426dd465e7c9715373678855b7e211e194b507ef8184e83f99 checksum: 10c0/d7f8494d355567dc4ea66fe765c86ba9b1e9ce5061ada5c80c51fdf6c98b004b0b7ef17b5f64d197e1bec2e22ef4b6c613b998e1c1bcad0b53f0a3e303ded2fe
languageName: node languageName: node
linkType: hard linkType: hard