Merge remote-tracking branch 'parent/main' into upstream-20240304

This commit is contained in:
KMY 2024-03-04 10:37:41 +09:00
commit 42b5727723
147 changed files with 1529 additions and 958 deletions

4
.github/codecov.yml vendored
View file

@ -1,3 +1,4 @@
comment: false # Do not leave PR comments
coverage: coverage:
status: status:
project: project:
@ -8,6 +9,3 @@ coverage:
default: default:
# Github status check is not blocking # Github status check is not blocking
informational: true informational: true
comment:
# Only write a comment in PR if there are changes
require_changes: true

2
Vagrantfile vendored
View file

@ -188,7 +188,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.post_up_message = <<MESSAGE config.vm.post_up_message = <<MESSAGE
To start server To start server
$ vagrant ssh -c "cd /vagrant && foreman start" $ vagrant ssh -c "cd /vagrant && bin/dev"
MESSAGE MESSAGE
end end

View file

@ -4,7 +4,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
before_action -> { authorize_if_got_token! :read, :'read:statuses' } before_action -> { authorize_if_got_token! :read, :'read:statuses' }
before_action :set_account before_action :set_account
after_action :insert_pagination_headers, unless: -> { truthy_param?(:pinned) } after_action :insert_pagination_headers
def index def index
cache_if_unauthenticated! cache_if_unauthenticated!

View file

@ -127,7 +127,7 @@ module LanguagesHelper
om: ['Oromo', 'Afaan Oromoo'].freeze, om: ['Oromo', 'Afaan Oromoo'].freeze,
or: ['Oriya', 'ଓଡ଼ିଆ'].freeze, or: ['Oriya', 'ଓଡ଼ିଆ'].freeze,
os: ['Ossetian', 'ирон æвзаг'].freeze, os: ['Ossetian', 'ирон æвзаг'].freeze,
pa: ['Panjabi', 'ਪੰਜਾਬੀ'].freeze, pa: ['Punjabi', 'ਪੰਜਾਬੀ'].freeze,
pi: ['Pāli', 'पाऴि'].freeze, pi: ['Pāli', 'पाऴि'].freeze,
pl: ['Polish', 'Polski'].freeze, pl: ['Polish', 'Polski'].freeze,
ps: ['Pashto', 'پښتو'].freeze, ps: ['Pashto', 'پښتو'].freeze,
@ -191,15 +191,18 @@ module LanguagesHelper
chr: ['Cherokee', 'ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ'].freeze, chr: ['Cherokee', 'ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ'].freeze,
ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze, ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze,
cnr: ['Montenegrin', 'crnogorski'].freeze, cnr: ['Montenegrin', 'crnogorski'].freeze,
csb: ['Kashubian', 'Kaszëbsczi'].freeze,
jbo: ['Lojban', 'la .lojban.'].freeze, jbo: ['Lojban', 'la .lojban.'].freeze,
kab: ['Kabyle', 'Taqbaylit'].freeze, kab: ['Kabyle', 'Taqbaylit'].freeze,
ldn: ['Láadan', 'Láadan'].freeze, ldn: ['Láadan', 'Láadan'].freeze,
lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze, lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze,
pdc: ['Pennsylvania Dutch', 'Pennsilfaani-Deitsch'].freeze,
sco: ['Scots', 'Scots'].freeze, sco: ['Scots', 'Scots'].freeze,
sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze, sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze,
smj: ['Lule Sami', 'Julevsámegiella'].freeze, smj: ['Lule Sami', 'Julevsámegiella'].freeze,
szl: ['Silesian', 'ślůnsko godka'].freeze, szl: ['Silesian', 'ślůnsko godka'].freeze,
tok: ['Toki Pona', 'toki pona'].freeze, tok: ['Toki Pona', 'toki pona'].freeze,
vai: ['Vai', 'ꕙꔤ'].freeze,
xal: ['Kalmyk', 'Хальмг келн'].freeze, xal: ['Kalmyk', 'Хальмг келн'].freeze,
zba: ['Balaibalan', 'باليبلن'].freeze, zba: ['Balaibalan', 'باليبلن'].freeze,
zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze, zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020-2024 Paweł Kuna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1 @@
Images in this folder are based on [Tabler.io icons](https://tabler.io/icons).

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020-2024 Paweł Kuna
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1 @@
Images in this folder are based on [Tabler.io icons](https://tabler.io/icons).

View file

Before

Width:  |  Height:  |  Size: 547 B

After

Width:  |  Height:  |  Size: 547 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 505 B

After

Width:  |  Height:  |  Size: 505 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

Before

Width:  |  Height:  |  Size: 688 B

After

Width:  |  Height:  |  Size: 688 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

Before

Width:  |  Height:  |  Size: 709 B

After

Width:  |  Height:  |  Size: 709 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 939 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -67,7 +67,7 @@ class EditedTimestamp extends PureComponent {
return ( return (
<DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}> <DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}>
<button className='dropdown-menu__text-button'> <button className='dropdown-menu__text-button'>
<FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: intl.formatDate(timestamp, { hour12: false, month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) }} /> <Icon id='caret-down' icon={ArrowDropDownIcon} /> <FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: intl.formatDate(timestamp, { month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) }} /> <Icon id='caret-down' icon={ArrowDropDownIcon} />
</button> </button>
</DropdownMenu> </DropdownMenu>
); );

View file

@ -53,7 +53,6 @@ const messages = defineMessages({
}); });
const dateFormatOptions = { const dateFormatOptions = {
hour12: false,
year: 'numeric', year: 'numeric',
month: 'short', month: 'short',
day: '2-digit', day: '2-digit',

View file

@ -632,7 +632,7 @@ class Status extends ImmutablePureComponent {
{withExpiration} {withExpiration}
{withLimited} {withLimited}
<span className='status__visibility-icon'><VisibilityIcon visibility={visibilityName} /></span> <span className='status__visibility-icon'><VisibilityIcon visibility={visibilityName} /></span>
<RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>} <RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
</a> </a>
<a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'> <a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'>

View file

@ -104,7 +104,6 @@ const dateFormatOptions = {
month: 'short', month: 'short',
day: 'numeric', day: 'numeric',
year: 'numeric', year: 'numeric',
hour12: false,
hour: '2-digit', hour: '2-digit',
minute: '2-digit', minute: '2-digit',
}; };

View file

@ -343,7 +343,7 @@ class Announcement extends ImmutablePureComponent {
<div className='announcements__item'> <div className='announcements__item'>
<strong className='announcements__item__range'> <strong className='announcements__item__range'>
<FormattedMessage id='announcement.announcement' defaultMessage='Announcement' /> <FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />
{hasTimeRange && <span> · <FormattedDate value={startsAt} hour12={false} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} hour12={false} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>} {hasTimeRange && <span> · <FormattedDate value={startsAt} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>}
</strong> </strong>
<Content announcement={announcement} /> <Content announcement={announcement} />

View file

@ -92,6 +92,10 @@ export default class Card extends PureComponent {
this.setState({ embedded: true }); this.setState({ embedded: true });
}; };
handleExternalLinkClick = (e) => {
e.stopPropagation();
};
setRef = c => { setRef = c => {
this.node = c; this.node = c;
}; };
@ -201,7 +205,7 @@ export default class Card extends PureComponent {
<div className='status-card__actions' onClick={this.handleEmbedClick} role='none'> <div className='status-card__actions' onClick={this.handleEmbedClick} role='none'>
<div> <div>
<button type='button' onClick={this.handleEmbedClick}><Icon id='play' icon={PlayArrowIcon} /></button> <button type='button' onClick={this.handleEmbedClick}><Icon id='play' icon={PlayArrowIcon} /></button>
<a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' icon={OpenInNewIcon} /></a> <a href={card.get('url')} onClick={this.handleExternalLinkClick} target='_blank' rel='noopener noreferrer'><Icon id='external-link' icon={OpenInNewIcon} /></a>
</div> </div>
</div> </div>
) : spoilerButton} ) : spoilerButton}

View file

@ -374,8 +374,8 @@ class DetailedStatus extends ImmutablePureComponent {
<div className='detailed-status__meta'> <div className='detailed-status__meta'>
<a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'> <a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
<FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' /> <FormattedDate value={new Date(status.get('created_at'))} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
</a>{edited}{visibilityLink}{searchabilityLink}{applicationLink}{reblogLink} · {favouriteLink} · {emojiReactionsLink} - {statusReferencesLink} </a>{edited}{visibilityLink}{searchabilityLink}{applicationLink}{reblogLink} · {favouriteLink} · {emojiReactionsLink} · {statusReferencesLink}
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,6 +1,6 @@
{ {
"about.blocks": "Prižiūrimi serveriai", "about.blocks": "Prižiūrimi serveriai",
"about.contact": "Kontaktuoti:", "about.contact": "Kontaktai:",
"about.disclaimer": "Mastodon nemokama atvirojo kodo programa ir Mastodon gGmbH prekės ženklas.", "about.disclaimer": "Mastodon nemokama atvirojo kodo programa ir Mastodon gGmbH prekės ženklas.",
"about.domain_blocks.no_reason_available": "Priežastis nepateikta", "about.domain_blocks.no_reason_available": "Priežastis nepateikta",
"about.domain_blocks.preamble": "Mastodon paprastai leidžia peržiūrėti turinį ir bendrauti su naudotojais iš bet kurio kito fediverse esančio serverio. Šios yra išimtys, kurios buvo padarytos šiame konkrečiame serveryje.", "about.domain_blocks.preamble": "Mastodon paprastai leidžia peržiūrėti turinį ir bendrauti su naudotojais iš bet kurio kito fediverse esančio serverio. Šios yra išimtys, kurios buvo padarytos šiame konkrečiame serveryje.",
@ -424,7 +424,7 @@
"notifications.column_settings.mention": "Paminėjimai:", "notifications.column_settings.mention": "Paminėjimai:",
"notifications.column_settings.poll": "Balsavimo rezultatai:", "notifications.column_settings.poll": "Balsavimo rezultatai:",
"notifications.column_settings.push": "\"Push\" pranešimai", "notifications.column_settings.push": "\"Push\" pranešimai",
"notifications.column_settings.reblog": "\"Boost\" kiekis:", "notifications.column_settings.reblog": "Pakėlimai:",
"notifications.column_settings.show": "Rodyti stulpelyje", "notifications.column_settings.show": "Rodyti stulpelyje",
"notifications.column_settings.sound": "Paleisti garsą", "notifications.column_settings.sound": "Paleisti garsą",
"notifications.column_settings.status": "New toots:", "notifications.column_settings.status": "New toots:",
@ -636,6 +636,7 @@
"status.translate": "Versti", "status.translate": "Versti",
"status.translated_from_with": "Išversta iš {lang} naudojant {provider}", "status.translated_from_with": "Išversta iš {lang} naudojant {provider}",
"status.uncached_media_warning": "Peržiūra nepasiekiama", "status.uncached_media_warning": "Peržiūra nepasiekiama",
"subscribed_languages.lead": "Po pakeitimo tavo pagrindinėje ir sąrašo laiko juostose bus rodomi tik įrašai pasirinktomis kalbomis. Jei nori gauti įrašus visomis kalbomis, pasirink nė vieno.",
"tabs_bar.home": "Pradžia", "tabs_bar.home": "Pradžia",
"tabs_bar.notifications": "Pranešimai", "tabs_bar.notifications": "Pranešimai",
"time_remaining.days": "Liko {number, plural, one {# diena} few {# dienos} many {# dieno} other {# dienų}}", "time_remaining.days": "Liko {number, plural, one {# diena} few {# dienos} many {# dieno} other {# dienų}}",

View file

@ -529,8 +529,8 @@
"poll_button.add_poll": "Peiling toevoegen", "poll_button.add_poll": "Peiling toevoegen",
"poll_button.remove_poll": "Peiling verwijderen", "poll_button.remove_poll": "Peiling verwijderen",
"privacy.change": "Zichtbaarheid van bericht aanpassen", "privacy.change": "Zichtbaarheid van bericht aanpassen",
"privacy.direct.long": "Iedereen die in het bericht wordt vermeld", "privacy.direct.long": "Alleen voor mensen die specifiek in het bericht worden vermeld",
"privacy.direct.short": "Bepaalde mensen", "privacy.direct.short": "Specifieke mensen",
"privacy.private.long": "Alleen jouw volgers", "privacy.private.long": "Alleen jouw volgers",
"privacy.private.short": "Volgers", "privacy.private.short": "Volgers",
"privacy.public.long": "Iedereen op Mastodon en daarbuiten", "privacy.public.long": "Iedereen op Mastodon en daarbuiten",

View file

@ -668,7 +668,7 @@
"status.mute": "靜音 @{name}", "status.mute": "靜音 @{name}",
"status.mute_conversation": "靜音對話", "status.mute_conversation": "靜音對話",
"status.open": "展開此嘟文", "status.open": "展開此嘟文",
"status.pin": "釘選個人檔案頁面", "status.pin": "釘選個人檔案頁面",
"status.pinned": "釘選嘟文", "status.pinned": "釘選嘟文",
"status.read_more": "閱讀更多", "status.read_more": "閱讀更多",
"status.reblog": "轉嘟", "status.reblog": "轉嘟",

View file

@ -1,254 +0,0 @@
import './public-path';
import React from 'react';
import { createRoot } from 'react-dom/client';
import Rails from '@rails/ujs';
import ready from '../mastodon/ready';
const setAnnouncementEndsAttributes = (target) => {
const valid = target?.value && target?.validity?.valid;
const element = document.querySelector('input[type="datetime-local"]#announcement_ends_at');
if (valid) {
element.classList.remove('optional');
element.required = true;
element.min = target.value;
} else {
element.classList.add('optional');
element.removeAttribute('required');
element.removeAttribute('min');
}
};
Rails.delegate(document, 'input[type="datetime-local"]#announcement_starts_at', 'change', ({ target }) => {
setAnnouncementEndsAttributes(target);
});
const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]';
const showSelectAll = () => {
const selectAllMatchingElement = document.querySelector('.batch-table__select-all');
selectAllMatchingElement.classList.add('active');
};
const hideSelectAll = () => {
const selectAllMatchingElement = document.querySelector('.batch-table__select-all');
const hiddenField = document.querySelector('#select_all_matching');
const selectedMsg = document.querySelector('.batch-table__select-all .selected');
const notSelectedMsg = document.querySelector('.batch-table__select-all .not-selected');
selectAllMatchingElement.classList.remove('active');
selectedMsg.classList.remove('active');
notSelectedMsg.classList.add('active');
hiddenField.value = '0';
};
Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
const selectAllMatchingElement = document.querySelector('.batch-table__select-all');
document.querySelectorAll(batchCheckboxClassName).forEach((content) => {
content.checked = target.checked;
});
if (selectAllMatchingElement) {
if (target.checked) {
showSelectAll();
} else {
hideSelectAll();
}
}
});
Rails.delegate(document, '.batch-table__select-all button', 'click', () => {
const hiddenField = document.querySelector('#select_all_matching');
const active = hiddenField.value === '1';
const selectedMsg = document.querySelector('.batch-table__select-all .selected');
const notSelectedMsg = document.querySelector('.batch-table__select-all .not-selected');
if (active) {
hiddenField.value = '0';
selectedMsg.classList.remove('active');
notSelectedMsg.classList.add('active');
} else {
hiddenField.value = '1';
notSelectedMsg.classList.remove('active');
selectedMsg.classList.add('active');
}
});
Rails.delegate(document, batchCheckboxClassName, 'change', () => {
const checkAllElement = document.querySelector('#batch_checkbox_all');
const selectAllMatchingElement = document.querySelector('.batch-table__select-all');
if (checkAllElement) {
const allCheckboxes = Array.from(
document.querySelectorAll(batchCheckboxClassName)
);
checkAllElement.checked = allCheckboxes.every((content) => content.checked);
checkAllElement.indeterminate = !checkAllElement.checked && allCheckboxes.some((content) => content.checked);
if (selectAllMatchingElement) {
if (checkAllElement.checked) {
showSelectAll();
} else {
hideSelectAll();
}
}
}
});
Rails.delegate(document, '.filter-subset--with-select select', 'change', ({ target }) => {
target.form.submit();
});
const onDomainBlockSeverityChange = (target) => {
const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media');
const rejectFavouriteDiv= document.querySelector('.input.with_label.domain_block_reject_favourite');
const rejectReplyDiv = document.querySelector('.input.with_label.domain_block_reject_reply');
const rejectReportsDiv = document.querySelector('.input.with_label.domain_block_reject_reports');
if (rejectMediaDiv) {
rejectMediaDiv.style.display = (target.value === 'suspend') ? 'none' : 'block';
}
if (rejectFavouriteDiv) {
rejectFavouriteDiv.style.display = (target.value === 'suspend') ? 'none' : 'block';
}
if (rejectReplyDiv) {
rejectReplyDiv.style.display = (target.value === 'suspend') ? 'none' : 'block';
}
if (rejectReportsDiv) {
rejectReportsDiv.style.display = (target.value === 'suspend') ? 'none' : 'block';
}
};
Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target));
const onEnableBootstrapTimelineAccountsChange = (target) => {
const bootstrapTimelineAccountsField = document.querySelector('#form_admin_settings_bootstrap_timeline_accounts');
if (bootstrapTimelineAccountsField) {
bootstrapTimelineAccountsField.disabled = !target.checked;
if (target.checked) {
bootstrapTimelineAccountsField.parentElement.classList.remove('disabled');
bootstrapTimelineAccountsField.parentElement.parentElement.classList.remove('disabled');
} else {
bootstrapTimelineAccountsField.parentElement.classList.add('disabled');
bootstrapTimelineAccountsField.parentElement.parentElement.classList.add('disabled');
}
}
};
Rails.delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target));
const onChangeRegistrationMode = (target) => {
const enabled = target.value === 'approved';
document.querySelectorAll('.form_admin_settings_registrations_mode .warning-hint').forEach((warning_hint) => {
warning_hint.style.display = target.value === 'open' ? 'inline' : 'none';
});
document.querySelectorAll('#form_admin_settings_require_invite_text').forEach((input) => {
input.disabled = !enabled;
if (enabled) {
let element = input;
do {
element.classList.remove('disabled');
element = element.parentElement;
} while (element && !element.classList.contains('fields-group'));
} else {
let element = input;
do {
element.classList.add('disabled');
element = element.parentElement;
} while (element && !element.classList.contains('fields-group'));
}
});
};
const convertUTCDateTimeToLocal = (value) => {
const date = new Date(value + 'Z');
const twoChars = (x) => (x.toString().padStart(2, '0'));
return `${date.getFullYear()}-${twoChars(date.getMonth()+1)}-${twoChars(date.getDate())}T${twoChars(date.getHours())}:${twoChars(date.getMinutes())}`;
};
const convertLocalDatetimeToUTC = (value) => {
const re = /^([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})/;
const match = re.exec(value);
const date = new Date(match[1], match[2] - 1, match[3], match[4], match[5]);
const fullISO8601 = date.toISOString();
return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6);
};
Rails.delegate(document, '#form_admin_settings_registrations_mode', 'change', ({ target }) => onChangeRegistrationMode(target));
ready(() => {
const domainBlockSeverityInput = document.getElementById('domain_block_severity');
if (domainBlockSeverityInput) onDomainBlockSeverityChange(domainBlockSeverityInput);
const enableBootstrapTimelineAccounts = document.getElementById('form_admin_settings_enable_bootstrap_timeline_accounts');
if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts);
const registrationMode = document.getElementById('form_admin_settings_registrations_mode');
if (registrationMode) onChangeRegistrationMode(registrationMode);
const checkAllElement = document.querySelector('#batch_checkbox_all');
if (checkAllElement) {
const allCheckboxes = Array.from(document.querySelectorAll(batchCheckboxClassName));
checkAllElement.checked = allCheckboxes.every( (content) => content.checked);
checkAllElement.indeterminate = !checkAllElement.checked && allCheckboxes.some((content) => content.checked);
}
document.querySelector('a#add-instance-button')?.addEventListener('click', (e) => {
const domain = document.querySelector('input[type="text"]#by_domain')?.value;
if (domain) {
const url = new URL(event.target.href);
url.searchParams.set('_domain', domain);
e.target.href = url;
}
});
document.querySelectorAll('input[type="datetime-local"]').forEach(element => {
if (element.value) {
element.value = convertUTCDateTimeToLocal(element.value);
}
if (element.placeholder) {
element.placeholder = convertUTCDateTimeToLocal(element.placeholder);
}
});
Rails.delegate(document, 'form', 'submit', ({ target }) => {
target.querySelectorAll('input[type="datetime-local"]').forEach(element => {
if (element.value && element.validity.valid) {
element.value = convertLocalDatetimeToUTC(element.value);
}
});
});
const announcementStartsAt = document.querySelector('input[type="datetime-local"]#announcement_starts_at');
if (announcementStartsAt) {
setAnnouncementEndsAttributes(announcementStartsAt);
}
document.querySelectorAll('[data-admin-component]').forEach(element => {
const componentName = element.getAttribute('data-admin-component');
const componentProps = JSON.parse(element.getAttribute('data-props'));
import('../mastodon/containers/admin_component').then(({ default: AdminComponent }) => {
return import('../mastodon/components/admin/' + componentName).then(({ default: Component }) => {
const root = createRoot(element);
root.render (
<AdminComponent>
<Component {...componentProps} />
</AdminComponent>,
);
});
}).catch(error => {
console.error(error);
});
});
});

View file

@ -0,0 +1,368 @@
import './public-path';
import { createRoot } from 'react-dom/client';
import Rails from '@rails/ujs';
import ready from '../mastodon/ready';
const setAnnouncementEndsAttributes = (target: HTMLInputElement) => {
const valid = target.value && target.validity.valid;
const element = document.querySelector<HTMLInputElement>(
'input[type="datetime-local"]#announcement_ends_at',
);
if (!element) return;
if (valid) {
element.classList.remove('optional');
element.required = true;
element.min = target.value;
} else {
element.classList.add('optional');
element.removeAttribute('required');
element.removeAttribute('min');
}
};
Rails.delegate(
document,
'input[type="datetime-local"]#announcement_starts_at',
'change',
({ target }) => {
if (target instanceof HTMLInputElement)
setAnnouncementEndsAttributes(target);
},
);
const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]';
const showSelectAll = () => {
const selectAllMatchingElement = document.querySelector(
'.batch-table__select-all',
);
selectAllMatchingElement?.classList.add('active');
};
const hideSelectAll = () => {
const selectAllMatchingElement = document.querySelector(
'.batch-table__select-all',
);
const hiddenField = document.querySelector<HTMLInputElement>(
'input#select_all_matching',
);
const selectedMsg = document.querySelector(
'.batch-table__select-all .selected',
);
const notSelectedMsg = document.querySelector(
'.batch-table__select-all .not-selected',
);
selectAllMatchingElement?.classList.remove('active');
selectedMsg?.classList.remove('active');
notSelectedMsg?.classList.add('active');
if (hiddenField) hiddenField.value = '0';
};
Rails.delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
if (!(target instanceof HTMLInputElement)) return;
const selectAllMatchingElement = document.querySelector(
'.batch-table__select-all',
);
document
.querySelectorAll<HTMLInputElement>(batchCheckboxClassName)
.forEach((content) => {
content.checked = target.checked;
});
if (selectAllMatchingElement) {
if (target.checked) {
showSelectAll();
} else {
hideSelectAll();
}
}
});
Rails.delegate(document, '.batch-table__select-all button', 'click', () => {
const hiddenField = document.querySelector<HTMLInputElement>(
'#select_all_matching',
);
if (!hiddenField) return;
const active = hiddenField.value === '1';
const selectedMsg = document.querySelector(
'.batch-table__select-all .selected',
);
const notSelectedMsg = document.querySelector(
'.batch-table__select-all .not-selected',
);
if (!selectedMsg || !notSelectedMsg) return;
if (active) {
hiddenField.value = '0';
selectedMsg.classList.remove('active');
notSelectedMsg.classList.add('active');
} else {
hiddenField.value = '1';
notSelectedMsg.classList.remove('active');
selectedMsg.classList.add('active');
}
});
Rails.delegate(document, batchCheckboxClassName, 'change', () => {
const checkAllElement = document.querySelector<HTMLInputElement>(
'input#batch_checkbox_all',
);
const selectAllMatchingElement = document.querySelector(
'.batch-table__select-all',
);
if (checkAllElement) {
const allCheckboxes = Array.from(
document.querySelectorAll<HTMLInputElement>(batchCheckboxClassName),
);
checkAllElement.checked = allCheckboxes.every((content) => content.checked);
checkAllElement.indeterminate =
!checkAllElement.checked &&
allCheckboxes.some((content) => content.checked);
if (selectAllMatchingElement) {
if (checkAllElement.checked) {
showSelectAll();
} else {
hideSelectAll();
}
}
}
});
Rails.delegate(
document,
'.filter-subset--with-select select',
'change',
({ target }) => {
if (target instanceof HTMLSelectElement) target.form?.submit();
},
);
const onDomainBlockSeverityChange = (target: HTMLSelectElement) => {
const rejectMediaDiv = document.querySelector(
'.input.with_label.domain_block_reject_media',
);
const rejectReportsDiv = document.querySelector(
'.input.with_label.domain_block_reject_reports',
);
if (rejectMediaDiv && rejectMediaDiv instanceof HTMLElement) {
rejectMediaDiv.style.display =
target.value === 'suspend' ? 'none' : 'block';
}
if (rejectReportsDiv && rejectReportsDiv instanceof HTMLElement) {
rejectReportsDiv.style.display =
target.value === 'suspend' ? 'none' : 'block';
}
};
Rails.delegate(document, '#domain_block_severity', 'change', ({ target }) => {
if (target instanceof HTMLSelectElement) onDomainBlockSeverityChange(target);
});
const onEnableBootstrapTimelineAccountsChange = (target: HTMLInputElement) => {
const bootstrapTimelineAccountsField =
document.querySelector<HTMLInputElement>(
'#form_admin_settings_bootstrap_timeline_accounts',
);
if (bootstrapTimelineAccountsField) {
bootstrapTimelineAccountsField.disabled = !target.checked;
if (target.checked) {
bootstrapTimelineAccountsField.parentElement?.classList.remove(
'disabled',
);
bootstrapTimelineAccountsField.parentElement?.parentElement?.classList.remove(
'disabled',
);
} else {
bootstrapTimelineAccountsField.parentElement?.classList.add('disabled');
bootstrapTimelineAccountsField.parentElement?.parentElement?.classList.add(
'disabled',
);
}
}
};
Rails.delegate(
document,
'#form_admin_settings_enable_bootstrap_timeline_accounts',
'change',
({ target }) => {
if (target instanceof HTMLInputElement)
onEnableBootstrapTimelineAccountsChange(target);
},
);
const onChangeRegistrationMode = (target: HTMLSelectElement) => {
const enabled = target.value === 'approved';
document
.querySelectorAll<HTMLElement>(
'.form_admin_settings_registrations_mode .warning-hint',
)
.forEach((warning_hint) => {
warning_hint.style.display = target.value === 'open' ? 'inline' : 'none';
});
document
.querySelectorAll<HTMLInputElement>(
'input#form_admin_settings_require_invite_text',
)
.forEach((input) => {
input.disabled = !enabled;
if (enabled) {
let element: HTMLElement | null = input;
do {
element.classList.remove('disabled');
element = element.parentElement;
} while (element && !element.classList.contains('fields-group'));
} else {
let element: HTMLElement | null = input;
do {
element.classList.add('disabled');
element = element.parentElement;
} while (element && !element.classList.contains('fields-group'));
}
});
};
const 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);
const fullISO8601 = date.toISOString();
return fullISO8601.slice(0, fullISO8601.indexOf('T') + 6);
}
Rails.delegate(
document,
'#form_admin_settings_registrations_mode',
'change',
({ target }) => {
if (target instanceof HTMLSelectElement) onChangeRegistrationMode(target);
},
);
async function mountReactComponent(element: Element) {
const componentName = element.getAttribute('data-admin-component');
const stringProps = element.getAttribute('data-props');
if (!stringProps) return;
const componentProps = JSON.parse(stringProps) as object;
const { default: AdminComponent } = await import(
'@/mastodon/containers/admin_component'
);
const { default: Component } = (await import(
`@/mastodon/components/admin/${componentName}`
)) as { default: React.ComponentType };
const root = createRoot(element);
root.render(
<AdminComponent>
<Component {...componentProps} />
</AdminComponent>,
);
}
ready(() => {
const domainBlockSeveritySelect = document.querySelector<HTMLSelectElement>(
'select#domain_block_severity',
);
if (domainBlockSeveritySelect)
onDomainBlockSeverityChange(domainBlockSeveritySelect);
const enableBootstrapTimelineAccounts =
document.querySelector<HTMLInputElement>(
'input#form_admin_settings_enable_bootstrap_timeline_accounts',
);
if (enableBootstrapTimelineAccounts)
onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts);
const registrationMode = document.querySelector<HTMLSelectElement>(
'select#form_admin_settings_registrations_mode',
);
if (registrationMode) onChangeRegistrationMode(registrationMode);
const checkAllElement = document.querySelector<HTMLInputElement>(
'input#batch_checkbox_all',
);
if (checkAllElement) {
const allCheckboxes = Array.from(
document.querySelectorAll<HTMLInputElement>(batchCheckboxClassName),
);
checkAllElement.checked = allCheckboxes.every((content) => content.checked);
checkAllElement.indeterminate =
!checkAllElement.checked &&
allCheckboxes.some((content) => content.checked);
}
document
.querySelector('a#add-instance-button')
?.addEventListener('click', (e) => {
const domain = document.querySelector<HTMLInputElement>(
'input[type="text"]#by_domain',
)?.value;
if (domain && e.target instanceof HTMLAnchorElement) {
const url = new URL(e.target.href);
url.searchParams.set('_domain', domain);
e.target.href = url.toString();
}
});
document
.querySelectorAll<HTMLInputElement>('input[type="datetime-local"]')
.forEach((element) => {
if (element.value) {
element.value = convertUTCDateTimeToLocal(element.value);
}
if (element.placeholder) {
element.placeholder = convertUTCDateTimeToLocal(element.placeholder);
}
});
Rails.delegate(document, 'form', 'submit', ({ target }) => {
if (target instanceof HTMLFormElement)
target
.querySelectorAll<HTMLInputElement>('input[type="datetime-local"]')
.forEach((element) => {
if (element.value && element.validity.valid) {
element.value = convertLocalDatetimeToUTC(element.value);
}
});
});
const announcementStartsAt = document.querySelector<HTMLInputElement>(
'input[type="datetime-local"]#announcement_starts_at',
);
if (announcementStartsAt) {
setAnnouncementEndsAttributes(announcementStartsAt);
}
document.querySelectorAll('[data-admin-component]').forEach((element) => {
void mountReactComponent(element);
});
}).catch((reason) => {
throw reason;
});

View file

@ -65,7 +65,6 @@ function loaded() {
const timeFormat = new Intl.DateTimeFormat(locale, { const timeFormat = new Intl.DateTimeFormat(locale, {
timeStyle: 'short', timeStyle: 'short',
hour12: false,
}); });
const formatMessage = ({ id, defaultMessage }, values) => { const formatMessage = ({ id, defaultMessage }, values) => {

View file

@ -192,6 +192,18 @@ table + p {
} }
} }
.email-dir-rtl {
direction: rtl;
[dir='rtl'] & {
direction: ltr;
}
}
.email-dir-ltr {
direction: ltr;
}
.email-padding-24 { .email-padding-24 {
padding: 24px; padding: 24px;
} }
@ -216,6 +228,30 @@ table + p {
border-bottom: 1px solid #dfdee3; border-bottom: 1px solid #dfdee3;
} }
.email-desktop-flex {
font-size: 0;
max-width: 740px;
margin-left: auto;
margin-right: auto;
&.email-dir-rtl > .email-desktop-column {
direction: ltr;
[dir='rtl'] & {
direction: rtl;
}
}
}
.email-desktop-column {
display: inline-block;
width: 100%;
max-width: none;
text-align: start;
vertical-align: top;
font-size: 16px;
}
// Header // Header
.email-header-td { .email-header-td {
padding: 16px 32px; padding: 16px 32px;
@ -312,6 +348,66 @@ table + p {
} }
} }
.email-header-card-table {
width: 100%;
border-collapse: separate;
overflow: hidden;
border-radius: 12px;
background-color: #fff;
border: 2px solid #fff;
box-shadow: 0 4px 16px 0 rgba(23, 6, 59, 8%);
}
.email-header-card {
position: relative;
max-height: 100px;
}
.email-header-card-banner-td {
border-radius: 12px 12px 0 0;
height: 80px;
background-color: #f3f2f5 !important;
background-position: center !important;
background-size: cover !important;
}
.email-header-card-body-td {
padding: 12px;
.email-btn-table {
width: 100%;
max-width: 212px;
}
}
.email-header-card-instance {
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
color: #17063b;
font-size: 14px;
line-height: 20px;
font-weight: 600;
&:only-of-type {
margin-bottom: 12px;
}
}
.email-header-card-description {
margin-bottom: 12px;
color: #746a89;
font-size: 12px;
line-height: 16px;
max-height: 32px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
// To make the design work with images off // To make the design work with images off
// we create an empty div that overlaps with // we create an empty div that overlaps with
// the rest of the content with a dark background. // the rest of the content with a dark background.
@ -336,6 +432,16 @@ table + p {
mso-padding-alt: 32px; mso-padding-alt: 32px;
} }
.email-body-columns-td {
border-top: 1px solid #dfdee3;
padding: 32px 24px 8px;
}
.email-body-huge-padding-td {
padding: 110px 32px 32px;
mso-padding-alt: 32px;
}
.email-body-padding-td { .email-body-padding-td {
& > p { & > p {
font-size: 14px; font-size: 14px;
@ -353,6 +459,30 @@ table + p {
} }
} }
// Texts
.email-h2 {
margin-bottom: 4px;
color: #17063b;
font-size: 18px;
font-weight: 600;
line-height: 28px;
}
.email-h-sub {
margin-bottom: 16px;
color: #746a89;
font-size: 14px;
line-height: 16px;
}
.email-p {
margin-bottom: 16px;
color: #746a89;
font-size: 14px;
font-weight: 400;
line-height: 20px;
}
// Footer // Footer
.email-footer-td { .email-footer-td {
padding: 28px 32px 32px; padding: 28px 32px 32px;
@ -539,8 +669,13 @@ table + p {
background-color: #fff; background-color: #fff;
} }
.email-checklist-checked {
border-color: #c4e6d7;
background-color: #eaf6f1;
}
.email-checklist-td { .email-checklist-td {
padding: 16px; padding: 16px 16px 6px;
} }
.email-checklist-icons-td { .email-checklist-icons-td {
@ -576,10 +711,15 @@ table + p {
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
line-height: 16.8px; line-height: 16.8px;
.email-checklist-checked & {
color: #746a89;
text-decoration: line-through;
}
} }
p { p {
margin: 0 0 2px; margin: 0 0 12px;
color: #746a89; color: #746a89;
font-size: 14px; font-size: 14px;
line-height: 16.8px; line-height: 16.8px;
@ -597,6 +737,194 @@ table + p {
padding-left: 10px; padding-left: 10px;
padding-right: 10px; padding-right: 10px;
} }
div + div {
margin-inline-start: auto;
margin-bottom: 12px;
}
}
// Welcome email
.email-welcome-apps-btns {
font-size: 12px;
line-height: 44px;
}
.email-column-td {
padding: 0 8px;
vertical-align: top;
}
.email-link-with-arrow {
color: #6364ff;
font-size: 14px;
font-weight: 600;
line-height: 16.8px;
&:hover {
color: #563acc !important;
}
span {
font-size: 12px;
font-weight: 400;
}
}
.email-column-action-td {
padding: 24px 0;
color: #6364ff;
font-size: 14px;
font-weight: 600;
line-height: 16.8px;
text-align: center;
}
// Follow and hashtags
.email-mini-wrapper-td {
padding: 4px 0;
table {
table-layout: fixed;
}
}
.email-mini-td {
border-radius: 12px;
border: 1px solid #e8e6eb;
background-color: #fff;
padding: 15px 16px;
}
.email-mini-follow-img-td {
width: 40px;
vertical-align: top;
img {
border-radius: 8px;
}
}
.email-mini-follow-text-td {
padding-left: 8px;
padding-right: 16px;
vertical-align: top;
h3 {
color: #17063b;
font-size: 14px;
font-weight: 600;
line-height: 20px;
}
p {
color: #746a89;
font-size: 12px;
font-weight: 400;
line-height: 16px;
}
}
.email-mini-follow-btn-td {
width: 68px;
vertical-align: top;
.email-btn-table {
width: 100%;
}
.email-btn-td {
mso-padding-alt: 10px;
}
.email-btn-a {
padding-left: 10px;
padding-right: 10px;
}
}
.email-mini-hashtag-td {
height: 40px;
td {
vertical-align: middle;
}
h3 {
color: #17063b;
font-size: 14px;
font-weight: 600;
line-height: 20px;
}
p {
color: #746a89;
font-size: 12px;
font-weight: 400;
line-height: 16px;
word-break: break-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.email-mini-hashtag-img-td {
width: 40px;
height: 20px;
white-space: nowrap;
text-indent: -2px;
font-size: 0;
& + td {
padding-left: 8px;
}
}
.email-mini-hashtag-img-span {
display: inline-block;
max-width: 12px;
font-size: 12px;
img {
width: 16px;
height: 16px;
border-radius: 50%;
max-width: none;
border: 2px solid #fff;
vertical-align: middle;
}
}
// Extra content on light purple background
.email-extra-wave {
height: 42px;
background-image: url('../images/mailer-new/welcome/purple-extra-soft-wave.png');
background-position: bottom center;
background-repeat: no-repeat;
}
.email-extra-td {
padding: 32px 32px 24px;
background-color: #f0f0ff;
background-image: url('../images/mailer-new/welcome/purple-extra-soft-spacer.png'); // Using an image to maintain the color even in forced dark modes
.email-column-td {
padding-top: 8px;
padding-bottom: 8px;
}
}
// Feature card
.email-feature-wrapper-td {
padding: 8px 0;
}
.email-feature-td {
padding: 24px;
background-color: #fff;
border: 1px solid #e8e6eb;
border-radius: 12px;
} }
// Responsive // Responsive
@ -617,4 +945,21 @@ table + p {
.email-desktop-flex { .email-desktop-flex {
display: flex; display: flex;
} }
.email-header-left {
padding-right: 32px;
}
.email-header-right {
width: 240px;
margin-inline-start: auto;
}
.email-desktop-column {
max-width: 346px !important;
}
.email-desktop-text-right {
text-align: right;
}
} }

View file

@ -5485,10 +5485,6 @@ a.status-card {
pointer-events: auto; pointer-events: auto;
opacity: 1; opacity: 1;
} }
@media screen and (min-width: $no-gap-breakpoint) {
inset-inline-start: 16px - 2px;
}
} }
.icon-search { .icon-search {
@ -8697,7 +8693,7 @@ noscript {
.search__input { .search__input {
border: 1px solid lighten($ui-base-color, 8%); border: 1px solid lighten($ui-base-color, 8%);
padding: 10px; padding: 10px;
padding-inline-end: 28px; padding-inline-end: 30px;
} }
.search__popout { .search__popout {

View file

@ -28,14 +28,17 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
def sql_query_string def sql_query_string
<<~SQL.squish <<~SQL.squish
SELECT axis.*, ( SELECT axis.*, (
SELECT count(distinct accounts.domain) AS value WITH tag_servers AS (
FROM statuses SELECT DISTINCT accounts.domain
INNER JOIN statuses_tags ON statuses.id = statuses_tags.status_id FROM statuses
INNER JOIN accounts ON statuses.account_id = accounts.id INNER JOIN statuses_tags ON statuses.id = statuses_tags.status_id
WHERE statuses_tags.tag_id = :tag_id INNER JOIN accounts ON statuses.account_id = accounts.id
AND statuses.id BETWEEN :earliest_status_id AND :latest_status_id WHERE statuses_tags.tag_id = :tag_id
AND date_trunc('day', statuses.created_at)::date = axis.period AND statuses.id BETWEEN :earliest_status_id AND :latest_status_id
) AND date_trunc('day', statuses.created_at)::date = axis.period
)
SELECT COUNT(*) FROM tag_servers
) AS value
FROM ( FROM (
SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period SELECT generate_series(date_trunc('day', :start_at::timestamp)::date, date_trunc('day', :end_at::timestamp)::date, interval '1 day') AS period
) as axis ) as axis

View file

@ -135,6 +135,12 @@ class UserMailer < Devise::Mailer
return unless @resource.active_for_authentication? return unless @resource.active_for_authentication?
@suggestions = AccountSuggestions.new(@resource.account).get(5)
@tags = Trends.tags.query.allowed.limit(5)
@has_account_fields = @resource.account.display_name.present? || @resource.account.note.present? || @resource.account.avatar.present?
@has_active_relationships = @resource.account.active_relationships.exists?
@has_statuses = @resource.account.statuses.exists?
I18n.with_locale(locale) do I18n.with_locale(locale) do
mail subject: default_i18n_subject mail subject: default_i18n_subject
end end

View file

@ -493,7 +493,7 @@ class User < ApplicationRecord
BootstrapTimelineWorker.perform_async(account_id) BootstrapTimelineWorker.perform_async(account_id)
ActivityTracker.increment('activity:accounts:local') ActivityTracker.increment('activity:accounts:local')
ActivityTracker.record('activity:logins', id) ActivityTracker.record('activity:logins', id)
UserMailer.welcome(self).deliver_later UserMailer.welcome(self).deliver_later(wait: 1.hour)
TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id) TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id)
reset_registration_limit_caches! reset_registration_limit_caches!
end end

View file

@ -41,6 +41,7 @@ class UserRole < ApplicationRecord
}.freeze }.freeze
EVERYONE_ROLE_ID = -99 EVERYONE_ROLE_ID = -99
NOBODY_POSITION = -1
module Flags module Flags
NONE = 0 NONE = 0
@ -108,7 +109,7 @@ class UserRole < ApplicationRecord
has_many :users, inverse_of: :role, foreign_key: 'role_id', dependent: :nullify has_many :users, inverse_of: :role, foreign_key: 'role_id', dependent: :nullify
def self.nobody def self.nobody
@nobody ||= UserRole.new(permissions: Flags::NONE, position: -1) @nobody ||= UserRole.new(permissions: Flags::NONE, position: NOBODY_POSITION)
end end
def self.everyone def self.everyone
@ -177,7 +178,7 @@ class UserRole < ApplicationRecord
end end
def set_position def set_position
self.position = -1 if everyone? self.position = NOBODY_POSITION if everyone?
end end
def validate_own_role_edition def validate_own_role_edition

View file

@ -1,4 +1,7 @@
%table.email-btn-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %table.email-btn-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr %tr
%td.email-btn-td %td.email-btn-td
= link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover' - if defined?(has_arrow) && !has_arrow
= link_to text, url, class: 'email-btn-a email-btn-hover'
- else
= link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover'

View file

@ -1,7 +1,7 @@
%table.email-w-full.email-checklist-wrapper-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %table.email-w-full.email-checklist-wrapper-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr %tr
%td.email-checklist-wrapper-td %td.email-checklist-wrapper-td
%table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation', class: ('email-checklist-checked' if defined?(checked) && checked) }
%tr %tr
%td.email-checklist-td %td.email-checklist-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
@ -15,15 +15,25 @@
- else - else
= image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 = image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20
%td.email-checklist-icons-step-td %td.email-checklist-icons-step-td
- if defined?(step_image_url) - if defined?(key)
= image_tag step_image_url, alt: '', width: 40, height: 40 = image_tag frontend_asset_url("images/mailer-new/welcome-icons/#{key}-#{checked ? 'on' : 'off'}.png"), alt: '', width: 40, height: 40
%td.email-checklist-text-td %td.email-checklist-text-td
.email-desktop-flex .email-desktop-flex
/[if mso]
<table border="0" cellpadding="0" cellspacing="0" align="center" style="width:100%;" role="presentation"><tr><td vertical-align:top;">
%div %div
- if defined?(title) - if defined?(title)
%h3= title %h3= title
- if defined?(text) - if defined?(text)
%p= text %p= text
/[if mso]
</td><td style="vertical-align:top;">
%div %div
- if defined?(button_text) && defined?(button_url) && defined?(checked) && !checked - if defined?(show_apps_buttons) && show_apps_buttons
= render 'application/mailer/button', text: button_text, url: button_url .email-welcome-apps-btns
= link_to image_tag(frontend_asset_url('images/mailer-new/store-icons/btn-app-store.png'), alt: t('user_mailer.welcome.apps_ios_action'), width: 120, height: 40), 'https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974'
= link_to image_tag(frontend_asset_url('images/mailer-new/store-icons/btn-google-play.png'), alt: t('user_mailer.welcome.apps_android_action'), width: 120, height: 40), 'https://play.google.com/store/apps/details?id=org.joinmastodon.android'
- elsif defined?(button_text) && defined?(button_url) && defined?(checked) && !checked
= render 'application/mailer/button', text: button_text, url: button_url, has_arrow: false
/[if mso]
</td></tr></table>

View file

@ -0,0 +1,32 @@
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-feature-wrapper-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-feature-td
.email-desktop-flex{ class: ('email-dir-rtl' if defined?(text_first_on_desktop) && !text_first_on_desktop) }
/[if mso]
<table border="0" cellpadding="0" cellspacing="0" align="center" style="width:100%;" role="presentation"><tr><td style="width:50%; vertical-align:top;">
.email-desktop-column
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-column-td
- if defined?(feature_title)
%h2.email-h2= feature_title
- if defined?(feature_text)
%p.email-p= feature_text
- if defined?(feature_btn_url)
= link_to '', href: feature_btn_url, class: 'email-link-with-arrow' do
#{t('user_mailer.welcome.feature_action')} 
%span= ''
/[if mso]
</td><td style="width:50%; vertical-align:top;">
.email-desktop-column
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-column-td
- if defined?(key)
%p{ class: ('email-desktop-text-right' if defined?(text_first_on_desktop) && text_first_on_desktop) }
= image_tag frontend_asset_url("images/mailer-new/welcome/#{key}.png"), alt: '', width: 240, height: 230
/[if mso]
</td></tr></table>

View file

@ -0,0 +1,15 @@
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-wrapper-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-follow-img-td
= image_tag full_asset_url(follow.account.avatar.url), alt: '', width: 40, height: 40
%td.email-mini-follow-text-td
%h3= follow.account.display_name.presence || follow.account.username
%p @#{follow.account.pretty_acct}
%td.email-mini-follow-btn-td
= render 'application/mailer/button', text: t('user_mailer.welcome.follow_action'), url: web_url("@#{follow.account.acct}"), has_arrow: false

View file

@ -0,0 +1,20 @@
- accounts = hashtag.statuses.with_public_visibility.joins(:account).merge(Account.without_suspended.without_silenced).includes(:account).limit(3).map(&:account)
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-wrapper-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-hashtag-td{ height: 40 }
%h3 ##{hashtag.display_name}
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-mini-hashtag-img-td
- accounts.each do |account|
%span.email-mini-hashtag-img-span
= image_tag full_asset_url(account.avatar.url), alt: '', width: 16, height: 16
%td
%p= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(hashtag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2)

View file

@ -1,25 +1,76 @@
- instance_presenter = InstancePresenter.new
= content_for :heading do = content_for :heading do
= render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation') .email-desktop-flex
.email-header-left
= render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation')
.email-header-right
.email-header-card
%table.email-header-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-header-card-banner-td{ height: 140, background: full_asset_url(instance_presenter.thumbnail&.file&.url(:'@1x') || frontend_asset_path('images/preview.png')) }
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-header-card-body-td
%p.email-header-card-instance= @instance
- if instance_presenter.description.present?
%p.email-header-card-description= instance_presenter.description
= render 'application/mailer/button', text: t('user_mailer.welcome.sign_in_action'), url: new_user_session_url, has_arrow: false
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr %tr
%td.email-body-padding-td %td.email-body-huge-padding-td
%table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %h2.email-h2= t('user_mailer.welcome.checklist_title')
%tr %p.email-h-sub= t('user_mailer.welcome.checklist_subtitle')
%td.email-inner-card-td-without-padding = render 'application/mailer/checklist', key: 'edit_profile_step', title: t('user_mailer.welcome.edit_profile_title'), text: t('user_mailer.welcome.edit_profile_step'), checked: @has_account_fields, button_text: t('user_mailer.welcome.edit_profile_action'), button_url: web_url('start/profile')
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } = render 'application/mailer/checklist', key: 'follow_step', title: t('user_mailer.welcome.follow_title'), text: t('user_mailer.welcome.follow_step'), checked: @has_active_relationships, button_text: t('user_mailer.welcome.follow_action'), button_url: web_url('start/follows')
%tr = render 'application/mailer/checklist', key: 'post_step', title: t('user_mailer.welcome.post_title'), text: t('user_mailer.welcome.post_step'), checked: @has_statuses, button_text: t('user_mailer.welcome.post_action'), button_url: web_url
%td.email-prose.email-padding-24 = render 'application/mailer/checklist', key: 'share_step', title: t('user_mailer.welcome.share_title'), text: t('user_mailer.welcome.share_step'), checked: false, button_text: t('user_mailer.welcome.share_action'), button_url: web_url('start/share')
%p = render 'application/mailer/checklist', key: 'apps_step', title: t('user_mailer.welcome.apps_title'), text: t('user_mailer.welcome.apps_step'), checked: false, show_apps_buttons: true
%b= t 'user_mailer.welcome.full_handle' %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
= render 'application/mailer/frame', text: "#{@resource.account.username}@#{@instance}" %tr
%p= t 'user_mailer.welcome.full_handle_hint', instance: @instance %td.email-body-columns-td
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } .email-desktop-flex
%tr /[if mso]
%td.email-border-top.email-prose.email-padding-24 <table border="0" cellpadding="0" cellspacing="0" align="center" style="width:100%;" role="presentation"><tr><td style="width:50%; vertical-align:top;">
%p= t 'user_mailer.welcome.edit_profile_step' .email-desktop-column
= render 'application/mailer/button', text: t('user_mailer.welcome.edit_profile_action'), url: settings_profile_url %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr
%tr %td.email-column-td
%td.email-border-top.email-prose.email-padding-24 %h2.email-h2= t('user_mailer.welcome.follows_title')
%p= t 'user_mailer.welcome.edit_profile_step' %p.email-h-sub= t('user_mailer.welcome.follows_subtitle')
= render 'application/mailer/button', text: t('user_mailer.welcome.final_action'), url: web_url = render partial: 'application/mailer/follow', collection: @suggestions
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-column-action-td
= link_to '', href: web_url('explore/suggestions'), class: 'email-link-with-arrow' do
= t('user_mailer.welcome.follows_view_more')
%span= ''
/[if mso]
</td><td style="width:50%; vertical-align:top;">
.email-desktop-column
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-column-td
%h2.email-h2= t('user_mailer.welcome.hashtags_title')
%p.email-h-sub= t('user_mailer.welcome.hashtags_subtitle')
= render partial: 'application/mailer/hashtag', collection: @tags
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-column-action-td
= link_to '', href: web_url('explore/tags'), class: 'email-link-with-arrow' do
= t('user_mailer.welcome.hashtags_view_more')
%span= ''
/[if mso]
</td></tr></table>
.email-extra-wave
%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' }
%tr
%td.email-extra-td
= render 'application/mailer/feature', key: 'feature_control', feature_title: t('user_mailer.welcome.feature_control_title'), feature_text: t('user_mailer.welcome.feature_control'), text_first_on_desktop: true
= render 'application/mailer/feature', key: 'feature_audience', feature_title: t('user_mailer.welcome.feature_audience_title'), feature_text: t('user_mailer.welcome.feature_audience'), text_first_on_desktop: false
= render 'application/mailer/feature', key: 'feature_moderation', feature_title: t('user_mailer.welcome.feature_moderation_title'), feature_text: t('user_mailer.welcome.feature_moderation'), text_first_on_desktop: true
= render 'application/mailer/feature', key: 'feature_creativity', feature_title: t('user_mailer.welcome.feature_creativity_title'), feature_text: t('user_mailer.welcome.feature_creativity'), text_first_on_desktop: false

View file

@ -1,16 +1,78 @@
<%= t 'user_mailer.welcome.title', name: @resource.account.username %> <%= t 'user_mailer.welcome.explanation' %> <%= t 'user_mailer.welcome.title', name: @resource.account.username %> <%= t 'user_mailer.welcome.explanation' %>
===
<%= t 'user_mailer.welcome.full_handle' %> (<%= "@#{@resource.account.local_username_and_domain}" %>)
<%= t 'user_mailer.welcome.full_handle_hint', instance: @instance %>
--- ---
<%= t 'user_mailer.welcome.edit_profile_step' %> <%= t('user_mailer.welcome.sign_in_action') %>
===
<%= new_user_session_url %>
=> <%= settings_profile_url %> ---
<%= t 'user_mailer.welcome.final_step' %> <%= t('user_mailer.welcome.checklist_title') %>
===
<%= t('user_mailer.welcome.checklist_subtitle') %>
=> <%= web_url %> 1. <%= t('user_mailer.welcome.edit_profile_title') %>
<%= t('user_mailer.welcome.edit_profile_step') %>
* <%= web_url('start/profile') %>
2. <%= t('user_mailer.welcome.follow_title') %>
<%= t('user_mailer.welcome.follow_step') %>
* <%= web_url('start/follows') %>
3. <%= t('user_mailer.welcome.post_title') %>
<%= t('user_mailer.welcome.post_step') %>
* <%= web_url %>
4. <%= t('user_mailer.welcome.share_title') %>
<%= t('user_mailer.welcome.share_step') %>
* <%= web_url('start/share') %>
5. <%= t('user_mailer.welcome.apps_title') %>
<%= t('user_mailer.welcome.apps_step') %>
* iOS: https://apps.apple.com/app/mastodon-for-iphone-and-ipad/id1571998974
* Android: https://play.google.com/store/apps/details?id=org.joinmastodon.android
---
<%= t('user_mailer.welcome.follows_title') %>
===
<%= t('user_mailer.welcome.follows_subtitle') %>
<%- @suggestions.each do |suggestion| %>
* <%= suggestion.account.display_name.presence || suggestion.account.username %> · @<%= suggestion.account.pretty_acct %>
<%= web_url("@#{suggestion.account.acct}") %>
<%- end %>
<%= web_url('explore/suggestions') %>
---
<%= t('user_mailer.welcome.hashtags_title') %>
===
<%= t('user_mailer.welcome.hashtags_subtitle') %>
<%- @tags.each do |tag| %>
* #<%= tag.display_name %> · <%= t('user_mailer.welcome.hashtags_recent_count', people: number_with_delimiter(tag.history.aggregate(2.days.ago.to_date..Time.zone.today).accounts), days: 2) %>
<%= tag_url(tag) %>
<%- end %>
<%= web_url('explore/tags') %>
---
<%= t('user_mailer.welcome.feature_control_title') %>
===
<%= word_wrap t('user_mailer.welcome.feature_control') %>
<%= t('user_mailer.welcome.feature_audience_title') %>
===
<%= word_wrap t('user_mailer.welcome.feature_audience') %>
<%= t('user_mailer.welcome.feature_moderation_title') %>
===
<%= word_wrap t('user_mailer.welcome.feature_moderation') %>
<%= t('user_mailer.welcome.feature_creativity_title') %>
===
<%= word_wrap t('user_mailer.welcome.feature_creativity') %>

20
bin/dev Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env sh
# Default to port 3000 if not specified
export PORT="${PORT:-3000}"
# Get around our boot.rb ENV check
export RAILS_ENV="${RAILS_ENV:-development}"
if command -v overmind &> /dev/null
then
overmind start -f Procfile.dev "$@"
exit $?
fi
if gem list --no-installed --exact --silent foreman; then
echo "Installing foreman..."
gem install foreman
fi
foreman start -f Procfile.dev "$@"

View file

@ -42,6 +42,7 @@ Rails.application.configure do
:hu, :hu,
:hy, :hy,
:id, :id,
:ie,
:ig, :ig,
:io, :io,
:is, :is,

View file

@ -1600,10 +1600,6 @@ an:
edit_profile_action: Configurar lo perfil edit_profile_action: Configurar lo perfil
edit_profile_step: Puetz personalizar lo tuyo perfil puyando una foto de perfil, cambiando lo tuyo nombre d'usuario y muito mas. Puetz optar per revisar a los nuevos seguidores antes que puedan seguir-te. edit_profile_step: Puetz personalizar lo tuyo perfil puyando una foto de perfil, cambiando lo tuyo nombre d'usuario y muito mas. Puetz optar per revisar a los nuevos seguidores antes que puedan seguir-te.
explanation: Aquí i hai qualques consellos pa empecipiar explanation: Aquí i hai qualques consellos pa empecipiar
final_action: Empecipiar a publicar
final_step: 'Empecipia a publicar! Mesmo sin seguidores, las tuyas publicacions publicas pueden estar vistas per atros, per eixemplo en a linia de tiempo local u en etiquetas. Tal vegada quieras presentar-te con a etiqueta de #presentacions.'
full_handle: Lo suyo sobrenombre completo
full_handle_hint: Esto ye lo que le dirías a los tuyos amigos pa que ells puedan ninviar-te mensaches u seguir-te dende unatra instancia.
subject: Bienveniu a Mastodon subject: Bienveniu a Mastodon
title: Te damos la bienvenida a bordo, %{name}! title: Te damos la bienvenida a bordo, %{name}!
users: users:

View file

@ -1969,10 +1969,6 @@ ar:
edit_profile_action: تهيئة الملف التعريفي edit_profile_action: تهيئة الملف التعريفي
edit_profile_step: يمكنك تخصيص ملفك الشخصي عن طريق رفع صورة ملفك الشخصي, تغيير اسم العرض الخاص بك والمزيد. يمكنك اختيار مراجعة المتابعين الجدد قبل السماح لهم بمتابعتك. edit_profile_step: يمكنك تخصيص ملفك الشخصي عن طريق رفع صورة ملفك الشخصي, تغيير اسم العرض الخاص بك والمزيد. يمكنك اختيار مراجعة المتابعين الجدد قبل السماح لهم بمتابعتك.
explanation: ها هي بعض النصائح قبل بداية الاستخدام explanation: ها هي بعض النصائح قبل بداية الاستخدام
final_action: اشرَع في النشر
final_step: 'ابدأ في النشر! حتى بدون متابعين، منشوراتك العامة قد يشاهدها آخرون، على سبيل المثال في التوقيت المحلي أو في الوسوم. قد ترغب في تقديم نفسك على وسم #introductions.'
full_handle: عنوانك الكامل
full_handle_hint: هذا هو ما يجب تقديمه لأصدقائك قصد أن يكون بإمكانهم متابَعتك أو مُراسَلتك حتى و إن كانت حساباتهم على خوادم أخرى.
subject: أهلًا بك على ماستدون subject: أهلًا بك على ماستدون
title: أهلاً بك، %{name}! title: أهلاً بك، %{name}!
users: users:

View file

@ -903,7 +903,6 @@ ast:
edit_profile_action: Configurar el perfil edit_profile_action: Configurar el perfil
edit_profile_step: Pues personalizar el perfil pente la xuba d'una semeya, el cambéu del nome visible ya muncho más. Tamién, si lo prefieres, pues revisar los perfiles nuevos enantes de que puedan siguite. edit_profile_step: Pues personalizar el perfil pente la xuba d'una semeya, el cambéu del nome visible ya muncho más. Tamién, si lo prefieres, pues revisar los perfiles nuevos enantes de que puedan siguite.
explanation: Equí tienes dalgunos conseyos pa que comiences explanation: Equí tienes dalgunos conseyos pa que comiences
final_action: Comenzar a espublizar
subject: Afáyate en Mastodon subject: Afáyate en Mastodon
title: "¡Afáyate, %{name}!" title: "¡Afáyate, %{name}!"
users: users:

View file

@ -1910,10 +1910,6 @@ be:
edit_profile_action: Наладзіць профіль edit_profile_action: Наладзіць профіль
edit_profile_step: Вы можаце наладзіць свой профіль, запампаваўшы выяву профілю, змяніўшы адлюстраванае імя і іншае. Вы можаце праглядаць новых падпісчыкаў, перш чым ім будзе дазволена падпісацца на вас. edit_profile_step: Вы можаце наладзіць свой профіль, запампаваўшы выяву профілю, змяніўшы адлюстраванае імя і іншае. Вы можаце праглядаць новых падпісчыкаў, перш чым ім будзе дазволена падпісацца на вас.
explanation: Вось некаторыя парады каб пачаць explanation: Вось некаторыя парады каб пачаць
final_action: Пачаць пісаць
final_step: 'Пачынайце пісаць! Нават, калі ў вас няма падпісчыкаў, іншыя людзі змогуць пабачыць вашыя допісы, напрыклад, у лакальнай стужцы, або праз хэштэгі. Калі хочаце, вы можаце прадставіцца праз хэштэг #introductions.'
full_handle: Ваш поўны маркер
full_handle_hint: Гэта тое, што вы дасце сваім сябрам, каб яны маглі адпраўляць паведамленні або падпісацца на вас з іншага сервера.
subject: Вітаем у Mastodon subject: Вітаем у Mastodon
title: Рады вітаць вас, %{name}! title: Рады вітаць вас, %{name}!
users: users:

View file

@ -1841,10 +1841,6 @@ bg:
edit_profile_action: Настройване на профила edit_profile_action: Настройване на профила
edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват. edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват.
explanation: Ето няколко стъпки за начало explanation: Ето няколко стъпки за начало
final_action: Начало на публикуване
final_step: 'Публикувайте! Дори без да имате последователи, вашите публични публикации ще бъдат видени от други, например в местната хронология или под хаштагове. Не забравяйте да се представите с хаштаг #introductions.'
full_handle: Пълното ви име
full_handle_hint: Ето какво бихте казали на приятелите си, за да могат да ви изпращат съобщения или да ви последват от друг сървър.
subject: Добре дошли в Mastodon subject: Добре дошли в Mastodon
title: Добре дошли на борда, %{name}! title: Добре дошли на борда, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ ca:
edit_profile_action: Configura el perfil edit_profile_action: Configura el perfil
edit_profile_step: Pots personalitzar el teu perfil pujant-hi un avatar, canviant el teu nom de visualització i molt més. Si ho prefereixes, pots revisar els seguidors nous abans que et puguin seguir. edit_profile_step: Pots personalitzar el teu perfil pujant-hi un avatar, canviant el teu nom de visualització i molt més. Si ho prefereixes, pots revisar els seguidors nous abans que et puguin seguir.
explanation: Aquests són alguns consells per a començar explanation: Aquests són alguns consells per a començar
final_action: Comença a publicar
final_step: 'Comença a publicar! Fins i tot sense seguidors, els altres poden veure els teus missatges públics, per exemple, a la línia de temps local i a les etiquetes. És possible que vulguis presentar-te amb l''etiqueta #introductions.'
full_handle: El teu nom d'usuari sencer
full_handle_hint: Això és el que has de dir als teus amics perquè puguin enviar-te missatges o seguir-te des d'un altre servidor.
subject: Et donem la benvinguda a Mastodon subject: Et donem la benvinguda a Mastodon
title: Benvingut a bord, %{name}! title: Benvingut a bord, %{name}!
users: users:

View file

@ -1035,9 +1035,6 @@ ckb:
welcome: welcome:
edit_profile_action: پرۆفایلی جێگیرکردن edit_profile_action: پرۆفایلی جێگیرکردن
explanation: ئەمە چەند ئامۆژگارییەکن بۆ دەست پێکردنت explanation: ئەمە چەند ئامۆژگارییەکن بۆ دەست پێکردنت
final_action: دەست بکە بە بڵاوکردنەوە
full_handle: ناوی بەکارهێنەری تەواوی ئێوە
full_handle_hint: ئەمە ئەو شتەیە کە بە هاوڕێکانت دەلێی بۆ ئەوەی پەیام یان لە ڕاژەیەکی دیکەی ترەوە بەدوات بکەون.
subject: بەخێربیت بۆ ماستۆدۆن subject: بەخێربیت بۆ ماستۆدۆن
title: بەخێربێیت، بەکارهێنەر %{name}! title: بەخێربێیت، بەکارهێنەر %{name}!
users: users:

View file

@ -1050,9 +1050,6 @@ co:
welcome: welcome:
edit_profile_action: Cunfigurazione di u prufile edit_profile_action: Cunfigurazione di u prufile
explanation: Eccu alcune idee per principià explanation: Eccu alcune idee per principià
final_action: Principià à pustà
full_handle: U vostru identificatore cumplettu
full_handle_hint: Quessu ghjè cio chì direte à i vostri amichi per circavi, abbunassi à u vostru contu da altrò, o mandà missaghji.
subject: Benvenutu·a nantà Mastodon subject: Benvenutu·a nantà Mastodon
title: Benvenutu·a, %{name}! title: Benvenutu·a, %{name}!
users: users:

View file

@ -1910,10 +1910,6 @@ cs:
edit_profile_action: Nastavit profil edit_profile_action: Nastavit profil
edit_profile_step: Váš profil si můžete přizpůsobit nahráním profilového obrázku, změnou zobrazovaného jména a dalším. Můžete se přihlásit k přezkoumání nových následovatelů, než vás budou moci následovat. edit_profile_step: Váš profil si můžete přizpůsobit nahráním profilového obrázku, změnou zobrazovaného jména a dalším. Můžete se přihlásit k přezkoumání nových následovatelů, než vás budou moci následovat.
explanation: Zde je pár tipů do začátku explanation: Zde je pár tipů do začátku
final_action: Začít psát
final_step: 'Začněte psát příspěvky! I bez sledujících mohou vaše veřejné příspěvky vidět ostatní, například na místní časové ose nebo v hashtagu. Možná se budete chtít představit na hashtagu #představení.'
full_handle: Vaše celá adresa profilu
full_handle_hint: Tohle je, co byste řekli svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru.
subject: Vítejte na Mastodonu subject: Vítejte na Mastodonu
title: Vítejte na palubě, %{name}! title: Vítejte na palubě, %{name}!
users: users:

View file

@ -823,6 +823,7 @@ cy:
disabled: I neb disabled: I neb
users: I ddefnyddwyr lleol wedi'u mewngofnodi users: I ddefnyddwyr lleol wedi'u mewngofnodi
registrations: registrations:
moderation_recommandation: Gwnewch yn siŵr bod gennych chi dîm cymedroli digonol ac adweithiol cyn i chi agor cofrestriadau i bawb!
preamble: Rheoli pwy all greu cyfrif ar eich gweinydd. preamble: Rheoli pwy all greu cyfrif ar eich gweinydd.
title: Cofrestriadau title: Cofrestriadau
registrations_mode: registrations_mode:
@ -830,6 +831,7 @@ cy:
approved: Mae angen cymeradwyaeth i gofrestru approved: Mae angen cymeradwyaeth i gofrestru
none: Nid oes neb yn gallu cofrestru none: Nid oes neb yn gallu cofrestru
open: Gall unrhyw un cofrestru open: Gall unrhyw un cofrestru
warning_hint: Rydym yn argymell defnyddio “Mae angen cymeradwyaeth ar gyfer cofrestru” oni bai eich bod yn hyderus y gall eich tîm cymedroli ymdrin â chofrestriadau sbam a rhai maleisus mewn modd amserol.
security: security:
authorized_fetch: Mae angen dilysu gan weinyddion ffederal authorized_fetch: Mae angen dilysu gan weinyddion ffederal
authorized_fetch_hint: Mae gofyn am ddilysiad gan weinyddion ffederal yn galluogi gorfodi llymach ar flociau lefel defnyddiwr a lefel gweinydd. Fodd bynnag, daw hyn ar gost perfformiad arafach, mae'n lleihau cyrhaeddiad eich atebion, a gall gyflwyno materion cydnawsedd gyda rhai gwasanaethau ffederal. Yn ogystal, ni fydd hyn yn atal actorion ymroddedig rhag estyn eich postiadau a'ch cyfrifon cyhoeddus. authorized_fetch_hint: Mae gofyn am ddilysiad gan weinyddion ffederal yn galluogi gorfodi llymach ar flociau lefel defnyddiwr a lefel gweinydd. Fodd bynnag, daw hyn ar gost perfformiad arafach, mae'n lleihau cyrhaeddiad eich atebion, a gall gyflwyno materion cydnawsedd gyda rhai gwasanaethau ffederal. Yn ogystal, ni fydd hyn yn atal actorion ymroddedig rhag estyn eich postiadau a'ch cyfrifon cyhoeddus.
@ -1038,6 +1040,9 @@ cy:
title: Bachau Gwe title: Bachau Gwe
webhook: Bachyn Gwe webhook: Bachyn Gwe
admin_mailer: admin_mailer:
auto_close_registrations:
body: Oherwydd diffyg gweithgarwch cymedrolwr diweddar, mae cofrestriadau ar %{instance} wedi'u newid yn awtomatig i'r angen i gael adolygiad â llaw, er mwyn atal %{instance} rhag cael ei ddefnyddio fel llwyfan ar gyfer actorion drwg posibl. Gallwch ei newid yn ôl i agor cofrestriadau ar unrhyw adeg.
subject: Mae cofrestriadau ar gyfer %{instance} wedi'u newid yn awtomatig i'r angen i gael cymeradwyaeth
new_appeal: new_appeal:
actions: actions:
delete_statuses: i ddileu eu postiadau delete_statuses: i ddileu eu postiadau
@ -1969,10 +1974,6 @@ cy:
edit_profile_action: Sefydlu proffil edit_profile_action: Sefydlu proffil
edit_profile_step: Gallwch addasu'ch proffil trwy lwytho llun proffil, newid eich enw dangos a mwy. Gallwch ddewis i adolygu dilynwyr newydd cyn iddyn nhw gael caniatâd i'ch dilyn. edit_profile_step: Gallwch addasu'ch proffil trwy lwytho llun proffil, newid eich enw dangos a mwy. Gallwch ddewis i adolygu dilynwyr newydd cyn iddyn nhw gael caniatâd i'ch dilyn.
explanation: Dyma ambell nodyn i'ch helpu i ddechrau explanation: Dyma ambell nodyn i'ch helpu i ddechrau
final_action: Dechrau postio
final_step: 'Dechreuwch bostio! Hyd yn oed heb ddilynwyr, efallai y bydd eraill yn gweld eich postiadau cyhoeddus, er enghraifft ar y ffrwd leol neu mewn hashnodau. Efallai y byddwch am gyflwyno eich hun ar yr hashnod #cyflwyniadau neu/a #introductions.'
full_handle: Eich enw llawn
full_handle_hint: Dyma beth fyddech chi'n ei ddweud wrth eich ffrindiau fel y gallant anfon neges neu eich dilyn o weinydd arall.
subject: Croeso i Mastodon subject: Croeso i Mastodon
title: Croeso, %{name}! title: Croeso, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ da:
edit_profile_action: Opsæt profil edit_profile_action: Opsæt profil
edit_profile_step: Man kan tilpasse sin profil ved at uploade profilfoto, overskrift, ændre visningsnavn mv. Ønskes nye følgere vurderet, før de må følge dig, kan kontoen låses. edit_profile_step: Man kan tilpasse sin profil ved at uploade profilfoto, overskrift, ændre visningsnavn mv. Ønskes nye følgere vurderet, før de må følge dig, kan kontoen låses.
explanation: Her er nogle råd for at få dig i gang explanation: Her er nogle råd for at få dig i gang
final_action: Begynd at poste
final_step: 'Begynd at poste! Selv uden følgere vil offentlige indlæg kunne ses af andre f.eks. på den lokale tidslinje og i hashtags. Man kan introducere sig selv via hastagget #introductions.'
full_handle: Dit fulde brugernavn
full_handle_hint: Dette er, hvad du oplyser til dine venner, så de kan sende dig beskeder eller følge dig fra andre servere.
subject: Velkommen til Mastodon subject: Velkommen til Mastodon
title: Velkommen ombord, %{name}! title: Velkommen ombord, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ de:
edit_profile_action: Profil einrichten edit_profile_action: Profil einrichten
edit_profile_step: Du kannst dein Profil anpassen, indem du ein Profilbild hochlädst, deinen Anzeigenamen änderst und vieles mehr. Du kannst dich dafür entscheiden, neue Follower zu überprüfen, bevor sie dir folgen dürfen. edit_profile_step: Du kannst dein Profil anpassen, indem du ein Profilbild hochlädst, deinen Anzeigenamen änderst und vieles mehr. Du kannst dich dafür entscheiden, neue Follower zu überprüfen, bevor sie dir folgen dürfen.
explanation: Hier sind ein paar Tipps, um loszulegen explanation: Hier sind ein paar Tipps, um loszulegen
final_action: Mit erstem Beitrag starten
final_step: 'Fang jetzt an zu posten! Selbst ohne Follower werden deine öffentlichen Beiträge von anderen gesehen, zum Beispiel in der lokalen Timeline oder über die Hashtags. Möglicherweise möchtest du dich allen mit dem Hashtag #neuhier vorstellen.'
full_handle: Dein vollständiger Profilname
full_handle_hint: Deinen vollständigen Profilnamen kannst du deinen Freund*innen mitteilen, damit sie dich anschreiben oder dir von einem anderen Server folgen können.
subject: Willkommen bei Mastodon! subject: Willkommen bei Mastodon!
title: Willkommen an Bord, %{name}! title: Willkommen an Bord, %{name}!
users: users:

View file

@ -1707,10 +1707,6 @@ el:
edit_profile_action: Στήσιμο προφίλ edit_profile_action: Στήσιμο προφίλ
edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα προφίλ, αλλάζοντας το εμφνιζόμενο όνομα και άλλα. Μπορείς να επιλέξεις να αξιολογείς νέους ακόλουθους πριν τους επιτραπεί να σε ακολουθήσουν. edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα προφίλ, αλλάζοντας το εμφνιζόμενο όνομα και άλλα. Μπορείς να επιλέξεις να αξιολογείς νέους ακόλουθους πριν τους επιτραπεί να σε ακολουθήσουν.
explanation: Μερικές συμβουλές για να ξεκινήσεις explanation: Μερικές συμβουλές για να ξεκινήσεις
final_action: Ξεκίνα να αναρτάς
final_step: 'Ξεκίνα να δημοσιεύεις! Ακόμα και χωρίς ακόλουθους τις δημόσιες δημοσιεύσεις σου μπορεί να τις δουν άλλοι, για παράδειγμα στην τοπική ροή ή στις ετικέτες. Ίσως να θέλεις να μας γνωρίσεις τον εαυτό σου με την ετικέτα #introductions.'
full_handle: Το πλήρες όνομά σου
full_handle_hint: Αυτό θα εδώ θα πεις στους φίλους σου για να σου μιλήσουν ή να σε ακολουθήσουν από άλλο διακομιστή.
subject: Καλώς ήρθες στο Mastodon subject: Καλώς ήρθες στο Mastodon
title: Καλώς όρισες, %{name}! title: Καλώς όρισες, %{name}!
users: users:

View file

@ -1841,10 +1841,6 @@ en-GB:
edit_profile_action: Setup profile edit_profile_action: Setup profile
edit_profile_step: You can customise your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before theyre allowed to follow you. edit_profile_step: You can customise your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before theyre allowed to follow you.
explanation: Here are some tips to get you started explanation: Here are some tips to get you started
final_action: Start posting
final_step: 'Start posting! Even without followers, your public posts may be seen by others, for example on the local timeline or in hashtags. You may want to introduce yourself on the #introductions hashtag.'
full_handle: Your full handle
full_handle_hint: This is what you would tell your friends so they can message or follow you from another server.
subject: Welcome to Mastodon subject: Welcome to Mastodon
title: Welcome aboard, %{name}! title: Welcome aboard, %{name}!
users: users:

View file

@ -2217,13 +2217,42 @@ en:
silence: Account limited silence: Account limited
suspend: Account suspended suspend: Account suspended
welcome: welcome:
edit_profile_action: Setup profile apps_android_action: Get it on Google Play
edit_profile_step: You can customize your profile by uploading a profile picture, changing your display name and more. You can opt-in to review new followers before theyre allowed to follow you. apps_ios_action: Download on the App Store
apps_step: Download our official apps.
apps_title: Mastodon apps
checklist_subtitle: 'Let''s get you started on this new social frontier:'
checklist_title: Welcome Checklist
edit_profile_action: Personalize
edit_profile_step: Boost your interactions by having a comprehensive profile.
edit_profile_title: Personalize your profile
explanation: Here are some tips to get you started explanation: Here are some tips to get you started
final_action: Start posting feature_action: Learn more
final_step: 'Start posting! Even without followers, your public posts may be seen by others, for example on the local timeline or in hashtags. You may want to introduce yourself on the #introductions hashtag.' feature_audience: Mastodon provides you with a unique possibility of managing your audience without middlemen. Mastodon deployed on your own infrastructure allows you to follow and be followed from any other Mastodon server online and is under no one's control but yours.
full_handle: Your full handle feature_audience_title: Build your audience in confidence
full_handle_hint: This is what you would tell your friends so they can message or follow you from another server. feature_control: You know best what you want to see on your home feed. No algorithms or ads to waste your time. Follow anyone across any Mastodon server from a single account and receive their posts in chronological order, and make your corner of the internet a little more like you.
feature_control_title: Stay in control of your own timeline
feature_creativity: Mastodon supports audio, video and picture posts, accessibility descriptions, polls, content warnings, animated avatars, custom emojis, thumbnail crop control, and more, to help you express yourself online. Whether you're publishing your art, your music, or your podcast, Mastodon is there for you.
feature_creativity_title: Unparalleled creativity
feature_moderation: Mastodon puts decision making back in your hands. Each server creates their own rules and regulations, which are enforced locally and not top-down like corporate social media, making it the most flexible in responding to the needs of different groups of people. Join a server with the rules you agree with, or host your own.
feature_moderation_title: Moderating the way it should be
follow_action: Follow
follow_step: Following interesting people is what Mastodon is all about.
follow_title: Personalize your home feed
follows_subtitle: Follow well-known accounts
follows_title: Who to follow
follows_view_more: View more people to follow
hashtags_recent_count: "%{people} people in the past %{days} days"
hashtags_subtitle: Explore whats trending since past 2 days
hashtags_title: Trending hashtags
hashtags_view_more: View more trending hashtags
post_action: Compose
post_step: Say hello to the world with text, photos, videos, or polls.
post_title: Make your first post
share_action: Share
share_step: Let your friends know how to find you on Mastodon.
share_title: Share your Mastodon profile
sign_in_action: Sign in
subject: Welcome to Mastodon subject: Welcome to Mastodon
title: Welcome aboard, %{name}! title: Welcome aboard, %{name}!
users: users:

View file

@ -1763,10 +1763,6 @@ eo:
edit_profile_action: Agordi profilon edit_profile_action: Agordi profilon
edit_profile_step: Vi povas personecigi vian profilon per alŝuti profilbildon, ŝangi vian montronomo kaj pli. edit_profile_step: Vi povas personecigi vian profilon per alŝuti profilbildon, ŝangi vian montronomo kaj pli.
explanation: Jen kelkaj konsiloj por helpi vin komenci explanation: Jen kelkaj konsiloj por helpi vin komenci
final_action: Ekmesaĝi
final_step: 'Ekmesaĝu! Eĉ sen sekvantoj, viaj publikaj mesaĝoj povas esti vidataj de aliaj, ekzemple en la loka templinio aŭ per kradvortoj. Eble vi ŝatus prezenti vin per la kradvorto #introductions / #konigo.'
full_handle: Via kompleta uzantnomo
full_handle_hint: Jen kion vi dirus al viaj amikoj, por ke ili mesaĝu aŭ sekvu vin de alia servilo.
subject: Bonvenon en Mastodon subject: Bonvenon en Mastodon
title: Bonvenon, %{name}! title: Bonvenon, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ es-AR:
edit_profile_action: Configurar perfil edit_profile_action: Configurar perfil
edit_profile_step: Podés personalizar tu perfil subiendo un avatar (imagen de perfil), cambiando tu nombre a mostrar y más. Podés optar por revisar a los nuevos seguidores antes de que puedan seguirte. edit_profile_step: Podés personalizar tu perfil subiendo un avatar (imagen de perfil), cambiando tu nombre a mostrar y más. Podés optar por revisar a los nuevos seguidores antes de que puedan seguirte.
explanation: Aquí hay algunos consejos para empezar explanation: Aquí hay algunos consejos para empezar
final_action: Empezá a enviar mensajes
final_step: "¡Empezá a enviar mensajes! Incluso sin seguidores, tus mensajes públicos pueden ser vistos por otros, por ejemplo en la linea temporal local o al usar etiquetas. Capaz que quieras presentarte al mundo con la etiqueta «#presentación»."
full_handle: Tu nombre de usuario completo
full_handle_hint: Esto es lo que le dirás a tus contactos para que ellos puedan enviarte mensajes o seguirte desde otro servidor.
subject: Bienvenido a Mastodon subject: Bienvenido a Mastodon
title: "¡Bienvenido a bordo, %{name}!" title: "¡Bienvenido a bordo, %{name}!"
users: users:

View file

@ -1846,10 +1846,6 @@ es-MX:
edit_profile_action: Configurar el perfil edit_profile_action: Configurar el perfil
edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte.
explanation: Aquí hay algunos consejos para empezar explanation: Aquí hay algunos consejos para empezar
final_action: Empezar a publicar
final_step: "¡Empieza a publicar! Incluso sin seguidores, tus publicaciones públicas pueden ser vistas por otros, por ejemplo en la línea de tiempo local o en etiquetas. Tal vez quieras presentarte con la etiqueta de #introducciones."
full_handle: Su sobrenombre completo
full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia.
subject: Bienvenido a Mastodon subject: Bienvenido a Mastodon
title: Te damos la bienvenida a bordo, %{name}! title: Te damos la bienvenida a bordo, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ es:
edit_profile_action: Configurar el perfil edit_profile_action: Configurar el perfil
edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte. edit_profile_step: Puedes personalizar tu perfil subiendo una foto de perfil, cambiando tu nombre de usuario y mucho más. Puedes optar por revisar a los nuevos seguidores antes de que puedan seguirte.
explanation: Aquí hay algunos consejos para empezar explanation: Aquí hay algunos consejos para empezar
final_action: Empezar a publicar
final_step: "¡Empieza a publicar! Incluso sin seguidores, tus publicaciones públicas pueden ser vistas por otros, por ejemplo en la línea de tiempo local o en etiquetas. Tal vez quieras presentarte con la etiqueta de #presentación."
full_handle: Su sobrenombre completo
full_handle_hint: Esto es lo que le dirías a tus amigos para que ellos puedan enviarte mensajes o seguirte desde otra instancia.
subject: Bienvenido a Mastodon subject: Bienvenido a Mastodon
title: Te damos la bienvenida a bordo, %{name}! title: Te damos la bienvenida a bordo, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ et:
Kui mõni asi arusaamatuks jääb, siis võib vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q Kui mõni asi arusaamatuks jääb, siis võib vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q
explanation: Siin on mõned nõuanded, mis aitavad alustada explanation: Siin on mõned nõuanded, mis aitavad alustada
final_action: Alusta postitamist
final_step: 'Nüüd tee oma esimene postitus. Hea tava on uues kohas ennast tutvustada ning kindlasti kasuta selles postituses ka silti #tutvustus. Isegi kui sul ei ole veel jälgijaid, siis su postitusi näevad kohalikul ajajoonel ka kõik teised serveri kasutajad.'
full_handle: Kasutajanimi Mastodon võrgustikus
full_handle_hint: Kui jagad kasutajanime väljaspool serverit, siis kasuta kindlasti pikka nime. Erinevates serverites võib olla sama kasutajanimega liikmeid.
subject: Tere tulemast Mastodoni subject: Tere tulemast Mastodoni
title: Tere tulemast, %{name}! title: Tere tulemast, %{name}!
users: users:

View file

@ -1847,10 +1847,6 @@ eu:
edit_profile_action: Ezarri profila edit_profile_action: Ezarri profila
edit_profile_step: Pertsonalizatu profila abatar bat igoz, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik berrikusi nahi badituzu, kontuari giltzarrapoa jarri diezaiokezu. edit_profile_step: Pertsonalizatu profila abatar bat igoz, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik berrikusi nahi badituzu, kontuari giltzarrapoa jarri diezaiokezu.
explanation: Hona hasteko aholku batzuk explanation: Hona hasteko aholku batzuk
final_action: Hasi bidalketak argitaratzen
final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure bidalketa publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.'
full_handle: Helbide osoa
full_handle_hint: Hau da lagunei esango zeniekeena beste zerbitzari batetik zu jarraitzeko edo zuri mezuak bidaltzeko.
subject: Ongi etorri Mastodon-era subject: Ongi etorri Mastodon-era
title: Ongi etorri, %{name}! title: Ongi etorri, %{name}!
users: users:

View file

@ -1579,10 +1579,6 @@ fa:
edit_profile_action: تنظیم نمایه edit_profile_action: تنظیم نمایه
edit_profile_step: می‌توانید نمایه‌تان را با بارگذاری تصویر نمایه، تغییر نام نمایشی و بیش از این‌‌ها سفارشی کنید. می‌توانید تعیین کنید که پی‌گیران جدید را پیش‌از این که بتوانند دنبالتان کنند بازبینی کنید. edit_profile_step: می‌توانید نمایه‌تان را با بارگذاری تصویر نمایه، تغییر نام نمایشی و بیش از این‌‌ها سفارشی کنید. می‌توانید تعیین کنید که پی‌گیران جدید را پیش‌از این که بتوانند دنبالتان کنند بازبینی کنید.
explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند explanation: نکته‌هایی که برای آغاز کار به شما کمک می‌کنند
final_action: چیزی منتشر کنید
final_step: 'چیزی بنویسید! حتا بدون پی‌گیر ممکن است فرسته‌های عمومیتان دیده شود. برای مثال روی خط زمانی محلی یا در برچسب‌ها. شاید بخواهید با برچسب #معرفی خودتان را معرّفی کنید.'
full_handle: نام کاربری کامل شما
full_handle_hint: این چیزی است که باید به دوستانتان بگویید تا بتوانند از کارسازی دیگر به شما پیام داده یا پی‌گیرتان شوند.
subject: به ماستودون خوش آمدید subject: به ماستودون خوش آمدید
title: خوش آمدید، کاربر %{name}! title: خوش آمدید، کاربر %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ fi:
edit_profile_action: Määritä profiili edit_profile_action: Määritä profiili
edit_profile_step: Voit mukauttaa profiiliasi muun muassa profiilikuvalla ja uudella näyttönimellä. Voit myös valita, haluatko tarkastaa ja hyväksyä uudet seuraajat itse. edit_profile_step: Voit mukauttaa profiiliasi muun muassa profiilikuvalla ja uudella näyttönimellä. Voit myös valita, haluatko tarkastaa ja hyväksyä uudet seuraajat itse.
explanation: Näillä vinkeillä pääset alkuun explanation: Näillä vinkeillä pääset alkuun
final_action: Ala julkaista
final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, voivat muut nähdä julkisia julkaisujasi esimerkiksi paikallisella aikajanalla tai aihetunnisteissa. Kannattaa myös esitellä itsensä aihetunnisteella #esittely.'
full_handle: Koko käyttäjätunnuksesi
full_handle_hint: Kerro tämä kavereillesi, niin he voivat lähettää sinulle viestejä tai seurata sinua toiselta palvelimelta.
subject: Tervetuloa Mastodoniin subject: Tervetuloa Mastodoniin
title: Tervetuloa mukaan, %{name}! title: Tervetuloa mukaan, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ fo:
edit_profile_action: Set upp vanga edit_profile_action: Set upp vanga
edit_profile_step: Tú kanst tillaga vanga tín við at leggja eina vangamynd inn, broyta vísta navnið hjá tær og meira. Tú kanst velja at eftirkanna nýggjar fylgjarar, áðrenn teir sleppa at fylgja tær. edit_profile_step: Tú kanst tillaga vanga tín við at leggja eina vangamynd inn, broyta vísta navnið hjá tær og meira. Tú kanst velja at eftirkanna nýggjar fylgjarar, áðrenn teir sleppa at fylgja tær.
explanation: Her eru nøkur ráð so tú kann koma gott ígongd explanation: Her eru nøkur ráð so tú kann koma gott ígongd
final_action: Byrja at posta
final_step: 'Byrja at posta! Sjálvt uttan fylgjarar, so kunnu tínir almennu postar vera sæddir av øðrum, til dømis á lokalu tíðarlinjuni ella í frámerkjum. Kanska vilt tú greiða frá um teg sjálva/n við frámerkinum #introductions.'
full_handle: Fulla brúkaranavn títt
full_handle_hint: Hetta er tað, sum tú fortelur vinum tínum, soleiðis at tey kunnu senda tær boð ella fylgja tær frá einum øðrum ambætara.
subject: Vælkomin til Mastodon subject: Vælkomin til Mastodon
title: Vælkomin umborð, %{name}! title: Vælkomin umborð, %{name}!
users: users:

View file

@ -1841,10 +1841,6 @@ fr-CA:
edit_profile_action: Configuration du profil edit_profile_action: Configuration du profil
edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte.
explanation: Voici quelques conseils pour vous aider à démarrer explanation: Voici quelques conseils pour vous aider à démarrer
final_action: Commencez à publier
final_step: 'Commencez à publier ! Même si vous n''avez pas encore d''abonnés, vos publications sont publiques et sont accessibles par les autres, par exemple grâce à la zone horaire locale ou par les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.'
full_handle: Votre identifiant complet
full_handle_hint: Cest ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir dun autre serveur.
subject: Bienvenue sur Mastodon subject: Bienvenue sur Mastodon
title: Bienvenue à bord, %{name}! title: Bienvenue à bord, %{name}!
users: users:

View file

@ -1841,10 +1841,6 @@ fr:
edit_profile_action: Configuration du profil edit_profile_action: Configuration du profil
edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte. edit_profile_step: Vous pouvez personnaliser votre profil en téléchargeant une photo de profil, en changant votre nom d'utilisateur, etc. Vous pouvez opter pour le passage en revue de chaque nouvelle demande d'abonnement à chaque fois qu'un utilisateur essaie de s'abonner à votre compte.
explanation: Voici quelques conseils pour vous aider à démarrer explanation: Voici quelques conseils pour vous aider à démarrer
final_action: Commencez à publier
final_step: 'Commencez à publier ! Même si vous n''avez pas encore d''abonnés, vos publications sont publiques et sont accessibles par les autres, par exemple grâce à la zone horaire locale ou par les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.'
full_handle: Votre identifiant complet
full_handle_hint: Cest ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir dun autre serveur.
subject: Bienvenue sur Mastodon subject: Bienvenue sur Mastodon
title: Bienvenue à bord, %{name}! title: Bienvenue à bord, %{name}!
users: users:

View file

@ -1841,10 +1841,6 @@ fy:
edit_profile_action: Profyl ynstelle edit_profile_action: Profyl ynstelle
edit_profile_step: Jo kinne jo profyl oanpasse troch in profylfoto op te laden, jo werjeftenamme oan te passen en mear. Jo kinne it hânmjittich goedkarren fan folgers ynstelle. edit_profile_step: Jo kinne jo profyl oanpasse troch in profylfoto op te laden, jo werjeftenamme oan te passen en mear. Jo kinne it hânmjittich goedkarren fan folgers ynstelle.
explanation: Hjir binne inkelde tips om jo op wei te helpen explanation: Hjir binne inkelde tips om jo op wei te helpen
final_action: Begjin mei berjochten te pleatsen
final_step: 'Begjin berjochten te pleatsen! Sels sûnder folgers kinne jo iepenbiere berjochten troch oaren besjoen wurde, bygelyks op de lokale tiidline en ûnder hashtags. Jo kinne josels foarstelle mei it gebrûk fan de hashtag #introductions.'
full_handle: Jo folsleine Mastodon-adres
full_handle_hint: Dit jouwe jo oan jo freonen, sadat se jo berjochten stjoere kinne of (fan in oare Mastodon-server ôf) folgje kinne.
subject: Wolkom op Mastodon subject: Wolkom op Mastodon
title: Wolkom oan board %{name}! title: Wolkom oan board %{name}!
users: users:

View file

@ -1880,10 +1880,6 @@ gd:
edit_profile_action: Suidhich a phròifil agad edit_profile_action: Suidhich a phròifil agad
edit_profile_step: "S urrainn dhut a phròifil agad a ghnàthachadh is tu a luchdadh suas dealbh pròifil, ag atharrachadh d ainm-taisbeanaidh is a bharrachd. S urrainn dhut lèirmheas a dhèanamh air daoine mus fhaod iad gad leantainn ma thogras tu." edit_profile_step: "S urrainn dhut a phròifil agad a ghnàthachadh is tu a luchdadh suas dealbh pròifil, ag atharrachadh d ainm-taisbeanaidh is a bharrachd. S urrainn dhut lèirmheas a dhèanamh air daoine mus fhaod iad gad leantainn ma thogras tu."
explanation: Seo gliocas no dhà gus tòiseachadh explanation: Seo gliocas no dhà gus tòiseachadh
final_action: Tòisich air postadh
final_step: 'Tòisich air postadh! Fiù s mur eil duine sam bith gad leantainn, chì cuid mhath na postaichean poblach agad, can air an loidhne-ama ionadail no le tagaichean hais. Saoil an innis thu beagan mu d dhèidhinn air an taga hais #fàilte?'
full_handle: D ainm-cleachdaiche slàn
full_handle_hint: Seo na bheir thu dha na caraidean agad ach an urrainn dhaibh teachdaireachd a chur thugad no gad leantainn o fhrithealaiche eile.
subject: Fàilte gu Mastodon subject: Fàilte gu Mastodon
title: Fàilte air bòrd, %{name}! title: Fàilte air bòrd, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ gl:
edit_profile_action: Configurar perfil edit_profile_action: Configurar perfil
edit_profile_step: Podes personalizar o teu perfil subindo unha imaxe de perfil, cambiar o nome público e moito máis. Podes elexir revisar as solicitudes de seguimento recibidas antes de permitirlles que te sigan. edit_profile_step: Podes personalizar o teu perfil subindo unha imaxe de perfil, cambiar o nome público e moito máis. Podes elexir revisar as solicitudes de seguimento recibidas antes de permitirlles que te sigan.
explanation: Aquí tes algunhas endereitas para ir aprendendo explanation: Aquí tes algunhas endereitas para ir aprendendo
final_action: Comeza a publicar
final_step: 'Publica! Incluso sen seguidoras, as túas mensaxes públicas serán vistas por outras persoas, por exemplo na cronoloxía local e nos cancelos. Poderías presentarte ao #fediverso utilizando o cancelo #introductions.'
full_handle: O teu alcume completo
full_handle_hint: Compárteo coas túas amizades para que poidan seguirte ou enviarche mensaxes desde outros servidores.
subject: Benvida a Mastodon subject: Benvida a Mastodon
title: Benvida, %{name}! title: Benvida, %{name}!
users: users:

View file

@ -1910,10 +1910,6 @@ he:
edit_profile_action: הגדרת פרופיל edit_profile_action: הגדרת פרופיל
edit_profile_step: תוכל.י להתאים אישית את הפרופיל באמצעות העלאת יצגן (אוואטר), כותרת, שינוי כינוי ועוד. אם תרצה.י לסקור את עוקביך/ייך החדשים לפני שתרשה.י להם לעקוב אחריך/ייך. edit_profile_step: תוכל.י להתאים אישית את הפרופיל באמצעות העלאת יצגן (אוואטר), כותרת, שינוי כינוי ועוד. אם תרצה.י לסקור את עוקביך/ייך החדשים לפני שתרשה.י להם לעקוב אחריך/ייך.
explanation: הנה כמה טיפים לעזור לך להתחיל explanation: הנה כמה טיפים לעזור לך להתחיל
final_action: התחל/ילי לחצרץ
final_step: 'התחל/ילי לחצצר! אפילו ללא עוקבים ייתכן שהחצרוצים הפומביים שלך יראו ע"י אחרים, למשל בציר הזמן המקומי או בתגיות הקבצה (האשתגים). כדאי להציג את עצמך תחת התגית #introductions או #היכרות'
full_handle: שם המשתמש המלא שלך
full_handle_hint: זה מה שתאמר.י לחברייך כדי שיוכלו לשלוח לך הודעה או לעקוב אחרייך ממופע אחר.
subject: ברוכים הבאים למסטודון subject: ברוכים הבאים למסטודון
title: ברוך/ה הבא/ה, %{name} ! title: ברוך/ה הבא/ה, %{name} !
users: users:

View file

@ -1846,10 +1846,6 @@ hu:
edit_profile_action: Készítsd el profilod edit_profile_action: Készítsd el profilod
edit_profile_step: Testreszabhatod a profilod egy profilkép feltöltésével, a megjelenített neved megváltoztatásával és így tovább. Bekapcsolhatod az új követőid jóváhagyását, mielőtt követhetnek. edit_profile_step: Testreszabhatod a profilod egy profilkép feltöltésével, a megjelenített neved megváltoztatásával és így tovább. Bekapcsolhatod az új követőid jóváhagyását, mielőtt követhetnek.
explanation: Néhány tipp a kezdeti lépésekhez explanation: Néhány tipp a kezdeti lépésekhez
final_action: Kezdj bejegyzéseket írni
final_step: 'Kezdj tülkölni! A nyilvános bejegyzéseid még követők híján is megjelennek másoknak, például a helyi idővonalon vagy a hashtageknél. Kezdd azzal, hogy bemutatkozol a #bemutatkozas vagy az #introductions hashtag használatával.'
full_handle: Teljes felhasználóneved
full_handle_hint: Ez az, amit megadhatsz másoknak, hogy üzenhessenek neked vagy követhessenek téged más szerverekről.
subject: Üdvözöl a Mastodon subject: Üdvözöl a Mastodon
title: Üdv a fedélzeten, %{name}! title: Üdv a fedélzeten, %{name}!
users: users:

View file

@ -875,7 +875,6 @@ hy:
suspend: Հաշիւը արգելափակուած է suspend: Հաշիւը արգելափակուած է
welcome: welcome:
edit_profile_action: Կարգաւորել հաշիւը edit_profile_action: Կարգաւորել հաշիւը
final_action: Սկսել գրել
subject: Բարի գալուստ Մաստոդոն subject: Բարի գալուստ Մաստոդոն
title: Բարի գալուստ նաւամատոյց, %{name} title: Բարի գալուստ նաւամատոյց, %{name}
users: users:

View file

@ -256,7 +256,6 @@ ia:
disable: Disactivar 2FA disable: Disactivar 2FA
user_mailer: user_mailer:
welcome: welcome:
final_step: 'Comencia a publicar! Mesmo sin sequitores, tu messages public poterea esser reguardate per alteres, per exemplo in le chronologia local o in hashtags. Tu poterea voler introducer te con le hashtag #introductiones.'
subject: Benvenite in Mastodon subject: Benvenite in Mastodon
webauthn_credentials: webauthn_credentials:
delete: Deler delete: Deler

View file

@ -1560,10 +1560,6 @@ id:
edit_profile_action: Siapkan profil edit_profile_action: Siapkan profil
edit_profile_step: Anda dapat mengubah profil Anda dengan mengunggah sebuah foto profil, mengubah nama tampilan Anda dan lain-lain. Anda dapat memilih untuk meninjau pengikut baru sebelum mereka diperbolehkan untuk mengikuti Anda. edit_profile_step: Anda dapat mengubah profil Anda dengan mengunggah sebuah foto profil, mengubah nama tampilan Anda dan lain-lain. Anda dapat memilih untuk meninjau pengikut baru sebelum mereka diperbolehkan untuk mengikuti Anda.
explanation: Beberapa tips sebelum Anda memulai explanation: Beberapa tips sebelum Anda memulai
final_action: Mulai mengirim
final_step: 'Mulai mengirim! Bahkan tanpa pengikut, kiriman publik Anda dapat dilihat oleh orang lain, misalkan di linimasa lokal atau dalam tagar. Anda dapat memperkenalkan diri Anda dalam tagar #introductions.'
full_handle: Penanganan penuh Anda
full_handle_hint: Ini yang dapat Anda sampaikan kepada teman agar mereka dapat mengirim pesan atau mengikuti Anda dari server lain.
subject: Selamat datang di Mastodon subject: Selamat datang di Mastodon
title: Selamat datang, %{name}! title: Selamat datang, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ ie:
edit_profile_action: Configuration de profil edit_profile_action: Configuration de profil
edit_profile_step: Tu posse personalisar tui profil por cargar un profil-image, changear tui monstrat nómine e plu. Tu posse optar tractar nov sequitores ante que ili es permisset sequer te. edit_profile_step: Tu posse personalisar tui profil por cargar un profil-image, changear tui monstrat nómine e plu. Tu posse optar tractar nov sequitores ante que ili es permisset sequer te.
explanation: Vi quelc suggestiones por que tu mey comensar explanation: Vi quelc suggestiones por que tu mey comensar
final_action: Comensar postar
final_step: 'Comensa a postar! Mem sin sequitores, tui public postas posse esser videt de altres, per exemple in li local témpor-linea o in hashtags. Tu fórsan vole introducter te per li hashtag #introductions.'
full_handle: Tui plen usator-nómine
full_handle_hint: Ti-ci es ti quel tu vell dir a tui amics por que ili mey inviar missages a te o sequer te de un altri servitor.
subject: Benevenit a Mastodon subject: Benevenit a Mastodon
title: Benevenit, %{name}! title: Benevenit, %{name}!
users: users:

View file

@ -1799,10 +1799,6 @@ io:
edit_profile_action: Facez profilo edit_profile_action: Facez profilo
edit_profile_step: Vu povas kustumizar vua profilo per adchargar profilimajo, chanjesar vua montronomo e plue. Vu povas selektas kontrolar nova sequanti ante oli permisesas sequar vu. edit_profile_step: Vu povas kustumizar vua profilo per adchargar profilimajo, chanjesar vua montronomo e plue. Vu povas selektas kontrolar nova sequanti ante oli permisesas sequar vu.
explanation: Subo esas guidilo por helpar vu komencar explanation: Subo esas guidilo por helpar vu komencar
final_action: Komencez postigar
final_step: 'Jus postigez! Mem sen sequanti, vua publika posti povas videsar da altra personi, exemplo es en lokala tempolineo e en hashtagi. Vu povas anke introduktar su en #introductions hashtagi.'
full_handle: Vua kompleta profilnomo
full_handle_hint: Co esas quon vu dicos a amiki por ke oli povas mesajigar o sequar vu de altra servilo.
subject: Bonveno a Mastodon subject: Bonveno a Mastodon
title: Bonveno, %{name}! title: Bonveno, %{name}!
users: users:

View file

@ -769,6 +769,7 @@ is:
disabled: Til engra disabled: Til engra
users: Til innskráðra staðværra notenda users: Til innskráðra staðværra notenda
registrations: registrations:
moderation_recommandation: Tryggðu að þú hafir hæft og aðgengilegt umsjónarteymi til taks áður en þú opnar á skráningar fyrir alla!
preamble: Stýrðu því hverjir geta útbúið notandaaðgang á netþjóninum þínum. preamble: Stýrðu því hverjir geta útbúið notandaaðgang á netþjóninum þínum.
title: Nýskráningar title: Nýskráningar
registrations_mode: registrations_mode:
@ -776,6 +777,7 @@ is:
approved: Krafist er samþykkt nýskráningar approved: Krafist er samþykkt nýskráningar
none: Enginn getur nýskráð sig none: Enginn getur nýskráð sig
open: Allir geta nýskráð sig open: Allir geta nýskráð sig
warning_hint: Við mælum með því að nota "Krafist er samþykkt nýskráningar" nema ef þú sért viss um að umsjónarteymið þitt geti brugðist tímanlega við ruslpósti og skráningum í misjöfnum tilgangi.
security: security:
authorized_fetch: Krefjast auðkenningar frá netþjónum í skýjasambandi authorized_fetch: Krefjast auðkenningar frá netþjónum í skýjasambandi
authorized_fetch_hint: Að krefjast auðkenningar frá netþjónum í skýjasambandi kallar fram strangari útfærslu á útilokunum, bæði varðandi notendur og netþjóna. Hins vegar kemur þetta niður á afköstum, minnkar útbreiðslu á svörum þínum og gæti valdið samhæfnivandamálum við sumar sambandsþjónustur. Að auki kemur þetta ekki í veg fyrir að aðilar sem ætla sér að ná í opinberar færslur og notendaaðganga frá þér geri það. authorized_fetch_hint: Að krefjast auðkenningar frá netþjónum í skýjasambandi kallar fram strangari útfærslu á útilokunum, bæði varðandi notendur og netþjóna. Hins vegar kemur þetta niður á afköstum, minnkar útbreiðslu á svörum þínum og gæti valdið samhæfnivandamálum við sumar sambandsþjónustur. Að auki kemur þetta ekki í veg fyrir að aðilar sem ætla sér að ná í opinberar færslur og notendaaðganga frá þér geri það.
@ -968,6 +970,9 @@ is:
title: Webhook-vefkrækjur title: Webhook-vefkrækjur
webhook: Webhook-vefkrækja webhook: Webhook-vefkrækja
admin_mailer: admin_mailer:
auto_close_registrations:
body: Vegna skorts á virkni umsjónaraðila að undanförnu, hafa nýskráningar á %{instance} sjálfkrafa verið stilltar á að þarfnast samþykktar umsjónaraðila, til að koma í veg fyrir að %{instance} verði mögulega misnotað af óprúttnum aðilum. Þú getur skipt hvenær sem er aftur yfir í opnar nýskráningar.
subject: Nýskráningar á %{instance} hafa sjálfkrafa verið stilltar á að krefjast samþykktar
new_appeal: new_appeal:
actions: actions:
delete_statuses: að eyða færslum viðkomandi delete_statuses: að eyða færslum viðkomandi
@ -1845,10 +1850,6 @@ is:
edit_profile_action: Setja upp notandasnið edit_profile_action: Setja upp notandasnið
edit_profile_step: Þú getur sérsniðið notandasniðið þitt með því að setja inn auðkennismynd þína, breyta birtingarnafninu þínu og ýmislegt fleira. Þú getur valið að yfirfara nýja fylgjendur áður en þú leyfir þeim að fylgjast með þér. edit_profile_step: Þú getur sérsniðið notandasniðið þitt með því að setja inn auðkennismynd þína, breyta birtingarnafninu þínu og ýmislegt fleira. Þú getur valið að yfirfara nýja fylgjendur áður en þú leyfir þeim að fylgjast með þér.
explanation: Hér eru nokkrar ábendingar til að koma þér í gang explanation: Hér eru nokkrar ábendingar til að koma þér í gang
final_action: Byrjaðu að skrifa
final_step: 'Byrjaðu að tjá þig! Jafnvel án fylgjenda geta aðrir séð opinberar færslur frá þér, til dæmis á staðværu tímalínunni eða í myllumerkjum. Þú gætir jafnvel viljað kynna þig á myllumerkinu #introductions.'
full_handle: Fullt auðkenni þitt
full_handle_hint: Þetta er það sem þú myndir gefa upp við vini þína svo þeir geti sent þér skilaboð eða fylgst með þér af öðrum netþjóni.
subject: Velkomin í Mastodon subject: Velkomin í Mastodon
title: Velkomin/n um borð, %{name}! title: Velkomin/n um borð, %{name}!
users: users:

View file

@ -1848,10 +1848,6 @@ it:
edit_profile_action: Configura profilo edit_profile_action: Configura profilo
edit_profile_step: Puoi personalizzare il tuo profilo caricando un'immagine del profilo, cambiare il tuo nome e altro ancora. Puoi scegliere di esaminare i nuovi seguaci prima che loro siano autorizzati a seguirti. edit_profile_step: Puoi personalizzare il tuo profilo caricando un'immagine del profilo, cambiare il tuo nome e altro ancora. Puoi scegliere di esaminare i nuovi seguaci prima che loro siano autorizzati a seguirti.
explanation: Ecco alcuni suggerimenti per iniziare explanation: Ecco alcuni suggerimenti per iniziare
final_action: Inizia a pubblicare
final_step: 'Inizia a pubblicare! Anche senza seguaci, i tuoi post pubblici possono essere visti da altri, ad esempio sulla timeline locale o negli hashtag. Potresti presentarti con l''hashtag #presentazione.'
full_handle: Il tuo nome utente completo
full_handle_hint: Questo è ciò che diresti ai tuoi amici in modo che possano seguirti o contattarti da un altro server.
subject: Benvenuto/a su Mastodon subject: Benvenuto/a su Mastodon
title: Benvenuto a bordo, %{name}! title: Benvenuto a bordo, %{name}!
users: users:

View file

@ -2206,10 +2206,6 @@ ja:
edit_profile_action: プロフィールを設定 edit_profile_action: プロフィールを設定
edit_profile_step: "プロフィール画像をアップロードしたり、表示名を変更したりして、プロフィールをカスタマイズできます。\n新しいフォロワーからフォローリクエストを承認する前に、オプトインで確認できます。" edit_profile_step: "プロフィール画像をアップロードしたり、表示名を変更したりして、プロフィールをカスタマイズできます。\n新しいフォロワーからフォローリクエストを承認する前に、オプトインで確認できます。"
explanation: 始めるにあたってのアドバイスです explanation: 始めるにあたってのアドバイスです
final_action: 始めましょう
final_step: 'さあ、始めましょう! たとえフォロワーがまだいなくても、あなたの公開した投稿はローカルタイムラインやハッシュタグなどを通じて誰かの目にとまるはずです。自己紹介をしたいときには #introductions ハッシュタグが便利かもしれません。'
full_handle: あなたの正式なユーザーID
full_handle_hint: 別のサーバーの友達とフォローやメッセージをやり取りする際には、これを伝えることになります。
subject: Mastodonへようこそ subject: Mastodonへようこそ
title: ようこそ、%{name}さん! title: ようこそ、%{name}さん!
users: users:

View file

@ -472,9 +472,6 @@ ka:
welcome: welcome:
edit_profile_action: პროფილის მოწყობა edit_profile_action: პროფილის მოწყობა
explanation: აქ რამდენიმე რჩევაა დასაწყისისთვის explanation: აქ რამდენიმე რჩევაა დასაწყისისთვის
final_action: დაიწყე პოსტვა
full_handle: თქვენი სრული სახელური
full_handle_hint: ეს არის ის რასაც ეტყვით თქვენს მეგობრებს, რათა მოგწერონ ან გამოგყვნენ სხვა ინსტანციიდან.
subject: კეთილი იყოს თქვენი მობრძანება მასტოდონში subject: კეთილი იყოს თქვენი მობრძანება მასტოდონში
title: კეთილი იყოს თქვენი მობრძანება, %{name}! title: კეთილი იყოს თქვენი მობრძანება, %{name}!
users: users:

View file

@ -794,8 +794,6 @@ kab:
silence: Amiḍan yesɛa talast silence: Amiḍan yesɛa talast
suspend: Amiḍan yettwaḥbas suspend: Amiḍan yettwaḥbas
welcome: welcome:
final_action: Bdu asuffeɣ
full_handle: Tansa umiḍan-ik takemmalit
subject: Ansuf ɣer Maṣṭudun subject: Ansuf ɣer Maṣṭudun
title: Ansuf yessek·em, %{name}! title: Ansuf yessek·em, %{name}!
users: users:

View file

@ -721,9 +721,6 @@ kk:
welcome: welcome:
edit_profile_action: Профиль өңдеу edit_profile_action: Профиль өңдеу
explanation: Мына кеңестерді шолып өтіңіз explanation: Мына кеңестерді шолып өтіңіз
final_action: Жазба жазу
full_handle: Желі тұтқасы
full_handle_hint: This is what you would tell your friends so they can message or follow you frоm another server.
subject: Mastodon Желісіне қош келдіңіз subject: Mastodon Желісіне қош келдіңіз
title: Ортаға қош келдің, %{name}! title: Ортаға қош келдің, %{name}!
users: users:

View file

@ -1816,10 +1816,6 @@ ko:
edit_profile_action: 프로필 설정 edit_profile_action: 프로필 설정
edit_profile_step: 프로필 사진을 업로드하거나 사람들에게 표시할 이름을 바꾸는 것 등으로 자신의 프로필을 커스텀 할 수 있습니다. 새로운 팔로워를 검토 후에 허용하도록 할 수도 있습니다. edit_profile_step: 프로필 사진을 업로드하거나 사람들에게 표시할 이름을 바꾸는 것 등으로 자신의 프로필을 커스텀 할 수 있습니다. 새로운 팔로워를 검토 후에 허용하도록 할 수도 있습니다.
explanation: 시작하기 전에 몇가지 팁들을 준비했습니다 explanation: 시작하기 전에 몇가지 팁들을 준비했습니다
final_action: 포스팅 시작하기
final_step: '게시물을 올리세요! 팔로워가 없더라도, 공개 게시물들은 다른 사람에게 보여질 수 있습니다, 예를 들자면 로컬이나 연합 타임라인 등이 있습니다. 사람들에게 자신을 소개하고 싶다면 #툿친소 해시태그를 이용해보세요.'
full_handle: 당신의 풀 핸들은 다음과 같습니다
full_handle_hint: 이것을 당신의 친구들에게 알려주면 다른 서버에서 팔로우 하거나 메시지를 보낼 수 있습니다.
subject: 마스토돈에 오신 것을 환영합니다 subject: 마스토돈에 오신 것을 환영합니다
title: 환영합니다 %{name} 님! title: 환영합니다 %{name} 님!
users: users:

View file

@ -1594,10 +1594,6 @@ ku:
edit_profile_action: Profîlê saz bike edit_profile_action: Profîlê saz bike
edit_profile_step: Tu dikarî bi barkirina wêneyek profîlê, guhertina navê xwe ya xuyangê û bêtir profîla xwe kesane bikî. Berî ku mafê bidî ku te şopînerên nû te bişopînin, tu dikarî binirxînî. edit_profile_step: Tu dikarî bi barkirina wêneyek profîlê, guhertina navê xwe ya xuyangê û bêtir profîla xwe kesane bikî. Berî ku mafê bidî ku te şopînerên nû te bişopînin, tu dikarî binirxînî.
explanation: Li vir çend serişte hene ku tu dest pê bike explanation: Li vir çend serişte hene ku tu dest pê bike
final_action: Dest bi weşandinê bike
final_step: 'Dest bi weşandinê bike! Bêyî şopîneran jî dibe ku şandiyên te yên gelemperî ji hêla kesên din ve werin dîtin, mînakî li ser demjimêra herêmî û di hashtagan de. Dibe ku tu bixwazî xwe li ser hashtagê #nasname bidî nasandin.'
full_handle: Hemî destikê te
full_handle_hint: Ji hevalên xwe re, ji bona ji rajekarekê din peyam bişîne an jî ji bona ku te bikaribe bişopîne tişta ku tu bibêjî ev e.
subject: Tu bi xêr hatî Mastodon subject: Tu bi xêr hatî Mastodon
title: Bi xêr hatî, %{name}! title: Bi xêr hatî, %{name}!
users: users:

View file

@ -1846,10 +1846,6 @@ lad:
edit_profile_action: Konfigurasyon de profil edit_profile_action: Konfigurasyon de profil
edit_profile_step: Puedes personalizar tu profil kargando una foto de profil, trokando tu nombre de utilizador i muncho mas. Puedes optar por revizar a los muevos suivantes antes de ke puedan segirte. edit_profile_step: Puedes personalizar tu profil kargando una foto de profil, trokando tu nombre de utilizador i muncho mas. Puedes optar por revizar a los muevos suivantes antes de ke puedan segirte.
explanation: Aki ay algunos konsejos para ampesar explanation: Aki ay algunos konsejos para ampesar
final_action: Ampesa a publikar
final_step: 'Ampesa a publikar! Inkluzo sin suivantes, tus publikasyones publikas pueden ser vistas por otros, por enshemplo en la linya de tiempo lokal o en etiketas. Tal vez keras aprezentarte kon la etiketa de #introduksiones.'
full_handle: Tu sovrenombre kompleto
full_handle_hint: Esto es lo ke le dirias a tus haverim para ke eyos puedan embiarte mesajes o segirte dizde otra instansya.
subject: Bienvenido a Mastodon subject: Bienvenido a Mastodon
title: Bienvenido, %{name}! title: Bienvenido, %{name}!
users: users:

View file

@ -319,7 +319,7 @@ lt:
guide_link_text: Visi gali prisidėti. guide_link_text: Visi gali prisidėti.
application_mailer: application_mailer:
notification_preferences: Keisti el pašto parinktis notification_preferences: Keisti el pašto parinktis
settings: 'Keisti el pašto parinktis: %{link}' settings: 'Keisti el. pašto nuostatas: %{link}'
view: 'Peržiūra:' view: 'Peržiūra:'
view_profile: Peržiurėti profilį view_profile: Peržiurėti profilį
view_status: Peržiūrėti statusą view_status: Peržiūrėti statusą
@ -608,10 +608,6 @@ lt:
welcome: welcome:
edit_profile_action: Nustatyti profilį edit_profile_action: Nustatyti profilį
explanation: Štai keletas patarimų, kaip pradėti explanation: Štai keletas patarimų, kaip pradėti
final_action: Pradėti kelti įrašus
final_step: 'Pradėk skelbti! Net jei ir neturi sekėjų, tavo viešus įrašus gali matyti kiti, pavyzdžiui, vietinėje laiko skalėje arba saitažodžiuose. Galbūt norėsi prisistatyti saitažodyje #introductions.'
full_handle: Tavo pilnas slapyvardis
full_handle_hint: Štai ką pasakytum savo draugams, kad jie galėtų parašyti arba sekti tave iš kito serverio.
subject: Sveiki atvykę į Mastodon subject: Sveiki atvykę į Mastodon
title: Sveiki atvykę, %{name}! title: Sveiki atvykę, %{name}!
users: users:

Some files were not shown because too many files have changed in this diff Show more