Merge remote-tracking branch 'soapbox/develop' into modals-stack

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
marcin mikołajczak 2022-02-02 14:30:38 +01:00
commit e0f0370579
56 changed files with 2641 additions and 336 deletions

View File

@ -0,0 +1,43 @@
{
"uri": "animalliberation.social",
"title": "Animal Liberation Network",
"short_description": "",
"description": "Animal Liberation Network is a community for <b>animal activists</b> on the Fediverse. You can connect with other activists through the <b>local timeline</b>, as well as spread your activism to the outside world with the <b>federated timeline</b>.",
"email": "alex@alexgleason.me",
"version": "3.0.0",
"urls": {
"streaming_api": "wss://animalliberation.social"
},
"stats": {
"user_count": 662,
"status_count": 2904,
"domain_count": 4003
},
"thumbnail": "https://animalliberation.social/packs/media/images/preview-9a17d32fc48369e8ccd910a75260e67d.jpg",
"languages": [
"en"
],
"registrations": true,
"approval_required": false,
"contact_account": {
"id": "1",
"username": "alex",
"acct": "alex",
"display_name": "Alex Gleason",
"locked": false,
"bot": false,
"created_at": "2016-11-30T22:19:42.956Z",
"note": "<p>Animal liberation free software Communist</p>",
"url": "https://animalliberation.social/@alex",
"avatar": "https://media.animalliberation.social/accounts/avatars/000/000/001/original/media.jpg",
"avatar_static": "https://media.animalliberation.social/accounts/avatars/000/000/001/original/media.jpg",
"header": "https://media.animalliberation.social/accounts/headers/000/000/001/original/09887023017e02c9.jpg",
"header_static": "https://media.animalliberation.social/accounts/headers/000/000/001/original/09887023017e02c9.jpg",
"followers_count": 236,
"following_count": 83,
"statuses_count": 357,
"last_status_at": "2021-02-20T19:28:24.353Z",
"emojis": [],
"fields": []
}
}

View File

@ -0,0 +1,128 @@
{
"uri": "mastodon.social",
"title": "Mastodon",
"short_description": "Server run by the main developers of the project <img draggable=\"false\" alt=\"🐘\" class=\"emojione\" src=\"https://mastodon.social/emoji/1f418.svg\" /> It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!",
"description": "Server run by the main developers of the project <img draggable=\"false\" alt=\"🐘\" class=\"emojione\" src=\"https://mastodon.social/emoji/1f418.svg\" /> It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!",
"email": "staff@mastodon.social",
"version": "3.4.3",
"urls": {
"streaming_api": "wss://mastodon.social"
},
"stats": {
"user_count": 619022,
"status_count": 33914684,
"domain_count": 21524
},
"thumbnail": "https://files.mastodon.social/site_uploads/files/000/000/001/original/vlcsnap-2018-08-27-16h43m11s127.png",
"languages": [
"en"
],
"registrations": true,
"approval_required": false,
"invites_enabled": true,
"configuration": {
"statuses": {
"max_characters": 500,
"max_media_attachments": 4,
"characters_reserved_per_url": 23
},
"media_attachments": {
"supported_mime_types": [
"image/jpeg",
"image/png",
"image/gif",
"video/webm",
"video/mp4",
"video/quicktime",
"video/ogg",
"audio/wave",
"audio/wav",
"audio/x-wav",
"audio/x-pn-wave",
"audio/ogg",
"audio/vorbis",
"audio/mpeg",
"audio/mp3",
"audio/webm",
"audio/flac",
"audio/aac",
"audio/m4a",
"audio/x-m4a",
"audio/mp4",
"audio/3gpp",
"video/x-ms-asf"
],
"image_size_limit": 10485760,
"image_matrix_limit": 16777216,
"video_size_limit": 41943040,
"video_frame_rate_limit": 60,
"video_matrix_limit": 2304000
},
"polls": {
"max_options": 4,
"max_characters_per_option": 50,
"min_expiration": 300,
"max_expiration": 2629746
}
},
"contact_account": {
"id": "1",
"username": "Gargron",
"acct": "Gargron",
"display_name": "Eugen 🎄",
"locked": false,
"bot": false,
"discoverable": true,
"group": false,
"created_at": "2016-03-16T00:00:00.000Z",
"note": "<p>Founder, CEO and lead developer <span class=\"h-card\"><a href=\"https://mastodon.social/@Mastodon\" class=\"u-url mention\">@<span>Mastodon</span></a></span>, Germany.</p>",
"url": "https://mastodon.social/@Gargron",
"avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png",
"avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png",
"header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg",
"header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg",
"followers_count": 98343,
"following_count": 271,
"statuses_count": 71288,
"last_status_at": "2022-01-31",
"emojis": [],
"fields": [
{
"name": "Patreon",
"value": "<a href=\"https://www.patreon.com/mastodon\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"\">patreon.com/mastodon</span><span class=\"invisible\"></span></a>",
"verified_at": null
},
{
"name": "Homepage",
"value": "<a href=\"https://zeonfederated.com\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">zeonfederated.com</span><span class=\"invisible\"></span></a>",
"verified_at": "2019-07-15T18:29:57.191+00:00"
}
]
},
"rules": [
{
"id": "1",
"text": "Sexually explicit or violent media must be marked as sensitive when posting"
},
{
"id": "2",
"text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism"
},
{
"id": "3",
"text": "No incitement of violence or promotion of violent ideologies"
},
{
"id": "4",
"text": "No harassment, dogpiling or doxxing of other users"
},
{
"id": "5",
"text": "No content illegal in Germany"
},
{
"id": "6",
"text": "No spam, advertising or bot accounts"
}
]
}

View File

@ -0,0 +1,131 @@
{
"approval_required": true,
"avatar_upload_limit": 2000000,
"background_image": "https://gleasonator.com/images/city.jpg",
"background_upload_limit": 4000000,
"banner_upload_limit": 4000000,
"description": "Building the next generation of the Fediverse. Speak freely.",
"description_limit": 5000,
"email": "alex@alexgleason.me",
"languages": [
"en"
],
"max_toot_chars": 5000,
"pleroma": {
"metadata": {
"account_activation_required": false,
"birthday_min_age": 0,
"birthday_required": false,
"features": [
"pleroma_api",
"mastodon_api",
"mastodon_api_streaming",
"polls",
"v2_suggestions",
"pleroma_explicit_addressing",
"shareable_emoji_packs",
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
"quote_posting",
"media_proxy",
"relay",
"pleroma_emoji_reactions",
"pleroma_chat_messages",
"email_list",
"profile_directory"
],
"federation": {
"enabled": true,
"exclusions": false,
"mrf_hashtag": {
"federated_timeline_removal": [],
"reject": [],
"sensitive": [
"nsfw"
]
},
"mrf_policies": [
"TagPolicy",
"SimplePolicy",
"InlineQuotePolicy",
"HashtagPolicy"
],
"mrf_simple": {
"accept": [],
"avatar_removal": [
"pawoo.net",
"sinblr.com",
"dajiaweibo.com",
"baraag.net"
],
"banner_removal": [
"pawoo.net",
"sinblr.com",
"dajiaweibo.com",
"baraag.net"
],
"federated_timeline_removal": [],
"followers_only": [],
"media_nsfw": [],
"media_removal": [
"pawoo.net",
"sinblr.com",
"dajiaweibo.com",
"baraag.net"
],
"reject": [
"solagg.com"
],
"reject_deletes": [],
"report_removal": []
},
"mrf_simple_info": {},
"quarantined_instances": [],
"quarantined_instances_info": {
"quarantined_instances": {}
}
},
"fields_limits": {
"max_fields": 15,
"max_remote_fields": 20,
"name_length": 512,
"value_length": 2048
},
"post_formats": [
"text/plain",
"text/html",
"text/markdown",
"text/bbcode"
],
"privileged_staff": true
},
"stats": {
"mau": 71
},
"vapid_public_key": "BLElLQVJVmY_e4F5JoYxI5jXiVOYNsJ9p-amkykc9NcI-jwa9T1Y2GIbDqbY-HqC6ayPkfW4K4o9vgBFKYmkuS4"
},
"poll_limits": {
"max_expiration": 31536000,
"max_option_chars": 200,
"max_options": 20,
"min_expiration": 0
},
"registrations": true,
"shout_limit": 5000,
"soapbox": {
"version": "1.1.1"
},
"stats": {
"domain_count": 8140,
"status_count": 101956,
"user_count": 421
},
"thumbnail": "https://media.gleasonator.com/c0d38bde6ef0b3baa483f574797662ebd83ef9e1a1162e8e4fcd930bb4b3c068.png",
"title": "Gleasonator",
"upload_limit": 100000000,
"uri": "https://gleasonator.com",
"urls": {
"streaming_api": "wss://gleasonator.com"
},
"version": "2.7.2 (compatible; Pleroma 2.4.51-1129-gf2cfef09-gleasonator)"
}

View File

@ -109,6 +109,10 @@ export const NOTIFICATION_SETTINGS_REQUEST = 'NOTIFICATION_SETTINGS_REQUEST';
export const NOTIFICATION_SETTINGS_SUCCESS = 'NOTIFICATION_SETTINGS_SUCCESS'; export const NOTIFICATION_SETTINGS_SUCCESS = 'NOTIFICATION_SETTINGS_SUCCESS';
export const NOTIFICATION_SETTINGS_FAIL = 'NOTIFICATION_SETTINGS_FAIL'; export const NOTIFICATION_SETTINGS_FAIL = 'NOTIFICATION_SETTINGS_FAIL';
export const BIRTHDAY_REMINDERS_FETCH_REQUEST = 'BIRTHDAY_REMINDERS_FETCH_REQUEST';
export const BIRTHDAY_REMINDERS_FETCH_SUCCESS = 'BIRTHDAY_REMINDERS_FETCH_SUCCESS';
export const BIRTHDAY_REMINDERS_FETCH_FAIL = 'BIRTHDAY_REMINDERS_FETCH_FAIL';
export function createAccount(params) { export function createAccount(params) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch({ type: ACCOUNT_CREATE_REQUEST, params }); dispatch({ type: ACCOUNT_CREATE_REQUEST, params });
@ -156,14 +160,7 @@ export function fetchAccountByUsername(username) {
const features = getFeatures(instance); const features = getFeatures(instance);
const me = state.get('me'); const me = state.get('me');
if (!me && features.accountLookup) { if (features.accountByUsername && (me || !features.accountLookup)) {
dispatch(accountLookup(username)).then(account => {
dispatch(fetchAccountSuccess(account));
}).catch(error => {
dispatch(fetchAccountFail(null, error));
dispatch(importErrorWhileFetchingAccountByUsername(username));
});
} else if (features.accountByUsername) {
api(getState).get(`/api/v1/accounts/${username}`).then(response => { api(getState).get(`/api/v1/accounts/${username}`).then(response => {
dispatch(fetchRelationships([response.data.id])); dispatch(fetchRelationships([response.data.id]));
dispatch(importFetchedAccount(response.data)); dispatch(importFetchedAccount(response.data));
@ -172,6 +169,13 @@ export function fetchAccountByUsername(username) {
dispatch(fetchAccountFail(null, error)); dispatch(fetchAccountFail(null, error));
dispatch(importErrorWhileFetchingAccountByUsername(username)); dispatch(importErrorWhileFetchingAccountByUsername(username));
}); });
} else if (features.accountLookup) {
dispatch(accountLookup(username)).then(account => {
dispatch(fetchAccountSuccess(account));
}).catch(error => {
dispatch(fetchAccountFail(null, error));
dispatch(importErrorWhileFetchingAccountByUsername(username));
});
} else { } else {
dispatch(accountSearch({ dispatch(accountSearch({
q: username, q: username,
@ -217,7 +221,7 @@ export function fetchAccountFail(id, error) {
}; };
} }
export function followAccount(id, reblogs = true) { export function followAccount(id, options = { reblogs: true }) {
return (dispatch, getState) => { return (dispatch, getState) => {
if (!isLoggedIn(getState)) return; if (!isLoggedIn(getState)) return;
@ -226,7 +230,7 @@ export function followAccount(id, reblogs = true) {
dispatch(followAccountRequest(id, locked)); dispatch(followAccountRequest(id, locked));
api(getState).post(`/api/v1/accounts/${id}/follow`, { reblogs }).then(response => { api(getState).post(`/api/v1/accounts/${id}/follow`, options).then(response => {
dispatch(followAccountSuccess(response.data, alreadyFollowing)); dispatch(followAccountSuccess(response.data, alreadyFollowing));
}).catch(error => { }).catch(error => {
dispatch(followAccountFail(error, locked)); dispatch(followAccountFail(error, locked));
@ -1030,3 +1034,26 @@ export function accountLookup(acct, cancelToken) {
}); });
}; };
} }
export function fetchBirthdayReminders(day, month) {
return (dispatch, getState) => {
if (!isLoggedIn(getState)) return;
const me = getState().get('me');
dispatch({ type: BIRTHDAY_REMINDERS_FETCH_REQUEST, day, month, id: me });
api(getState).get('/api/v1/pleroma/birthdays', { params: { day, month } }).then(response => {
dispatch(importFetchedAccounts(response.data));
dispatch({
type: BIRTHDAY_REMINDERS_FETCH_SUCCESS,
accounts: response.data,
day,
month,
id: me,
});
}).catch(error => {
dispatch({ type: BIRTHDAY_REMINDERS_FETCH_FAIL, day, month, id: me });
});
};
}

View File

@ -81,6 +81,7 @@ const messages = defineMessages({
uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' }, uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' },
scheduleError: { id: 'compose.invalid_schedule', defaultMessage: 'You must schedule a post at least 5 minutes out.' }, scheduleError: { id: 'compose.invalid_schedule', defaultMessage: 'You must schedule a post at least 5 minutes out.' },
success: { id: 'compose.submit_success', defaultMessage: 'Your post was sent' }, success: { id: 'compose.submit_success', defaultMessage: 'Your post was sent' },
view: { id: 'snackbar.view', defaultMessage: 'View' },
}); });
const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1); const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1);
@ -190,7 +191,7 @@ export function handleComposeSubmit(dispatch, getState, data, status) {
dispatch(insertIntoTagHistory(data.tags || [], status)); dispatch(insertIntoTagHistory(data.tags || [], status));
dispatch(submitComposeSuccess({ ...data })); dispatch(submitComposeSuccess({ ...data }));
dispatch(snackbar.success(messages.success)); dispatch(snackbar.success(messages.success, messages.view, `/@${data.account.acct}/posts/${data.id}`));
} }
const needsDescriptions = state => { const needsDescriptions = state => {
@ -296,8 +297,7 @@ export function submitComposeFail(error) {
export function uploadCompose(files) { export function uploadCompose(files) {
return function(dispatch, getState) { return function(dispatch, getState) {
if (!isLoggedIn(getState)) return; if (!isLoggedIn(getState)) return;
const instance = getState().get('instance'); const attachmentLimit = getState().getIn(['instance', 'configuration', 'statuses', 'max_media_attachments']);
const { attachmentLimit } = getFeatures(instance);
const media = getState().getIn(['compose', 'media_attachments']); const media = getState().getIn(['compose', 'media_attachments']);
const progress = new Array(files.length).fill(0); const progress = new Array(files.length).fill(0);

View File

@ -58,6 +58,7 @@ export const REMOTE_INTERACTION_FAIL = 'REMOTE_INTERACTION_FAIL';
const messages = defineMessages({ const messages = defineMessages({
bookmarkAdded: { id: 'status.bookmarked', defaultMessage: 'Bookmark added.' }, bookmarkAdded: { id: 'status.bookmarked', defaultMessage: 'Bookmark added.' },
bookmarkRemoved: { id: 'status.unbookmarked', defaultMessage: 'Bookmark removed.' }, bookmarkRemoved: { id: 'status.unbookmarked', defaultMessage: 'Bookmark removed.' },
view: { id: 'snackbar.view', defaultMessage: 'View' },
}); });
export function reblog(status) { export function reblog(status) {
@ -220,28 +221,28 @@ export function unfavouriteFail(status, error) {
}; };
} }
export function bookmark(intl, status) { export function bookmark(status) {
return function(dispatch, getState) { return function(dispatch, getState) {
dispatch(bookmarkRequest(status)); dispatch(bookmarkRequest(status));
api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function(response) { api(getState).post(`/api/v1/statuses/${status.get('id')}/bookmark`).then(function(response) {
dispatch(importFetchedStatus(response.data)); dispatch(importFetchedStatus(response.data));
dispatch(bookmarkSuccess(status, response.data)); dispatch(bookmarkSuccess(status, response.data));
dispatch(snackbar.success(intl.formatMessage(messages.bookmarkAdded))); dispatch(snackbar.success(messages.bookmarkAdded, messages.view, '/bookmarks'));
}).catch(function(error) { }).catch(function(error) {
dispatch(bookmarkFail(status, error)); dispatch(bookmarkFail(status, error));
}); });
}; };
} }
export function unbookmark(intl, status) { export function unbookmark(status) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch(unbookmarkRequest(status)); dispatch(unbookmarkRequest(status));
api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => { api(getState).post(`/api/v1/statuses/${status.get('id')}/unbookmark`).then(response => {
dispatch(importFetchedStatus(response.data)); dispatch(importFetchedStatus(response.data));
dispatch(unbookmarkSuccess(status, response.data)); dispatch(unbookmarkSuccess(status, response.data));
dispatch(snackbar.success(intl.formatMessage(messages.bookmarkRemoved))); dispatch(snackbar.success(messages.bookmarkRemoved));
}).catch(error => { }).catch(error => {
dispatch(unbookmarkFail(status, error)); dispatch(unbookmarkFail(status, error));
}); });

View File

@ -100,6 +100,10 @@ export const defaultSettings = ImmutableMap({
move: false, move: false,
'pleroma:emoji_reaction': false, 'pleroma:emoji_reaction': false,
}), }),
birthdays: ImmutableMap({
show: true,
}),
}), }),
community: ImmutableMap({ community: ImmutableMap({

View File

@ -1,21 +1,23 @@
import { ALERT_SHOW } from './alerts'; import { ALERT_SHOW } from './alerts';
export const show = (severity, message) => ({ export const show = (severity, message, actionLabel, actionLink) => ({
type: ALERT_SHOW, type: ALERT_SHOW,
message, message,
actionLabel,
actionLink,
severity, severity,
}); });
export function info(message) { export function info(message, actionLabel, actionLink) {
return show('info', message); return show('info', message, actionLabel, actionLink);
} }
export function success(message) { export function success(message, actionLabel, actionLink) {
return show('success', message); return show('success', message, actionLabel, actionLink);
} }
export function error(message) { export function error(message, actionLabel, actionLink) {
return show('error', message); return show('error', message, actionLabel, actionLink);
} }
export default { export default {

View File

@ -0,0 +1,130 @@
import PropTypes from 'prop-types';
import React from 'react';
import DatePicker from 'react-datepicker';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux';
import 'react-datepicker/dist/react-datepicker.css';
import IconButton from 'soapbox/components/icon_button';
import { getFeatures } from 'soapbox/utils/features';
const messages = defineMessages({
birthdayPlaceholder: { id: 'edit_profile.fields.birthday_placeholder', defaultMessage: 'Your birthday' },
previousMonth: { id: 'datepicker.previous_month', defaultMessage: 'Previous month' },
nextMonth: { id: 'datepicker.next_month', defaultMessage: 'Next month' },
previousYear: { id: 'datepicker.previous_year', defaultMessage: 'Previous year' },
nextYear: { id: 'datepicker.next_year', defaultMessage: 'Next year' },
});
const mapStateToProps = state => {
const features = getFeatures(state.get('instance'));
return {
supportsBirthdays: features.birthdays,
minAge: state.getIn(['instance', 'pleroma', 'metadata', 'birthday_min_age']),
};
};
export default @connect(mapStateToProps)
@injectIntl
class EditProfile extends ImmutablePureComponent {
static propTypes = {
hint: PropTypes.node,
required: PropTypes.bool,
supportsBirthdays: PropTypes.bool,
minAge: PropTypes.number,
onChange: PropTypes.func.isRequired,
value: PropTypes.instanceOf(Date),
};
renderHeader = ({
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
decreaseYear,
increaseYear,
prevYearButtonDisabled,
nextYearButtonDisabled,
date,
}) => {
const { intl } = this.props;
return (
<div className='datepicker__header'>
<div className='datepicker__months'>
<IconButton
className='datepicker__button'
src={require('@tabler/icons/icons/chevron-left.svg')}
onClick={decreaseMonth}
disabled={prevMonthButtonDisabled}
aria-label={intl.formatMessage(messages.previousMonth)}
title={intl.formatMessage(messages.previousMonth)}
/>
{intl.formatDate(date, { month: 'long' })}
<IconButton
className='datepicker__button'
src={require('@tabler/icons/icons/chevron-right.svg')}
onClick={increaseMonth}
disabled={nextMonthButtonDisabled}
aria-label={intl.formatMessage(messages.nextMonth)}
title={intl.formatMessage(messages.nextMonth)}
/>
</div>
<div className='datepicker__years'>
<IconButton
className='datepicker__button'
src={require('@tabler/icons/icons/chevron-left.svg')}
onClick={decreaseYear}
disabled={prevYearButtonDisabled}
aria-label={intl.formatMessage(messages.previousYear)}
title={intl.formatMessage(messages.previousYear)}
/>
{intl.formatDate(date, { year: 'numeric' })}
<IconButton
className='datepicker__button'
src={require('@tabler/icons/icons/chevron-right.svg')}
onClick={increaseYear}
disabled={nextYearButtonDisabled}
aria-label={intl.formatMessage(messages.nextYear)}
title={intl.formatMessage(messages.nextYear)}
/>
</div>
</div>
);
}
render() {
const { intl, value, onChange, supportsBirthdays, hint, required, minAge } = this.props;
if (!supportsBirthdays) return null;
let maxDate = new Date();
maxDate = new Date(maxDate.getTime() - minAge * 1000 * 60 * 60 * 24 + maxDate.getTimezoneOffset() * 1000 * 60);
return (
<div className='datepicker'>
{hint && (
<div className='datepicker__hint'>
{hint}
</div>
)}
<div className='datepicker__input'>
<DatePicker
selected={value}
wrapperClassName='react-datepicker-wrapper'
onChange={onChange}
placeholderText={intl.formatMessage(messages.birthdayPlaceholder)}
minDate={new Date('1900-01-01')}
maxDate={maxDate}
required={required}
renderCustomHeader={this.renderHeader}
/>
</div>
</div>
);
}
}

View File

@ -0,0 +1,154 @@
import PropTypes from 'prop-types';
import React from 'react';
import { HotKeys } from 'react-hotkeys';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { injectIntl, FormattedMessage } from 'react-intl';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { fetchBirthdayReminders } from 'soapbox/actions/accounts';
import { openModal } from 'soapbox/actions/modal';
import Icon from 'soapbox/components/icon';
import { makeGetAccount } from 'soapbox/selectors';
const mapStateToProps = (state, props) => {
const me = state.get('me');
const getAccount = makeGetAccount();
const birthdays = state.getIn(['user_lists', 'birthday_reminders', me]);
if (birthdays && birthdays.size > 0) {
return {
birthdays,
account: getAccount(state, birthdays.first()),
};
}
return {
birthdays,
};
};
export default @connect(mapStateToProps)
@injectIntl
class BirthdayReminders extends ImmutablePureComponent {
static propTypes = {
birthdays: ImmutablePropTypes.orderedSet,
intl: PropTypes.object.isRequired,
dispatch: PropTypes.func.isRequired,
onMoveDown: PropTypes.func,
};
componentDidMount() {
const { dispatch } = this.props;
const date = new Date();
const day = date.getDate();
const month = date.getMonth() + 1;
dispatch(fetchBirthdayReminders(day, month));
}
getHandlers() {
return {
open: this.handleOpenBirthdaysModal,
moveDown: this.props.onMoveDown,
};
}
handleOpenBirthdaysModal = () => {
const { dispatch } = this.props;
dispatch(openModal('BIRTHDAYS'));
}
renderMessage() {
const { birthdays, account } = this.props;
const link = (
<bdi>
<Link
className='notification__display-name'
title={account.get('acct')}
to={`/@${account.get('acct')}`}
dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }}
/>
</bdi>
);
if (birthdays.size === 1) {
return <FormattedMessage id='notification.birthday' defaultMessage='{name} has birthday today' values={{ name: link }} />;
}
return (
<FormattedMessage
id='notification.birthday_plural'
defaultMessage='{name} and {more} have birthday today'
values={{
name: link,
more: (
<span type='button' role='presentation' onClick={this.handleOpenBirthdaysModal}>
<FormattedMessage
id='notification.birthday.more'
defaultMessage='{count} more {count, plural, one {friend} other {friends}}'
values={{ count: birthdays.size - 1 }}
/>
</span>
),
}}
/>
);
}
renderMessageForScreenReader = () => {
const { intl, birthdays, account } = this.props;
if (birthdays.size === 1) {
return intl.formatMessage({ id: 'notification.birthday', defaultMessage: '{name} has birthday today' }, { name: account.get('display_name') });
}
return intl.formatMessage(
{
id: 'notification.birthday_plural',
defaultMessage: '{name} and {more} have birthday today',
},
{
name: account.get('display_name'),
more: intl.formatMessage(
{
id: 'notification.birthday.more',
defaultMessage: '{count} more {count, plural, one {friend} other {friends}}',
},
{ count: birthdays.size - 1 },
),
},
);
}
render() {
const { birthdays } = this.props;
if (!birthdays || birthdays.size === 0) return null;
return (
<HotKeys handlers={this.getHandlers()}>
<div className='notification notification-birthday focusable' tabIndex='0' title={this.renderMessageForScreenReader()}>
<div className='notification__message'>
<div className='notification__icon-wrapper'>
<Icon src={require('@tabler/icons/icons/ballon.svg')} />
</div>
<span>
{this.renderMessage()}
</span>
</div>
</div>
</HotKeys>
);
}
}

View File

@ -31,6 +31,14 @@ import configureStore from '../store/configureStore';
const validLocale = locale => Object.keys(messages).includes(locale); const validLocale = locale => Object.keys(messages).includes(locale);
// Delay rendering until instance has loaded or failed (for feature detection)
const isInstanceLoaded = state => {
const v = state.getIn(['instance', 'version'], '0.0.0');
const fetchFailed = state.getIn(['meta', 'instance_fetch_failed'], false);
return v !== '0.0.0' || fetchFailed;
};
export const store = configureStore(); export const store = configureStore();
// Configure global functions for developers // Configure global functions for developers
@ -60,6 +68,7 @@ const mapStateToProps = (state) => {
return { return {
showIntroduction, showIntroduction,
me, me,
instanceLoaded: isInstanceLoaded(state),
reduceMotion: settings.get('reduceMotion'), reduceMotion: settings.get('reduceMotion'),
underlineLinks: settings.get('underlineLinks'), underlineLinks: settings.get('underlineLinks'),
systemFont: settings.get('systemFont'), systemFont: settings.get('systemFont'),
@ -80,6 +89,7 @@ class SoapboxMount extends React.PureComponent {
static propTypes = { static propTypes = {
showIntroduction: PropTypes.bool, showIntroduction: PropTypes.bool,
me: SoapboxPropTypes.me, me: SoapboxPropTypes.me,
instanceLoaded: PropTypes.bool,
reduceMotion: PropTypes.bool, reduceMotion: PropTypes.bool,
underlineLinks: PropTypes.bool, underlineLinks: PropTypes.bool,
systemFont: PropTypes.bool, systemFont: PropTypes.bool,
@ -124,8 +134,9 @@ class SoapboxMount extends React.PureComponent {
} }
render() { render() {
const { me, themeCss, locale, customCss } = this.props; const { me, instanceLoaded, themeCss, locale, customCss } = this.props;
if (me === null) return null; if (me === null) return null;
if (!instanceLoaded) return null;
if (this.state.localeLoading) return null; if (this.state.localeLoading) return null;
// Disabling introduction for launch // Disabling introduction for launch

View File

@ -134,9 +134,9 @@ const mapDispatchToProps = (dispatch, { intl }) => {
onBookmark(status) { onBookmark(status) {
if (status.get('bookmarked')) { if (status.get('bookmarked')) {
dispatch(unbookmark(intl, status)); dispatch(unbookmark(status));
} else { } else {
dispatch(bookmark(intl, status)); dispatch(bookmark(status));
} }
}, },

View File

@ -283,7 +283,21 @@ class Header extends ImmutablePureComponent {
}); });
} }
if (features.accountSubscriptions) { if (features.accountNotifies) {
if (account.getIn(['relationship', 'notifying'])) {
menu.push({
text: intl.formatMessage(messages.unsubscribe, { name: account.get('username') }),
action: this.props.onNotifyToggle,
icon: require('@tabler/icons/icons/bell.svg'),
});
} else {
menu.push({
text: intl.formatMessage(messages.subscribe, { name: account.get('username') }),
action: this.props.onNotifyToggle,
icon: require('@tabler/icons/icons/bell-off.svg'),
});
}
} else if (features.accountSubscriptions) {
if (account.getIn(['relationship', 'subscribing'])) { if (account.getIn(['relationship', 'subscribing'])) {
menu.push({ menu.push({
text: intl.formatMessage(messages.unsubscribe, { name: account.get('username') }), text: intl.formatMessage(messages.unsubscribe, { name: account.get('username') }),
@ -589,8 +603,8 @@ class Header extends ImmutablePureComponent {
<StillImage src={account.get('header')} alt='' className='parallax' /> <StillImage src={account.get('header')} alt='' className='parallax' />
</a>} </a>}
{features.accountSubscriptions && <div className='account__header__subscribe'> {(features.accountNotifies || features.accountSubscriptions) && <div className='account__header__subscribe'>
<SubscriptionButton account={account} /> <SubscriptionButton account={account} features={features} />
</div>} </div>}
</div> </div>

View File

@ -59,6 +59,10 @@ export default class Header extends ImmutablePureComponent {
this.props.onSubscriptionToggle(this.props.account); this.props.onSubscriptionToggle(this.props.account);
} }
handleNotifyToggle = () => {
this.props.onNotifyToggle(this.props.account);
}
handleMute = () => { handleMute = () => {
this.props.onMute(this.props.account); this.props.onMute(this.props.account);
} }
@ -145,6 +149,7 @@ export default class Header extends ImmutablePureComponent {
onChat={this.handleChat} onChat={this.handleChat}
onReblogToggle={this.handleReblogToggle} onReblogToggle={this.handleReblogToggle}
onSubscriptionToggle={this.handleSubscriptionToggle} onSubscriptionToggle={this.handleSubscriptionToggle}
onNotifyToggle={this.handleNotifyToggle}
onReport={this.handleReport} onReport={this.handleReport}
onMute={this.handleMute} onMute={this.handleMute}
onBlockDomain={this.handleBlockDomain} onBlockDomain={this.handleBlockDomain}

View File

@ -116,9 +116,9 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onReblogToggle(account) { onReblogToggle(account) {
if (account.getIn(['relationship', 'showing_reblogs'])) { if (account.getIn(['relationship', 'showing_reblogs'])) {
dispatch(followAccount(account.get('id'), false)); dispatch(followAccount(account.get('id'), { reblogs: false }));
} else { } else {
dispatch(followAccount(account.get('id'), true)); dispatch(followAccount(account.get('id'), { reblogs: true }));
} }
}, },
@ -130,6 +130,14 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
} }
}, },
onNotifyToggle(account) {
if (account.getIn(['relationship', 'notifying'])) {
dispatch(followAccount(account.get('id'), { notify: false }));
} else {
dispatch(followAccount(account.get('id'), { notify: true }));
}
},
onEndorseToggle(account) { onEndorseToggle(account) {
if (account.getIn(['relationship', 'endorsed'])) { if (account.getIn(['relationship', 'endorsed'])) {
dispatch(unpinAccount(account.get('id'))); dispatch(unpinAccount(account.get('id')));

View File

@ -14,6 +14,7 @@ import { accountLookup } from 'soapbox/actions/accounts';
import { register, verifyCredentials } from 'soapbox/actions/auth'; import { register, verifyCredentials } from 'soapbox/actions/auth';
import { openModal } from 'soapbox/actions/modal'; import { openModal } from 'soapbox/actions/modal';
import { getSettings } from 'soapbox/actions/settings'; import { getSettings } from 'soapbox/actions/settings';
import BirthdayInput from 'soapbox/components/birthday_input';
import ShowablePassword from 'soapbox/components/showable_password'; import ShowablePassword from 'soapbox/components/showable_password';
import CaptchaField from 'soapbox/features/auth_login/components/captcha'; import CaptchaField from 'soapbox/features/auth_login/components/captcha';
import { import {
@ -46,6 +47,7 @@ const mapStateToProps = (state, props) => ({
needsApproval: state.getIn(['instance', 'approval_required']), needsApproval: state.getIn(['instance', 'approval_required']),
supportsEmailList: getFeatures(state.get('instance')).emailList, supportsEmailList: getFeatures(state.get('instance')).emailList,
supportsAccountLookup: getFeatures(state.get('instance')).accountLookup, supportsAccountLookup: getFeatures(state.get('instance')).accountLookup,
birthdayRequired: state.getIn(['instance', 'pleroma', 'metadata', 'birthday_required']),
}); });
export default @connect(mapStateToProps) export default @connect(mapStateToProps)
@ -61,6 +63,7 @@ class RegistrationForm extends ImmutablePureComponent {
supportsEmailList: PropTypes.bool, supportsEmailList: PropTypes.bool,
supportsAccountLookup: PropTypes.bool, supportsAccountLookup: PropTypes.bool,
inviteToken: PropTypes.string, inviteToken: PropTypes.string,
birthdayRequired: PropTypes.bool,
} }
static contextTypes = { static contextTypes = {
@ -129,6 +132,12 @@ class RegistrationForm extends ImmutablePureComponent {
this.setState({ passwordMismatch: !this.passwordsMatch() }); this.setState({ passwordMismatch: !this.passwordsMatch() });
} }
onBirthdayChange = birthday => {
this.setState({
birthday,
});
}
launchModal = () => { launchModal = () => {
const { dispatch, intl, needsConfirmation, needsApproval } = this.props; const { dispatch, intl, needsConfirmation, needsApproval } = this.props;
@ -197,6 +206,7 @@ class RegistrationForm extends ImmutablePureComponent {
onSubmit = e => { onSubmit = e => {
const { dispatch, inviteToken } = this.props; const { dispatch, inviteToken } = this.props;
const { birthday } = this.state;
if (!this.passwordsMatch()) { if (!this.passwordsMatch()) {
this.setState({ passwordMismatch: true }); this.setState({ passwordMismatch: true });
@ -211,6 +221,10 @@ class RegistrationForm extends ImmutablePureComponent {
if (inviteToken) { if (inviteToken) {
params.set('token', inviteToken); params.set('token', inviteToken);
} }
if (birthday) {
params.set('birthday', new Date(birthday.getTime() - (birthday.getTimezoneOffset() * 60000)).toISOString().slice(0, 10));
}
}); });
this.setState({ submissionLoading: true }); this.setState({ submissionLoading: true });
@ -245,8 +259,8 @@ class RegistrationForm extends ImmutablePureComponent {
} }
render() { render() {
const { instance, intl, supportsEmailList } = this.props; const { instance, intl, supportsEmailList, birthdayRequired } = this.props;
const { params, usernameUnavailable, passwordConfirmation, passwordMismatch } = this.state; const { params, usernameUnavailable, passwordConfirmation, passwordMismatch, birthday } = this.state;
const isLoading = this.state.captchaLoading || this.state.submissionLoading; const isLoading = this.state.captchaLoading || this.state.submissionLoading;
return ( return (
@ -311,6 +325,12 @@ class RegistrationForm extends ImmutablePureComponent {
error={passwordMismatch === true} error={passwordMismatch === true}
required required
/> />
{birthdayRequired &&
<BirthdayInput
value={birthday}
onChange={this.onBirthdayChange}
required
/>}
{instance.get('approval_required') && {instance.get('approval_required') &&
<SimpleTextarea <SimpleTextarea
label={<FormattedMessage id='registration.reason' defaultMessage='Why do you want to join?' />} label={<FormattedMessage id='registration.reason' defaultMessage='Why do you want to join?' />}

View File

@ -0,0 +1,88 @@
import PropTypes from 'prop-types';
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux';
import Avatar from 'soapbox/components/avatar';
import DisplayName from 'soapbox/components/display_name';
import Icon from 'soapbox/components/icon';
import Permalink from 'soapbox/components/permalink';
import { makeGetAccount } from 'soapbox/selectors';
const messages = defineMessages({
birthday: { id: 'account.birthday', defaultMessage: 'Born {date}' },
});
const makeMapStateToProps = () => {
const getAccount = makeGetAccount();
const mapStateToProps = (state, { accountId }) => {
const account = getAccount(state, accountId);
return {
account,
};
};
return mapStateToProps;
};
export default @connect(makeMapStateToProps)
@injectIntl
class Account extends ImmutablePureComponent {
static propTypes = {
accountId: PropTypes.string.isRequired,
intl: PropTypes.object.isRequired,
account: ImmutablePropTypes.map,
};
static defaultProps = {
added: false,
};
componentDidMount() {
const { account, accountId } = this.props;
if (accountId && !account) {
this.props.fetchAccount(accountId);
}
}
render() {
const { account, intl } = this.props;
if (!account) return null;
const birthday = account.getIn(['pleroma', 'birthday']);
if (!birthday) return null;
const formattedBirthday = intl.formatDate(birthday, { day: 'numeric', month: 'short', year: 'numeric' });
return (
<div className='account'>
<div className='account__wrapper'>
<Permalink className='account__display-name' title={account.get('acct')} href={`/@${account.get('acct')}`} to={`/@${account.get('acct')}`}>
<div className='account__display-name'>
<div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>
<DisplayName account={account} />
</div>
</Permalink>
<div
className='account__birthday'
title={intl.formatMessage(messages.birthday, {
date: formattedBirthday,
})}
>
<Icon src={require('@tabler/icons/icons/ballon.svg')} />
{formattedBirthday}
</div>
</div>
</div>
);
}
}

View File

@ -199,11 +199,11 @@ class PollForm extends ImmutablePureComponent {
} }
const mapStateToProps = state => { const mapStateToProps = state => {
const pollLimits = state.getIn(['instance', 'poll_limits']); const pollLimits = state.getIn(['instance', 'configuration', 'polls']);
return { return {
maxOptions: pollLimits.get('max_options'), maxOptions: pollLimits.get('max_options'),
maxOptionChars: pollLimits.get('max_option_chars'), maxOptionChars: pollLimits.get('max_characters_per_option'),
maxExpiration: pollLimits.get('max_expiration'), maxExpiration: pollLimits.get('max_expiration'),
minExpiration: pollLimits.get('min_expiration'), minExpiration: pollLimits.get('min_expiration'),
}; };

View File

@ -27,7 +27,7 @@ const mapStateToProps = state => ({
showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']), showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
isModalOpen: state.get('modal').size && state.get('modal').last().modalType === 'COMPOSE', isModalOpen: state.get('modal').size && state.get('modal').last().modalType === 'COMPOSE',
maxTootChars: state.getIn(['instance', 'max_toot_chars']), maxTootChars: state.getIn(['instance', 'configuration', 'statuses', 'max_characters']),
scheduledAt: state.getIn(['compose', 'schedule']), scheduledAt: state.getIn(['compose', 'schedule']),
scheduledStatusCount: state.get('scheduled_statuses').size, scheduledStatusCount: state.get('scheduled_statuses').size,
}); });

View File

@ -14,6 +14,7 @@ import { updateNotificationSettings } from 'soapbox/actions/accounts';
import { patchMe } from 'soapbox/actions/me'; import { patchMe } from 'soapbox/actions/me';
import snackbar from 'soapbox/actions/snackbar'; import snackbar from 'soapbox/actions/snackbar';
import { getSoapboxConfig } from 'soapbox/actions/soapbox'; import { getSoapboxConfig } from 'soapbox/actions/soapbox';
import BirthdayInput from 'soapbox/components/birthday_input';
import Icon from 'soapbox/components/icon'; import Icon from 'soapbox/components/icon';
import { import {
SimpleForm, SimpleForm,
@ -49,6 +50,8 @@ const messages = defineMessages({
error: { id: 'edit_profile.error', defaultMessage: 'Profile update failed' }, error: { id: 'edit_profile.error', defaultMessage: 'Profile update failed' },
bioPlaceholder: { id: 'edit_profile.fields.bio_placeholder', defaultMessage: 'Tell us about yourself.' }, bioPlaceholder: { id: 'edit_profile.fields.bio_placeholder', defaultMessage: 'Tell us about yourself.' },
displayNamePlaceholder: { id: 'edit_profile.fields.display_name_placeholder', defaultMessage: 'Name' }, displayNamePlaceholder: { id: 'edit_profile.fields.display_name_placeholder', defaultMessage: 'Name' },
view: { id: 'snackbar.view', defaultMessage: 'View' },
birthdayPlaceholder: { id: 'edit_profile.fields.birthday_placeholder', defaultMessage: 'Your birthday' },
}); });
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
@ -58,12 +61,14 @@ const makeMapStateToProps = () => {
const me = state.get('me'); const me = state.get('me');
const account = getAccount(state, me); const account = getAccount(state, me);
const soapbox = getSoapboxConfig(state); const soapbox = getSoapboxConfig(state);
const features = getFeatures(state.get('instance'));
return { return {
account, account,
maxFields: state.getIn(['instance', 'pleroma', 'metadata', 'fields_limits', 'max_fields'], 4), maxFields: state.getIn(['instance', 'pleroma', 'metadata', 'fields_limits', 'max_fields'], 4),
verifiedCanEditName: soapbox.get('verifiedCanEditName'), verifiedCanEditName: soapbox.get('verifiedCanEditName'),
supportsEmailList: getFeatures(state.get('instance')).emailList, supportsEmailList: features.emailList,
supportsBirthdays: features.birthdays,
}; };
}; };
@ -94,6 +99,8 @@ class EditProfile extends ImmutablePureComponent {
account: ImmutablePropTypes.map, account: ImmutablePropTypes.map,
maxFields: PropTypes.number, maxFields: PropTypes.number,
verifiedCanEditName: PropTypes.bool, verifiedCanEditName: PropTypes.bool,
supportsEmailList: PropTypes.bool,
supportsBirthdays: PropTypes.bool,
}; };
state = { state = {
@ -107,6 +114,8 @@ class EditProfile extends ImmutablePureComponent {
const strangerNotifications = account.getIn(['pleroma', 'notification_settings', 'block_from_strangers']); const strangerNotifications = account.getIn(['pleroma', 'notification_settings', 'block_from_strangers']);
const acceptsEmailList = account.getIn(['pleroma', 'accepts_email_list']); const acceptsEmailList = account.getIn(['pleroma', 'accepts_email_list']);
const discoverable = account.getIn(['source', 'pleroma', 'discoverable']); const discoverable = account.getIn(['source', 'pleroma', 'discoverable']);
const birthday = account.getIn(['pleroma', 'birthday']);
const showBirthday = account.getIn(['source', 'pleroma', 'show_birthday']);
const initialState = account.withMutations(map => { const initialState = account.withMutations(map => {
map.merge(map.get('source')); map.merge(map.get('source'));
@ -116,6 +125,11 @@ class EditProfile extends ImmutablePureComponent {
map.set('accepts_email_list', acceptsEmailList); map.set('accepts_email_list', acceptsEmailList);
map.set('hide_network', hidesNetwork(account)); map.set('hide_network', hidesNetwork(account));
map.set('discoverable', discoverable); map.set('discoverable', discoverable);
map.set('show_birthday', showBirthday);
if (birthday) {
const date = new Date(birthday);
map.set('birthday', new Date(date.getTime() + (date.getTimezoneOffset() * 60000)));
}
unescapeParams(map, ['display_name', 'bio']); unescapeParams(map, ['display_name', 'bio']);
}); });
@ -156,6 +170,10 @@ class EditProfile extends ImmutablePureComponent {
hide_follows: state.hide_network, hide_follows: state.hide_network,
hide_followers_count: state.hide_network, hide_followers_count: state.hide_network,
hide_follows_count: state.hide_network, hide_follows_count: state.hide_network,
birthday: state.birthday
? new Date(state.birthday.getTime() - (state.birthday.getTimezoneOffset() * 60000)).toISOString().slice(0, 10)
: undefined,
show_birthday: state.show_birthday,
}, this.getFieldParams().toJS()); }, this.getFieldParams().toJS());
} }
@ -171,7 +189,7 @@ class EditProfile extends ImmutablePureComponent {
} }
handleSubmit = (event) => { handleSubmit = (event) => {
const { dispatch, intl } = this.props; const { dispatch, intl, account } = this.props;
const credentials = dispatch(patchMe(this.getFormdata())); const credentials = dispatch(patchMe(this.getFormdata()));
const notifications = dispatch(updateNotificationSettings({ const notifications = dispatch(updateNotificationSettings({
@ -182,7 +200,7 @@ class EditProfile extends ImmutablePureComponent {
Promise.all([credentials, notifications]).then(() => { Promise.all([credentials, notifications]).then(() => {
this.setState({ isLoading: false }); this.setState({ isLoading: false });
dispatch(snackbar.success(intl.formatMessage(messages.success))); dispatch(snackbar.success(intl.formatMessage(messages.success), intl.formatMessage(messages.view), `/@${account.get('acct')}`));
}).catch((error) => { }).catch((error) => {
this.setState({ isLoading: false }); this.setState({ isLoading: false });
dispatch(snackbar.error(intl.formatMessage(messages.error))); dispatch(snackbar.error(intl.formatMessage(messages.error)));
@ -223,6 +241,12 @@ class EditProfile extends ImmutablePureComponent {
}; };
} }
handleBirthdayChange = birthday => {
this.setState({
birthday,
});
}
handleAddField = () => { handleAddField = () => {
this.setState({ this.setState({
fields: this.state.fields.push(ImmutableMap({ name: '', value: '' })), fields: this.state.fields.push(ImmutableMap({ name: '', value: '' })),
@ -238,7 +262,7 @@ class EditProfile extends ImmutablePureComponent {
} }
render() { render() {
const { intl, maxFields, account, verifiedCanEditName, supportsEmailList } = this.props; const { intl, maxFields, account, verifiedCanEditName, supportsBirthdays, supportsEmailList } = this.props;
const verified = isVerified(account); const verified = isVerified(account);
const canEditName = verifiedCanEditName || !verified; const canEditName = verifiedCanEditName || !verified;
@ -267,6 +291,22 @@ class EditProfile extends ImmutablePureComponent {
onChange={this.handleTextChange} onChange={this.handleTextChange}
rows={3} rows={3}
/> />
{supportsBirthdays && (
<>
<BirthdayInput
hint={<FormattedMessage id='edit_profile.fields.birthday_label' defaultMessage='Birthday' />}
value={this.state.birthday}
onChange={this.handleBirthdayChange}
/>
<Checkbox
label={<FormattedMessage id='edit_profile.fields.show_birthday_label' defaultMessage='Show my birthday' />}
hint={<FormattedMessage id='edit_profile.hints.show_birthday' defaultMessage='Your birthday will be visible on your profile.' />}
name='show_birthday'
checked={this.state.show_birthday}
onChange={this.handleCheckboxChange}
/>
</>
)}
<div className='fields-row'> <div className='fields-row'>
<div className='fields-row__column fields-row__column-6'> <div className='fields-row__column fields-row__column-6'>
<ProfilePreview account={this.makePreviewAccount()} /> <ProfilePreview account={this.makePreviewAccount()} />

View File

@ -24,6 +24,7 @@ class ColumnSettings extends React.PureComponent {
onClear: PropTypes.func.isRequired, onClear: PropTypes.func.isRequired,
onClose: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired,
supportsEmojiReacts: PropTypes.bool, supportsEmojiReacts: PropTypes.bool,
supportsBirthdays: PropTypes.bool,
}; };
onPushChange = (path, checked) => { onPushChange = (path, checked) => {
@ -39,7 +40,7 @@ class ColumnSettings extends React.PureComponent {
} }
render() { render() {
const { intl, settings, pushSettings, onChange, onClear, onClose, supportsEmojiReacts } = this.props; const { intl, settings, pushSettings, onChange, onClear, onClose, supportsEmojiReacts, supportsBirthdays } = this.props;
const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />; const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;
const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />; const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;
@ -50,6 +51,7 @@ class ColumnSettings extends React.PureComponent {
const soundSettings = [['sounds', 'follow'], ['sounds', 'favourite'], ['sounds', 'pleroma:emoji_reaction'], ['sounds', 'mention'], ['sounds', 'reblog'], ['sounds', 'poll'], ['sounds', 'move']]; const soundSettings = [['sounds', 'follow'], ['sounds', 'favourite'], ['sounds', 'pleroma:emoji_reaction'], ['sounds', 'mention'], ['sounds', 'reblog'], ['sounds', 'poll'], ['sounds', 'move']];
const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed'); const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');
const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />; const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;
const birthdaysStr = <FormattedMessage id='notifications.column_settings.birthdays.show' defaultMessage='Show birthday reminders' />;
return ( return (
<div className='column-settings'> <div className='column-settings'>
@ -84,6 +86,17 @@ class ColumnSettings extends React.PureComponent {
</div> </div>
</div> </div>
{supportsBirthdays &&
<div role='group' aria-labelledby='notifications-filter-bar'>
<span id='notifications-filter-bar' className='column-settings__section'>
<FormattedMessage id='notifications.column_settings.birthdays.category' defaultMessage='Birthdays' />
</span>
<div className='column-settings__row'>
<SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['birthdays', 'show']} onChange={onChange} label={birthdaysStr} />
</div>
</div>
}
<div role='group' aria-labelledby='notifications-follow'> <div role='group' aria-labelledby='notifications-follow'>
<span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span> <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>

View File

@ -24,6 +24,7 @@ const mapStateToProps = state => {
settings: getSettings(state).get('notifications'), settings: getSettings(state).get('notifications'),
pushSettings: state.get('push_notifications'), pushSettings: state.get('push_notifications'),
supportsEmojiReacts: features.emojiReacts, supportsEmojiReacts: features.emojiReacts,
supportsBirthdays: features.birthdays,
}; };
}; };

View File

@ -8,8 +8,10 @@ import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { getSettings } from 'soapbox/actions/settings'; import { getSettings } from 'soapbox/actions/settings';
import BirthdayReminders from 'soapbox/components/birthday_reminders';
import SubNavigation from 'soapbox/components/sub_navigation'; import SubNavigation from 'soapbox/components/sub_navigation';
import PlaceholderNotification from 'soapbox/features/placeholder/components/placeholder_notification'; import PlaceholderNotification from 'soapbox/features/placeholder/components/placeholder_notification';
import { getFeatures } from 'soapbox/utils/features';
import { import {
expandNotifications, expandNotifications,
@ -45,14 +47,24 @@ const getNotifications = createSelector([
return notifications.filter(item => item !== null && allowedType === item.get('type')); return notifications.filter(item => item !== null && allowedType === item.get('type'));
}); });
const mapStateToProps = state => ({ const mapStateToProps = state => {
showFilterBar: getSettings(state).getIn(['notifications', 'quickFilter', 'show']), const settings = getSettings(state);
notifications: getNotifications(state), const instance = state.get('instance');
isLoading: state.getIn(['notifications', 'isLoading'], true), const features = getFeatures(instance);
isUnread: state.getIn(['notifications', 'unread']) > 0, const showBirthdayReminders = settings.getIn(['notifications', 'birthdays', 'show']) && settings.getIn(['notifications', 'quickFilter', 'active']) === 'all' && features.birthdays;
hasMore: state.getIn(['notifications', 'hasMore']), const birthdays = showBirthdayReminders && state.getIn(['user_lists', 'birthday_reminders', state.get('me')]);
totalQueuedNotificationsCount: state.getIn(['notifications', 'totalQueuedNotificationsCount'], 0),
}); return {
showFilterBar: settings.getIn(['notifications', 'quickFilter', 'show']),
notifications: getNotifications(state),
isLoading: state.getIn(['notifications', 'isLoading'], true),
isUnread: state.getIn(['notifications', 'unread']) > 0,
hasMore: state.getIn(['notifications', 'hasMore']),
totalQueuedNotificationsCount: state.getIn(['notifications', 'totalQueuedNotificationsCount'], 0),
showBirthdayReminders,
hasBirthdays: !!birthdays,
};
};
export default @connect(mapStateToProps) export default @connect(mapStateToProps)
@injectIntl @injectIntl
@ -68,6 +80,8 @@ class Notifications extends React.PureComponent {
hasMore: PropTypes.bool, hasMore: PropTypes.bool,
dequeueNotifications: PropTypes.func, dequeueNotifications: PropTypes.func,
totalQueuedNotificationsCount: PropTypes.number, totalQueuedNotificationsCount: PropTypes.number,
showBirthdayReminders: PropTypes.bool,
hasBirthdays: PropTypes.bool,
}; };
componentWillUnmount() { componentWillUnmount() {
@ -104,15 +118,25 @@ class Notifications extends React.PureComponent {
} }
handleMoveUp = id => { handleMoveUp = id => {
const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1; const { hasBirthdays } = this.props;
let elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1;
if (hasBirthdays) elementIndex++;
this._selectChild(elementIndex, true); this._selectChild(elementIndex, true);
} }
handleMoveDown = id => { handleMoveDown = id => {
const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1; const { hasBirthdays } = this.props;
let elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1;
if (hasBirthdays) elementIndex++;
this._selectChild(elementIndex, false); this._selectChild(elementIndex, false);
} }
handleMoveBelowBirthdays = () => {
this._selectChild(1, false);
}
_selectChild(index, align_top) { _selectChild(index, align_top) {
const container = this.column.node; const container = this.column.node;
const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`); const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);
@ -137,7 +161,7 @@ class Notifications extends React.PureComponent {
} }
render() { render() {
const { intl, notifications, isLoading, hasMore, showFilterBar, totalQueuedNotificationsCount } = this.props; const { intl, notifications, isLoading, hasMore, showFilterBar, totalQueuedNotificationsCount, showBirthdayReminders } = this.props;
const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage="You don't have any notifications yet. Interact with others to start the conversation." />; const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage="You don't have any notifications yet. Interact with others to start the conversation." />;
let scrollableContent = null; let scrollableContent = null;
@ -164,6 +188,13 @@ class Notifications extends React.PureComponent {
onMoveDown={this.handleMoveDown} onMoveDown={this.handleMoveDown}
/> />
)); ));
if (showBirthdayReminders) scrollableContent = scrollableContent.unshift(
<BirthdayReminders
key='birthdays'
onMoveDown={this.handleMoveBelowBirthdays}
/>,
);
} else { } else {
scrollableContent = null; scrollableContent = null;
} }

View File

@ -32,6 +32,7 @@ export const languages = {
da: 'Dansk', da: 'Dansk',
de: 'Deutsch', de: 'Deutsch',
el: 'Ελληνικά', el: 'Ελληνικά',
'en-Shaw': '𐑖𐑱𐑝𐑾𐑯',
eo: 'Esperanto', eo: 'Esperanto',
es: 'Español', es: 'Español',
eu: 'Euskara', eu: 'Euskara',

View File

@ -98,9 +98,9 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onBookmark(status) { onBookmark(status) {
if (status.get('bookmarked')) { if (status.get('bookmarked')) {
dispatch(unbookmark(intl, status)); dispatch(unbookmark(status));
} else { } else {
dispatch(bookmark(intl, status)); dispatch(bookmark(status));
} }
}, },

View File

@ -221,9 +221,9 @@ class Status extends ImmutablePureComponent {
handleBookmark = (status) => { handleBookmark = (status) => {
if (status.get('bookmarked')) { if (status.get('bookmarked')) {
this.props.dispatch(unbookmark(this.props.intl, status)); this.props.dispatch(unbookmark(status));
} else { } else {
this.props.dispatch(bookmark(this.props.intl, status)); this.props.dispatch(bookmark(status));
} }
} }

View File

@ -0,0 +1,97 @@
import PropTypes from 'prop-types';
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';
import { connect } from 'react-redux';
import IconButton from 'soapbox/components/icon_button';
import LoadingIndicator from 'soapbox/components/loading_indicator';
import ScrollableList from 'soapbox/components/scrollable_list';
import Account from 'soapbox/features/birthdays/account';
const messages = defineMessages({
close: { id: 'lightbox.close', defaultMessage: 'Close' },
});
const mapStateToProps = (state) => {
const me = state.get('me');
return {
accountIds: state.getIn(['user_lists', 'birthday_reminders', me]),
};
};
export default @connect(mapStateToProps)
@injectIntl
class BirthdaysModal extends React.PureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
onClose: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
accountIds: ImmutablePropTypes.orderedSet,
};
componentDidMount() {
this.unlistenHistory = this.context.router.history.listen((_, action) => {
if (action === 'PUSH') {
this.onClickClose(null, true);
}
});
}
componentWillUnmount() {
if (this.unlistenHistory) {
this.unlistenHistory();
}
}
onClickClose = (_, noPop) => {
this.props.onClose('BIRTHDAYS', noPop);
};
render() {
const { intl, accountIds } = this.props;
let body;
if (!accountIds) {
body = <LoadingIndicator />;
} else {
const emptyMessage = <FormattedMessage id='status.reblogs.empty' defaultMessage='No one has reposted this post yet. When someone does, they will show up here.' />;
body = (
<ScrollableList
scrollKey='reblogs'
emptyMessage={emptyMessage}
>
{accountIds.map(id =>
<Account key={id} accountId={id} withNote={false} />,
)}
</ScrollableList>
);
}
return (
<div className='modal-root__modal reactions-modal'>
<div className='compose-modal__header'>
<h3 className='compose-modal__header__title'>
<FormattedMessage id='column.birthdays' defaultMessage='Birthdays' />
</h3>
<IconButton
className='compose-modal__close'
title={intl.formatMessage(messages.close)}
src={require('@tabler/icons/icons/x.svg')}
onClick={this.onClickClose} size={20}
/>
</div>
{body}
</div>
);
}
}

View File

@ -26,6 +26,7 @@ import {
FavouritesModal, FavouritesModal,
ReblogsModal, ReblogsModal,
MentionsModal, MentionsModal,
BirthdaysModal,
} from '../../../features/ui/util/async-components'; } from '../../../features/ui/util/async-components';
import BundleContainer from '../containers/bundle_container'; import BundleContainer from '../containers/bundle_container';
@ -57,6 +58,7 @@ const MODAL_COMPONENTS = {
'FAVOURITES': FavouritesModal, 'FAVOURITES': FavouritesModal,
'REACTIONS': ReactionsModal, 'REACTIONS': ReactionsModal,
'MENTIONS': MentionsModal, 'MENTIONS': MentionsModal,
'BIRTHDAYS': BirthdaysModal,
}; };
export default class ModalRoot extends React.PureComponent { export default class ModalRoot extends React.PureComponent {

View File

@ -1,6 +1,7 @@
import classNames from 'classnames'; import classNames from 'classnames';
import React from 'react'; import React from 'react';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import { FormattedMessage, injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { Link, NavLink } from 'react-router-dom'; import { Link, NavLink } from 'react-router-dom';
@ -30,6 +31,7 @@ const mapStateToProps = (state, props) => {
}; };
export default @connect(mapStateToProps) export default @connect(mapStateToProps)
@injectIntl
class PendingStatus extends ImmutablePureComponent { class PendingStatus extends ImmutablePureComponent {
renderMedia = () => { renderMedia = () => {
@ -48,6 +50,56 @@ class PendingStatus extends ImmutablePureComponent {
} }
} }
renderReplyMentions = () => {
const { status } = this.props;
if (!status.get('in_reply_to_id')) {
return null;
}
const to = status.get('mentions', []);
if (to.size === 0) {
if (status.get('in_reply_to_account_id') === status.getIn(['account', 'id'])) {
return (
<div className='reply-mentions'>
<FormattedMessage
id='reply_mentions.reply'
defaultMessage='Replying to {accounts}{more}'
values={{
accounts: <span className='reply-mentions__account'>@{status.getIn(['account', 'username'])}</span>,
more: false,
}}
/>
</div>
);
} else {
return (
<div className='reply-mentions'>
<FormattedMessage id='reply_mentions.reply_empty' defaultMessage='Replying to post' />
</div>
);
}
}
return (
<div className='reply-mentions'>
<FormattedMessage
id='reply_mentions.reply'
defaultMessage='Replying to {accounts}{more}'
values={{
accounts: to.slice(0, 2).map(account => (<>
<span key={account.username} className='reply-mentions__account'>@{account.username}</span>
{' '}
</>)),
more: to.size > 2 && <FormattedMessage id='reply_mentions.more' defaultMessage='and {count} more' values={{ count: to.size - 2 }} />,
}}
/>
</div>
);
}
render() { render() {
const { status, className } = this.props; const { status, className } = this.props;
if (!status) return null; if (!status) return null;
@ -85,6 +137,8 @@ class PendingStatus extends ImmutablePureComponent {
</div> </div>
</div> </div>
{this.renderReplyMentions()}
<StatusContent <StatusContent
status={status} status={status}
expanded expanded

View File

@ -80,6 +80,41 @@ class ProfileInfoPanel extends ImmutablePureComponent {
return badges; return badges;
} }
getBirthday = () => {
const { account, intl } = this.props;
const birthday = account.getIn(['pleroma', 'birthday']);
if (!birthday) return null;
const formattedBirthday = intl.formatDate(birthday, { timeZone: 'UTC', day: 'numeric', month: 'long', year: 'numeric' });
const date = new Date(birthday);
const today = new Date();
const hasBirthday = date.getDate() === today.getDate() && date.getMonth() === today.getMonth();
if (hasBirthday) {
return (
<div className='profile-info-panel-content__birthday' title={formattedBirthday}>
<Icon src={require('@tabler/icons/icons/ballon.svg')} />
<FormattedMessage
id='account.birthday_today' defaultMessage='Birthday is today!'
/>
</div>
);
}
return (
<div className='profile-info-panel-content__birthday'>
<Icon src={require('@tabler/icons/icons/ballon.svg')} />
<FormattedMessage
id='account.birthday' defaultMessage='Born {date}' values={{
date: formattedBirthday,
}}
/>
</div>
);
}
render() { render() {
const { account, displayFqn, intl, identity_proofs, username } = this.props; const { account, displayFqn, intl, identity_proofs, username } = this.props;
@ -150,6 +185,8 @@ class ProfileInfoPanel extends ImmutablePureComponent {
/> />
</div>} </div>}
{this.getBirthday()}
<ProfileStats <ProfileStats
className='profile-info-panel-content__stats' className='profile-info-panel-content__stats'
account={account} account={account}

View File

@ -1,4 +1,5 @@
import classNames from 'classnames'; import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
@ -6,6 +7,7 @@ import { defineMessages, injectIntl } from 'react-intl';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { import {
followAccount,
subscribeAccount, subscribeAccount,
unsubscribeAccount, unsubscribeAccount,
} from 'soapbox/actions/accounts'; } from 'soapbox/actions/accounts';
@ -33,6 +35,13 @@ const mapDispatchToProps = (dispatch) => ({
dispatch(subscribeAccount(account.get('id'))); dispatch(subscribeAccount(account.get('id')));
} }
}, },
onNotifyToggle(account) {
if (account.getIn(['relationship', 'notifying'])) {
dispatch(followAccount(account.get('id'), { notify: false }));
} else {
dispatch(followAccount(account.get('id'), { notify: true }));
}
},
}); });
export default @connect(mapStateToProps, mapDispatchToProps) export default @connect(mapStateToProps, mapDispatchToProps)
@ -41,15 +50,17 @@ class SubscriptionButton extends ImmutablePureComponent {
static propTypes = { static propTypes = {
account: ImmutablePropTypes.map, account: ImmutablePropTypes.map,
features: PropTypes.object.isRequired,
}; };
handleSubscriptionToggle = () => { handleSubscriptionToggle = () => {
this.props.onSubscriptionToggle(this.props.account); if (this.props.features.accountNotifies) this.props.onNotifyToggle(this.props.account);
else this.props.onSubscriptionToggle(this.props.account);
} }
render() { render() {
const { account, intl } = this.props; const { account, intl, features } = this.props;
const subscribing = account.getIn(['relationship', 'subscribing']); const subscribing = features.accountNotifies ? account.getIn(['relationship', 'notifying']) : account.getIn(['relationship', 'subscribing']);
const following = account.getIn(['relationship', 'following']); const following = account.getIn(['relationship', 'following']);
const requested = account.getIn(['relationship', 'requested']); const requested = account.getIn(['relationship', 'requested']);

View File

@ -1,6 +1,8 @@
import React from 'react';
import { injectIntl } from 'react-intl'; import { injectIntl } from 'react-intl';
import { NotificationStack } from 'react-notification'; import { NotificationStack } from 'react-notification';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
import { dismissAlert } from '../../../actions/alerts'; import { dismissAlert } from '../../../actions/alerts';
import { getAlerts } from '../../../selectors'; import { getAlerts } from '../../../selectors';
@ -16,22 +18,35 @@ const defaultBarStyleFactory = (index, style, notification) => {
const mapStateToProps = (state, { intl }) => { const mapStateToProps = (state, { intl }) => {
const notifications = getAlerts(state); const notifications = getAlerts(state);
notifications.forEach(notification => ['title', 'message'].forEach(key => { notifications.forEach(notification => {
const value = notification[key]; ['title', 'message', 'actionLabel'].forEach(key => {
const value = notification[key];
if (typeof value === 'object') { if (typeof value === 'object') {
notification[key] = intl.formatMessage(value); notification[key] = intl.formatMessage(value);
}
});
if (notification.actionLabel) {
notification.action = (
<Link to={notification.actionLink}>
{notification.actionLabel}
</Link>
);
} }
})); });
return { notifications }; return { notifications, linkComponent: Link };
}; };
const mapDispatchToProps = (dispatch) => { const mapDispatchToProps = (dispatch) => {
const onDismiss = alert => {
dispatch(dismissAlert(alert));
};
return { return {
onDismiss: alert => { onDismiss,
dispatch(dismissAlert(alert)); onClick: onDismiss,
},
barStyleFactory: defaultBarStyleFactory, barStyleFactory: defaultBarStyleFactory,
activeBarStyleFactory: defaultBarStyleFactory, activeBarStyleFactory: defaultBarStyleFactory,
}; };

View File

@ -214,6 +214,10 @@ export function MentionsModal() {
return import(/* webpackChunkName: "features/ui" */'../components/mentions_modal'); return import(/* webpackChunkName: "features/ui" */'../components/mentions_modal');
} }
export function BirthdaysModal() {
return import(/* webpackChunkName: "features/ui" */'../components/birthdays_modal');
}
export function ListEditor() { export function ListEditor() {
return import(/* webpackChunkName: "features/list_editor" */'../../list_editor'); return import(/* webpackChunkName: "features/list_editor" */'../../list_editor');
} }

View File

@ -1,14 +1,31 @@
import { fromJS } from 'immutable'; import { fromJS } from 'immutable';
import { OrderedSet as ImmutableOrderedSet } from 'immutable';
import { normalizeStatus } from 'soapbox/actions/importer/normalizer'; import { normalizeStatus } from 'soapbox/actions/importer/normalizer';
import { makeGetAccount } from 'soapbox/selectors'; import { makeGetAccount, makeGetStatus } from 'soapbox/selectors';
export const buildStatus = (state, pendingStatus, idempotencyKey) => { export const buildStatus = (state, pendingStatus, idempotencyKey) => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
const getStatus = makeGetStatus();
const me = state.get('me'); const me = state.get('me');
const account = getAccount(state, me); const account = getAccount(state, me);
let mentions;
if (pendingStatus.get('in_reply_to_id')) {
const inReplyTo = getStatus(state, { id: pendingStatus.get('in_reply_to_id') });
if (inReplyTo.getIn(['account', 'id']) === me) {
mentions = ImmutableOrderedSet([account.get('acct')]).union(pendingStatus.get('to', []));
} else {
mentions = pendingStatus.get('to', []);
}
mentions = mentions.map(mention => ({
username: mention.split('@')[0],
}));
}
const status = normalizeStatus({ const status = normalizeStatus({
account, account,
application: null, application: null,
@ -24,7 +41,7 @@ export const buildStatus = (state, pendingStatus, idempotencyKey) => {
in_reply_to_id: pendingStatus.get('in_reply_to_id'), in_reply_to_id: pendingStatus.get('in_reply_to_id'),
language: null, language: null,
media_attachments: pendingStatus.get('media_ids').map(id => ({ id })), media_attachments: pendingStatus.get('media_ids').map(id => ({ id })),
mentions: [], mentions,
muted: false, muted: false,
pinned: false, pinned: false,
poll: pendingStatus.get('poll', null), poll: pendingStatus.get('poll', null),

View File

@ -783,7 +783,7 @@
"reply_indicator.cancel": "Abbrechen", "reply_indicator.cancel": "Abbrechen",
"reply_mentions.account.add": "Add to mentions", "reply_mentions.account.add": "Add to mentions",
"reply_mentions.account.remove": "Remove from mentions", "reply_mentions.account.remove": "Remove from mentions",
"reply_mentions.more": "und {count, plural, one {einen weiteren Nutzer} other {# weitere Nutzer}}.", "reply_mentions.more": "und {count, plural, one {einen weiteren Nutzer} other {# weitere Nutzer}}",
"reply_mentions.reply": "Antwort an {accounts}{more}", "reply_mentions.reply": "Antwort an {accounts}{more}",
"reply_mentions.reply_empty": "Antwort auf einen Beitrag", "reply_mentions.reply_empty": "Antwort auf einen Beitrag",
"report.block": "{target} blockieren.", "report.block": "{target} blockieren.",

View File

@ -0,0 +1,975 @@
{
"about.also_available": "𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑦𐑯:",
"accordion.collapse": "𐑒𐑩𐑤𐑨𐑐𐑕",
"accordion.expand": "𐑦𐑒𐑕𐑐𐑨𐑯𐑛",
"account.add_or_remove_from_list": "𐑨𐑛 𐑹 𐑮𐑦𐑥𐑵𐑝 𐑮𐑦𐑥𐑵𐑝 𐑤𐑦𐑕𐑑𐑕",
"account.badges.bot": "𐑚𐑪𐑑",
"account.block": "𐑚𐑤𐑪𐑒 @{name}",
"account.block_domain": "𐑣𐑲𐑛 𐑧𐑝𐑮𐑦𐑔𐑦𐑙 𐑓𐑮𐑪𐑥 {domain}",
"account.blocked": "𐑚𐑤𐑪𐑒𐑑",
"account.chat": "𐑗𐑨𐑑 𐑢𐑦𐑞 @{name}",
"account.column_settings.description": "𐑞𐑰𐑟 𐑕𐑧𐑑𐑦𐑙𐑟 𐑩𐑐𐑤𐑲 𐑑 𐑷𐑤 𐑩𐑒𐑬𐑯𐑑 𐑑𐑲𐑥𐑤𐑲𐑯𐑟.",
"account.column_settings.title": "𐑩𐑒𐑬𐑯𐑑 𐑑𐑲𐑥𐑤𐑲𐑯 𐑕𐑧𐑑𐑦𐑙𐑟",
"account.deactivated": "𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑𐑩𐑛",
"account.deactivated_description": "𐑞𐑦𐑕 𐑩𐑒𐑬𐑯𐑑 𐑣𐑨𐑟 𐑚𐑰𐑯 𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑𐑩𐑛.",
"account.direct": "𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡 @{name}",
"account.domain_blocked": "𐑛𐑴𐑥𐑱𐑯 𐑣𐑦𐑛𐑩𐑯",
"account.edit_profile": "𐑧𐑛𐑦𐑑 𐑐𐑮𐑴𐑓𐑲𐑤",
"account.endorse": "𐑓𐑰𐑗𐑼 𐑪𐑯 𐑐𐑮𐑴𐑓𐑲𐑤",
"account.follow": "𐑓𐑪𐑤𐑴",
"account.followers": "𐑓𐑪𐑤𐑴𐑼𐑟",
"account.followers.empty": "𐑯𐑴 𐑢𐑳𐑯 𐑓𐑪𐑤𐑴𐑟 𐑞𐑦𐑕 𐑿𐑟𐑼 𐑘𐑧𐑑.",
"account.follows": "𐑓𐑪𐑤𐑴𐑟",
"account.follows.empty": "𐑞𐑦𐑕 𐑿𐑟𐑼 𐑛𐑳𐑟𐑩𐑯𐑑 𐑓𐑪𐑤𐑴 𐑧𐑯𐑦𐑢𐑳𐑯 𐑘𐑧𐑑.",
"account.follows_you": "𐑓𐑪𐑤𐑴𐑟 𐑿",
"account.hide_reblogs": "𐑣𐑲𐑛 𐑮𐑰𐑐𐑴𐑕𐑑𐑕 𐑓𐑮𐑪𐑥 @{name}",
"account.last_status": "𐑤𐑭𐑕𐑑 𐑨𐑒𐑑𐑦𐑝",
"account.link_verified_on": "𐑴𐑯𐑼𐑖𐑦𐑐 𐑝 𐑞𐑦𐑕 𐑤𐑦𐑙𐑒 𐑢𐑪𐑟 𐑗𐑧𐑒𐑑 𐑪𐑯 {date}",
"account.locked_info": "𐑞𐑦𐑕 𐑩𐑒𐑬𐑯𐑑 𐑐𐑮𐑦𐑝𐑩𐑕𐑦 𐑕𐑑𐑱𐑑𐑩𐑕 𐑦𐑟 𐑕𐑧𐑑 𐑑 𐑤𐑪𐑒𐑑. 𐑞 𐑴𐑯𐑼 𐑥𐑨𐑯𐑘𐑫𐑩𐑤𐑦 𐑮𐑦𐑝𐑿𐑟 𐑣𐑵 𐑒𐑨𐑯 𐑓𐑪𐑤𐑴 𐑞𐑧𐑥.",
"account.login": "𐑤𐑪𐑜 𐑦𐑯",
"account.media": "𐑥𐑰𐑛𐑾",
"account.member_since": "𐑡𐑶𐑯𐑛 {date}",
"account.mention": "𐑥𐑧𐑯𐑖𐑩𐑯",
"account.moved_to": "{name} 𐑣𐑨𐑟 𐑥𐑵𐑝𐑛 𐑑:",
"account.mute": "𐑥𐑿𐑑 @{name}",
"account.muted": "𐑥𐑿𐑑𐑩𐑛",
"account.never_active": "𐑯𐑧𐑝𐑼",
"account.posts": "𐑐𐑴𐑕𐑑𐑕",
"account.posts_with_replies": "𐑐𐑴𐑕𐑑𐑕 𐑯 𐑮𐑦𐑐𐑤𐑲𐑟",
"account.profile": "𐑐𐑮𐑴𐑓𐑲𐑤",
"account.register": "𐑕𐑲𐑯 𐑳𐑐",
"account.remote_follow": "𐑮𐑦𐑥𐑴𐑑 𐑓𐑪𐑤𐑴",
"account.report": "𐑮𐑦𐑐𐑹𐑑 @{name}",
"account.requested": "𐑩𐑢𐑱𐑑𐑦𐑙 𐑩𐑐𐑮𐑵𐑝𐑩𐑤. 𐑒𐑤𐑦𐑒 𐑑 𐑒𐑨𐑯𐑕𐑩𐑤 𐑓𐑪𐑤𐑴 𐑮𐑦𐑒𐑢𐑧𐑕𐑑",
"account.requested_small": "𐑩𐑢𐑱𐑑𐑦𐑙 𐑩𐑐𐑮𐑵𐑝𐑩𐑤",
"account.share": "𐑖𐑺 @{name}'s 𐑐𐑮𐑴𐑓𐑲𐑤",
"account.show_reblogs": "𐑖𐑴 𐑮𐑰𐑐𐑴𐑕𐑑𐑕 𐑓𐑮𐑪𐑥 @{name}",
"account.subscribe": "𐑕𐑩𐑚𐑕𐑒𐑮𐑲𐑚 𐑑 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑓𐑮𐑪𐑥 @{name}",
"account.subscribed": "𐑕𐑩𐑚𐑕𐑒𐑮𐑲𐑚𐑛",
"account.unblock": "𐑳𐑯𐑚𐑤𐑪𐑒 @{name}",
"account.unblock_domain": "𐑳𐑯𐑣𐑲𐑛 {domain}",
"account.unendorse": "𐑛𐑴𐑯𐑑 𐑓𐑰𐑗𐑼 𐑪𐑯 𐑐𐑮𐑴𐑓𐑲𐑤",
"account.unfollow": "𐑳𐑯𐑓𐑪𐑤𐑴",
"account.unmute": "𐑳𐑯𐑥𐑿𐑑 @{name}",
"account.unsubscribe": "𐑳𐑯𐑕𐑩𐑚𐑕𐑒𐑮𐑲𐑚 𐑑 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑓𐑮𐑪𐑥 @{name}",
"account_gallery.none": "𐑯𐑴 𐑥𐑰𐑛𐑾 𐑑 𐑖𐑴.",
"account_search.placeholder": "𐑕𐑻𐑗 𐑓 𐑩𐑯 𐑩𐑒𐑬𐑯𐑑",
"account_timeline.column_settings.show_pinned": "𐑖𐑴 𐑐𐑦𐑯𐑛 𐑐𐑴𐑕𐑑𐑕",
"admin.awaiting_approval.approved_message": "{acct} 𐑢𐑪𐑟 𐑩𐑐𐑮𐑵𐑝𐑛!",
"admin.awaiting_approval.empty_message": "𐑞𐑺 𐑦𐑟 𐑯𐑴𐑚𐑪𐑛𐑦 𐑢𐑱𐑑𐑦𐑙 𐑓 𐑩𐑐𐑮𐑵𐑝𐑩𐑤. 𐑢𐑧𐑯 𐑩 𐑯𐑿 𐑿𐑟𐑼 𐑕𐑲𐑯𐑟 𐑳𐑐, 𐑿 𐑒𐑨𐑯 𐑮𐑦𐑝𐑿 𐑞𐑧𐑥 𐑣𐑽.",
"admin.awaiting_approval.rejected_message": "{acct} 𐑢𐑪𐑟 𐑮𐑦𐑡𐑧𐑒𐑑𐑩𐑛.",
"admin.dashboard.registration_mode.approval_hint": "𐑿𐑟𐑼𐑟 𐑒𐑨𐑯 𐑕𐑲𐑯 𐑳𐑐, 𐑚𐑳𐑑 𐑞𐑺 𐑩𐑒𐑬𐑯𐑑 𐑴𐑯𐑤𐑦 𐑜𐑧𐑑𐑕 𐑨𐑒𐑑𐑦𐑝𐑱𐑑𐑩𐑛 𐑢𐑧𐑯 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯 𐑩𐑐𐑮𐑵𐑝𐑟 𐑦𐑑.",
"admin.dashboard.registration_mode.approval_label": "𐑩𐑐𐑮𐑵𐑝𐑩𐑤 𐑮𐑦𐑒𐑢𐑲𐑼𐑛",
"admin.dashboard.registration_mode.closed_hint": "𐑯𐑴𐑚𐑪𐑛𐑦 𐑒𐑨𐑯 𐑕𐑲𐑯 𐑳𐑐. 𐑿 𐑒𐑨𐑯 𐑕𐑑𐑦𐑤 𐑦𐑯𐑝𐑲𐑑 𐑐𐑰𐑐𐑩𐑤.",
"admin.dashboard.registration_mode.closed_label": "𐑒𐑤𐑴𐑟𐑛",
"admin.dashboard.registration_mode.open_hint": "𐑧𐑯𐑦𐑢𐑳𐑯 𐑒𐑨𐑯 𐑡𐑶𐑯.",
"admin.dashboard.registration_mode.open_label": "𐑴𐑐𐑩𐑯",
"admin.dashboard.registration_mode_label": "𐑮𐑧𐑡𐑦𐑕𐑑𐑮𐑱𐑖𐑩𐑯𐑟",
"admin.dashboard.settings_saved": "𐑕𐑧𐑑𐑦𐑙𐑟 𐑕𐑱𐑝𐑛!",
"admin.dashcounters.domain_count_label": "𐑐𐑽𐑟",
"admin.dashcounters.mau_label": "𐑥𐑳𐑯𐑔𐑤𐑦 𐑨𐑒𐑑𐑦𐑝 𐑿𐑟𐑼𐑟",
"admin.dashcounters.retention_label": "𐑿𐑟𐑼 𐑮𐑦𐑑𐑧𐑯𐑖𐑩𐑯",
"admin.dashcounters.status_count_label": "𐑐𐑴𐑕𐑑𐑕",
"admin.dashcounters.user_count_label": "𐑑𐑴𐑑𐑩𐑤 𐑿𐑟𐑼𐑟",
"admin.dashwidgets.email_list_header": "𐑰𐑥𐑱𐑤 𐑤𐑦𐑕𐑑",
"admin.dashwidgets.software_header": "𐑕𐑪𐑓𐑑𐑢𐑺",
"admin.latest_accounts_panel.expand_message": "𐑒𐑤𐑦𐑒 𐑑 𐑕𐑰 {count} 𐑥𐑹 {count, plural, one {account} other {accounts}}",
"admin.latest_accounts_panel.title": "𐑤𐑱𐑑𐑩𐑕𐑑 𐑩𐑒𐑬𐑯𐑑𐑕",
"admin.moderation_log.empty_message": "𐑿 𐑣𐑨𐑝 𐑯𐑪𐑑 𐑐𐑼𐑓𐑹𐑥𐑛 𐑧𐑯𐑦 𐑥𐑪𐑛𐑼𐑱𐑖𐑩𐑯 𐑨𐑒𐑖𐑩𐑯𐑟 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 do, 𐑩 𐑣𐑦𐑕𐑑𐑼𐑦 𐑢𐑦𐑤 𐑚𐑰 𐑖𐑴𐑯 𐑣𐑽.",
"admin.reports.actions.close": "𐑒𐑤𐑴𐑟",
"admin.reports.actions.view_status": "𐑝𐑿 𐑐𐑴𐑕𐑑",
"admin.reports.empty_message": "𐑞𐑺 𐑸 𐑯𐑴 𐑴𐑐𐑩𐑯 𐑮𐑦𐑐𐑹𐑑𐑕. 𐑦𐑓 𐑩 𐑿𐑟𐑼 𐑜𐑧𐑑𐑕 𐑮𐑦𐑐𐑹𐑑𐑩𐑛, 𐑞𐑱 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"admin.reports.report_closed_message": "𐑮𐑦𐑐𐑹𐑑 𐑪𐑯 @{name} 𐑢𐑪𐑟 𐑒𐑤𐑴𐑟𐑛",
"admin.reports.report_title": "𐑮𐑦𐑐𐑹𐑑 𐑪𐑯 {acct}",
"admin.statuses.actions.delete_status": "𐑛𐑦𐑤𐑰𐑑 𐑐𐑴𐑕𐑑",
"admin.statuses.actions.mark_status_not_sensitive": "𐑥𐑸𐑒 𐑐𐑴𐑕𐑑 𐑯𐑪𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"admin.statuses.actions.mark_status_sensitive": "𐑥𐑸𐑒 𐑐𐑴𐑕𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"admin.statuses.status_deleted_message": "𐑐𐑴𐑕𐑑 𐑚𐑲 @{acct} 𐑢𐑪𐑟 𐑛𐑦𐑤𐑰𐑑𐑩𐑛",
"admin.statuses.status_marked_message_not_sensitive": "𐑐𐑴𐑕𐑑 𐑚𐑲 @{acct} 𐑢𐑪𐑟 𐑥𐑸𐑒𐑑 𐑯𐑪𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"admin.statuses.status_marked_message_sensitive": "𐑐𐑴𐑕𐑑 𐑚𐑲 @{acct} 𐑢𐑪𐑟 𐑥𐑸𐑒𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"admin.user_index.empty": "𐑯𐑴 𐑿𐑟𐑼𐑟 𐑓𐑬𐑯𐑛.",
"admin.user_index.search_input_placeholder": "𐑣𐑵 𐑸 𐑿 𐑤𐑫𐑒𐑦𐑙 for?",
"admin.users.actions.deactivate_user": "𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑 @{name}",
"admin.users.actions.delete_user": "𐑛𐑦𐑤𐑰𐑑 @{name}",
"admin.users.actions.demote_to_moderator": "𐑛𐑦𐑥𐑴𐑑 @{name} 𐑑 𐑩 𐑥𐑪𐑛𐑼𐑱𐑑𐑼",
"admin.users.actions.demote_to_moderator_message": "@{acct} 𐑢𐑪𐑟 𐑛𐑦𐑥𐑴𐑑𐑩𐑛 𐑑 𐑩 𐑥𐑪𐑛𐑼𐑱𐑑𐑼",
"admin.users.actions.demote_to_user": "𐑛𐑦𐑥𐑴𐑑 @{name} 𐑑 𐑩 𐑮𐑧𐑜𐑘𐑩𐑤𐑼 𐑿𐑟𐑼",
"admin.users.actions.demote_to_user_message": "@{acct} 𐑢𐑪𐑟 𐑛𐑦𐑥𐑴𐑑𐑩𐑛 𐑑 𐑩 𐑮𐑧𐑜𐑘𐑩𐑤𐑼 𐑿𐑟𐑼",
"admin.users.actions.promote_to_admin": "𐑐𐑮𐑩𐑥𐑴𐑑 @{name} 𐑑 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯",
"admin.users.actions.promote_to_admin_message": "@{acct} 𐑢𐑪𐑟 𐑐𐑮𐑩𐑥𐑴𐑑𐑩𐑛 𐑑 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯",
"admin.users.actions.promote_to_moderator": "𐑐𐑮𐑩𐑥𐑴𐑑 @{name} 𐑑 𐑩 𐑥𐑪𐑛𐑼𐑱𐑑𐑼",
"admin.users.actions.promote_to_moderator_message": "@{acct} 𐑢𐑪𐑟 𐑐𐑮𐑩𐑥𐑴𐑑𐑩𐑛 𐑑 𐑩 𐑥𐑪𐑛𐑼𐑱𐑑𐑼",
"admin.users.actions.suggest_user": "𐑕𐑩𐑡𐑧𐑕𐑑 @{name}",
"admin.users.actions.unsuggest_user": "𐑳𐑯𐑕𐑩𐑡𐑧𐑕𐑑 @{name}",
"admin.users.actions.unverify_user": "𐑳𐑯𐑝𐑧𐑮𐑦𐑓𐑲 @{name}",
"admin.users.actions.verify_user": "𐑝𐑧𐑮𐑦𐑓𐑲 @{name}",
"admin.users.user_deactivated_message": "@{acct} 𐑢𐑪𐑟 𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑𐑩𐑛",
"admin.users.user_deleted_message": "@{acct} 𐑢𐑪𐑟 𐑛𐑦𐑤𐑰𐑑𐑩𐑛",
"admin.users.user_suggested_message": "@{acct} 𐑢𐑪𐑟 𐑕𐑩𐑡𐑧𐑕𐑑𐑩𐑛",
"admin.users.user_unsuggested_message": "@{acct} 𐑢𐑪𐑟 𐑳𐑯𐑕𐑩𐑡𐑧𐑕𐑑𐑩𐑛",
"admin.users.user_unverified_message": "@{acct} 𐑢𐑪𐑟 𐑳𐑯𐑝𐑧𐑮𐑦𐑓𐑲𐑛",
"admin.users.user_verified_message": "@{acct} 𐑢𐑪𐑟 𐑝𐑧𐑮𐑦𐑓𐑲𐑛",
"admin_nav.awaiting_approval": "𐑩𐑢𐑱𐑑𐑦𐑙 𐑩𐑐𐑮𐑵𐑝𐑩𐑤",
"admin_nav.dashboard": "𐑛𐑨𐑖𐑚𐑹𐑛",
"admin_nav.reports": "𐑮𐑦𐑐𐑹𐑑𐑕",
"alert.unexpected.clear_cookies": "𐑒𐑤𐑽 𐑒𐑫𐑒𐑦𐑟 𐑯 𐑚𐑮𐑬𐑟𐑼 𐑛𐑱𐑑𐑩",
"alert.unexpected.help_text": "𐑦𐑓 𐑞 𐑐𐑮𐑪𐑚𐑤𐑩𐑥 𐑐𐑼𐑕𐑦𐑕𐑑𐑕, 𐑐𐑤𐑰𐑟 𐑯𐑴𐑑𐑦𐑓𐑲 𐑩 𐑕𐑲𐑑 𐑨𐑛𐑥𐑦𐑯 𐑢𐑦𐑞 𐑩 𐑕𐑒𐑮𐑰𐑯𐑖𐑪𐑑 𐑯 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑩𐑚𐑬𐑑 𐑘𐑹 𐑢𐑧𐑚 𐑚𐑮𐑬𐑟𐑼. 𐑿 𐑥𐑱 𐑷𐑤𐑕𐑴 {clear_cookies} (𐑞𐑦𐑕 𐑢𐑦𐑤 𐑤𐑪𐑜 𐑿 𐑬𐑑).",
"alert.unexpected.message": "𐑩𐑯 𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑧𐑮𐑼 occurred.",
"alert.unexpected.return_home": "𐑮𐑦𐑑𐑻𐑯 𐑣𐑴𐑥",
"alert.unexpected.title": "𐑵𐑐𐑕!",
"aliases.account.add": "𐑒𐑮𐑦𐑱𐑑 𐑱𐑤𐑾𐑕",
"aliases.account_label": "𐑴𐑤𐑛 𐑩𐑒𐑬𐑯𐑑:",
"aliases.aliases_list_delete": "𐑳𐑯𐑤𐑦𐑙𐑒 𐑱𐑤𐑾𐑕",
"aliases.search": "𐑕𐑻𐑗 𐑘𐑹 𐑴𐑤𐑛 𐑩𐑒𐑬𐑯𐑑",
"aliases.success.add": "𐑩𐑒𐑬𐑯𐑑 𐑱𐑤𐑾𐑕 𐑒𐑮𐑦𐑱𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"aliases.success.remove": "𐑩𐑒𐑬𐑯𐑑 𐑱𐑤𐑾𐑕 𐑮𐑦𐑥𐑵𐑝𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"app_create.name_label": "𐑨𐑐 𐑯𐑱𐑥",
"app_create.name_placeholder": "e.g. 'Soapbox'",
"app_create.redirect_uri_label": "𐑮𐑰𐑛𐑦𐑮𐑧𐑒𐑑 URIs",
"app_create.restart": "𐑒𐑮𐑦𐑱𐑑 𐑩𐑯𐑳𐑞𐑼",
"app_create.results.app_label": "𐑨𐑐",
"app_create.results.explanation_text": "𐑿 𐑒𐑮𐑦𐑱𐑑𐑩𐑛 𐑩 𐑯𐑿 𐑨𐑐 𐑯 𐑑𐑴𐑒𐑩𐑯! 𐑐𐑤𐑰𐑟 𐑒𐑪𐑐𐑦 𐑞 𐑒𐑮𐑦𐑛𐑧𐑯𐑖𐑩𐑤𐑟 𐑕𐑳𐑥𐑢𐑺; 𐑿 𐑢𐑦𐑤 𐑯𐑪𐑑 𐑕𐑰 𐑞𐑧𐑥 𐑩𐑜𐑱𐑯 𐑭𐑓𐑑𐑼 𐑯𐑨𐑝𐑦𐑜𐑱𐑑𐑦𐑙 𐑩𐑢𐑱 𐑓𐑮𐑪𐑥 𐑞𐑦𐑕 𐑐𐑱𐑡.",
"app_create.results.explanation_title": "𐑨𐑐 𐑒𐑮𐑦𐑱𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"app_create.results.token_label": "OAuth 𐑑𐑴𐑒𐑩𐑯",
"app_create.scopes_label": "𐑕𐑒𐑴𐑐𐑕",
"app_create.scopes_placeholder": "e.g. 'read write follow'",
"app_create.submit": "𐑒𐑮𐑦𐑱𐑑 𐑨𐑐",
"app_create.website_label": "𐑢𐑧𐑚𐑕𐑲𐑑",
"auth.invalid_credentials": "𐑮𐑪𐑙 𐑿𐑟𐑼𐑯𐑱𐑥 𐑹 𐑐𐑭𐑕𐑢𐑻𐑛",
"auth.logged_out": "𐑤𐑪𐑜𐑛 𐑬𐑑.",
"backups.actions.create": "𐑒𐑮𐑦𐑱𐑑 𐑚𐑨𐑒𐑳𐑐",
"backups.empty_message": "𐑯𐑴 𐑚𐑨𐑒𐑳𐑐𐑕 𐑓𐑬𐑯𐑛. {action}",
"backups.empty_message.action": "𐑒𐑮𐑦𐑱𐑑 𐑢𐑳𐑯 𐑯𐑬?",
"backups.pending": "𐑐𐑧𐑯𐑛𐑦𐑙",
"boost_modal.combo": "𐑿 𐑒𐑨𐑯 𐑐𐑮𐑧𐑕 {combo} 𐑑 𐑕𐑒𐑦𐑐 𐑞𐑦𐑕 𐑯𐑧𐑒𐑕𐑑 𐑑𐑲𐑥",
"bundle_column_error.body": "𐑕𐑳𐑥𐑔𐑦𐑙 𐑢𐑧𐑯𐑑 𐑮𐑪𐑙 𐑢𐑲𐑤 𐑤𐑴𐑛𐑦𐑙 𐑞𐑦𐑕 𐑒𐑩𐑥𐑐𐑴𐑯𐑩𐑯𐑑.",
"bundle_column_error.retry": "𐑑𐑮𐑲 𐑩𐑜𐑱𐑯",
"bundle_column_error.title": "𐑯𐑧𐑑𐑢𐑻𐑒 𐑧𐑮𐑼",
"bundle_modal_error.close": "𐑒𐑤𐑴𐑟",
"bundle_modal_error.message": "𐑕𐑳𐑥𐑔𐑦𐑙 𐑢𐑧𐑯𐑑 𐑮𐑪𐑙 𐑢𐑲𐑤 𐑤𐑴𐑛𐑦𐑙 𐑞𐑦𐑕 𐑒𐑩𐑥𐑐𐑴𐑯𐑩𐑯𐑑.",
"bundle_modal_error.retry": "𐑑𐑮𐑲 𐑩𐑜𐑱𐑯",
"chat_box.actions.close": "𐑒𐑤𐑴𐑟 𐑗𐑨𐑑",
"chat_box.actions.send": "𐑕𐑧𐑯𐑛",
"chat_box.input.placeholder": "𐑕𐑧𐑯𐑛 𐑩 𐑥𐑧𐑕𐑦𐑡…",
"chat_panels.main_window.empty": "𐑯𐑴 𐑗𐑨𐑑𐑕 𐑓𐑬𐑯𐑛. 𐑑 𐑕𐑑𐑸𐑑 𐑩 𐑗𐑨𐑑, 𐑝𐑦𐑟𐑦𐑑 𐑩 𐑿𐑟𐑼𐑟 𐑐𐑮𐑴𐑓𐑲𐑤.",
"chat_panels.main_window.title": "𐑗𐑨𐑑𐑕",
"chats.actions.delete": "𐑛𐑦𐑤𐑰𐑑 𐑥𐑧𐑕𐑦𐑡",
"chats.actions.more": "𐑥𐑹",
"chats.actions.report": "𐑮𐑦𐑐𐑹𐑑 𐑿𐑟𐑼",
"chats.attachment": "𐑩𐑑𐑨𐑗𐑥𐑩𐑯𐑑",
"chats.attachment_image": "𐑦𐑥𐑦𐑡",
"chats.audio_toggle_off": "𐑷𐑛𐑦𐑴 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯 𐑪𐑓",
"chats.audio_toggle_on": "𐑷𐑛𐑦𐑴 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯 on",
"chats.dividers.today": "𐑑𐑩𐑛𐑱",
"chats.search_placeholder": "𐑕𐑑𐑸𐑑 𐑩 𐑗𐑨𐑑 𐑢𐑦𐑞…",
"column.admin.awaiting_approval": "𐑩𐑢𐑱𐑑𐑦𐑙 𐑩𐑐𐑮𐑵𐑝𐑩𐑤",
"column.admin.dashboard": "𐑛𐑨𐑖𐑚𐑹𐑛",
"column.admin.moderation_log": "𐑥𐑪𐑛𐑼𐑱𐑖𐑩𐑯 𐑤𐑪𐑜",
"column.admin.reports": "𐑮𐑦𐑐𐑹𐑑𐑕",
"column.admin.reports.menu.moderation_log": "𐑥𐑪𐑛𐑼𐑱𐑖𐑩𐑯 𐑤𐑪𐑜",
"column.admin.users": "𐑿𐑟𐑼𐑟",
"column.aliases": "𐑩𐑒𐑬𐑯𐑑 𐑱𐑤𐑾𐑕𐑩𐑟",
"column.aliases.create_error": "𐑧𐑮𐑼 𐑒𐑮𐑦𐑱𐑑𐑦𐑙 𐑱𐑤𐑾𐑕",
"column.aliases.delete": "𐑛𐑦𐑤𐑰𐑑",
"column.aliases.delete_error": "𐑧𐑮𐑼 𐑛𐑦𐑤𐑰𐑑𐑦𐑙 𐑱𐑤𐑾𐑕",
"column.aliases.subheading_add_new": "𐑨𐑛 𐑯𐑿 𐑱𐑤𐑾𐑕",
"column.aliases.subheading_aliases": "𐑒𐑳𐑮𐑩𐑯𐑑 𐑱𐑤𐑾𐑕𐑩𐑟",
"column.app_create": "𐑒𐑮𐑦𐑱𐑑 𐑨𐑐",
"column.backups": "𐑚𐑨𐑒𐑳𐑐𐑕",
"column.blocks": "𐑚𐑤𐑪𐑒𐑑 𐑿𐑟𐑼𐑟",
"column.bookmarks": "𐑚𐑫𐑒𐑥𐑸𐑒𐑕",
"column.chats": "𐑗𐑨𐑑𐑕",
"column.community": "𐑤𐑴𐑒𐑩𐑤 𐑑𐑲𐑥𐑤𐑲𐑯",
"column.crypto_donate": "𐑛𐑴𐑯𐑱𐑑 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦",
"column.developers": "𐑛𐑦𐑝𐑧𐑤𐑩𐑐𐑼𐑟",
"column.direct": "𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡𐑩𐑟",
"column.directory": "𐑚𐑮𐑬𐑟 𐑐𐑮𐑴𐑓𐑲𐑤s",
"column.domain_blocks": "𐑣𐑦𐑛𐑩𐑯 𐑛𐑴𐑥𐑱𐑯𐑟",
"column.edit_profile": "𐑧𐑛𐑦𐑑 𐑐𐑮𐑴𐑓𐑲𐑤",
"column.export_data": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑛𐑱𐑑𐑩",
"column.favourited_statuses": "𐑤𐑲𐑒𐑑 𐑐𐑴𐑕𐑑𐑕",
"column.favourites": "𐑤𐑲𐑒𐑕",
"column.federation_restrictions": "𐑓𐑧𐑛𐑼𐑱𐑖𐑩𐑯 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟",
"column.filters": "𐑥𐑿𐑑𐑩𐑛 𐑢𐑻𐑛𐑟",
"column.filters.add_new": "𐑨𐑛 𐑯𐑿 𐑓𐑦𐑤𐑑𐑼",
"column.filters.conversations": "𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯𐑟",
"column.filters.create_error": "𐑧𐑮𐑼 𐑨𐑛𐑦𐑙 𐑓𐑦𐑤𐑑𐑼",
"column.filters.delete": "𐑛𐑦𐑤𐑰𐑑",
"column.filters.delete_error": "𐑧𐑮𐑼 𐑛𐑦𐑤𐑰𐑑𐑦𐑙 𐑓𐑦𐑤𐑑𐑼",
"column.filters.drop_header": "𐑛𐑮𐑪𐑐 𐑦𐑯𐑕𐑑𐑧𐑛 𐑝 𐑣𐑲𐑛",
"column.filters.drop_hint": "𐑓𐑦𐑤𐑑𐑼𐑛 𐑐𐑴𐑕𐑑𐑕 𐑢𐑦𐑤 𐑛𐑦𐑕𐑩𐑐𐑽 𐑦𐑮𐑦𐑝𐑻𐑕𐑩𐑚𐑤𐑦, 𐑰𐑝𐑩𐑯 𐑦𐑓 𐑓𐑦𐑤𐑑𐑼 𐑦𐑟 𐑤𐑱𐑑𐑼 𐑮𐑦𐑥𐑵𐑝𐑛",
"column.filters.expires": "𐑦𐑒𐑕𐑐𐑲𐑼 𐑭𐑓𐑑𐑼",
"column.filters.expires_hint": "𐑧𐑒𐑕𐑐𐑦𐑮𐑱𐑖𐑩𐑯 𐑛𐑱𐑑𐑕 𐑸 𐑯𐑪𐑑 𐑒𐑳𐑮𐑩𐑯𐑑𐑤𐑦 𐑕𐑩𐑐𐑹𐑑𐑩𐑛",
"column.filters.home_timeline": "𐑣𐑴𐑥 𐑑𐑲𐑥𐑤𐑲𐑯",
"column.filters.keyword": "𐑒𐑰𐑢𐑻𐑛 𐑹 𐑓𐑮𐑱𐑟",
"column.filters.notifications": "𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"column.filters.public_timeline": "𐑐𐑳𐑚𐑤𐑦𐑒 𐑑𐑲𐑥𐑤𐑲𐑯",
"column.filters.subheading_add_new": "𐑨𐑛 𐑯𐑿 𐑓𐑦𐑤𐑑𐑼",
"column.filters.subheading_filters": "𐑒𐑳𐑮𐑩𐑯𐑑 𐑓𐑦𐑤𐑑𐑼𐑟",
"column.filters.whole_word_header": "𐑣𐑴𐑤 𐑢𐑻𐑛",
"column.filters.whole_word_hint": "𐑢𐑧𐑯 𐑞 𐑒𐑰𐑢𐑻𐑛 𐑹 𐑓𐑮𐑱𐑟 𐑦𐑟 𐑨𐑤𐑓𐑩𐑯𐑿𐑥𐑧𐑮𐑦𐑒 𐑴𐑯𐑤𐑦, 𐑦𐑑 𐑢𐑦𐑤 𐑴𐑯𐑤𐑦 𐑚𐑰 𐑩𐑐𐑤𐑲𐑛 𐑦𐑓 𐑦𐑑 𐑥𐑨𐑗𐑩𐑟 𐑞 𐑣𐑴𐑤 𐑢𐑻𐑛",
"column.follow_requests": "𐑓𐑪𐑤𐑴 𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑕",
"column.followers": "𐑓𐑪𐑤𐑴𐑼𐑟",
"column.following": "𐑓𐑪𐑤𐑴𐑦𐑙",
"column.groups": "𐑜𐑮𐑵𐑐𐑕",
"column.home": "𐑣𐑴𐑥",
"column.import_data": "𐑦𐑥𐑐𐑹𐑑 𐑛𐑱𐑑𐑩",
"column.info": "𐑕𐑻𐑝𐑼 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯",
"column.lists": "𐑤𐑦𐑕𐑑𐑕",
"column.mentions": "𐑥𐑧𐑯𐑖𐑩𐑯𐑟",
"column.mfa": "𐑥𐑳𐑤𐑑𐑦-𐑓𐑨𐑒𐑑𐑼 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯",
"column.mfa_cancel": "𐑒𐑨𐑯𐑕𐑩𐑤",
"column.mfa_confirm_button": "𐑒𐑩𐑯𐑓𐑻𐑥",
"column.mfa_disable_button": "𐑛𐑦𐑕𐑱𐑚𐑩𐑤",
"column.mfa_setup": "𐑐𐑮𐑩𐑕𐑰𐑛 𐑑 𐑕𐑧𐑑𐑳𐑐",
"column.mutes": "𐑥𐑿𐑑𐑩𐑛 𐑿𐑟𐑼𐑟",
"column.notifications": "𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"column.pins": "𐑐𐑦𐑯𐑛 𐑐𐑴𐑕𐑑𐑕",
"column.preferences": "𐑐𐑮𐑧𐑓𐑼𐑩𐑯𐑕𐑩𐑟",
"column.profile_directory": "𐑐𐑮𐑴𐑓𐑲𐑤 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦",
"column.public": "𐑓𐑧𐑛𐑼𐑱𐑑𐑩𐑛 𐑑𐑲𐑥𐑤𐑲𐑯",
"column.reactions": "𐑮𐑦𐑨𐑒𐑖𐑩𐑯𐑟",
"column.reblogs": "𐑮𐑰𐑐𐑴𐑕𐑑𐑕",
"column.remote": "𐑓𐑧𐑛𐑼𐑱𐑑𐑩𐑛 𐑑𐑲𐑥𐑤𐑲𐑯",
"column.scheduled_statuses": "𐑖𐑧𐑡𐑵𐑤𐑛 𐑐𐑴𐑕𐑑𐑕",
"column.search": "𐑕𐑻𐑗",
"column.security": "𐑕𐑦𐑒𐑘𐑫𐑼𐑦𐑑𐑦",
"column.soapbox_config": "·𐑕𐑴𐑐𐑚𐑪𐑒𐑕 𐑒𐑩𐑯𐑓𐑦𐑜",
"column_back_button.label": "𐑚𐑨𐑒",
"column_forbidden.body": "𐑿 𐑛𐑵 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑐𐑼𐑥𐑦𐑖𐑩𐑯 𐑑 𐑨𐑒𐑕𐑧𐑕 𐑞𐑦𐑕 𐑐𐑱𐑡.",
"column_forbidden.title": "𐑓𐑼𐑚𐑦𐑛𐑩𐑯",
"column_header.hide_settings": "𐑣𐑲𐑛 𐑕𐑧𐑑𐑦𐑙𐑟",
"column_header.show_settings": "𐑖𐑴 𐑕𐑧𐑑𐑦𐑙𐑟",
"community.column_settings.media_only": "𐑥𐑰𐑛𐑾 𐑴𐑯𐑤𐑦",
"community.column_settings.title": "𐑤𐑴𐑒𐑩𐑤 𐑑𐑲𐑥𐑤𐑲𐑯 𐑕𐑧𐑑𐑦𐑙𐑟",
"compose.character_counter.title": "𐑿𐑟𐑛 {chars} 𐑬𐑑 𐑝 {maxChars} 𐑒𐑨𐑮𐑩𐑒𐑑𐑼𐑟",
"compose.invalid_schedule": "𐑿 𐑥𐑳𐑕𐑑 𐑖𐑧𐑡𐑵𐑤 𐑩 𐑐𐑴𐑕𐑑 𐑨𐑑 𐑤𐑰𐑕𐑑 5 𐑥𐑦𐑯𐑦𐑑𐑕 𐑬𐑑.",
"compose.submit_success": "𐑘𐑹 𐑐𐑴𐑕𐑑 𐑢𐑪𐑟 𐑕𐑧𐑯𐑑",
"compose_form.direct_message_warning": "𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑢𐑦𐑤 𐑴𐑯𐑤𐑦 𐑚𐑰 𐑕𐑧𐑯𐑑 𐑑 𐑞 𐑥𐑧𐑯𐑖𐑩𐑯𐑛 𐑿𐑟𐑼𐑟.",
"compose_form.hashtag_warning": "𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑢𐑴𐑯𐑑 𐑚𐑰 𐑤𐑦𐑕𐑑𐑩𐑛 𐑳𐑯𐑛𐑼 𐑧𐑯𐑦 𐑣𐑨𐑖𐑑𐑨𐑜 𐑨𐑟 𐑦𐑑 𐑦𐑟 𐑳𐑯𐑤𐑦𐑕𐑑𐑩𐑛. 𐑴𐑯𐑤𐑦 𐑐𐑳𐑚𐑤𐑦𐑒 𐑐𐑴𐑕𐑑𐑕 𐑒𐑨𐑯 𐑚𐑰 𐑕𐑻𐑗𐑑 𐑚𐑲 𐑣𐑨𐑖𐑑𐑨𐑜.",
"compose_form.lock_disclaimer": "𐑘𐑹 𐑩𐑒𐑬𐑯𐑑 𐑦𐑟 𐑯𐑪𐑑 {locked}. 𐑧𐑯𐑦𐑢𐑳𐑯 𐑒𐑨𐑯 𐑓𐑪𐑤𐑴 𐑿 𐑑 𐑝𐑿 𐑘𐑹 𐑓𐑪𐑤𐑴𐑼-𐑴𐑯𐑤𐑦 𐑐𐑴𐑕𐑑𐑕.",
"compose_form.lock_disclaimer.lock": "𐑤𐑪𐑒𐑑",
"compose_form.markdown.marked": "𐑐𐑴𐑕𐑑 𐑥𐑸𐑒𐑛𐑬𐑯 𐑦𐑯𐑱𐑚𐑩𐑤𐑛",
"compose_form.markdown.unmarked": "𐑐𐑴𐑕𐑑 𐑥𐑸𐑒𐑛𐑬𐑯 𐑛𐑦𐑕𐑱𐑚𐑩𐑤𐑛",
"compose_form.message": "𐑥𐑧𐑕𐑦𐑡",
"compose_form.placeholder": "𐑢𐑪𐑑𐑕 𐑪𐑯 𐑘𐑹 𐑥𐑲𐑯𐑛?",
"compose_form.poll.add_option": "𐑨𐑛 𐑩 𐑗𐑶𐑕",
"compose_form.poll.duration": "𐑐𐑴𐑤 𐑛𐑘𐑫𐑼𐑱𐑖𐑩𐑯",
"compose_form.poll.option_placeholder": "𐑗𐑶𐑕 {number}",
"compose_form.poll.remove_option": "𐑮𐑦𐑥𐑵𐑝 𐑞𐑦𐑕 𐑗𐑶𐑕",
"compose_form.poll.switch_to_multiple": "𐑗𐑱𐑯𐑡 𐑐𐑴𐑤 𐑑 𐑩𐑤𐑬 𐑥𐑳𐑤𐑑𐑦𐑐𐑩𐑤 𐑗𐑶𐑕𐑩𐑟",
"compose_form.poll.switch_to_single": "𐑗𐑱𐑯𐑡 𐑐𐑴𐑤 𐑑 𐑩𐑤𐑬 𐑓 𐑩 𐑕𐑦𐑙𐑜𐑩𐑤 𐑗𐑶𐑕",
"compose_form.publish": "𐑐𐑳𐑚𐑤𐑦𐑖",
"compose_form.publish_loud": "{publish}!",
"compose_form.schedule": "𐑖𐑧𐑡𐑵𐑤",
"compose_form.scheduled_statuses.click_here": "𐑒𐑤𐑦𐑒 𐑣𐑽",
"compose_form.scheduled_statuses.message": "𐑿 𐑣𐑨𐑝 𐑖𐑧𐑡𐑵𐑤𐑛 𐑐𐑴𐑕𐑑𐑕. {click_here} 𐑑 𐑕𐑰 𐑞𐑧𐑥.",
"compose_form.sensitive.hide": "𐑥𐑸𐑒 𐑥𐑰𐑛𐑾 𐑨𐑟 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"compose_form.sensitive.marked": "𐑥𐑰𐑛𐑾 𐑦𐑟 𐑥𐑸𐑒𐑑 𐑨𐑟 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"compose_form.sensitive.unmarked": "𐑥𐑰𐑛𐑾 𐑦𐑟 𐑯𐑪𐑑 𐑥𐑸𐑒𐑑 𐑨𐑟 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"compose_form.spoiler.marked": "𐑑𐑧𐑒𐑕𐑑 𐑦𐑟 𐑣𐑦𐑛𐑩𐑯 behind 𐑢𐑹𐑯𐑦𐑙",
"compose_form.spoiler.unmarked": "𐑑𐑧𐑒𐑕𐑑 𐑦𐑟 𐑯𐑪𐑑 𐑣𐑦𐑛𐑩𐑯",
"compose_form.spoiler_placeholder": "𐑮𐑲𐑑 𐑘𐑹 𐑢𐑹𐑯𐑦𐑙 𐑣𐑽",
"confirmation_modal.cancel": "𐑒𐑨𐑯𐑕𐑩𐑤",
"confirmations.admin.deactivate_user.confirm": "𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑 @{name}",
"confirmations.admin.deactivate_user.message": "𐑿 𐑸 𐑩𐑚𐑬𐑑 𐑑 𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑 @{acct}. 𐑛𐑰𐑨𐑒𐑑𐑦𐑝𐑱𐑑𐑦𐑙 𐑩 𐑿𐑟𐑼 𐑦𐑟 𐑩 𐑮𐑦𐑝𐑻𐑕𐑩𐑚𐑩𐑤 𐑨𐑒𐑖𐑩𐑯.",
"confirmations.admin.delete_local_user.checkbox": "𐑲 𐑳𐑯𐑛𐑼𐑕𐑑𐑨𐑯𐑛 𐑞𐑨𐑑 𐑲 𐑨𐑥 𐑩𐑚𐑬𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 𐑩 𐑤𐑴𐑒𐑩𐑤 𐑿𐑟𐑼.",
"confirmations.admin.delete_status.confirm": "𐑛𐑦𐑤𐑰𐑑 𐑐𐑴𐑕𐑑",
"confirmations.admin.delete_status.message": "𐑿 𐑸 𐑩𐑚𐑬𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 𐑩 𐑐𐑴𐑕𐑑 𐑚𐑲 @{acct}. 𐑞𐑦𐑕 𐑨𐑒𐑖𐑩𐑯 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑳𐑯𐑛𐑳𐑯.",
"confirmations.admin.delete_user.confirm": "𐑛𐑦𐑤𐑰𐑑 @{name}",
"confirmations.admin.delete_user.message": "𐑿 𐑸 𐑩𐑚𐑬𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 @{acct}. ¡𐑞𐑦𐑕 𐑦𐑟 𐑩 𐑛𐑦𐑕𐑑𐑮𐑳𐑒𐑑𐑦𐑝 𐑨𐑒𐑖𐑩𐑯 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑳𐑯𐑛𐑳𐑯!",
"confirmations.admin.mark_status_not_sensitive.confirm": "𐑥𐑸𐑒 𐑐𐑴𐑕𐑑 𐑯𐑪𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"confirmations.admin.mark_status_not_sensitive.message": "𐑿 𐑸 𐑩𐑚𐑬𐑑 𐑑 𐑥𐑸𐑒 𐑩 𐑐𐑴𐑕𐑑 𐑚𐑲 @{acct} 𐑯𐑪𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝.",
"confirmations.admin.mark_status_sensitive.confirm": "𐑥𐑸𐑒 𐑐𐑴𐑕𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"confirmations.admin.mark_status_sensitive.message": "𐑿 𐑸 𐑩𐑚𐑬𐑑 𐑑 𐑥𐑸𐑒 𐑩 𐑐𐑴𐑕𐑑 𐑚𐑲 @{acct} 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝.",
"confirmations.admin.reject_user.confirm": "𐑮𐑦𐑡𐑧𐑒𐑑 @{name}",
"confirmations.admin.reject_user.message": "𐑿 𐑸 𐑩𐑚𐑬𐑑 𐑑 𐑮𐑦𐑡𐑧𐑒𐑑 @{acct} 𐑮𐑧𐑡𐑦𐑕𐑑𐑮𐑱𐑖𐑩𐑯 𐑮𐑦𐑒𐑢𐑧𐑕𐑑. 𐑞𐑦𐑕 𐑨𐑒𐑖𐑩𐑯 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑳𐑯𐑛𐑳𐑯.",
"confirmations.block.block_and_report": "𐑚𐑤𐑪𐑒 𐑯 𐑮𐑦𐑐𐑹𐑑",
"confirmations.block.confirm": "𐑚𐑤𐑪𐑒",
"confirmations.block.message": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑚𐑤𐑪𐑒 {name}?",
"confirmations.delete.confirm": "𐑛𐑦𐑤𐑰𐑑",
"confirmations.delete.heading": "𐑛𐑦𐑤𐑰𐑑 𐑐𐑴𐑕𐑑",
"confirmations.delete.message": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑?",
"confirmations.delete_list.confirm": "𐑛𐑦𐑤𐑰𐑑",
"confirmations.delete_list.message": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑐𐑻𐑥𐑩𐑯𐑩𐑯𐑑𐑤𐑦 𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 list?",
"confirmations.domain_block.confirm": "𐑣𐑲𐑛 𐑦𐑯𐑑𐑲𐑼 𐑛𐑴𐑥𐑱𐑯",
"confirmations.domain_block.message": "𐑸 𐑿 𐑮𐑾𐑤𐑦, 𐑮𐑾𐑤𐑦 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑚𐑤𐑪𐑒 𐑞 𐑦𐑯𐑑𐑲𐑼 {domain}? 𐑦𐑯 𐑥𐑴𐑕𐑑 𐑒𐑱𐑕𐑩𐑟 𐑩 𐑓𐑿 𐑑𐑸𐑜𐑩𐑑𐑩𐑛 𐑚𐑤𐑪𐑒𐑕 𐑹 𐑥𐑿𐑑𐑕 𐑸 𐑕𐑩𐑓𐑦𐑖𐑩𐑯𐑑 𐑯 𐑐𐑮𐑧𐑓𐑼𐑩𐑚𐑩𐑤. 𐑿 𐑢𐑦𐑤 𐑯𐑪𐑑 𐑕𐑰 𐑒𐑪𐑯𐑑𐑧𐑯𐑑 𐑓𐑮𐑪𐑥 𐑞𐑨𐑑 𐑛𐑴𐑥𐑱𐑯 𐑦𐑯 𐑧𐑯𐑦 𐑐𐑳𐑚𐑤𐑦𐑒 𐑑𐑲𐑥𐑤𐑲𐑯𐑟 𐑹 𐑘𐑹 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟.",
"confirmations.mute.confirm": "𐑥𐑿𐑑",
"confirmations.mute.message": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑥𐑿𐑑 {name}?",
"confirmations.redraft.confirm": "𐑛𐑦𐑤𐑰𐑑 𐑯 𐑮𐑰𐑛𐑮𐑭𐑓𐑑",
"confirmations.redraft.message": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑯 𐑮𐑰𐑛𐑮𐑭𐑓𐑑 𐑦𐑑? 𐑓𐑱𐑝𐑼𐑦𐑑𐑕 𐑯 𐑮𐑰𐑐𐑴𐑕𐑑𐑕 𐑢𐑦𐑤 𐑚𐑰 𐑤𐑪𐑕𐑑, 𐑯 𐑮𐑦𐑐𐑤𐑲𐑟 𐑑 𐑞 𐑼𐑦𐑡𐑦𐑯𐑩𐑤 𐑐𐑴𐑕𐑑 𐑢𐑦𐑤 𐑚𐑰 𐑹𐑓𐑩𐑯𐑛.",
"confirmations.register.needs_approval": "𐑘𐑹 𐑩𐑒𐑬𐑯𐑑 𐑢𐑦𐑤 𐑚𐑰 𐑥𐑨𐑯𐑘𐑫𐑩𐑤𐑦 𐑩𐑐𐑮𐑵𐑝𐑛 𐑚𐑲 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯. 𐑐𐑤𐑰𐑟 𐑚𐑰 𐑐𐑱𐑖𐑩𐑯𐑑 𐑢𐑲𐑤 𐑢𐑰 𐑮𐑦𐑝𐑿 𐑘𐑹 𐑛𐑰𐑑𐑱𐑤𐑟.",
"confirmations.register.needs_confirmation": "𐑐𐑤𐑰𐑟 𐑗𐑧𐑒 𐑘𐑹 𐑦𐑯𐑚𐑪𐑒𐑕 𐑨𐑑 {email} 𐑓 𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑦𐑯𐑕𐑑𐑮𐑳𐑒𐑖𐑩𐑯𐑟. 𐑿 𐑢𐑦𐑤 𐑯𐑰𐑛 𐑑 𐑝𐑧𐑮𐑦𐑓𐑲 𐑘𐑹 𐑰𐑥𐑱𐑤 𐑩𐑛𐑮𐑧𐑕 𐑑 𐑒𐑩𐑯𐑑𐑦𐑯𐑿.",
"confirmations.reply.confirm": "𐑮𐑦𐑐𐑤𐑲",
"confirmations.reply.message": "𐑮𐑦𐑐𐑤𐑲𐑦𐑙 𐑯𐑬 𐑢𐑦𐑤 𐑴𐑝𐑼𐑲𐑑 𐑞 𐑥𐑧𐑕𐑦𐑡 𐑿 𐑸 𐑒𐑳𐑮𐑩𐑯𐑑𐑤𐑦 𐑒𐑩𐑥𐑐𐑴𐑟𐑦𐑙. 𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑐𐑮𐑩𐑕𐑰𐑛?",
"confirmations.unfollow.confirm": "𐑳𐑯𐑓𐑪𐑤𐑴",
"confirmations.unfollow.message": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑳𐑯𐑓𐑪𐑤𐑴 {name}?",
"crypto_donate.explanation_box.message": "{siteTitle} 𐑩𐑒𐑕𐑧𐑐𐑑𐑕 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑛𐑴𐑯𐑱𐑖𐑩𐑯𐑟. 𐑿 𐑥𐑱 𐑕𐑧𐑯𐑛 𐑩 𐑛𐑴𐑯𐑱𐑖𐑩𐑯 𐑑 𐑧𐑯𐑦 𐑝 𐑞 𐑩𐑛𐑮𐑧𐑕𐑩𐑟 𐑚𐑦𐑤𐑴. 𐑔𐑨𐑙𐑒 𐑿 𐑓 𐑘𐑹 𐑕𐑩𐑐𐑹𐑑!",
"crypto_donate.explanation_box.title": "𐑕𐑧𐑯𐑛𐑦𐑙 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑛𐑴𐑯𐑱𐑖𐑩𐑯𐑟",
"crypto_donate_panel.actions.more": "𐑒𐑤𐑦𐑒 𐑑 𐑕𐑰 {count} 𐑥𐑹 {count, plural, one {wallet} other {wallets}}",
"crypto_donate_panel.heading": "𐑛𐑴𐑯𐑱𐑑 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦",
"crypto_donate_panel.intro.message": "{siteTitle} 𐑩𐑒𐑕𐑧𐑐𐑑𐑕 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑛𐑴𐑯𐑱𐑖𐑩𐑯𐑟 𐑑 fund our 𐑕𐑻𐑝𐑦𐑕. 𐑔𐑨𐑙𐑒 𐑿 𐑓 𐑘𐑹 𐑕𐑩𐑐𐑹𐑑!",
"datepicker.hint": "𐑖𐑧𐑡𐑵𐑤𐑛 𐑑 𐑐𐑴𐑕𐑑 𐑨𐑑…",
"developers.navigation.app_create_label": "𐑒𐑮𐑦𐑱𐑑 𐑩𐑯 𐑨𐑐",
"developers.navigation.intentional_error_label": "𐑑𐑮𐑦𐑜𐑼 𐑩𐑯 𐑧𐑮𐑼",
"direct.search_placeholder": "𐑕𐑧𐑯𐑛 𐑩 𐑥𐑧𐑕𐑦𐑡 to…",
"directory.federated": "𐑓𐑮𐑪𐑥 𐑯𐑴𐑯 ·𐑓𐑧𐑛𐑦𐑝𐑻𐑕",
"directory.local": "𐑓𐑮𐑪𐑥 {domain} 𐑴𐑯𐑤𐑦",
"directory.new_arrivals": "𐑯𐑿 𐑼𐑲𐑝𐑩𐑤𐑟",
"directory.recently_active": "𐑮𐑰𐑕𐑩𐑯𐑑𐑤𐑦 𐑨𐑒𐑑𐑦𐑝",
"donate": "𐑛𐑴𐑯𐑱𐑑",
"donate_crypto": "𐑛𐑴𐑯𐑱𐑑 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦",
"edit_federation.followers_only": "𐑣𐑲𐑛 𐑐𐑴𐑕𐑑𐑕 𐑦𐑒𐑕𐑧𐑐𐑑 𐑑 𐑓𐑪𐑤𐑴𐑼𐑟",
"edit_federation.force_nsfw": "𐑓𐑹𐑕 𐑩𐑑𐑨𐑗𐑥𐑩𐑯𐑑𐑕 𐑑 𐑚𐑰 𐑥𐑸𐑒𐑑 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"edit_federation.media_removal": "𐑕𐑑𐑮𐑦𐑐 𐑥𐑰𐑛𐑾",
"edit_federation.reject": "𐑮𐑦𐑡𐑧𐑒𐑑 𐑷𐑤 𐑨𐑒𐑑𐑦𐑝𐑦𐑑𐑦𐑟",
"edit_federation.save": "𐑕𐑱𐑝",
"edit_federation.success": "{host} 𐑓𐑧𐑛𐑼𐑱𐑖𐑩𐑯 𐑢𐑪𐑟 𐑳𐑐𐑛𐑱𐑑𐑩𐑛",
"edit_federation.unlisted": "𐑓𐑹𐑕 𐑐𐑴𐑕𐑑𐑕 𐑳𐑯𐑤𐑦𐑕𐑑𐑩𐑛",
"edit_profile.error": "𐑐𐑮𐑴𐑓𐑲𐑤 𐑳𐑐𐑛𐑱𐑑 𐑓𐑱𐑤𐑛",
"edit_profile.fields.accepts_email_list_label": "𐑕𐑩𐑚𐑕𐑒𐑮𐑲𐑚 𐑑 𐑯𐑿𐑟𐑤𐑧𐑑𐑼",
"edit_profile.fields.avatar_label": "𐑨𐑝𐑩𐑑𐑸",
"edit_profile.fields.bio_label": "𐑚𐑲𐑴",
"edit_profile.fields.bio_placeholder": "𐑑𐑧𐑤 𐑳𐑕 𐑩𐑚𐑬𐑑 𐑘𐑹𐑕𐑧𐑤𐑓.",
"edit_profile.fields.bot_label": "𐑞𐑦𐑕 𐑦𐑟 𐑩 𐑚𐑪𐑑 𐑩𐑒𐑬𐑯𐑑",
"edit_profile.fields.discoverable_label": "𐑩𐑤𐑬 𐑩𐑒𐑬𐑯𐑑 𐑛𐑦𐑕𐑒𐑳𐑝𐑼𐑦",
"edit_profile.fields.display_name_label": "𐑛𐑦𐑕𐑐𐑤𐑱 𐑯𐑱𐑥",
"edit_profile.fields.display_name_placeholder": "𐑯𐑱𐑥",
"edit_profile.fields.header_label": "𐑣𐑧𐑛𐑼",
"edit_profile.fields.hide_network_label": "𐑣𐑲𐑛 𐑯𐑧𐑑𐑢𐑻𐑒",
"edit_profile.fields.locked_label": "𐑤𐑪𐑒 𐑩𐑒𐑬𐑯𐑑",
"edit_profile.fields.meta_fields.content_placeholder": "𐑒𐑪𐑯𐑑𐑧𐑯𐑑",
"edit_profile.fields.meta_fields.label_placeholder": "𐑤𐑱𐑚𐑩𐑤",
"edit_profile.fields.meta_fields_label": "𐑐𐑮𐑴𐑓𐑲𐑤 𐑥𐑧𐑑𐑩𐑛𐑱𐑑𐑩",
"edit_profile.fields.stranger_notifications_label": "𐑚𐑤𐑪𐑒 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑓𐑮𐑪𐑥 strangers",
"edit_profile.fields.verified_display_name": "𐑝𐑧𐑮𐑦𐑓𐑲𐑛 𐑿𐑟𐑼𐑟 𐑥𐑱 𐑯𐑪𐑑 𐑳𐑐𐑛𐑱𐑑 𐑞𐑺 𐑛𐑦𐑕𐑐𐑤𐑱 𐑯𐑱𐑥",
"edit_profile.hints.accepts_email_list": "𐑪𐑐𐑑-𐑦𐑯 𐑑 𐑯𐑿𐑟 𐑯 𐑥𐑸𐑒𐑩𐑑𐑦𐑙 𐑳𐑐𐑛𐑱𐑑𐑕.",
"edit_profile.hints.avatar": "PNG, GIF 𐑹 JPG. 𐑢𐑦𐑤 𐑚𐑰 downscaled 𐑑 {size}",
"edit_profile.hints.bot": "𐑞𐑦𐑕 𐑩𐑒𐑬𐑯𐑑 𐑥𐑱𐑯𐑤𐑦 𐑐𐑼𐑓𐑹𐑥𐑟 𐑷𐑑𐑩𐑥𐑱𐑑𐑩𐑛 𐑨𐑒𐑖𐑩𐑯𐑟 𐑯 𐑥𐑲𐑑 𐑯𐑪𐑑 𐑚𐑰 𐑥𐑪𐑯𐑦𐑑𐑼𐑛",
"edit_profile.hints.discoverable": "𐑛𐑦𐑕𐑐𐑤𐑱 𐑩𐑒𐑬𐑯𐑑 𐑦𐑯 𐑐𐑮𐑴𐑓𐑲𐑤 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦 𐑯 𐑩𐑤𐑬 𐑦𐑯𐑛𐑧𐑒𐑕𐑦𐑙 𐑚𐑲 𐑦𐑒𐑕𐑑𐑻𐑯𐑩𐑤 𐑕𐑻𐑝𐑦𐑕𐑩𐑟",
"edit_profile.hints.header": "PNG, GIF 𐑹 JPG. 𐑢𐑦𐑤 𐑚𐑰 downscaled 𐑑 {size}",
"edit_profile.hints.hide_network": "𐑣𐑵 𐑿 𐑓𐑪𐑤𐑴 𐑯 𐑣𐑵 𐑓𐑪𐑤𐑴𐑟 𐑿 𐑢𐑦𐑤 𐑯𐑪𐑑 𐑚𐑰 𐑖𐑴𐑯 𐑪𐑯 𐑘𐑹 𐑐𐑮𐑴𐑓𐑲𐑤",
"edit_profile.hints.locked": "𐑮𐑦𐑒𐑢𐑲𐑼𐑟 𐑿 𐑑 𐑥𐑨𐑯𐑘𐑫𐑩𐑤𐑦 𐑩𐑐𐑮𐑵𐑝 𐑓𐑪𐑤𐑴𐑼𐑟",
"edit_profile.hints.meta_fields": "𐑿 𐑒𐑨𐑯 𐑣𐑨𐑝 𐑳𐑐 𐑑 {count, plural, one {# item} other {# items}} 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑨𐑟 𐑩 𐑑𐑱𐑚𐑩𐑤 𐑪𐑯 𐑘𐑹 𐑐𐑮𐑴𐑓𐑲𐑤",
"edit_profile.hints.stranger_notifications": "𐑴𐑯𐑤𐑦 𐑖𐑴 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑓𐑮𐑪𐑥 𐑐𐑰𐑐𐑩𐑤 𐑿 𐑓𐑪𐑤𐑴",
"edit_profile.meta_fields.add": "𐑨𐑛 𐑯𐑿 𐑲𐑑𐑩𐑥",
"edit_profile.save": "𐑕𐑱𐑝",
"edit_profile.success": "𐑐𐑮𐑴𐑓𐑲𐑤 𐑕𐑱𐑝𐑛!",
"embed.instructions": " 𐑦𐑥𐑚𐑧𐑛 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑪𐑯 𐑘𐑹 𐑢𐑧𐑚𐑕𐑲𐑑 𐑚𐑲 𐑒𐑪𐑐𐑦𐑦𐑙 𐑞 𐑒𐑴𐑛 𐑚𐑦𐑤𐑴.",
"embed.preview": "𐑣𐑽 𐑦𐑟 𐑢𐑪𐑑 𐑦𐑑 𐑢𐑦𐑤 𐑤𐑫𐑒 𐑤𐑲𐑒:",
"emoji_button.activity": "𐑨𐑒𐑑𐑦𐑝𐑦𐑑𐑦",
"emoji_button.custom": "𐑒𐑳𐑕𐑑𐑩𐑥",
"emoji_button.flags": "𐑓𐑤𐑨𐑜𐑟",
"emoji_button.food": "𐑓𐑵𐑛 𐑯 𐑛𐑮𐑦𐑙𐑒",
"emoji_button.label": "𐑦𐑯𐑕𐑻𐑑 𐑦𐑥𐑴𐑡𐑦",
"emoji_button.nature": "𐑯𐑱𐑗𐑼",
"emoji_button.not_found": "𐑯𐑴 𐑦𐑥𐑴𐑡𐑦𐑟!! (╯°□°)╯︵ ┻━┻",
"emoji_button.objects": "𐑪𐑚𐑡𐑧𐑒𐑑𐑕",
"emoji_button.people": "𐑐𐑰𐑐𐑩𐑤",
"emoji_button.recent": "𐑓𐑮𐑰𐑒𐑢𐑩𐑯𐑑𐑤𐑦 𐑿𐑟𐑛",
"emoji_button.search": "𐑕𐑻𐑗...",
"emoji_button.search_results": "𐑕𐑻𐑗 𐑮𐑦𐑟𐑳𐑤𐑑𐑕",
"emoji_button.symbols": "𐑕𐑦𐑥𐑚𐑩𐑤𐑟",
"emoji_button.travel": "𐑑𐑮𐑨𐑝𐑩𐑤 𐑯 𐑐𐑤𐑱𐑕𐑩𐑟",
"empty_column.account_blocked": "𐑿 𐑸 𐑚𐑤𐑪𐑒𐑑 𐑚𐑲 @{accountUsername}.",
"empty_column.account_favourited_statuses": "𐑞𐑦𐑕 𐑿𐑟𐑼 𐑛𐑳𐑟𐑩𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑤𐑲𐑒𐑑 𐑐𐑴𐑕𐑑𐑕 𐑘𐑧𐑑.",
"empty_column.account_timeline": "𐑯𐑴 𐑐𐑴𐑕𐑑𐑕 𐑣𐑽!",
"empty_column.account_unavailable": "𐑐𐑮𐑴𐑓𐑲𐑤 𐑳𐑯𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤",
"empty_column.aliases": "𐑿 𐑣𐑨𐑝𐑩𐑯𐑑 𐑒𐑮𐑦𐑱𐑑𐑩𐑛 𐑧𐑯𐑦 𐑩𐑒𐑬𐑯𐑑 𐑱𐑤𐑾𐑕 𐑘𐑧𐑑.",
"empty_column.aliases.suggestions": "𐑞𐑺 𐑸 𐑯𐑴 𐑩𐑒𐑬𐑯𐑑 𐑕𐑩𐑡𐑧𐑕𐑗𐑩𐑯𐑟 available 𐑓 𐑞 𐑐𐑮𐑩𐑝𐑲𐑛𐑩𐑛 term.",
"empty_column.blocks": "𐑿 𐑣𐑨𐑝𐑩𐑯𐑑 𐑚𐑤𐑪𐑒𐑑 𐑧𐑯𐑦 𐑿𐑟𐑼𐑟 𐑘𐑧𐑑.",
"empty_column.bookmarks": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑚𐑫𐑒𐑥𐑸𐑒𐑕 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 𐑨𐑛 𐑢𐑳𐑯, 𐑦𐑑 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.community": "𐑞 𐑤𐑴𐑒𐑩𐑤 𐑑𐑲𐑥𐑤𐑲𐑯 𐑦𐑟 𐑧𐑥𐑐𐑑𐑦. 𐑮𐑲𐑑 𐑕𐑳𐑥𐑔𐑦𐑙 𐑐𐑳𐑚𐑤𐑦𐑒𐑤𐑦 𐑑 𐑜𐑧𐑑 𐑞 𐑚𐑷𐑤 𐑮𐑴𐑤𐑦𐑙!",
"empty_column.direct": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡𐑩𐑟 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 𐑕𐑧𐑯𐑛 𐑹 𐑮𐑦𐑕𐑰𐑝 𐑢𐑳𐑯, 𐑦𐑑 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.domain_blocks": "𐑞𐑺 𐑸 𐑯𐑴 𐑣𐑦𐑛𐑩𐑯 𐑛𐑴𐑥𐑱𐑯𐑟 𐑘𐑧𐑑.",
"empty_column.favourited_statuses": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑤𐑲𐑒𐑑 𐑐𐑴𐑕𐑑𐑕 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 𐑤𐑲𐑒 𐑢𐑳𐑯, 𐑦𐑑 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.favourites": "𐑯𐑴 𐑢𐑳𐑯 𐑣𐑨𐑟 𐑤𐑲𐑒𐑑 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑕𐑳𐑥𐑢𐑳𐑯 𐑛𐑳𐑟, 𐑞𐑱 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.filters": "𐑿 𐑣𐑨𐑝𐑩𐑯𐑑 𐑒𐑮𐑦𐑱𐑑𐑩𐑛 𐑧𐑯𐑦 𐑥𐑿𐑑𐑩𐑛 𐑢𐑻𐑛𐑟 𐑘𐑧𐑑.",
"empty_column.follow_recommendations": "𐑤𐑫𐑒𐑕 𐑤𐑲𐑒 𐑯𐑴 𐑕𐑩𐑡𐑧𐑕𐑗𐑩𐑯𐑟 𐑒𐑫𐑛 𐑚𐑰 𐑡𐑧𐑯𐑼𐑱𐑑𐑩𐑛 𐑓 𐑿. 𐑿 𐑒𐑨𐑯 𐑑𐑮𐑲 𐑿𐑟𐑦𐑙 𐑕𐑻𐑗 𐑑 𐑤𐑫𐑒 𐑓 𐑐𐑰𐑐𐑩𐑤 𐑿 𐑥𐑲𐑑 𐑯𐑴 𐑹 𐑦𐑒𐑕𐑐𐑤𐑹 𐑑𐑮𐑧𐑯𐑛𐑦𐑙 𐑣𐑨𐑖𐑑𐑨𐑜𐑟.",
"empty_column.follow_requests": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑓𐑪𐑤𐑴 𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑕 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 𐑮𐑦𐑕𐑰𐑝 𐑢𐑳𐑯, 𐑦𐑑 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.group": "𐑞𐑺 𐑦𐑟 𐑯𐑳𐑔𐑦𐑙 𐑦𐑯 𐑞𐑦𐑕 𐑜𐑮𐑵𐑐 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑥𐑧𐑥𐑚𐑼𐑟 𐑝 𐑞𐑦𐑕 𐑜𐑮𐑵𐑐 𐑥𐑱𐑒 𐑯𐑿 𐑐𐑴𐑕𐑑𐑕, 𐑞𐑱 𐑢𐑦𐑤 𐑩𐑐𐑽 𐑣𐑽.",
"empty_column.hashtag": "𐑞𐑺 𐑦𐑟 𐑯𐑳𐑔𐑦𐑙 𐑦𐑯 𐑞𐑦𐑕 𐑣𐑨𐑖𐑑𐑨𐑜 𐑘𐑧𐑑.",
"empty_column.home": "𐑘𐑹 𐑣𐑴𐑥 𐑑𐑲𐑥𐑤𐑲𐑯 𐑦𐑟 𐑧𐑥𐑐𐑑𐑦! 𐑝𐑦𐑟𐑦𐑑 {public} 𐑑 𐑜𐑧𐑑 𐑕𐑑𐑸𐑑𐑩𐑛 𐑯 𐑥𐑰𐑑 𐑳𐑞𐑼 𐑿𐑟𐑼𐑟.",
"empty_column.home.local_tab": "𐑞 {site_title} tab",
"empty_column.list": "𐑞𐑺 𐑦𐑟 𐑯𐑳𐑔𐑦𐑙 𐑦𐑯 𐑞𐑦𐑕 𐑤𐑦𐑕𐑑 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑥𐑧𐑥𐑚𐑼𐑟 𐑝 𐑞𐑦𐑕 𐑤𐑦𐑕𐑑 𐑒𐑮𐑦𐑱𐑑 𐑯𐑿 𐑐𐑴𐑕𐑑𐑕, 𐑞𐑱 𐑢𐑦𐑤 𐑩𐑐𐑽 𐑣𐑽.",
"empty_column.lists": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑤𐑦𐑕𐑑𐑕 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 𐑒𐑮𐑦𐑱𐑑 𐑢𐑳𐑯, 𐑦𐑑 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.mutes": "𐑿 𐑣𐑨𐑝𐑩𐑯𐑑 𐑥𐑿𐑑𐑩𐑛 𐑧𐑯𐑦 𐑿𐑟𐑼𐑟 𐑘𐑧𐑑.",
"empty_column.notifications": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑘𐑧𐑑. 𐑦𐑯𐑑𐑼𐑨𐑒𐑑 𐑢𐑦𐑞 𐑳𐑞𐑼𐑟 𐑑 𐑕𐑑𐑸𐑑 𐑞 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯.",
"empty_column.public": "𐑞𐑺 𐑦𐑟 𐑯𐑳𐑔𐑦𐑙 𐑣𐑽! 𐑮𐑲𐑑 𐑕𐑳𐑥𐑔𐑦𐑙 𐑐𐑳𐑚𐑤𐑦𐑒𐑤𐑦, 𐑹 𐑥𐑨𐑯𐑘𐑫𐑩𐑤𐑦 𐑓𐑪𐑤𐑴 𐑿𐑟𐑼𐑟 𐑓𐑮𐑪𐑥 𐑳𐑞𐑼 𐑕𐑻𐑝𐑼𐑟 𐑑 𐑓𐑦𐑤 𐑦𐑑 𐑳𐑐",
"empty_column.remote": "𐑞𐑺 𐑦𐑟 𐑯𐑳𐑔𐑦𐑙 𐑣𐑽! 𐑥𐑨𐑯𐑘𐑫𐑩𐑤𐑦 𐑓𐑪𐑤𐑴 𐑿𐑟𐑼𐑟 𐑓𐑮𐑪𐑥 {instance} 𐑑 𐑓𐑦𐑤 𐑦𐑑 𐑳𐑐.",
"empty_column.scheduled_statuses": "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑖𐑧𐑡𐑵𐑤𐑛 𐑕𐑑𐑱𐑑𐑩𐑕𐑩𐑟 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑿 𐑨𐑛 𐑢𐑳𐑯, 𐑦𐑑 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"empty_column.search.accounts": "𐑞𐑺 𐑸 𐑯𐑴 𐑐𐑰𐑐𐑩𐑤 𐑮𐑦𐑟𐑳𐑤𐑑𐑕 𐑓 \"{term}\"",
"empty_column.search.hashtags": "𐑞𐑺 𐑸 𐑯𐑴 𐑣𐑨𐑖𐑑𐑨𐑜𐑟 𐑮𐑦𐑟𐑳𐑤𐑑𐑕 𐑓 \"{term}\"",
"empty_column.search.statuses": "𐑞𐑺 𐑸 𐑯𐑴 𐑐𐑴𐑕𐑑𐑕 𐑮𐑦𐑟𐑳𐑤𐑑𐑕 𐑓 \"{term}\"",
"export_data.actions.export": "𐑦𐑒𐑕𐑐𐑹𐑑",
"export_data.actions.export_blocks": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑚𐑤𐑪𐑒𐑕",
"export_data.actions.export_follows": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑓𐑪𐑤𐑴𐑟",
"export_data.actions.export_mutes": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑥𐑿𐑑𐑕",
"export_data.blocks_label": "𐑚𐑤𐑪𐑒𐑕",
"export_data.follows_label": "𐑓𐑪𐑤𐑴𐑟",
"export_data.hints.blocks": "𐑜𐑧𐑑 𐑩 CSV 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑩 𐑤𐑦𐑕𐑑 𐑝 𐑚𐑤𐑪𐑒𐑑 𐑩𐑒𐑬𐑯𐑑𐑕",
"export_data.hints.follows": "𐑜𐑧𐑑 𐑩 CSV 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑩 𐑤𐑦𐑕𐑑 𐑝 𐑓𐑪𐑤𐑴𐑛 𐑩𐑒𐑬𐑯𐑑𐑕",
"export_data.hints.mutes": "𐑜𐑧𐑑 𐑩 CSV 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑩 𐑤𐑦𐑕𐑑 𐑝 𐑥𐑿𐑑𐑩𐑛 𐑩𐑒𐑬𐑯𐑑𐑕",
"export_data.mutes_label": "𐑥𐑿𐑑𐑕",
"export_data.success.blocks": "𐑚𐑤𐑪𐑒𐑕 𐑦𐑒𐑕𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"export_data.success.followers": "𐑓𐑪𐑤𐑴𐑼𐑟 𐑦𐑒𐑕𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"export_data.success.mutes": "𐑥𐑿𐑑𐑕 𐑦𐑒𐑕𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"federation_restriction.federated_timeline_removal": "·𐑓𐑧𐑛𐑦𐑝𐑻𐑕 𐑑𐑲𐑥𐑤𐑲𐑯 𐑮𐑦𐑥𐑵𐑝𐑩𐑤",
"federation_restriction.followers_only": "𐑣𐑦𐑛𐑩𐑯 𐑦𐑒𐑕𐑧𐑐𐑑 𐑑 𐑓𐑪𐑤𐑴𐑼𐑟",
"federation_restriction.full_media_removal": "𐑓𐑫𐑤 𐑥𐑰𐑛𐑾 𐑮𐑦𐑥𐑵𐑝𐑩𐑤",
"federation_restriction.media_nsfw": "𐑩𐑑𐑨𐑗𐑥𐑩𐑯𐑑𐑕 𐑥𐑸𐑒𐑑 ⸰𐑯𐑕𐑓𐑢",
"federation_restriction.partial_media_removal": "𐑐𐑸𐑖𐑩𐑤 𐑥𐑰𐑛𐑾 𐑮𐑦𐑥𐑵𐑝𐑩𐑤",
"federation_restrictions.empty_message": "{siteTitle} 𐑣𐑨𐑟 𐑯𐑪𐑑 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑑𐑩𐑛 𐑧𐑯𐑦 𐑦𐑯𐑕𐑑𐑩𐑯𐑕𐑩𐑟.",
"federation_restrictions.explanation_box.message": "𐑯𐑹𐑥𐑩𐑤𐑦 𐑕𐑻𐑝𐑼𐑟 𐑪𐑯 𐑞 ·𐑓𐑧𐑛𐑦𐑝𐑻𐑕 𐑒𐑨𐑯 𐑒𐑩𐑥𐑿𐑯𐑦𐑒𐑱𐑑 𐑓𐑮𐑰𐑤𐑦. {siteTitle} 𐑣𐑨𐑟 𐑦𐑥𐑐𐑴𐑟𐑛 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟 𐑪𐑯 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑕𐑻𐑝𐑼𐑟.",
"federation_restrictions.explanation_box.title": "𐑦𐑯𐑕𐑑𐑩𐑯𐑕-specific policies",
"federation_restrictions.not_disclosed_message": "{siteTitle} 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑛𐑦𐑕𐑒𐑤𐑴𐑟 𐑓𐑧𐑛𐑼𐑱𐑖𐑩𐑯 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟 𐑔𐑮𐑵 𐑞 API.",
"fediverse_tab.explanation_box.dismiss": "𐑛𐑴𐑯𐑑 𐑖𐑴 𐑩𐑜𐑱𐑯",
"fediverse_tab.explanation_box.explanation": "{site_title} 𐑦𐑟 𐑐𐑸𐑑 𐑝 𐑞 ·𐑓𐑧𐑛𐑦𐑝𐑻𐑕, 𐑩 𐑕𐑴𐑖𐑩𐑤 𐑯𐑧𐑑𐑢𐑻𐑒 𐑥𐑱𐑛 𐑳𐑐 𐑝 𐑔𐑬𐑟𐑩𐑯𐑛𐑟 𐑝 𐑦𐑯𐑛𐑦𐑐𐑧𐑯𐑛𐑩𐑯𐑑 𐑕𐑴𐑖𐑩𐑤 𐑥𐑰𐑛𐑾 𐑕𐑲𐑑𐑕 (aka \"𐑕𐑻𐑝𐑼𐑟\"). 𐑞 𐑐𐑴𐑕𐑑𐑕 𐑿 𐑕𐑰 𐑣𐑽 𐑸 𐑓𐑮𐑪𐑥 3rd-𐑐𐑸𐑑𐑦 𐑕𐑻𐑝𐑼𐑟. 𐑿 𐑣𐑨𐑝 𐑞 𐑓𐑮𐑰𐑛𐑩𐑥 𐑑 𐑦𐑯𐑜𐑱𐑡 𐑢𐑦𐑞 𐑞𐑧𐑥, 𐑹 𐑑 𐑚𐑤𐑪𐑒 𐑧𐑯𐑦 𐑕𐑻𐑝𐑼 𐑿 𐑛𐑴𐑯𐑑 𐑤𐑲𐑒. 𐑐𐑱 𐑩𐑑𐑧𐑯𐑖𐑩𐑯 𐑑 𐑞 𐑓𐑫𐑤 𐑿𐑟𐑼𐑯𐑱𐑥 𐑭𐑓𐑑𐑼 𐑞 𐑕𐑧𐑒𐑩𐑯𐑛 @ 𐑕𐑦𐑥𐑚𐑩𐑤 𐑑 𐑯𐑴 𐑢𐑦𐑗 𐑕𐑻𐑝𐑼 𐑩 𐑐𐑴𐑕𐑑 𐑦𐑟 𐑓𐑮𐑪𐑥. 𐑑 𐑕𐑰 𐑴𐑯𐑤𐑦 {site_title} 𐑐𐑴𐑕𐑑𐑕, 𐑝𐑦𐑟𐑦𐑑 {local}.",
"fediverse_tab.explanation_box.title": "𐑢𐑪𐑑 𐑦𐑟 𐑞 ·𐑓𐑧𐑛𐑦𐑝𐑻𐑕?",
"filters.added": "𐑓𐑦𐑤𐑑𐑼 𐑨𐑛𐑩𐑛.",
"filters.context_header": "𐑓𐑦𐑤𐑑𐑼 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑𐑕",
"filters.context_hint": "𐑢𐑳𐑯 𐑹 𐑥𐑳𐑤𐑑𐑦𐑐𐑩𐑤 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑𐑕 𐑢𐑺 𐑞 𐑓𐑦𐑤𐑑𐑼 𐑖𐑫𐑛 𐑩𐑐𐑤𐑲",
"filters.filters_list_context_label": "𐑓𐑦𐑤𐑑𐑼 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑𐑕:",
"filters.filters_list_delete": "𐑛𐑦𐑤𐑰𐑑",
"filters.filters_list_details_label": "𐑓𐑦𐑤𐑑𐑼 𐑕𐑧𐑑𐑦𐑙𐑟:",
"filters.filters_list_drop": "𐑛𐑮𐑪𐑐",
"filters.filters_list_hide": "𐑣𐑲𐑛",
"filters.filters_list_phrase_label": "𐑒𐑰𐑢𐑻𐑛 𐑹 𐑓𐑮𐑱𐑟:",
"filters.filters_list_whole-word": "𐑣𐑴𐑤 𐑢𐑻𐑛",
"filters.removed": "𐑓𐑦𐑤𐑑𐑼 𐑛𐑦𐑤𐑰𐑑𐑩𐑛.",
"follow_recommendations.done": "𐑛𐑳𐑯",
"follow_recommendations.heading": "𐑓𐑪𐑤𐑴 𐑐𐑰𐑐𐑩𐑤 𐑿𐑛 𐑤𐑲𐑒 𐑑 𐑕𐑰 𐑐𐑴𐑕𐑑𐑕 𐑓𐑮𐑪𐑥! 𐑣𐑽 𐑸 𐑕𐑳𐑥 𐑕𐑩𐑡𐑧𐑕𐑗𐑩𐑯𐑟.",
"follow_recommendations.lead": "𐑐𐑴𐑕𐑑𐑕 𐑓𐑮𐑪𐑥 𐑐𐑰𐑐𐑩𐑤 𐑿 𐑓𐑪𐑤𐑴 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑦𐑯 𐑒𐑮𐑪𐑯𐑩𐑤𐑪𐑡𐑦𐑒𐑩𐑤 𐑹𐑛𐑼 𐑪𐑯 𐑘𐑹 𐑣𐑴𐑥 𐑓𐑰𐑛. 𐑛𐑴𐑯𐑑 𐑚𐑰 𐑩𐑓𐑮𐑱𐑛 𐑑 𐑥𐑱𐑒 𐑥𐑦𐑕𐑑𐑱𐑒𐑕, 𐑿 𐑒𐑨𐑯 𐑳𐑯𐑓𐑪𐑤𐑴 𐑐𐑰𐑐𐑩𐑤 𐑡𐑳𐑕𐑑 𐑨𐑟 𐑰𐑟𐑦𐑤𐑦 𐑧𐑯𐑦 𐑑𐑲𐑥!",
"follow_request.authorize": "𐑷𐑔𐑼𐑲𐑟",
"follow_request.reject": "𐑮𐑦𐑡𐑧𐑒𐑑",
"forms.copy": "𐑒𐑪𐑐𐑦",
"forms.hide_password": "𐑣𐑲𐑛 𐑐𐑭𐑕𐑢𐑻𐑛",
"forms.show_password": "𐑖𐑴 𐑐𐑭𐑕𐑢𐑻𐑛",
"getting_started.open_source_notice": "{code_name} 𐑦𐑟 𐑴𐑐𐑩𐑯 𐑕𐑹𐑕 𐑕𐑪𐑓𐑑𐑢𐑺. 𐑿 𐑒𐑨𐑯 𐑒𐑩𐑯𐑑𐑮𐑦𐑚𐑿𐑑 𐑹 𐑮𐑦𐑐𐑹𐑑 𐑦𐑖𐑵𐑟 𐑨𐑑 {code_link} (v{code_version}).",
"group.detail.archived_group": "𐑸𐑒𐑲𐑝𐑛 𐑜𐑮𐑵𐑐",
"group.members.empty": "𐑞𐑦𐑕 𐑜𐑮𐑵𐑐 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑟 𐑧𐑯𐑦 𐑥𐑧𐑥𐑚𐑼𐑟.",
"group.removed_accounts.empty": "𐑞𐑦𐑕 𐑜𐑮𐑵𐑐 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑟 𐑧𐑯𐑦 𐑮𐑦𐑥𐑵𐑝𐑛 𐑩𐑒𐑬𐑯𐑑𐑕.",
"groups.card.join": "𐑡𐑶𐑯",
"groups.card.members": "𐑥𐑧𐑥𐑚𐑼𐑟",
"groups.card.roles.admin": "𐑘𐑫𐑼 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯",
"groups.card.roles.member": "𐑘𐑫𐑼 𐑩 𐑥𐑧𐑥𐑚𐑼",
"groups.card.view": "𐑝𐑿",
"groups.create": "𐑒𐑮𐑦𐑱𐑑 𐑜𐑮𐑵𐑐",
"groups.detail.role_admin": "𐑘𐑫𐑼 𐑩𐑯 𐑨𐑛𐑥𐑦𐑯",
"groups.edit": "𐑧𐑛𐑦𐑑",
"groups.form.coverImage": "𐑳𐑐𐑤𐑴𐑛 𐑯𐑿 𐑚𐑨𐑯𐑼 𐑦𐑥𐑦𐑡 (𐑪𐑐𐑖𐑩𐑯𐑩𐑤)",
"groups.form.coverImageChange": "𐑚𐑨𐑯𐑼 𐑦𐑥𐑦𐑡 𐑕𐑦𐑤𐑧𐑒𐑑𐑩𐑛",
"groups.form.create": "𐑒𐑮𐑦𐑱𐑑 𐑜𐑮𐑵𐑐",
"groups.form.description": "𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯",
"groups.form.title": "𐑑𐑲𐑑𐑩𐑤",
"groups.form.update": "𐑳𐑐𐑛𐑱𐑑 𐑜𐑮𐑵𐑐",
"groups.join": "𐑡𐑶𐑯 𐑜𐑮𐑵𐑐",
"groups.leave": "𐑤𐑰𐑝 𐑜𐑮𐑵𐑐",
"groups.removed_accounts": "𐑮𐑦𐑥𐑵𐑝𐑛 𐑩𐑒𐑬𐑯𐑑𐑕",
"groups.sidebar-panel.item.no_recent_activity": "𐑯𐑴 𐑮𐑰𐑕𐑩𐑯𐑑 𐑨𐑒𐑑𐑦𐑝𐑦𐑑𐑦",
"groups.sidebar-panel.item.view": "𐑯𐑿 𐑐𐑴𐑕𐑑𐑕",
"groups.sidebar-panel.show_all": "𐑖𐑴 𐑷𐑤",
"groups.sidebar-panel.title": "𐑜𐑮𐑵𐑐𐑕 𐑘𐑫𐑼 𐑦𐑯",
"groups.tab_admin": "𐑥𐑨𐑯𐑦𐑡",
"groups.tab_featured": "𐑓𐑰𐑗𐑼𐑛",
"groups.tab_member": "𐑥𐑧𐑥𐑚𐑼",
"hashtag.column_header.tag_mode.all": "𐑯 {additional}",
"hashtag.column_header.tag_mode.any": "𐑹 {additional}",
"hashtag.column_header.tag_mode.none": "𐑢𐑦𐑞𐑬𐑑 {additional}",
"header.about.label": "𐑩𐑚𐑬𐑑",
"header.back_to.label": "𐑚𐑨𐑒 𐑑 {siteTitle}",
"header.home.label": "𐑣𐑴𐑥",
"header.login.label": "𐑤𐑪𐑜 𐑦𐑯",
"home.column_settings.show_direct": "𐑖𐑴 𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡𐑩𐑟",
"home.column_settings.show_reblogs": "𐑖𐑴 𐑮𐑰𐑐𐑴𐑕𐑑𐑕",
"home.column_settings.show_replies": "𐑖𐑴 𐑮𐑦𐑐𐑤𐑲𐑟",
"home.column_settings.title": "𐑣𐑴𐑥 𐑕𐑧𐑑𐑦𐑙𐑟",
"home_column.lists": "𐑤𐑦𐑕𐑑𐑕",
"home_column_header.all": "𐑷𐑤",
"home_column_header.fediverse": "·𐑓𐑧𐑛𐑦𐑝𐑻𐑕",
"home_column_header.home": "𐑣𐑴𐑥",
"icon_button.icons": "𐑲𐑒𐑪𐑯𐑟",
"icon_button.label": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑲𐑒𐑪𐑯",
"icon_button.not_found": "𐑯𐑴 𐑲𐑒𐑪𐑯𐑟!! (╯°□°)╯︵ ┻━┻",
"import_data.actions.import": "𐑦𐑥𐑐𐑹𐑑",
"import_data.actions.import_blocks": "𐑦𐑥𐑐𐑹𐑑 𐑚𐑤𐑪𐑒𐑕",
"import_data.actions.import_follows": "𐑦𐑥𐑐𐑹𐑑 𐑓𐑪𐑤𐑴𐑟",
"import_data.actions.import_mutes": "𐑦𐑥𐑐𐑹𐑑 𐑥𐑿𐑑𐑕",
"import_data.blocks_label": "𐑚𐑤𐑪𐑒𐑕",
"import_data.follows_label": "𐑓𐑪𐑤𐑴𐑟",
"import_data.hints.blocks": "CSV 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑩 𐑤𐑦𐑕𐑑 𐑝 𐑚𐑤𐑪𐑒𐑑 𐑩𐑒𐑬𐑯𐑑𐑕",
"import_data.hints.follows": "CSV 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑩 𐑤𐑦𐑕𐑑 𐑝 𐑓𐑪𐑤𐑴𐑛 𐑩𐑒𐑬𐑯𐑑𐑕",
"import_data.hints.mutes": "CSV 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑩 𐑤𐑦𐑕𐑑 𐑝 𐑥𐑿𐑑𐑩𐑛 𐑩𐑒𐑬𐑯𐑑𐑕",
"import_data.mutes_label": "𐑥𐑿𐑑𐑕",
"import_data.success.blocks": "𐑚𐑤𐑪𐑒𐑕 𐑦𐑥𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"import_data.success.followers": "𐑓𐑪𐑤𐑴𐑼𐑟 𐑦𐑥𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"import_data.success.mutes": "𐑥𐑿𐑑𐑕 𐑦𐑥𐑐𐑹𐑑𐑩𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦",
"intervals.full.days": "{number, plural, one {# day} other {# days}}",
"intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
"intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
"introduction.federation.action": "𐑯𐑧𐑒𐑕𐑑",
"introduction.federation.home.headline": "𐑣𐑴𐑥",
"introduction.federation.home.text": "𐑐𐑴𐑕𐑑𐑕 𐑓𐑮𐑪𐑥 𐑐𐑰𐑐𐑩𐑤 𐑿 𐑓𐑪𐑤𐑴 𐑢𐑦𐑤 𐑩𐑐𐑽 𐑦𐑯 𐑘𐑹 𐑣𐑴𐑥 𐑓𐑰𐑛. 𐑿 𐑒𐑨𐑯 𐑓𐑪𐑤𐑴 𐑧𐑯𐑦𐑢𐑳𐑯 𐑪𐑯 𐑧𐑯𐑦 𐑕𐑻𐑝𐑼!",
"introduction.interactions.action": "Finish tutorial!",
"introduction.interactions.favourite.headline": "𐑓𐑱𐑝𐑼𐑦𐑑",
"introduction.interactions.favourite.text": "𐑿 𐑒𐑨𐑯 𐑕𐑱𐑝 𐑩 𐑐𐑴𐑕𐑑 𐑓 𐑤𐑱𐑑𐑼, 𐑯 let 𐑞 𐑷𐑔𐑼 𐑯𐑴 𐑞𐑨𐑑 𐑿 𐑤𐑲𐑒𐑑 𐑦𐑑, 𐑚𐑲 𐑓𐑱𐑝𐑼𐑦𐑑𐑦𐑙 𐑦𐑑.",
"introduction.interactions.reblog.headline": "𐑮𐑰𐑐𐑴𐑕𐑑",
"introduction.interactions.reblog.text": "𐑿 𐑒𐑨𐑯 𐑖𐑺 𐑳𐑞𐑼 𐑐𐑰𐑐𐑩𐑤𐑟 𐑐𐑴𐑕𐑑𐑕 𐑢𐑦𐑞 𐑘𐑹 𐑓𐑪𐑤𐑴𐑼𐑟 𐑚𐑲 𐑮𐑰𐑐𐑴𐑕𐑑𐑦𐑙 𐑞𐑧𐑥.",
"introduction.interactions.reply.headline": "𐑮𐑦𐑐𐑤𐑲",
"introduction.interactions.reply.text": "𐑿 𐑒𐑨𐑯 𐑮𐑦𐑐𐑤𐑲 𐑑 𐑳𐑞𐑼 𐑐𐑰𐑐𐑩𐑤𐑟 𐑯 𐑘𐑹 𐑴𐑯 𐑐𐑴𐑕𐑑𐑕, 𐑢𐑦𐑗 𐑢𐑦𐑤 chain 𐑞𐑧𐑥 𐑑𐑩𐑜𐑧𐑞𐑼 𐑦𐑯 𐑩 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯.",
"introduction.welcome.action": "𐑤𐑧𐑑𐑕 𐑜𐑴!",
"introduction.welcome.headline": "𐑓𐑻𐑕𐑑 𐑕𐑑𐑧𐑐𐑕",
"introduction.welcome.text": "𐑢𐑧𐑤𐑒𐑩𐑥 𐑑 𐑞 ·𐑓𐑧𐑛𐑦𐑝𐑻𐑕! 𐑦𐑯 𐑩 𐑓𐑿 𐑥𐑴𐑥𐑩𐑯𐑑𐑕, 𐑿𐑤 𐑚𐑰 𐑱𐑚𐑩𐑤 𐑑 𐑚𐑮𐑷𐑛𐑒𐑭𐑕𐑑 𐑥𐑧𐑕𐑦𐑡𐑩𐑟 𐑯 𐑑𐑷𐑒 𐑑 𐑘𐑹 𐑓𐑮𐑧𐑯𐑛𐑟 𐑩𐑒𐑮𐑪𐑕 𐑩 𐑢𐑲𐑛 𐑝𐑼𐑲𐑩𐑑𐑦 𐑝 𐑕𐑻𐑝𐑼𐑟. 𐑚𐑳𐑑 𐑞𐑦𐑕 𐑕𐑻𐑝𐑼, {domain}, 𐑦𐑟 special—it 𐑣𐑴𐑕𐑑𐑕 𐑘𐑹 𐑐𐑮𐑴𐑓𐑲𐑤, so 𐑮𐑦𐑥𐑧𐑥𐑚𐑼 𐑦𐑑𐑕 𐑯𐑱𐑥.",
"keyboard_shortcuts.back": "𐑑 𐑯𐑨𐑝𐑦𐑜𐑱𐑑 𐑚𐑨𐑒",
"keyboard_shortcuts.blocked": "𐑑 𐑴𐑐𐑩𐑯 𐑚𐑤𐑪𐑒𐑑 𐑿𐑟𐑼𐑟 𐑤𐑦𐑕𐑑",
"keyboard_shortcuts.boost": "𐑑 𐑮𐑰𐑐𐑴𐑕𐑑",
"keyboard_shortcuts.compose": "𐑑 𐑓𐑴𐑒𐑩𐑕 𐑞 𐑒𐑩𐑥𐑐𐑴𐑟 𐑑𐑧𐑒𐑕𐑑𐑺𐑾",
"keyboard_shortcuts.down": "𐑑 𐑥𐑵𐑝 𐑛𐑬𐑯 𐑦𐑯 𐑞 𐑤𐑦𐑕𐑑",
"keyboard_shortcuts.enter": "𐑑 𐑴𐑐𐑩𐑯 𐑐𐑴𐑕𐑑",
"keyboard_shortcuts.favourite": "𐑑 𐑤𐑲𐑒",
"keyboard_shortcuts.favourites": "𐑑 𐑴𐑐𐑩𐑯 𐑤𐑲𐑒𐑕 𐑤𐑦𐑕𐑑",
"keyboard_shortcuts.heading": "𐑒𐑰𐑚𐑹𐑛 𐑖𐑹𐑑𐑒𐑳𐑑𐑕",
"keyboard_shortcuts.home": "𐑑 𐑴𐑐𐑩𐑯 𐑣𐑴𐑥 𐑑𐑲𐑥𐑤𐑲𐑯",
"keyboard_shortcuts.hotkey": "Hotkey",
"keyboard_shortcuts.legend": "𐑑 𐑛𐑦𐑕𐑐𐑤𐑱 𐑞𐑦𐑕 legend",
"keyboard_shortcuts.mention": "𐑑 𐑥𐑧𐑯𐑖𐑩𐑯 𐑷𐑔𐑼",
"keyboard_shortcuts.muted": "𐑑 𐑴𐑐𐑩𐑯 𐑥𐑿𐑑𐑩𐑛 𐑿𐑟𐑼𐑟 𐑤𐑦𐑕𐑑",
"keyboard_shortcuts.my_profile": "𐑑 𐑴𐑐𐑩𐑯 𐑘𐑹 𐑐𐑮𐑴𐑓𐑲𐑤",
"keyboard_shortcuts.notifications": "𐑑 𐑴𐑐𐑩𐑯 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑒𐑪𐑤𐑩𐑥",
"keyboard_shortcuts.open_media": "𐑑 𐑴𐑐𐑩𐑯 𐑥𐑰𐑛𐑾",
"keyboard_shortcuts.pinned": "𐑑 𐑴𐑐𐑩𐑯 𐑐𐑦𐑯𐑛 𐑐𐑴𐑕𐑑𐑕 𐑤𐑦𐑕𐑑",
"keyboard_shortcuts.profile": "𐑑 𐑴𐑐𐑩𐑯 𐑷𐑔𐑼𐑟 𐑐𐑮𐑴𐑓𐑲𐑤",
"keyboard_shortcuts.react": "𐑑 𐑮𐑦𐑨𐑒𐑑",
"keyboard_shortcuts.reply": "𐑑 𐑮𐑦𐑐𐑤𐑲",
"keyboard_shortcuts.requests": "𐑑 𐑴𐑐𐑩𐑯 𐑓𐑪𐑤𐑴 𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑕 𐑤𐑦𐑕𐑑",
"keyboard_shortcuts.search": "𐑑 𐑓𐑴𐑒𐑩𐑕 𐑕𐑻𐑗",
"keyboard_shortcuts.toggle_hidden": "𐑑 𐑖𐑴/𐑣𐑲𐑛 𐑑𐑧𐑒𐑕𐑑 behind CW",
"keyboard_shortcuts.toggle_sensitivity": "𐑑 𐑖𐑴/𐑣𐑲𐑛 𐑥𐑰𐑛𐑾",
"keyboard_shortcuts.toot": "𐑑 𐑕𐑑𐑸𐑑 𐑩 𐑯𐑿 𐑐𐑴𐑕𐑑",
"keyboard_shortcuts.unfocus": "𐑑 𐑳𐑯-𐑓𐑴𐑒𐑩𐑕 𐑒𐑩𐑥𐑐𐑴𐑟 𐑑𐑧𐑒𐑕𐑑𐑺𐑾/𐑕𐑻𐑗",
"keyboard_shortcuts.up": "𐑑 𐑥𐑵𐑝 𐑳𐑐 𐑦𐑯 𐑞 𐑤𐑦𐑕𐑑",
"lightbox.close": "𐑒𐑤𐑴𐑟",
"lightbox.next": "𐑯𐑧𐑒𐑕𐑑",
"lightbox.previous": "𐑐𐑮𐑰𐑝𐑾𐑕",
"lightbox.view_context": "𐑝𐑿 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑",
"list.click_to_add": "𐑒𐑤𐑦𐑒 𐑣𐑽 𐑑 𐑨𐑛 𐑐𐑰𐑐𐑩𐑤",
"list.label": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑤𐑦𐑕𐑑…",
"list.select": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑤𐑦𐑕𐑑",
"list_adder.header_title": "𐑨𐑛 𐑹 𐑮𐑦𐑥𐑵𐑝 𐑓𐑮𐑪𐑥 𐑤𐑦𐑕𐑑𐑕",
"lists.account.add": "𐑨𐑛 𐑑 𐑤𐑦𐑕𐑑",
"lists.account.remove": "𐑮𐑦𐑥𐑵𐑝 𐑓𐑮𐑪𐑥 𐑤𐑦𐑕𐑑",
"lists.edit": "𐑧𐑛𐑦𐑑 𐑤𐑦𐑕𐑑",
"lists.edit.submit": "𐑗𐑱𐑯𐑡 𐑑𐑲𐑑𐑩𐑤",
"lists.new.create": "𐑨𐑛 𐑤𐑦𐑕𐑑",
"lists.new.create_title": "𐑒𐑮𐑦𐑱𐑑",
"lists.new.save_title": "𐑕𐑱𐑝 𐑑𐑲𐑑𐑩𐑤",
"lists.new.title_placeholder": "𐑯𐑿 𐑤𐑦𐑕𐑑 𐑑𐑲𐑑𐑩𐑤",
"lists.search": "𐑕𐑻𐑗 𐑩𐑥𐑳𐑙 𐑐𐑰𐑐𐑩𐑤 𐑿 𐑓𐑪𐑤𐑴",
"lists.subheading": "𐑘𐑹 𐑤𐑦𐑕𐑑𐑕",
"loading_indicator.label": "𐑤𐑴𐑛𐑦𐑙...",
"login.fields.instance_label": "𐑦𐑯𐑕𐑑𐑩𐑯𐑕",
"login.fields.instance_placeholder": "example.com",
"login.fields.otp_code_hint": "𐑧𐑯𐑑𐑼 𐑞 two-factor 𐑒𐑴𐑛 𐑡𐑧𐑯𐑼𐑱𐑑𐑩𐑛 𐑚𐑲 𐑘𐑹 𐑓𐑴𐑯 𐑨𐑐 𐑹 𐑿𐑕 𐑢𐑳𐑯 𐑝 𐑘𐑹 𐑮𐑦𐑒𐑳𐑝𐑼𐑦 𐑒𐑴𐑛𐑟",
"login.fields.otp_code_label": "Two-factor 𐑒𐑴𐑛:",
"login.fields.password_placeholder": "𐑐𐑭𐑕𐑢𐑻𐑛",
"login.fields.username_placeholder": "𐑿𐑟𐑼𐑯𐑱𐑥",
"login.log_in": "𐑤𐑪𐑜 𐑦𐑯",
"login.otp_log_in": "OTP 𐑤𐑪𐑜𐑦𐑯",
"login.otp_log_in.fail": "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑴𐑛, 𐑐𐑤𐑰𐑟 𐑑𐑮𐑲 𐑩𐑜𐑱𐑯.",
"login.reset_password_hint": "𐑑𐑮𐑳𐑚𐑩𐑤 𐑤𐑪𐑜𐑦𐑙 𐑦𐑯?",
"media_gallery.toggle_visible": "𐑑𐑪𐑜𐑩𐑤 𐑝𐑦𐑟𐑩𐑚𐑦𐑤𐑦𐑑𐑦",
"media_panel.empty_message": "𐑯𐑴 𐑥𐑰𐑛𐑾 𐑓𐑬𐑯𐑛.",
"media_panel.title": "𐑥𐑰𐑛𐑾",
"mfa.mfa_disable_enter_password": "𐑧𐑯𐑑𐑼 𐑘𐑹 𐑒𐑳𐑮𐑩𐑯𐑑 𐑐𐑭𐑕𐑢𐑻𐑛 𐑑 𐑛𐑦𐑕𐑱𐑚𐑩𐑤 two-factor auth.",
"mfa.mfa_setup_enter_password": "𐑧𐑯𐑑𐑼 𐑘𐑹 𐑒𐑳𐑮𐑩𐑯𐑑 𐑐𐑭𐑕𐑢𐑻𐑛 𐑑 𐑒𐑩𐑯𐑓𐑻𐑥 𐑘𐑹 𐑲𐑛𐑧𐑯𐑑𐑦𐑑𐑦",
"mfa.mfa_setup_scan_description": "𐑿𐑟𐑦𐑙 𐑘𐑹 two-factor 𐑨𐑐, 𐑕𐑒𐑨𐑯 𐑞𐑦𐑕 QR 𐑒𐑴𐑛 𐑹 𐑧𐑯𐑑𐑼 𐑞 𐑑𐑧𐑒𐑕𐑑 𐑒𐑰.",
"mfa.mfa_setup_scan_key": "𐑒𐑰:",
"mfa.mfa_setup_scan_title": "𐑕𐑒𐑨𐑯",
"mfa.mfa_setup_verify_description": "𐑑 𐑦𐑯𐑱𐑚𐑩𐑤 two-factor 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯, 𐑧𐑯𐑑𐑼 𐑞 𐑒𐑴𐑛 𐑓𐑮𐑪𐑥 𐑘𐑹 two-factor 𐑨𐑐",
"mfa.mfa_setup_verify_title": "𐑝𐑧𐑮𐑦𐑓𐑲",
"mfa.otp_enabled_description": "𐑿 𐑣𐑨𐑝 𐑦𐑯𐑱𐑚𐑩𐑤𐑛 two-factor 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯 via OTP.",
"mfa.otp_enabled_title": "OTP 𐑦𐑯𐑱𐑚𐑩𐑤𐑛",
"mfa.setup_hint": "𐑓𐑪𐑤𐑴 𐑞𐑰𐑟 𐑕𐑑𐑧𐑐𐑕 𐑑 𐑕𐑧𐑑 𐑳𐑐 𐑥𐑳𐑤𐑑𐑦-𐑓𐑨𐑒𐑑𐑼 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯 𐑪𐑯 𐑘𐑹 𐑩𐑒𐑬𐑯𐑑 𐑢𐑦𐑞 OTP",
"mfa.setup_otp_title": "OTP 𐑛𐑦𐑕𐑱𐑚𐑩𐑤𐑛",
"mfa.setup_recoverycodes": "𐑮𐑦𐑒𐑳𐑝𐑼𐑦 𐑒𐑴𐑛𐑟",
"mfa.setup_warning": "𐑮𐑲𐑑 𐑞𐑰𐑟 𐑒𐑴𐑛𐑟 𐑛𐑬𐑯 𐑹 𐑕𐑱𐑝 𐑞𐑧𐑥 𐑕𐑳𐑥𐑢𐑺 𐑕𐑦𐑒𐑘𐑫𐑼 - 𐑳𐑞𐑼𐑢𐑲𐑟 𐑿 𐑢𐑴𐑯𐑑 𐑕𐑰 𐑞𐑧𐑥 𐑩𐑜𐑱𐑯. 𐑦𐑓 𐑿 𐑤𐑵𐑟 𐑨𐑒𐑕𐑧𐑕 𐑑 𐑘𐑹 2FA 𐑨𐑐 𐑯 𐑮𐑦𐑒𐑳𐑝𐑼𐑦 𐑒𐑴𐑛𐑟 𐑿𐑤 𐑚𐑰 𐑤𐑪𐑒𐑑 𐑬𐑑 𐑝 𐑘𐑹 𐑩𐑒𐑬𐑯𐑑.",
"missing_description_modal.cancel": "𐑒𐑨𐑯𐑕𐑩𐑤",
"missing_description_modal.continue": "𐑐𐑴𐑕𐑑",
"missing_description_modal.text": "𐑿 𐑣𐑨𐑝 𐑯𐑪𐑑 𐑧𐑯𐑑𐑼𐑛 𐑩 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯 𐑓 𐑷𐑤 𐑩𐑑𐑨𐑗𐑥𐑩𐑯𐑑𐑕. 𐑒𐑩𐑯𐑑𐑦𐑯𐑿 𐑧𐑯𐑦𐑢𐑱?",
"missing_indicator.label": "𐑯𐑪𐑑 𐑓𐑬𐑯𐑛",
"missing_indicator.sublabel": "𐑞𐑦𐑕 𐑮𐑦𐑟𐑹𐑕 𐑒𐑫𐑛 𐑯𐑪𐑑 𐑚𐑰 𐑓𐑬𐑯𐑛",
"morefollows.followers_label": "…𐑯 {count} 𐑥𐑹 {count, plural, one {follower} other {followers}} 𐑪𐑯 𐑮𐑦𐑥𐑴𐑑 𐑕𐑲𐑑𐑕.",
"morefollows.following_label": "…𐑯 {count} 𐑥𐑹 {count, plural, one {follow} other {follows}} 𐑪𐑯 𐑮𐑦𐑥𐑴𐑑 𐑕𐑲𐑑𐑕.",
"mute_modal.hide_notifications": "𐑣𐑲𐑛 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟 𐑓𐑮𐑪𐑥 𐑞𐑦𐑕 𐑿𐑟𐑼?",
"navigation.chats": "𐑗𐑨𐑑𐑕",
"navigation.dashboard": "𐑛𐑨𐑖𐑚𐑹𐑛",
"navigation.developers": "𐑛𐑦𐑝𐑧𐑤𐑩𐑐𐑼𐑟",
"navigation.direct_messages": "𐑥𐑧𐑕𐑦𐑡𐑩𐑟",
"navigation.home": "𐑣𐑴𐑥",
"navigation.invites": "𐑦𐑯𐑝𐑲𐑑𐑕",
"navigation.notifications": "𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"navigation.search": "𐑕𐑻𐑗",
"navigation_bar.account_aliases": "𐑩𐑒𐑬𐑯𐑑 𐑱𐑤𐑾𐑕𐑩𐑟",
"navigation_bar.admin_settings": "AdminFE",
"navigation_bar.blocks": "𐑚𐑤𐑪𐑒𐑕",
"navigation_bar.bookmarks": "𐑚𐑫𐑒𐑥𐑸𐑒𐑕",
"navigation_bar.compose": "𐑒𐑩𐑥𐑐𐑴𐑟 𐑯𐑿 𐑐𐑴𐑕𐑑",
"navigation_bar.compose_direct": "𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡",
"navigation_bar.compose_reply": "𐑮𐑦𐑐𐑤𐑲 𐑑 𐑐𐑴𐑕𐑑",
"navigation_bar.domain_blocks": "𐑛𐑴𐑥𐑱𐑯 𐑚𐑤𐑪𐑒𐑕",
"navigation_bar.export_data": "𐑦𐑒𐑕𐑐𐑹𐑑 𐑛𐑱𐑑𐑩",
"navigation_bar.favourites": "𐑤𐑲𐑒𐑕",
"navigation_bar.filters": "𐑓𐑦𐑤𐑑𐑼𐑟",
"navigation_bar.follow_requests": "𐑓𐑪𐑤𐑴 𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑕",
"navigation_bar.import_data": "𐑦𐑥𐑐𐑹𐑑 𐑛𐑱𐑑𐑩",
"navigation_bar.in_reply_to": "In 𐑮𐑦𐑐𐑤𐑲 to",
"navigation_bar.info": "𐑩𐑚𐑬𐑑 𐑞𐑦𐑕 𐑕𐑻𐑝𐑼",
"navigation_bar.invites": "𐑦𐑯𐑝𐑲𐑑𐑕",
"navigation_bar.keyboard_shortcuts": "𐑣𐑪𐑑𐑒𐑰𐑟",
"navigation_bar.lists": "𐑤𐑦𐑕𐑑𐑕",
"navigation_bar.logout": " 𐑤𐑪𐑜𐑬𐑑",
"navigation_bar.messages": "𐑥𐑧𐑕𐑦𐑡𐑩𐑟",
"navigation_bar.mutes": "𐑥𐑿𐑑𐑕",
"navigation_bar.pins": "𐑐𐑦𐑯𐑛 𐑐𐑴𐑕𐑑𐑕",
"navigation_bar.preferences": "𐑐𐑮𐑧𐑓𐑼𐑩𐑯𐑕𐑩𐑟",
"navigation_bar.profile_directory": "𐑐𐑮𐑴𐑓𐑲𐑤 𐑛𐑦𐑮𐑧𐑒𐑑𐑼𐑦",
"navigation_bar.security": "𐑕𐑦𐑒𐑘𐑫𐑼𐑦𐑑𐑦",
"navigation_bar.soapbox_config": "·𐑕𐑴𐑐𐑚𐑪𐑒𐑕 𐑒𐑩𐑯𐑓𐑦𐑜",
"notification.chat_mention": "{name} 𐑕𐑧𐑯𐑑 𐑿 𐑩 𐑥𐑧𐑕𐑦𐑡",
"notification.favourite": "{name} 𐑤𐑲𐑒𐑑 𐑘𐑹 𐑐𐑴𐑕𐑑",
"notification.follow": "{name} 𐑓𐑪𐑤𐑴𐑛 𐑿",
"notification.follow_request": "{name} 𐑣𐑨𐑟 𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑩𐑛 𐑑 𐑓𐑪𐑤𐑴 𐑿",
"notification.mention": "{name} 𐑥𐑧𐑯𐑖𐑩𐑯𐑛 𐑿",
"notification.move": "{name} 𐑥𐑵𐑝𐑛 𐑑 {targetName}",
"notification.pleroma:emoji_reaction": "{name} 𐑮𐑦𐑨𐑒𐑑𐑩𐑛 𐑑 𐑘𐑹 𐑐𐑴𐑕𐑑",
"notification.poll": "A 𐑐𐑴𐑤 𐑿 𐑣𐑨𐑝 𐑝𐑴𐑑𐑩𐑛 𐑦𐑯 𐑣𐑨𐑟 𐑧𐑯𐑛𐑩𐑛",
"notification.reblog": "{name} 𐑮𐑰𐑐𐑴𐑕𐑑𐑩𐑛 𐑘𐑹 𐑐𐑴𐑕𐑑",
"notifications.clear": "𐑒𐑤𐑽 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"notifications.clear_confirmation": "𐑸 𐑿 𐑖𐑫𐑼 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑐𐑻𐑥𐑩𐑯𐑩𐑯𐑑𐑤𐑦 𐑒𐑤𐑽 𐑷𐑤 𐑘𐑹 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟?",
"notifications.column_settings.alert": "𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"notifications.column_settings.emoji_react": "𐑦𐑥𐑴𐑡𐑦 𐑮𐑦𐑨𐑒𐑑𐑕:",
"notifications.column_settings.favourite": "𐑤𐑲𐑒𐑕:",
"notifications.column_settings.filter_bar.advanced": "𐑛𐑦𐑕𐑐𐑤𐑱 𐑷𐑤 𐑒𐑨𐑑𐑩𐑜𐑼𐑦𐑟",
"notifications.column_settings.filter_bar.category": "𐑒𐑢𐑦𐑒 𐑓𐑦𐑤𐑑𐑼 𐑚𐑸",
"notifications.column_settings.filter_bar.show": "𐑖𐑴",
"notifications.column_settings.follow": "𐑯𐑿 𐑓𐑪𐑤𐑴𐑼𐑟:",
"notifications.column_settings.follow_request": "𐑯𐑿 𐑓𐑪𐑤𐑴 𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑕:",
"notifications.column_settings.mention": "𐑥𐑧𐑯𐑖𐑩𐑯𐑟:",
"notifications.column_settings.move": "𐑥𐑵𐑝𐑟:",
"notifications.column_settings.poll": "𐑐𐑴𐑤 𐑮𐑦𐑟𐑳𐑤𐑑𐑕:",
"notifications.column_settings.push": "𐑐𐑫𐑖 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"notifications.column_settings.reblog": "𐑮𐑰𐑐𐑴𐑕𐑑𐑕:",
"notifications.column_settings.show": "𐑖𐑴 𐑦𐑯 𐑒𐑪𐑤𐑩𐑥",
"notifications.column_settings.sound": "𐑐𐑤𐑱 𐑕𐑬𐑯𐑛",
"notifications.column_settings.sounds": "𐑕𐑬𐑯𐑛𐑟",
"notifications.column_settings.sounds.all_sounds": "𐑐𐑤𐑱 𐑕𐑬𐑯𐑛 𐑓 𐑷𐑤 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"notifications.column_settings.title": "𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯 𐑕𐑧𐑑𐑦𐑙𐑟",
"notifications.filter.all": "𐑷𐑤",
"notifications.filter.boosts": "𐑮𐑰𐑐𐑴𐑕𐑑𐑕",
"notifications.filter.emoji_reacts": "𐑦𐑥𐑴𐑡𐑦 𐑮𐑦𐑨𐑒𐑑𐑕",
"notifications.filter.favourites": "𐑤𐑲𐑒𐑕",
"notifications.filter.follows": "𐑓𐑪𐑤𐑴𐑟",
"notifications.filter.mentions": "𐑥𐑧𐑯𐑖𐑩𐑯𐑟",
"notifications.filter.moves": "𐑥𐑵𐑝𐑟",
"notifications.filter.polls": "𐑐𐑴𐑤 𐑮𐑦𐑟𐑳𐑤𐑑𐑕",
"notifications.group": "{count} 𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"notifications.queue_label": "𐑒𐑤𐑦𐑒 𐑑 𐑕𐑰 {count} 𐑯𐑿 {count, plural, one {notification} other {notifications}}",
"password_reset.confirmation": "𐑗𐑧𐑒 𐑘𐑹 𐑰𐑥𐑱𐑤 𐑓 𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯.",
"password_reset.fields.username_placeholder": "𐑰𐑥𐑱𐑤 𐑹 𐑿𐑟𐑼𐑯𐑱𐑥",
"password_reset.reset": "𐑮𐑰𐑕𐑧𐑑 𐑐𐑭𐑕𐑢𐑻𐑛",
"pinned_statuses.none": "𐑯𐑴 𐑐𐑦𐑯𐑟 𐑑 𐑖𐑴.",
"poll.closed": "𐑒𐑤𐑴𐑟𐑛",
"poll.refresh": "𐑮𐑦𐑓𐑮𐑧𐑖",
"poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
"poll.vote": "𐑝𐑴𐑑",
"poll.voted": "𐑿 𐑝𐑴𐑑𐑩𐑛 𐑓 𐑞𐑦𐑕 answer",
"poll.votes": "{votes, plural, one {# vote} other {# votes}}",
"poll_button.add_poll": "𐑨𐑛 𐑩 𐑐𐑴𐑤",
"poll_button.remove_poll": "𐑮𐑦𐑥𐑵𐑝 𐑐𐑴𐑤",
"preferences.fields.auto_play_gif_label": "𐑷𐑑𐑴-𐑐𐑤𐑱 𐑨𐑯𐑦𐑥𐑱𐑑𐑩𐑛 GIFs",
"preferences.fields.autoload_more_label": "𐑷𐑑𐑩𐑥𐑨𐑑𐑦𐑒𐑤𐑦 𐑤𐑴𐑛 𐑥𐑹 𐑲𐑑𐑩𐑥𐑟 𐑢𐑧𐑯 scrolled 𐑑 𐑞 𐑚𐑪𐑑𐑩𐑥 𐑝 𐑞 𐑐𐑱𐑡",
"preferences.fields.autoload_timelines_label": "𐑷𐑑𐑩𐑥𐑨𐑑𐑦𐑒𐑤𐑦 𐑤𐑴𐑛 𐑯𐑿 𐑐𐑴𐑕𐑑𐑕 𐑢𐑧𐑯 scrolled 𐑑 𐑞 𐑑𐑪𐑐 𐑝 𐑞 𐑐𐑱𐑡",
"preferences.fields.boost_modal_label": "𐑖𐑴 𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜 𐑚𐑦𐑓𐑹 𐑮𐑰𐑐𐑴𐑕𐑑𐑦𐑙",
"preferences.fields.content_type_label": "𐑐𐑴𐑕𐑑 format",
"preferences.fields.delete_modal_label": "𐑖𐑴 𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜 𐑚𐑦𐑓𐑹 𐑛𐑦𐑤𐑰𐑑𐑦𐑙 𐑩 𐑐𐑴𐑕𐑑",
"preferences.fields.demetricator_label": "𐑿𐑕 Demetricator",
"preferences.fields.developer_label": "𐑛𐑦𐑝𐑧𐑤𐑩𐑐𐑼 𐑑𐑵𐑤𐑟",
"preferences.fields.display_media.default": "𐑣𐑲𐑛 𐑥𐑰𐑛𐑾 𐑥𐑸𐑒𐑑 𐑨𐑟 𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝",
"preferences.fields.display_media.hide_all": "𐑷𐑤𐑢𐑱𐑟 𐑣𐑲𐑛 𐑥𐑰𐑛𐑾",
"preferences.fields.display_media.show_all": "𐑷𐑤𐑢𐑱𐑟 𐑖𐑴 𐑥𐑰𐑛𐑾",
"preferences.fields.dyslexic_font_label": "Dyslexic 𐑥𐑴𐑛",
"preferences.fields.expand_spoilers_label": "𐑷𐑤𐑢𐑱𐑟 𐑦𐑒𐑕𐑐𐑨𐑯𐑛 𐑐𐑴𐑕𐑑𐑕 𐑥𐑸𐑒𐑑 𐑢𐑦𐑞 𐑒𐑪𐑯𐑑𐑧𐑯𐑑 𐑢𐑹𐑯𐑦𐑙𐑟",
"preferences.fields.halloween_label": "Halloween 𐑥𐑴𐑛",
"preferences.fields.language_label": "𐑤𐑨𐑙𐑜𐑢𐑦𐑡",
"preferences.fields.media_display_label": "𐑥𐑰𐑛𐑾 𐑛𐑦𐑕𐑐𐑤𐑱",
"preferences.fields.missing_description_modal_label": "𐑖𐑴 𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜 𐑚𐑦𐑓𐑹 𐑕𐑧𐑯𐑛𐑦𐑙 𐑩 𐑐𐑴𐑕𐑑 𐑢𐑦𐑞𐑬𐑑 𐑥𐑰𐑛𐑾 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯𐑟",
"preferences.fields.privacy_label": "𐑐𐑴𐑕𐑑 𐑐𐑮𐑦𐑝𐑩𐑕𐑦",
"preferences.fields.reduce_motion_label": "𐑮𐑦𐑛𐑿𐑕 𐑥𐑴𐑖𐑩𐑯 𐑦𐑯 𐑨𐑯𐑦𐑥𐑱𐑖𐑩𐑯𐑟",
"preferences.fields.system_font_label": "𐑿𐑕 𐑕𐑦𐑕𐑑𐑩𐑥𐑟 𐑛𐑦𐑓𐑷𐑤𐑑 𐑓𐑪𐑯𐑑",
"preferences.fields.underline_links_label": "𐑷𐑤𐑢𐑱𐑟 𐑳𐑯𐑛𐑼𐑤𐑲𐑯 𐑤𐑦𐑙𐑒𐑕 𐑦𐑯 𐑐𐑴𐑕𐑑𐑕",
"preferences.fields.unfollow_modal_label": "𐑖𐑴 𐑒𐑪𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯 𐑛𐑲𐑩𐑤𐑪𐑜 𐑚𐑦𐑓𐑹 𐑳𐑯𐑓𐑪𐑤𐑴𐑦𐑙 𐑕𐑳𐑥𐑢𐑳𐑯",
"preferences.hints.content_type_markdown": "𐑢𐑹𐑯𐑦𐑙: 𐑦𐑒𐑕𐑐𐑧𐑮𐑦𐑥𐑧𐑯𐑑𐑩𐑤!",
"preferences.hints.demetricator": "𐑛𐑦𐑒𐑮𐑰𐑕 𐑕𐑴𐑖𐑩𐑤 𐑥𐑰𐑛𐑾 𐑨𐑙𐑟𐑲𐑩𐑑𐑦 𐑚𐑲 𐑣𐑲𐑛𐑦𐑙 𐑷𐑤 𐑯𐑳𐑥𐑚𐑼𐑟 𐑓𐑮𐑪𐑥 𐑞 𐑕𐑲𐑑.",
"preferences.hints.halloween": "𐑚𐑦𐑢𐑺: SPOOKY! 𐑕𐑩𐑐𐑹𐑑𐑕 𐑤𐑲𐑑/𐑛𐑸𐑒 𐑑𐑪𐑜𐑩𐑤.",
"preferences.hints.privacy_followers_only": "𐑴𐑯𐑤𐑦 𐑖𐑴 𐑑 𐑓𐑪𐑤𐑴𐑼𐑟",
"preferences.hints.privacy_public": "𐑧𐑝𐑮𐑦𐑢𐑳𐑯 𐑒𐑨𐑯 𐑕𐑰",
"preferences.hints.privacy_unlisted": "𐑧𐑝𐑮𐑦𐑢𐑳𐑯 𐑒𐑨𐑯 𐑕𐑰, 𐑚𐑳𐑑 𐑯𐑪𐑑 𐑤𐑦𐑕𐑑𐑩𐑛 𐑪𐑯 𐑐𐑳𐑚𐑤𐑦𐑒 𐑑𐑲𐑥𐑤𐑲𐑯𐑟",
"preferences.options.content_type_markdown": "𐑥𐑸𐑒𐑛𐑬𐑯",
"preferences.options.content_type_plaintext": "𐑐𐑤𐑱𐑯 𐑑𐑧𐑒𐑕𐑑",
"preferences.options.privacy_followers_only": "𐑓𐑪𐑤𐑴𐑼𐑟-𐑴𐑯𐑤𐑦",
"preferences.options.privacy_public": "𐑐𐑳𐑚𐑤𐑦𐑒",
"preferences.options.privacy_unlisted": "𐑳𐑯𐑤𐑦𐑕𐑑𐑩𐑛",
"privacy.change": "𐑩𐑡𐑳𐑕𐑑 𐑐𐑴𐑕𐑑 𐑐𐑮𐑦𐑝𐑩𐑕𐑦",
"privacy.direct.long": "𐑐𐑴𐑕𐑑 𐑑 𐑥𐑧𐑯𐑖𐑩𐑯𐑛 𐑿𐑟𐑼𐑟 𐑴𐑯𐑤𐑦",
"privacy.direct.short": "𐑛𐑦𐑮𐑧𐑒𐑑",
"privacy.private.long": "𐑐𐑴𐑕𐑑 𐑑 𐑓𐑪𐑤𐑴𐑼𐑟 𐑴𐑯𐑤𐑦",
"privacy.private.short": "𐑓𐑪𐑤𐑴𐑼𐑟-𐑴𐑯𐑤𐑦",
"privacy.public.long": "𐑐𐑴𐑕𐑑 𐑑 𐑐𐑳𐑚𐑤𐑦𐑒 𐑑𐑲𐑥𐑤𐑲𐑯𐑟",
"privacy.public.short": "𐑐𐑳𐑚𐑤𐑦𐑒",
"privacy.unlisted.long": "𐑛𐑵 𐑯𐑪𐑑 𐑐𐑴𐑕𐑑 𐑑 𐑐𐑳𐑚𐑤𐑦𐑒 𐑑𐑲𐑥𐑤𐑲𐑯𐑟",
"privacy.unlisted.short": "𐑳𐑯𐑤𐑦𐑕𐑑𐑩𐑛",
"profile_dropdown.add_account": "𐑨𐑛 𐑩𐑯 𐑦𐑜𐑟𐑦𐑕𐑑𐑦𐑙 𐑩𐑒𐑬𐑯𐑑",
"profile_dropdown.logout": "𐑤𐑪𐑜 𐑬𐑑 @{acct}",
"public.column_settings.title": "·𐑓𐑧𐑛𐑦𐑝𐑻𐑕 𐑑𐑲𐑥𐑤𐑲𐑯 𐑕𐑧𐑑𐑦𐑙𐑟",
"reactions.all": "𐑷𐑤",
"regeneration_indicator.label": "𐑤𐑴𐑛𐑦𐑙…",
"regeneration_indicator.sublabel": "𐑘𐑹 𐑣𐑴𐑥 𐑓𐑰𐑛 𐑦𐑟 𐑚𐑰𐑦𐑙 𐑐𐑮𐑦𐑐𐑺𐑛!",
"register_invite.lead": "𐑒𐑩𐑥𐑐𐑤𐑰𐑑 𐑞 𐑓𐑹𐑥 𐑚𐑦𐑤𐑴 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑩𐑯 𐑩𐑒𐑬𐑯𐑑.",
"register_invite.title": "𐑿𐑝 𐑚𐑰𐑯 𐑦𐑯𐑝𐑲𐑑𐑩𐑛 𐑑 𐑡𐑶𐑯 {siteTitle}!",
"registration.agreement": "𐑲 𐑩𐑜𐑮𐑰 𐑑 𐑞 {tos}.",
"registration.captcha.hint": "𐑒𐑤𐑦𐑒 𐑞 𐑦𐑥𐑦𐑡 𐑑 𐑜𐑧𐑑 𐑩 𐑯𐑿 ·𐑒𐑨𐑐𐑗𐑩",
"registration.closed_message": "{instance} 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑒𐑕𐑧𐑐𐑑𐑦𐑙 𐑯𐑿 𐑥𐑧𐑥𐑚𐑼𐑟",
"registration.closed_title": "𐑮𐑧𐑡𐑦𐑕𐑑𐑮𐑱𐑖𐑩𐑯𐑟 𐑒𐑤𐑴𐑟𐑛",
"registration.confirmation_modal.close": "𐑒𐑤𐑴𐑟",
"registration.fields.confirm_placeholder": "𐑐𐑭𐑕𐑢𐑻𐑛 (𐑩𐑜𐑱𐑯)",
"registration.fields.email_placeholder": "𐑰𐑥𐑱𐑤 𐑩𐑛𐑮𐑧𐑕",
"registration.fields.password_placeholder": "𐑐𐑭𐑕𐑢𐑻𐑛",
"registration.fields.username_hint": "𐑴𐑯𐑤𐑦 𐑤𐑧𐑑𐑼𐑟, 𐑯𐑳𐑥𐑚𐑼𐑟, 𐑯 𐑳𐑯𐑛𐑼𐑕𐑒𐑹𐑟 𐑸 𐑩𐑤𐑬𐑛.",
"registration.fields.username_placeholder": "𐑿𐑟𐑼𐑯𐑱𐑥",
"registration.lead": "𐑢𐑦𐑞 𐑩𐑯 𐑩𐑒𐑬𐑯𐑑 𐑪𐑯 {instance} 𐑿𐑤 𐑚𐑰 𐑱𐑚𐑩𐑤 𐑑 𐑓𐑪𐑤𐑴 𐑐𐑰𐑐𐑩𐑤 𐑪𐑯 𐑧𐑯𐑦 𐑕𐑻𐑝𐑼 𐑦𐑯 𐑞 ·𐑓𐑧𐑛𐑦𐑝𐑻𐑕.",
"registration.newsletter": "𐑕𐑩𐑚𐑕𐑒𐑮𐑲𐑚 𐑑 𐑯𐑿𐑟𐑤𐑧𐑑𐑼.",
"registration.password_mismatch": "𐑐𐑭𐑕𐑢𐑻𐑛𐑟 𐑛𐑴𐑯𐑑 match.",
"registration.reason": "𐑢𐑲 𐑛𐑵 𐑿 𐑢𐑪𐑯𐑑 𐑑 𐑡𐑶𐑯?",
"registration.reason_hint": "𐑞𐑦𐑕 𐑢𐑦𐑤 help 𐑳𐑕 𐑮𐑦𐑝𐑿 𐑘𐑹 𐑨𐑐𐑤𐑦𐑒𐑱𐑖𐑩𐑯",
"registration.sign_up": "𐑕𐑲𐑯 𐑳𐑐",
"registration.tos": "Terms 𐑝 𐑕𐑻𐑝𐑦𐑕",
"registration.username_unavailable": "𐑿𐑟𐑼𐑯𐑱𐑥 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑑𐑱𐑒𐑩𐑯.",
"relative_time.days": "{number}d",
"relative_time.hours": "{number}h",
"relative_time.just_now": "𐑯𐑬",
"relative_time.minutes": "{number}m",
"relative_time.seconds": "{number}s",
"remote_instance.edit_federation": "𐑧𐑛𐑦𐑑 𐑓𐑧𐑛𐑼𐑱𐑖𐑩𐑯",
"remote_instance.federation_panel.heading": "𐑓𐑧𐑛𐑼𐑱𐑖𐑩𐑯 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟",
"remote_instance.federation_panel.no_restrictions_message": "{siteTitle} 𐑣𐑨𐑟 𐑐𐑤𐑱𐑕𐑑 𐑯𐑴 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟 𐑪𐑯 {host}.",
"remote_instance.federation_panel.restricted_message": "{siteTitle} 𐑚𐑤𐑪𐑒𐑕 𐑷𐑤 𐑨𐑒𐑑𐑦𐑝𐑦𐑑𐑦𐑟 𐑓𐑮𐑪𐑥 {host}.",
"remote_instance.federation_panel.some_restrictions_message": "{siteTitle} 𐑣𐑨𐑟 𐑐𐑤𐑱𐑕𐑑 𐑕𐑳𐑥 𐑮𐑦𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟 𐑪𐑯 {host}.",
"remote_instance.pin_host": "𐑐𐑦𐑯 {host}",
"remote_instance.unpin_host": "𐑳𐑯𐑐𐑦𐑯 {host}",
"remote_interaction.account_placeholder": "𐑧𐑯𐑑𐑼 𐑘𐑹 username@domain 𐑿 𐑢𐑪𐑯𐑑 𐑑 act 𐑓𐑮𐑪𐑥",
"remote_interaction.divider": "or",
"remote_interaction.favourite": "𐑐𐑮𐑩𐑕𐑰𐑛 𐑑 𐑤𐑲𐑒",
"remote_interaction.favourite_title": "𐑤𐑲𐑒 𐑩 𐑐𐑴𐑕𐑑 𐑮𐑦𐑥𐑴𐑑𐑤𐑦",
"remote_interaction.follow": "𐑐𐑮𐑩𐑕𐑰𐑛 𐑑 𐑓𐑪𐑤𐑴",
"remote_interaction.follow_title": "𐑓𐑪𐑤𐑴 {user} 𐑮𐑦𐑥𐑴𐑑𐑤𐑦",
"remote_interaction.poll_vote": "𐑐𐑮𐑩𐑕𐑰𐑛 𐑑 𐑝𐑴𐑑",
"remote_interaction.poll_vote_title": "𐑝𐑴𐑑 𐑦𐑯 𐑩 𐑐𐑴𐑤 𐑮𐑦𐑥𐑴𐑑𐑤𐑦",
"remote_interaction.reblog": "𐑐𐑮𐑩𐑕𐑰𐑛 𐑑 𐑮𐑰𐑐𐑴𐑕𐑑",
"remote_interaction.reblog_title": "𐑮𐑰𐑚𐑤𐑪𐑜 𐑩 𐑐𐑴𐑕𐑑 𐑮𐑦𐑥𐑴𐑑𐑤𐑦",
"remote_interaction.reply": "𐑐𐑮𐑩𐑕𐑰𐑛 𐑑 𐑮𐑦𐑐𐑤𐑲",
"remote_interaction.reply_title": "𐑮𐑦𐑐𐑤𐑲 𐑑 𐑩 𐑐𐑴𐑕𐑑 𐑮𐑦𐑥𐑴𐑑𐑤𐑦",
"remote_interaction.user_not_found_error": "𐑒𐑫𐑛𐑩𐑯𐑑 find given 𐑿𐑟𐑼",
"remote_timeline.filter_message": "𐑿 𐑸 𐑝𐑿𐑦𐑙 𐑞 𐑑𐑲𐑥𐑤𐑲𐑯 𐑝 {instance}.",
"reply_indicator.cancel": "𐑒𐑨𐑯𐑕𐑩𐑤",
"reply_mentions.account.add": "𐑨𐑛 𐑑 𐑥𐑧𐑯𐑖𐑩𐑯𐑟",
"reply_mentions.account.remove": "𐑮𐑦𐑥𐑵𐑝 𐑓𐑮𐑪𐑥 𐑥𐑧𐑯𐑖𐑩𐑯𐑟",
"reply_mentions.more": "𐑯 {count} 𐑥𐑹",
"reply_mentions.reply": "𐑮𐑦𐑐𐑤𐑲𐑦𐑙 𐑑 {accounts}{more}",
"reply_mentions.reply_empty": "𐑮𐑦𐑐𐑤𐑲𐑦𐑙 𐑑 𐑐𐑴𐑕𐑑",
"report.block": "𐑚𐑤𐑪𐑒 {target}",
"report.block_hint": "𐑛𐑵 𐑿 𐑷𐑤𐑕𐑴 𐑢𐑪𐑯𐑑 𐑑 𐑚𐑤𐑪𐑒 𐑞𐑦𐑕 𐑩𐑒𐑬𐑯𐑑?",
"report.forward": "𐑓𐑹𐑢𐑼𐑛 𐑑 {target}",
"report.forward_hint": "𐑞 𐑩𐑒𐑬𐑯𐑑 𐑦𐑟 𐑓𐑮𐑪𐑥 𐑩𐑯𐑳𐑞𐑼 𐑕𐑻𐑝𐑼. 𐑕𐑧𐑯𐑛 𐑩 𐑒𐑪𐑐𐑦 𐑝 𐑞 𐑮𐑦𐑐𐑹𐑑 𐑞𐑺 𐑨𐑟 𐑢𐑧𐑤?",
"report.hint": "𐑞 𐑮𐑦𐑐𐑹𐑑 𐑢𐑦𐑤 𐑚𐑰 𐑕𐑧𐑯𐑑 𐑑 𐑘𐑹 𐑕𐑻𐑝𐑼 𐑥𐑪𐑛𐑼𐑱𐑑𐑼𐑟. 𐑿 𐑒𐑨𐑯 𐑐𐑮𐑩𐑝𐑲𐑛 𐑩𐑯 𐑧𐑒𐑕𐑐𐑤𐑩𐑯𐑱𐑖𐑩𐑯 𐑝 𐑢𐑲 𐑿 𐑸 𐑮𐑦𐑐𐑹𐑑𐑦𐑙 𐑞𐑦𐑕 𐑩𐑒𐑬𐑯𐑑 𐑚𐑦𐑤𐑴:",
"report.placeholder": "𐑩𐑛𐑦𐑖𐑩𐑯𐑩𐑤 𐑒𐑪𐑥𐑧𐑯𐑑𐑕",
"report.submit": "𐑕𐑩𐑚𐑥𐑦𐑑",
"report.target": "𐑮𐑦𐑐𐑹𐑑𐑦𐑙 {target}",
"schedule.post_time": "𐑐𐑴𐑕𐑑 𐑛𐑱𐑑/𐑑𐑲𐑥",
"schedule.remove": "𐑮𐑦𐑥𐑵𐑝 𐑖𐑧𐑡𐑵𐑤",
"schedule_button.add_schedule": "𐑖𐑧𐑡𐑵𐑤 𐑐𐑴𐑕𐑑 𐑓 𐑤𐑱𐑑𐑼",
"schedule_button.remove_schedule": "𐑐𐑴𐑕𐑑 𐑦𐑥𐑰𐑛𐑾𐑑𐑤𐑦",
"scheduled_status.cancel": "𐑒𐑨𐑯𐑕𐑩𐑤",
"search.action": "𐑕𐑻𐑗 𐑓 “{query}”",
"search.placeholder": "𐑕𐑻𐑗",
"search_results.accounts": "𐑐𐑰𐑐𐑩𐑤",
"search_results.hashtags": "𐑣𐑨𐑖𐑑𐑨𐑜𐑟",
"search_results.statuses": "𐑐𐑴𐑕𐑑𐑕",
"search_results.top": "𐑑𐑪𐑐",
"security.codes.fail": "𐑓𐑱𐑤𐑛 𐑑 𐑓𐑧𐑗 𐑚𐑨𐑒𐑳𐑐 𐑒𐑴𐑛𐑟",
"security.confirm.fail": "𐑦𐑯𐑒𐑼𐑧𐑒𐑑 𐑒𐑴𐑛 𐑹 𐑐𐑭𐑕𐑢𐑻𐑛. 𐑑𐑮𐑲 𐑩𐑜𐑱𐑯.",
"security.delete_account.fail": "𐑩𐑒𐑬𐑯𐑑 𐑛𐑦𐑤𐑰𐑖𐑩𐑯 𐑓𐑱𐑤𐑛.",
"security.delete_account.success": "𐑩𐑒𐑬𐑯𐑑 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦 𐑛𐑦𐑤𐑰𐑑𐑩𐑛.",
"security.disable.fail": "𐑦𐑯𐑒𐑼𐑧𐑒𐑑 𐑐𐑭𐑕𐑢𐑻𐑛. 𐑑𐑮𐑲 𐑩𐑜𐑱𐑯.",
"security.disable_mfa": "𐑛𐑦𐑕𐑱𐑚𐑩𐑤",
"security.fields.email.label": "𐑰𐑥𐑱𐑤 𐑩𐑛𐑮𐑧𐑕",
"security.fields.new_password.label": "𐑯𐑿 𐑐𐑭𐑕𐑢𐑻𐑛",
"security.fields.old_password.label": "𐑒𐑳𐑮𐑩𐑯𐑑 𐑐𐑭𐑕𐑢𐑻𐑛",
"security.fields.password.label": "𐑐𐑭𐑕𐑢𐑻𐑛",
"security.fields.password_confirmation.label": "𐑯𐑿 𐑐𐑭𐑕𐑢𐑻𐑛 (𐑩𐑜𐑱𐑯)",
"security.headers.delete": "𐑛𐑦𐑤𐑰𐑑 𐑩𐑒𐑬𐑯𐑑",
"security.headers.tokens": "𐑕𐑧𐑖𐑩𐑯𐑟",
"security.headers.update_email": "𐑗𐑱𐑯𐑡 𐑰𐑥𐑱𐑤",
"security.headers.update_password": "𐑗𐑱𐑯𐑡 𐑐𐑭𐑕𐑢𐑻𐑛",
"security.mfa": "𐑕𐑧𐑑 𐑳𐑐 2-Factor Auth",
"security.mfa_enabled": "𐑿 𐑣𐑨𐑝 𐑥𐑳𐑤𐑑𐑦-𐑓𐑨𐑒𐑑𐑼 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯 𐑕𐑧𐑑 𐑳𐑐 𐑢𐑦𐑞 OTP.",
"security.mfa_header": "𐑷𐑔𐑼𐑲𐑟𐑱𐑖𐑩𐑯 𐑥𐑧𐑔𐑩𐑛𐑟",
"security.mfa_setup_hint": "𐑒𐑩𐑯𐑓𐑦𐑜𐑼 𐑥𐑳𐑤𐑑𐑦-𐑓𐑨𐑒𐑑𐑼 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯 𐑢𐑦𐑞 OTP",
"security.qr.fail": "𐑓𐑱𐑤𐑛 𐑑 𐑓𐑧𐑗 𐑕𐑧𐑑𐑳𐑐 key",
"security.submit": "𐑕𐑱𐑝 𐑗𐑱𐑯𐑡𐑩𐑟",
"security.submit.delete": "𐑛𐑦𐑤𐑰𐑑 𐑩𐑒𐑬𐑯𐑑",
"security.text.delete": "𐑑 𐑛𐑦𐑤𐑰𐑑 𐑘𐑹 𐑩𐑒𐑬𐑯𐑑, 𐑧𐑯𐑑𐑼 𐑘𐑹 𐑐𐑭𐑕𐑢𐑻𐑛 𐑞𐑧𐑯 𐑒𐑤𐑦𐑒 𐑛𐑦𐑤𐑰𐑑 𐑩𐑒𐑬𐑯𐑑. 𐑞𐑦𐑕 𐑦𐑟 𐑩 𐑐𐑻𐑥𐑩𐑯𐑩𐑯𐑑 𐑨𐑒𐑖𐑩𐑯 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑳𐑯𐑛𐑳𐑯. 𐑘𐑹 𐑩𐑒𐑬𐑯𐑑 𐑢𐑦𐑤 𐑚𐑰 𐑛𐑦𐑕𐑑𐑮𐑶𐑛 𐑓𐑮𐑪𐑥 𐑞𐑦𐑕 𐑕𐑻𐑝𐑼, 𐑯 𐑩 𐑛𐑦𐑤𐑰𐑖𐑩𐑯 𐑮𐑦𐑒𐑢𐑧𐑕𐑑 𐑢𐑦𐑤 𐑚𐑰 𐑕𐑧𐑯𐑑 𐑑 𐑳𐑞𐑼 𐑕𐑻𐑝𐑼𐑟. 𐑦𐑑𐑕 𐑯𐑪𐑑 𐑜𐑨𐑮𐑩𐑯𐑑𐑰𐑛 𐑞𐑨𐑑 𐑷𐑤 𐑕𐑻𐑝𐑼𐑟 𐑢𐑦𐑤 𐑐𐑻𐑡 𐑘𐑹 𐑩𐑒𐑬𐑯𐑑.",
"security.tokens.revoke": "𐑮𐑦𐑝𐑴𐑒",
"security.update_email.fail": "𐑳𐑐𐑛𐑱𐑑 𐑰𐑥𐑱𐑤 𐑓𐑱𐑤𐑛.",
"security.update_email.success": "𐑰𐑥𐑱𐑤 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦 𐑳𐑐𐑛𐑱𐑑𐑩𐑛.",
"security.update_password.fail": "𐑳𐑐𐑛𐑱𐑑 𐑐𐑭𐑕𐑢𐑻𐑛 𐑓𐑱𐑤𐑛.",
"security.update_password.success": "𐑐𐑭𐑕𐑢𐑻𐑛 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑩𐑤𐑦 𐑳𐑐𐑛𐑱𐑑𐑩𐑛.",
"signup_panel.subtitle": "𐑕𐑲𐑯 𐑳𐑐 𐑯𐑬 𐑑 𐑛𐑦𐑕𐑒𐑳𐑕.",
"signup_panel.title": "𐑯𐑿 𐑑 {site_title}?",
"soapbox_config.authenticated_profile_hint": "𐑿𐑟𐑼𐑟 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑤𐑪𐑜𐑛-𐑦𐑯 𐑑 𐑝𐑿 𐑮𐑦𐑐𐑤𐑲𐑟 𐑯 𐑥𐑰𐑛𐑾 𐑪𐑯 𐑿𐑟𐑼 𐑐𐑮𐑴𐑓𐑲𐑤𐑟.",
"soapbox_config.authenticated_profile_label": "𐑐𐑮𐑴𐑓𐑲𐑤𐑟 𐑮𐑦𐑒𐑢𐑲𐑼 𐑷𐑔𐑧𐑯𐑑𐑦𐑒𐑱𐑖𐑩𐑯",
"soapbox_config.copyright_footer.meta_fields.label_placeholder": "Copyright footer",
"soapbox_config.crypto_address.meta_fields.address_placeholder": "𐑩𐑛𐑮𐑧𐑕",
"soapbox_config.crypto_address.meta_fields.note_placeholder": "𐑯𐑴𐑑 (𐑪𐑐𐑖𐑩𐑯𐑩𐑤)",
"soapbox_config.crypto_address.meta_fields.ticker_placeholder": "𐑑𐑦𐑒𐑼",
"soapbox_config.crypto_donate_panel_limit.meta_fields.limit_placeholder": "𐑯𐑳𐑥𐑚𐑼 𐑝 𐑲𐑑𐑩𐑥𐑟 𐑑 𐑛𐑦𐑕𐑐𐑤𐑱 𐑦𐑯 𐑞 𐑒𐑮𐑦𐑐𐑑𐑴 𐑣𐑴𐑥𐑐𐑱𐑡 widget",
"soapbox_config.custom_css.meta_fields.url_placeholder": "URL",
"soapbox_config.display_fqn_label": "𐑛𐑦𐑕𐑐𐑤𐑱 𐑛𐑴𐑥𐑱𐑯 (eg @user@domain) 𐑓 𐑤𐑴𐑒𐑩𐑤 𐑩𐑒𐑬𐑯𐑑𐑕.",
"soapbox_config.fields.brand_color_label": "𐑚𐑮𐑨𐑯𐑛 𐑒𐑳𐑤𐑼",
"soapbox_config.fields.crypto_address.add": "𐑨𐑛 𐑯𐑿 𐑒𐑮𐑦𐑐𐑑𐑴 𐑩𐑛𐑮𐑧𐑕",
"soapbox_config.fields.crypto_addresses_label": "𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑩𐑛𐑮𐑧𐑕𐑩𐑟",
"soapbox_config.fields.home_footer.add": "𐑨𐑛 𐑯𐑿 𐑣𐑴𐑥 𐑓𐑫𐑑𐑼 𐑲𐑑𐑩𐑥",
"soapbox_config.fields.home_footer_fields_label": "𐑣𐑴𐑥 𐑓𐑫𐑑𐑼 𐑲𐑑𐑩𐑥𐑟",
"soapbox_config.fields.logo_label": "Logo",
"soapbox_config.fields.promo_panel.add": "𐑨𐑛 𐑯𐑿 Promo panel 𐑲𐑑𐑩𐑥",
"soapbox_config.fields.promo_panel_fields_label": "Promo panel 𐑲𐑑𐑩𐑥𐑟",
"soapbox_config.fields.theme_label": "𐑛𐑦𐑓𐑷𐑤𐑑 𐑔𐑰𐑥",
"soapbox_config.greentext_label": "𐑦𐑯𐑱𐑚𐑩𐑤 𐑜𐑮𐑰𐑯𐑑𐑧𐑒𐑕𐑑 𐑕𐑩𐑐𐑹𐑑",
"soapbox_config.hints.crypto_addresses": "𐑨𐑛 𐑒𐑮𐑦𐑐𐑑𐑴𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑩𐑛𐑮𐑧𐑕𐑩𐑟 so 𐑿𐑟𐑼𐑟 𐑝 𐑘𐑹 𐑕𐑲𐑑 𐑒𐑨𐑯 𐑛𐑴𐑯𐑱𐑑 𐑑 𐑿. 𐑹𐑛𐑼 matters, 𐑯 𐑿 𐑥𐑳𐑕𐑑 𐑿𐑕 lowercase 𐑑𐑦𐑒𐑼 values.",
"soapbox_config.hints.home_footer_fields": "𐑿 𐑒𐑨𐑯 𐑣𐑨𐑝 custom defined 𐑤𐑦𐑙𐑒𐑕 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑪𐑯 𐑞 𐑓𐑫𐑑𐑼 𐑝 𐑘𐑹 static 𐑐𐑱𐑡𐑩𐑟",
"soapbox_config.hints.logo": "SVG. 𐑨𐑑 𐑥𐑴𐑕𐑑 2 MB. 𐑢𐑦𐑤 𐑚𐑰 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑑 50px height, maintaining aspect ratio",
"soapbox_config.hints.promo_panel_fields": "𐑿 𐑒𐑨𐑯 𐑣𐑨𐑝 custom defined 𐑤𐑦𐑙𐑒𐑕 𐑛𐑦𐑕𐑐𐑤𐑱𐑛 𐑪𐑯 𐑞 right panel 𐑝 𐑞 𐑑𐑲𐑥𐑤𐑲𐑯𐑟 𐑐𐑱𐑡.",
"soapbox_config.hints.promo_panel_icons": "{ link }",
"soapbox_config.hints.promo_panel_icons.link": "·𐑕𐑴𐑐𐑚𐑪𐑒𐑕 𐑲𐑒𐑪𐑯𐑟 List",
"soapbox_config.home_footer.meta_fields.label_placeholder": "Label",
"soapbox_config.home_footer.meta_fields.url_placeholder": "URL",
"soapbox_config.promo_panel.meta_fields.icon_placeholder": "𐑲𐑒𐑪𐑯",
"soapbox_config.promo_panel.meta_fields.label_placeholder": "Label",
"soapbox_config.promo_panel.meta_fields.url_placeholder": "URL",
"soapbox_config.raw_json_hint": "𐑧𐑛𐑦𐑑 𐑞 𐑕𐑧𐑑𐑦𐑙𐑟 𐑛𐑱𐑑𐑩 𐑛𐑦𐑮𐑧𐑒𐑑𐑤𐑦. 𐑗𐑱𐑯𐑡𐑩𐑟 𐑥𐑱𐑛 𐑛𐑦𐑮𐑧𐑒𐑑𐑤𐑦 𐑑 𐑞 JSON 𐑓𐑲𐑤 𐑢𐑦𐑤 𐑴𐑝𐑼𐑮𐑲𐑛 𐑞 𐑓𐑹𐑥 𐑓𐑰𐑤𐑛𐑟 𐑩𐑚𐑳𐑝. 𐑒𐑤𐑦𐑒 𐑕𐑱𐑝 𐑑 𐑩𐑐𐑤𐑲 𐑘𐑹 𐑗𐑱𐑯𐑡𐑩𐑟.",
"soapbox_config.raw_json_label": "𐑩𐑛𐑝𐑭𐑯𐑕𐑑: 𐑧𐑛𐑦𐑑 raw JSON 𐑛𐑱𐑑𐑩",
"soapbox_config.save": "𐑕𐑱𐑝",
"soapbox_config.saved": "·𐑕𐑴𐑐𐑚𐑪𐑒𐑕 𐑒𐑩𐑯𐑓𐑦𐑜 𐑕𐑱𐑝𐑛!",
"soapbox_config.verified_can_edit_name_label": "𐑩𐑤𐑬 𐑝𐑧𐑮𐑦𐑓𐑲𐑛 𐑿𐑟𐑼𐑟 𐑑 𐑧𐑛𐑦𐑑 𐑞𐑺 𐑴𐑯 𐑛𐑦𐑕𐑐𐑤𐑱 𐑯𐑱𐑥.",
"status.admin_account": "𐑴𐑐𐑩𐑯 𐑥𐑪𐑛𐑼𐑱𐑖𐑩𐑯 𐑦𐑯𐑑𐑼𐑓𐑱𐑕 𐑓 @{name}",
"status.admin_status": "𐑴𐑐𐑩𐑯 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑦𐑯 𐑞 𐑥𐑪𐑛𐑼𐑱𐑖𐑩𐑯 𐑦𐑯𐑑𐑼𐑓𐑱𐑕",
"status.block": "𐑚𐑤𐑪𐑒 @{name}",
"status.bookmark": "𐑚𐑫𐑒𐑥𐑸𐑒",
"status.bookmarked": "𐑚𐑫𐑒𐑥𐑸𐑒 𐑨𐑛𐑩𐑛.",
"status.cancel_reblog_private": "𐑳𐑯-𐑮𐑰𐑐𐑴𐑕𐑑",
"status.cannot_reblog": "𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑮𐑰𐑐𐑴𐑕𐑑𐑩𐑛",
"status.chat": "𐑗𐑨𐑑 𐑢𐑦𐑞 @{name}",
"status.copy": "𐑒𐑪𐑐𐑦 𐑤𐑦𐑙𐑒 𐑑 𐑐𐑴𐑕𐑑",
"status.delete": "𐑛𐑦𐑤𐑰𐑑",
"status.detailed_status": "𐑛𐑰𐑑𐑱𐑤𐑛 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯 𐑝𐑿",
"status.direct": "𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡 @{name}",
"status.embed": " 𐑦𐑥𐑚𐑧𐑛",
"status.favourite": "𐑤𐑲𐑒",
"status.filtered": "𐑓𐑦𐑤𐑑𐑼𐑛",
"status.load_more": "𐑤𐑴𐑛 𐑥𐑹",
"status.media_hidden": "𐑥𐑰𐑛𐑾 𐑣𐑦𐑛𐑩𐑯",
"status.mention": "𐑥𐑧𐑯𐑖𐑩𐑯 @{name}",
"status.more": "𐑥𐑹",
"status.mute": "𐑥𐑿𐑑 @{name}",
"status.mute_conversation": "𐑥𐑿𐑑 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯",
"status.open": "𐑦𐑒𐑕𐑐𐑨𐑯𐑛 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑",
"status.pin": "𐑐𐑦𐑯 𐑪𐑯 𐑐𐑮𐑴𐑓𐑲𐑤",
"status.pinned": "𐑐𐑦𐑯𐑛 𐑐𐑴𐑕𐑑",
"status.reactions.cry": "𐑕𐑨𐑛",
"status.reactions.empty": "𐑯𐑴 𐑢𐑳𐑯 𐑣𐑨𐑟 𐑮𐑦𐑨𐑒𐑑𐑩𐑛 𐑑 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑕𐑳𐑥𐑢𐑳𐑯 𐑛𐑳𐑟, 𐑞𐑱 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"status.reactions.heart": "𐑤𐑳𐑝",
"status.reactions.laughing": "𐑣𐑭𐑣𐑭",
"status.reactions.like": "𐑤𐑲𐑒",
"status.reactions.open_mouth": "𐑢𐑬",
"status.reactions.weary": "𐑢𐑽𐑦",
"status.reactions_expand": "𐑕𐑦𐑤𐑧𐑒𐑑 𐑦𐑥𐑴𐑡𐑦",
"status.read_more": "𐑮𐑧𐑛 𐑥𐑹",
"status.reblog": "𐑮𐑰𐑐𐑴𐑕𐑑",
"status.reblog_private": "𐑮𐑰𐑐𐑴𐑕𐑑 𐑑 𐑼𐑦𐑡𐑦𐑯𐑩𐑤 𐑷𐑛𐑾𐑯𐑕",
"status.reblogged_by": "{name} 𐑮𐑰𐑐𐑴𐑕𐑑𐑩𐑛",
"status.reblogs.empty": "𐑯𐑴 𐑢𐑳𐑯 𐑣𐑨𐑟 𐑮𐑰𐑐𐑴𐑕𐑑𐑩𐑛 𐑞𐑦𐑕 𐑐𐑴𐑕𐑑 𐑘𐑧𐑑. 𐑢𐑧𐑯 𐑕𐑳𐑥𐑢𐑳𐑯 𐑛𐑳𐑟, 𐑞𐑱 𐑢𐑦𐑤 𐑖𐑴 𐑳𐑐 𐑣𐑽.",
"status.redraft": "𐑛𐑦𐑤𐑰𐑑 𐑯 𐑮𐑰𐑛𐑮𐑭𐑓𐑑",
"status.remove_account_from_group": "𐑮𐑦𐑥𐑵𐑝 𐑩𐑒𐑬𐑯𐑑 𐑓𐑮𐑪𐑥 𐑜𐑮𐑵𐑐",
"status.remove_post_from_group": "𐑮𐑦𐑥𐑵𐑝 𐑐𐑴𐑕𐑑 𐑓𐑮𐑪𐑥 𐑜𐑮𐑵𐑐",
"status.reply": "𐑮𐑦𐑐𐑤𐑲",
"status.replyAll": "𐑮𐑦𐑐𐑤𐑲 𐑑 𐑔𐑮𐑧𐑛",
"status.report": "𐑮𐑦𐑐𐑹𐑑 @{name}",
"status.sensitive_warning": "𐑕𐑧𐑯𐑕𐑦𐑑𐑦𐑝 𐑒𐑪𐑯𐑑𐑧𐑯𐑑",
"status.share": "𐑖𐑺",
"status.show_less": "𐑖𐑴 𐑤𐑧𐑕",
"status.show_less_all": "𐑖𐑴 𐑤𐑧𐑕 𐑓 𐑷𐑤",
"status.show_more": "𐑖𐑴 𐑥𐑹",
"status.show_more_all": "𐑖𐑴 𐑥𐑹 𐑓 𐑷𐑤",
"status.show_thread": "𐑖𐑴 𐑔𐑮𐑧𐑛",
"status.title": "𐑐𐑴𐑕𐑑",
"status.title_direct": "𐑛𐑦𐑮𐑧𐑒𐑑 𐑥𐑧𐑕𐑦𐑡",
"status.unbookmark": "𐑮𐑦𐑥𐑵𐑝 𐑚𐑫𐑒𐑥𐑸𐑒",
"status.unbookmarked": "𐑚𐑫𐑒𐑥𐑸𐑒 𐑮𐑦𐑥𐑵𐑝𐑛.",
"status.unmute_conversation": "𐑳𐑯𐑥𐑿𐑑 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯",
"status.unpin": "𐑳𐑯𐑐𐑦𐑯 𐑓𐑮𐑪𐑥 𐑐𐑮𐑴𐑓𐑲𐑤",
"status_list.queue_label": "𐑒𐑤𐑦𐑒 𐑑 𐑕𐑰 {count} 𐑯𐑿 {count, plural, 𐑢𐑳𐑯 {post} 𐑳𐑞𐑼 {posts}}",
"statuses.tombstone": "𐑢𐑳𐑯 𐑹 𐑥𐑹 𐑐𐑴𐑕𐑑𐑕 𐑦𐑟 𐑳𐑯𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤.",
"suggestions.dismiss": "𐑛𐑦𐑕𐑥𐑦𐑕 𐑕𐑩𐑡𐑧𐑕𐑗𐑩𐑯",
"tabs_bar.all": "𐑷𐑤",
"tabs_bar.apps": "𐑨𐑐𐑕",
"tabs_bar.chats": "𐑗𐑨𐑑𐑕",
"tabs_bar.dashboard": "𐑛𐑨𐑖𐑚𐑹𐑛",
"tabs_bar.fediverse": "·𐑓𐑧𐑛𐑦𐑝𐑻𐑕",
"tabs_bar.header": "𐑩𐑒𐑬𐑯𐑑 𐑦𐑯𐑓𐑴",
"tabs_bar.home": "𐑣𐑴𐑥",
"tabs_bar.news": "𐑯𐑿𐑟",
"tabs_bar.notifications": "𐑯𐑴𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯𐑟",
"tabs_bar.post": "𐑐𐑴𐑕𐑑",
"tabs_bar.search": "𐑕𐑻𐑗",
"tabs_bar.theme_toggle_dark": "𐑕𐑢𐑦𐑗 𐑑 𐑛𐑸𐑒 𐑔𐑰𐑥",
"tabs_bar.theme_toggle_light": "𐑕𐑢𐑦𐑗 𐑑 𐑤𐑲𐑑 𐑔𐑰𐑥",
"time_remaining.days": "{number, plural, one {# day} other {# days}} 𐑤𐑧𐑓𐑑",
"time_remaining.hours": "{number, plural, one {# hour} other {# hours}} 𐑤𐑧𐑓𐑑",
"time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} 𐑤𐑧𐑓𐑑",
"time_remaining.moments": "𐑥𐑴𐑥𐑩𐑯𐑑𐑕 remaining",
"time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} 𐑤𐑧𐑓𐑑",
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people} 𐑑𐑷𐑒𐑦𐑙",
"trends.title": "𐑑𐑮𐑧𐑯𐑛𐑟",
"ui.beforeunload": "𐑘𐑹 𐑛𐑮𐑭𐑓𐑑 𐑢𐑦𐑤 𐑚𐑰 𐑤𐑪𐑕𐑑 𐑦𐑓 𐑿 𐑤𐑰𐑝.",
"unauthorized_modal.footer": "𐑷𐑤𐑮𐑧𐑛𐑦 𐑣𐑨𐑝 𐑩𐑯 𐑩𐑒𐑬𐑯𐑑? {login}.",
"unauthorized_modal.text": "𐑿 𐑯𐑰𐑛 𐑑 𐑚𐑰 𐑤𐑪𐑜𐑛 𐑦𐑯 𐑑 𐑛𐑵 𐑞𐑨𐑑.",
"unauthorized_modal.title": "𐑕𐑲𐑯 𐑳𐑐 𐑓 {site_title}",
"upload_area.title": "𐑛𐑮𐑨𐑜 𐑯 𐑛𐑮𐑪𐑐 𐑑 𐑳𐑐𐑤𐑴𐑛",
"upload_button.label": "𐑨𐑛 𐑥𐑰𐑛𐑾 𐑩𐑑𐑨𐑗𐑥𐑩𐑯𐑑",
"upload_error.limit": "𐑓𐑲𐑤 𐑳𐑐𐑤𐑴𐑛 𐑤𐑦𐑥𐑦𐑑 𐑦𐑒𐑕𐑰𐑛𐑩𐑛.",
"upload_error.poll": "𐑓𐑲𐑤 𐑳𐑐𐑤𐑴𐑛 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑢𐑦𐑞 𐑐𐑴𐑤𐑟.",
"upload_form.description": "𐑛𐑦𐑕𐑒𐑮𐑲𐑚 𐑓 𐑞 𐑝𐑦𐑠𐑫𐑩𐑤𐑦 𐑦𐑥𐑐𐑺𐑛",
"upload_form.preview": "𐑐𐑮𐑰𐑝𐑿",
"upload_form.undo": "𐑛𐑦𐑤𐑰𐑑",
"upload_progress.label": "𐑳𐑐𐑤𐑴𐑛𐑦𐑙...",
"video.close": "𐑒𐑤𐑴𐑟 𐑝𐑦𐑛𐑦𐑴",
"video.download": "𐑛𐑬𐑯𐑤𐑴𐑛 𐑓𐑲𐑤",
"video.exit_fullscreen": "𐑧𐑒𐑕𐑦𐑑 𐑓𐑫𐑤 𐑕𐑒𐑮𐑰𐑯",
"video.expand": "𐑦𐑒𐑕𐑐𐑨𐑯𐑛 𐑝𐑦𐑛𐑦𐑴",
"video.fullscreen": "𐑓𐑫𐑤 𐑕𐑒𐑮𐑰𐑯",
"video.hide": "𐑣𐑲𐑛 𐑝𐑦𐑛𐑦𐑴",
"video.mute": "𐑥𐑿𐑑 𐑕𐑬𐑯𐑛",
"video.pause": "𐑐𐑷𐑟",
"video.play": "𐑐𐑤𐑱",
"video.unmute": "𐑳𐑯𐑥𐑿𐑑 𐑕𐑬𐑯𐑛",
"who_to_follow.title": "𐑣𐑵 𐑑 𐑓𐑪𐑤𐑴"
}

View File

@ -1,19 +1,19 @@
{ {
"about.also_available": "Available in:", "about.also_available": "זמין ב",
"accordion.collapse": "Collapse", "accordion.collapse": "כווץ",
"accordion.expand": "Expand", "accordion.expand": "הרחבה",
"account.add_or_remove_from_list": "הוסף או הסר מהרשימות", "account.add_or_remove_from_list": "הוסף או הסר מהרשימות",
"account.badges.bot": "בוט", "account.badges.bot": "בוט",
"account.block": "חסימת @{name}", "account.block": "חסימת @{name}",
"account.block_domain": "להסתיר הכל מהקהילה {domain}", "account.block_domain": "להסתיר הכל מהקהילה {domain}",
"account.blocked": "חסום", "account.blocked": "חסום",
"account.chat": "Chat with @{name}", "account.chat": "צ'אט עם @{name}",
"account.column_settings.description": "These settings apply to all account timelines.", "account.column_settings.description": ".ההגדרות האלו מיושמות על כל ציר הזמן",
"account.column_settings.title": "Acccount timeline settings", "account.column_settings.title": "הגדרות ציר זמן של המשתמש",
"account.deactivated": "Deactivated", "account.deactivated": "מושבת",
"account.deactivated_description": "This account has been deactivated.", "account.deactivated_description": "החשבון הזה הושבת",
"account.direct": "Direct Message @{name}", "account.direct": "הודעה ישירה @{name}",
"account.domain_blocked": "הדומיין חסוי", "account.domain_blocked": "הדומיין חסום",
"account.edit_profile": "עריכת פרופיל", "account.edit_profile": "עריכת פרופיל",
"account.endorse": "הצג בפרופיל", "account.endorse": "הצג בפרופיל",
"account.follow": "מעקב", "account.follow": "מעקב",
@ -23,86 +23,86 @@
"account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.", "account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.",
"account.follows_you": "במעקב אחריך", "account.follows_you": "במעקב אחריך",
"account.hide_reblogs": "להסתיר הידהודים מאת @{name}", "account.hide_reblogs": "להסתיר הידהודים מאת @{name}",
"account.last_status": "Last active", "account.last_status": "פעיל לאחרונה",
"account.link_verified_on": "בעלות על הקישור הזה נבדקה לאחרונה ב{date}", "account.link_verified_on": "בעלות על הקישור הזה נבדקה לאחרונה ב{date}",
"account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.locked_info": "החשבון הוגדר כנעול. בעל החשבון בודק ידנית מי יכול לעקוב אחריו",
"account.login": "Log in", "account.login": "התחברות",
"account.media": "מדיה", "account.media": "מדיה",
"account.member_since": "Joined {date}", "account.member_since": "הצטרף {date}",
"account.mention": "אזכור של", "account.mention": "אזכור של",
"account.moved_to": "החשבון {name} הועבר אל:", "account.moved_to": "החשבון {name} הועבר אל:",
"account.mute": "להשתיק את @{name}", "account.mute": "להשתיק את @{name}",
"account.muted": "Muted", "account.muted": "מושתק",
"account.never_active": "Never", "account.never_active": "אף פעם",
"account.posts": "הודעות", "account.posts": "פוסטים",
"account.posts_with_replies": "Toots with replies", "account.posts_with_replies": "פוסטים עם תגובות",
"account.profile": "Profile", "account.profile": "פרופיל",
"account.register": "Sign up", "account.register": "הרשם",
"account.remote_follow": "Remote follow", "account.remote_follow": "מעקב מרחוק",
"account.report": "לדווח על @{name}", "account.report": "לדווח על @{name}",
"account.requested": "בהמתנה לאישור", "account.requested": "בהמתנה לאישור",
"account.requested_small": "Awaiting approval", "account.requested_small": "מחכה לאישור",
"account.share": "לשתף את הפרופיל של @{name}", "account.share": "לשתף את הפרופיל של @{name}",
"account.show_reblogs": "להראות הדהודים מאת @{name}", "account.show_reblogs": "להראות הדהודים מאת @{name}",
"account.subscribe": "Subscribe to notifications from @{name}", "account.subscribe": "הרשם להתראות מאת @{name}",
"account.subscribed": "Subscribed", "account.subscribed": "רשום",
"account.unblock": "הסרת חסימה מעל @{name}", "account.unblock": "הסרת חסימה מעל @{name}",
"account.unblock_domain": "הסר חסימה מקהילת {domain}", "account.unblock_domain": "הסר חסימה מקהילת {domain}",
"account.unendorse": "לא להציג בפרופיל", "account.unendorse": "לא להציג בפרופיל",
"account.unfollow": "הפסקת מעקב", "account.unfollow": "הפסקת מעקב",
"account.unmute": "הפסקת השתקת @{name}", "account.unmute": "הפסקת השתקת @{name}",
"account.unsubscribe": "Unsubscribe to notifications from @{name}", "account.unsubscribe": "בטל הרשמה מ@{name}",
"account_gallery.none": "No media to show.", "account_gallery.none": "אין מדיה להראות.",
"account_search.placeholder": "Search for an account", "account_search.placeholder": "חפש משתמש",
"account_timeline.column_settings.show_pinned": "Show pinned posts", "account_timeline.column_settings.show_pinned": "הצג הודעות מוצמדות",
"admin.awaiting_approval.approved_message": "{acct} was approved!", "admin.awaiting_approval.approved_message": "{acct} הואשר!",
"admin.awaiting_approval.empty_message": "There is nobody waiting for approval. When a new user signs up, you can review them here.", "admin.awaiting_approval.empty_message": "אף אחד לא מחכה לאישור. כאשר משתמש חדש יירשם, תוכל לבחון אותו פה.",
"admin.awaiting_approval.rejected_message": "{acct} was rejected.", "admin.awaiting_approval.rejected_message": "{acct} נדחה",
"admin.dashboard.registration_mode.approval_hint": "Users can sign up, but their account only gets activated when an admin approves it.", "admin.dashboard.registration_mode.approval_hint": "משתמשים יכולים להרשם, אבל החשבון שלהם מופעל רק כשמנהל יאשר אותו.",
"admin.dashboard.registration_mode.approval_label": "Approval Required", "admin.dashboard.registration_mode.approval_label": "נדרש אישור",
"admin.dashboard.registration_mode.closed_hint": "Nobody can sign up. You can still invite people.", "admin.dashboard.registration_mode.closed_hint": "אף אחד לא יכול להרשם. אתה עדיין יכול להזמין אנשים.",
"admin.dashboard.registration_mode.closed_label": "Closed", "admin.dashboard.registration_mode.closed_label": "סגור להרשמה",
"admin.dashboard.registration_mode.open_hint": "Anyone can join.", "admin.dashboard.registration_mode.open_hint": "כל אחד יכול להצטרף",
"admin.dashboard.registration_mode.open_label": "Open", "admin.dashboard.registration_mode.open_label": "פתוח",
"admin.dashboard.registration_mode_label": "Registrations", "admin.dashboard.registration_mode_label": "הרשמות",
"admin.dashboard.settings_saved": "Settings saved!", "admin.dashboard.settings_saved": "ההגדרות נשמרו!",
"admin.dashcounters.domain_count_label": "peers", "admin.dashcounters.domain_count_label": "עמיתים",
"admin.dashcounters.mau_label": "monthly active users", "admin.dashcounters.mau_label": "משתמשים פעילים חודשית",
"admin.dashcounters.retention_label": "user retention", "admin.dashcounters.retention_label": "שימור משתמשים",
"admin.dashcounters.status_count_label": "posts", "admin.dashcounters.status_count_label": "פוסטים",
"admin.dashcounters.user_count_label": "total users", "admin.dashcounters.user_count_label": "סך כל המשתמשים",
"admin.dashwidgets.email_list_header": "Email list", "admin.dashwidgets.email_list_header": "רשימת דואר",
"admin.dashwidgets.software_header": "Software", "admin.dashwidgets.software_header": "תוכנה",
"admin.latest_accounts_panel.expand_message": "Click to see {count} more {count, plural, one {account} other {accounts}}", "admin.latest_accounts_panel.expand_message": "לחץ כדי לראות {count} עוד{count, plural, one {account} אחר {accounts}}",
"admin.latest_accounts_panel.title": "Latest Accounts", "admin.latest_accounts_panel.title": "חשבונות אחרונים",
"admin.moderation_log.empty_message": "You have not performed any moderation actions yet. When you do, a history will be shown here.", "admin.moderation_log.empty_message": "לא ביצעת פעולות ניהול עדיין. כשתבצע, ההיסטוריה תהיה כאן.",
"admin.reports.actions.close": "Close", "admin.reports.actions.close": "סגור",
"admin.reports.actions.view_status": "View post", "admin.reports.actions.view_status": "צפה בפוסט",
"admin.reports.empty_message": "There are no open reports. If a user gets reported, they will show up here.", "admin.reports.empty_message": "אין דוחות פתוחים. אם משתמש יידווח, הוא יופיע כאן.",
"admin.reports.report_closed_message": "Report on @{name} was closed", "admin.reports.report_closed_message": "דיווח על @{name} נסגר",
"admin.reports.report_title": "Report on {acct}", "admin.reports.report_title": "דיווח על {acct}",
"admin.statuses.actions.delete_status": "Delete post", "admin.statuses.actions.delete_status": "מחק פוסט",
"admin.statuses.actions.mark_status_not_sensitive": "Mark post not sensitive", "admin.statuses.actions.mark_status_not_sensitive": "סמן פוסט כלא רגיש",
"admin.statuses.actions.mark_status_sensitive": "Mark post sensitive", "admin.statuses.actions.mark_status_sensitive": "סמן פוסט כרגיש",
"admin.statuses.status_deleted_message": "Post by @{acct} was deleted", "admin.statuses.status_deleted_message": "פוסט מ@{acct} נמחק",
"admin.statuses.status_marked_message_not_sensitive": "Post by @{acct} was marked not sensitive", "admin.statuses.status_marked_message_not_sensitive": "פוסטים מ@{acct} סומנו כלא רגישים",
"admin.statuses.status_marked_message_sensitive": "Post by @{acct} was marked sensitive", "admin.statuses.status_marked_message_sensitive": "פוסטים מ@{acct} סומנו כרגישים",
"admin.user_index.empty": "No users found.", "admin.user_index.empty": "לא נמצאו משתמשים.",
"admin.user_index.search_input_placeholder": "Who are you looking for?", "admin.user_index.search_input_placeholder": "את מי אתה מחפש?",
"admin.users.actions.deactivate_user": "Deactivate @{name}", "admin.users.actions.deactivate_user": "השבת @{name}",
"admin.users.actions.delete_user": "Delete @{name}", "admin.users.actions.delete_user": "מחק @{name}",
"admin.users.actions.demote_to_moderator": "Demote @{name} to a moderator", "admin.users.actions.demote_to_moderator": "הורד @{name} בדרגה למנהל",
"admin.users.actions.demote_to_moderator_message": "@{acct} was demoted to a moderator", "admin.users.actions.demote_to_moderator_message": "@{acct} הורד בדרגה למנהל",
"admin.users.actions.demote_to_user": "Demote @{name} to a regular user", "admin.users.actions.demote_to_user": "הורד @{name} בדרגה למשתמש רגיל",
"admin.users.actions.demote_to_user_message": "@{acct} was demoted to a regular user", "admin.users.actions.demote_to_user_message": "@{acct} הורד בדרגה למשתמש רגיל",
"admin.users.actions.promote_to_admin": "Promote @{name} to an admin", "admin.users.actions.promote_to_admin": "קדם @{name} לאדמין",
"admin.users.actions.promote_to_admin_message": "@{acct} was promoted to an admin", "admin.users.actions.promote_to_admin_message": "@{acct} קודם לאדמין",
"admin.users.actions.promote_to_moderator": "Promote @{name} to a moderator", "admin.users.actions.promote_to_moderator": "קדם @{name} למנהל",
"admin.users.actions.promote_to_moderator_message": "@{acct} was promoted to a moderator", "admin.users.actions.promote_to_moderator_message": "@{acct} קודם למנהל",
"admin.users.actions.suggest_user": "Suggest @{name}", "admin.users.actions.suggest_user": "הצע @{name}",
"admin.users.actions.unsuggest_user": "Unsuggest @{name}", "admin.users.actions.unsuggest_user": "הסר הצעה @{name}",
"admin.users.actions.unverify_user": "Unverify @{name}", "admin.users.actions.unverify_user": "הסר אימות @{name}",
"admin.users.actions.verify_user": "Verify @{name}", "admin.users.actions.verify_user": "אמת @{name}",
"admin.users.user_deactivated_message": "@{acct} was deactivated", "admin.users.user_deactivated_message": "@{acct} was deactivated",
"admin.users.user_deleted_message": "@{acct} was deleted", "admin.users.user_deleted_message": "@{acct} was deleted",
"admin.users.user_suggested_message": "@{acct} was suggested", "admin.users.user_suggested_message": "@{acct} was suggested",
@ -112,22 +112,22 @@
"admin_nav.awaiting_approval": "Awaiting Approval", "admin_nav.awaiting_approval": "Awaiting Approval",
"admin_nav.dashboard": "Dashboard", "admin_nav.dashboard": "Dashboard",
"admin_nav.reports": "Reports", "admin_nav.reports": "Reports",
"alert.unexpected.clear_cookies": "clear cookies and browser data", "alert.unexpected.clear_cookies": "נקה קובצי 'עוגיות' ונתוני דפדפן",
"alert.unexpected.help_text": "If the problem persists, please notify a site admin with a screenshot and information about your web browser. You may also {clear_cookies} (this will log you out).", "alert.unexpected.help_text": "If the problem persists, please notify a site admin with a screenshot and information about your web browser. You may also {clear_cookies} (this will log you out).",
"alert.unexpected.message": "אירעה שגיאה בלתי צפויה.", "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
"alert.unexpected.return_home": "Return Home", "alert.unexpected.return_home": "חזור הביתה",
"alert.unexpected.title": "אופס!", "alert.unexpected.title": "אופס!",
"aliases.account.add": "Create alias", "aliases.account.add": "צור כינוי",
"aliases.account_label": "Old account:", "aliases.account_label": "חשבון ישן:",
"aliases.aliases_list_delete": "Unlink alias", "aliases.aliases_list_delete": "בטל קישור בכינוי",
"aliases.search": "Search your old account", "aliases.search": "חפש חשבון ישן",
"aliases.success.add": "Account alias created successfully", "aliases.success.add": "כינוי חשבון נוצר בהצלחה",
"aliases.success.remove": "Account alias removed successfully", "aliases.success.remove": "כינוי חשבון הוסר בהצלחה",
"app_create.name_label": "App name", "app_create.name_label": "שם אפליקציה",
"app_create.name_placeholder": "e.g. 'Soapbox'", "app_create.name_placeholder": "לדוגמא 'סבוניה'",
"app_create.redirect_uri_label": "Redirect URIs", "app_create.redirect_uri_label": "נתב URIs",
"app_create.restart": "Create another", "app_create.restart": "צור עוד",
"app_create.results.app_label": "App", "app_create.results.app_label": "אפליקציה",
"app_create.results.explanation_text": "You created a new app and token! Please copy the credentials somewhere; you will not see them again after navigating away from this page.", "app_create.results.explanation_text": "You created a new app and token! Please copy the credentials somewhere; you will not see them again after navigating away from this page.",
"app_create.results.explanation_title": "App created successfully", "app_create.results.explanation_title": "App created successfully",
"app_create.results.token_label": "OAuth token", "app_create.results.token_label": "OAuth token",
@ -135,7 +135,7 @@
"app_create.scopes_placeholder": "e.g. 'read write follow'", "app_create.scopes_placeholder": "e.g. 'read write follow'",
"app_create.submit": "Create app", "app_create.submit": "Create app",
"app_create.website_label": "Website", "app_create.website_label": "Website",
"auth.invalid_credentials": "Wrong username or password", "auth.invalid_credentials": "Wrong username or סיסמא",
"auth.logged_out": "Logged out.", "auth.logged_out": "Logged out.",
"backups.actions.create": "Create backup", "backups.actions.create": "Create backup",
"backups.empty_message": "No backups found. {action}", "backups.empty_message": "No backups found. {action}",
@ -160,8 +160,8 @@
"chats.attachment_image": "Image", "chats.attachment_image": "Image",
"chats.audio_toggle_off": "Audio notification off", "chats.audio_toggle_off": "Audio notification off",
"chats.audio_toggle_on": "Audio notification on", "chats.audio_toggle_on": "Audio notification on",
"chats.dividers.today": "Today", "chats.dividers.today": "היום",
"chats.search_placeholder": "Start a chat with…", "chats.search_placeholder": "התחל בצ'אט עם",
"column.admin.awaiting_approval": "Awaiting Approval", "column.admin.awaiting_approval": "Awaiting Approval",
"column.admin.dashboard": "Dashboard", "column.admin.dashboard": "Dashboard",
"column.admin.moderation_log": "Moderation Log", "column.admin.moderation_log": "Moderation Log",
@ -169,64 +169,64 @@
"column.admin.reports.menu.moderation_log": "Moderation Log", "column.admin.reports.menu.moderation_log": "Moderation Log",
"column.admin.users": "Users", "column.admin.users": "Users",
"column.aliases": "Account aliases", "column.aliases": "Account aliases",
"column.aliases.create_error": "Error creating alias", "column.aliases.create_error": "שגיאה ביצירת כינוי",
"column.aliases.delete": "Delete", "column.aliases.delete": "מחק כינוי",
"column.aliases.delete_error": "Error deleting alias", "column.aliases.delete_error": "שגיאה במחיקת כינוי",
"column.aliases.subheading_add_new": "Add New Alias", "column.aliases.subheading_add_new": "הוסף כינוי חדש",
"column.aliases.subheading_aliases": "Current aliases", "column.aliases.subheading_aliases": "כינויים נוכחיים",
"column.app_create": "Create app", "column.app_create": "צור אפליקציה",
"column.backups": "Backups", "column.backups": "גיבויים",
"column.blocks": "חסימות", "column.blocks": "חסימות",
"column.bookmarks": "Bookmarks", "column.bookmarks": "סימניות",
"column.chats": "Chats", "column.chats": "צ'אטים",
"column.community": "ציר זמן מקומי", "column.community": "ציר זמן מקומי",
"column.crypto_donate": "Donate Cryptocurrency", "column.crypto_donate": "תרום קריפטו",
"column.developers": "Developers", "column.developers": "מפתחים",
"column.direct": "Direct messages", "column.direct": "הודעות ישירות",
"column.directory": "Browse profiles", "column.directory": "דפדף בין פרופילים",
"column.domain_blocks": "Hidden domains", "column.domain_blocks": "דומיינים מוסתרים",
"column.edit_profile": "Edit profile", "column.edit_profile": "ערוך פרופיל",
"column.export_data": "Export data", "column.export_data": "יצא נתונים",
"column.favourited_statuses": "Liked posts", "column.favourited_statuses": "פוסטים שאהבתי",
"column.favourites": "Likes", "column.favourites": "לייקים",
"column.federation_restrictions": "Federation Restrictions", "column.federation_restrictions": "הגבלות פדרציה",
"column.filters": "Muted words", "column.filters": "מילים מושתקות",
"column.filters.add_new": "Add New Filter", "column.filters.add_new": "הוסף פילטר חדש",
"column.filters.conversations": "Conversations", "column.filters.conversations": "שיחות",
"column.filters.create_error": "Error adding filter", "column.filters.create_error": "שגיאה בהוספת פילטר",
"column.filters.delete": "Delete", "column.filters.delete": "מחק פילטר",
"column.filters.delete_error": "Error deleting filter", "column.filters.delete_error": "שגיאה במחיקת פילטר",
"column.filters.drop_header": "Drop instead of hide", "column.filters.drop_header": "הורד במקום להסתיר",
"column.filters.drop_hint": "Filtered posts will disappear irreversibly, even if filter is later removed", "column.filters.drop_hint": "פוסטים מסוננים ייעלמו באופן בלתי הפיך, גם אם הפילטר יוסר מאוחר יותר",
"column.filters.expires": "Expire after", "column.filters.expires": "פג תוקף לאחר",
"column.filters.expires_hint": "Expiration dates are not currently supported", "column.filters.expires_hint": "תאריכי תפוגה אינם נתמכים כעת",
"column.filters.home_timeline": "Home timeline", "column.filters.home_timeline": "ציר זמן ביתי",
"column.filters.keyword": "Keyword or phrase", "column.filters.keyword": "מילת מפתח או ביטוי",
"column.filters.notifications": "Notifications", "column.filters.notifications": "התראות",
"column.filters.public_timeline": "Public timeline", "column.filters.public_timeline": "ציר זמן ציבורי",
"column.filters.subheading_add_new": "Add New Filter", "column.filters.subheading_add_new": "הוסף פילטר חדש",
"column.filters.subheading_filters": "Current Filters", "column.filters.subheading_filters": "פילטרים נוכחיים",
"column.filters.whole_word_header": "Whole word", "column.filters.whole_word_header": "מילה שלמה",
"column.filters.whole_word_hint": "When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word", "column.filters.whole_word_hint": "כאשר מילת המפתח או הביטוי הם אלפאנומריים בלבד, הם יוחלו רק אם הם תואמים לכל המילה.",
"column.follow_requests": "בקשות מעקב", "column.follow_requests": "בקשות מעקב",
"column.followers": "Followers", "column.followers": "עוקבים",
"column.following": "Following", "column.following": "עוקב אחרי",
"column.groups": "Groups", "column.groups": "קבוצות",
"column.home": בית", "column.home": ית",
"column.import_data": "Import data", "column.import_data": "יבא נתונים",
"column.info": "Server information", "column.info": "מידע על הסרבר",
"column.lists": "Lists", "column.lists": "רשימות",
"column.mentions": "Mentions", "column.mentions": "אזכורים",
"column.mfa": "Multi-Factor Authentication", "column.mfa": "אימות מרובה גורמים",
"column.mfa_cancel": "Cancel", "column.mfa_cancel": "בטל",
"column.mfa_confirm_button": "Confirm", "column.mfa_confirm_button": "אמת",
"column.mfa_disable_button": "Disable", "column.mfa_disable_button": "השבת",
"column.mfa_setup": "Proceed to Setup", "column.mfa_setup": "המשך להתקנה",
"column.mutes": "השתקות", "column.mutes": "השתקות",
"column.notifications": "התראות", "column.notifications": "התראות",
"column.pins": "Pinned posts", "column.pins": "פוסטים נעוצים",
"column.preferences": "Preferences", "column.preferences": "העדפות",
"column.profile_directory": "Profile directory", "column.profile_directory": "מדריך פרופילים",
"column.public": "בפרהסיה", "column.public": "בפרהסיה",
"column.reactions": "Reactions", "column.reactions": "Reactions",
"column.reblogs": "Reposts", "column.reblogs": "Reposts",
@ -237,10 +237,10 @@
"column.soapbox_config": "Soapbox config", "column.soapbox_config": "Soapbox config",
"column_back_button.label": "חזרה", "column_back_button.label": "חזרה",
"column_forbidden.body": "You do not have permission to access this page.", "column_forbidden.body": "You do not have permission to access this page.",
"column_forbidden.title": "Forbidden", "column_forbidden.title": "אסור",
"column_header.hide_settings": "הסתרת העדפות", "column_header.hide_settings": "הסתרת העדפות",
"column_header.show_settings": "הצגת העדפות", "column_header.show_settings": "הצגת העדפות",
"community.column_settings.media_only": "Media only", "community.column_settings.media_only": "רק מדיה",
"community.column_settings.title": "Local timeline settings", "community.column_settings.title": "Local timeline settings",
"compose.character_counter.title": "Used {chars} out of {maxChars} characters", "compose.character_counter.title": "Used {chars} out of {maxChars} characters",
"compose.invalid_schedule": "You must schedule a post at least 5 minutes out.", "compose.invalid_schedule": "You must schedule a post at least 5 minutes out.",
@ -443,8 +443,8 @@
"follow_request.authorize": "קבלה", "follow_request.authorize": "קבלה",
"follow_request.reject": "דחיה", "follow_request.reject": "דחיה",
"forms.copy": "Copy", "forms.copy": "Copy",
"forms.hide_password": "Hide password", "forms.hide_password": "Hide סיסמא",
"forms.show_password": "Show password", "forms.show_password": "Show סיסמא",
"getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {code_link} (v{code_version}).", "getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {code_link} (v{code_version}).",
"group.detail.archived_group": "Archived group", "group.detail.archived_group": "Archived group",
"group.members.empty": "This group does not has any members.", "group.members.empty": "This group does not has any members.",
@ -580,8 +580,8 @@
"media_gallery.toggle_visible": "נראה בלתי נראה", "media_gallery.toggle_visible": "נראה בלתי נראה",
"media_panel.empty_message": "No media found.", "media_panel.empty_message": "No media found.",
"media_panel.title": "Media", "media_panel.title": "Media",
"mfa.mfa_disable_enter_password": "Enter your current password to disable two-factor auth:", "mfa.mfa_disable_enter_password": "Enter your current סיסמא to disable two-factor auth:",
"mfa.mfa_setup_enter_password": "Enter your current password to confirm your identity:", "mfa.mfa_setup_enter_password": "Enter your current סיסמא to confirm your identity:",
"mfa.mfa_setup_scan_description": "Using your two-factor app, scan this QR code or enter text key:", "mfa.mfa_setup_scan_description": "Using your two-factor app, scan this QR code or enter text key:",
"mfa.mfa_setup_scan_key": "Key:", "mfa.mfa_setup_scan_key": "Key:",
"mfa.mfa_setup_scan_title": "Scan", "mfa.mfa_setup_scan_title": "Scan",
@ -676,7 +676,7 @@
"notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}", "notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}",
"password_reset.confirmation": "Check your email for confirmation.", "password_reset.confirmation": "Check your email for confirmation.",
"password_reset.fields.username_placeholder": "Email or username", "password_reset.fields.username_placeholder": "Email or username",
"password_reset.reset": "Reset password", "password_reset.reset": "Reset סיסמא",
"pinned_statuses.none": "No pins to show.", "pinned_statuses.none": "No pins to show.",
"poll.closed": "Closed", "poll.closed": "Closed",
"poll.refresh": "Refresh", "poll.refresh": "Refresh",
@ -806,90 +806,90 @@
"search_results.statuses": "Posts", "search_results.statuses": "Posts",
"search_results.top": "Top", "search_results.top": "Top",
"security.codes.fail": "Failed to fetch backup codes", "security.codes.fail": "Failed to fetch backup codes",
"security.confirm.fail": "Incorrect code or password. Try again.", "security.confirm.fail": "Incorrect code or סיסמא. Try again.",
"security.delete_account.fail": "Account deletion failed.", "security.delete_account.fail": "Account deletion failed.",
"security.delete_account.success": "Account successfully deleted.", "security.delete_account.success": "Account successfully deleted.",
"security.disable.fail": "Incorrect password. Try again.", "security.disable.fail": "Incorrect סיסמא. Try again.",
"security.disable_mfa": "Disable", "security.disable_mfa": "Disable",
"security.fields.email.label": "Email address", "security.fields.email.label": "Email address",
"security.fields.new_password.label": "New password", "security.fields.new_password.label": "סיסמא חדשה",
"security.fields.old_password.label": "Current password", "security.fields.old_password.label": "סיסמא נוכחית",
"security.fields.password.label": "Password", "security.fields.סיסמא.label": "סיסמא",
"security.fields.password_confirmation.label": "New password (again)", "security.fields.password_confirmation.label": "סיסמא חדשה (שוב)",
"security.headers.delete": "Delete Account", "security.headers.delete": "מחק חשבון",
"security.headers.tokens": "Sessions", "security.headers.tokens": "Sessions",
"security.headers.update_email": "Change Email", "security.headers.update_email": "שנה אימייל",
"security.headers.update_password": "Change Password", "security.headers.update_password": "שנה סיסמא",
"security.mfa": "Set up 2-Factor Auth", "security.mfa": "הגדר אימות דו-גורמי",
"security.mfa_enabled": "You have multi-factor authentication set up with OTP.", "security.mfa_enabled": "הגדרת אימות מרובה גורמים עם OTP.",
"security.mfa_header": "Authorization Methods", "security.mfa_header": "שיטות הרשאה",
"security.mfa_setup_hint": "Configure multi-factor authentication with OTP", "security.mfa_setup_hint": "הגדר אימות רב-גורמי עם OTP",
"security.qr.fail": "Failed to fetch setup key", "security.qr.fail": "אחזור מפתח ההגדרה נכשל",
"security.submit": "Save changes", "security.submit": "שמור שינויים",
"security.submit.delete": "Delete Account", "security.submit.delete": "מחק חשבון",
"security.text.delete": "To delete your account, enter your password then click Delete Account. This is a permanent action that cannot be undone. Your account will be destroyed from this server, and a deletion request will be sent to other servers. It's not guaranteed that all servers will purge your account.", "security.text.delete": "כדי למחוק את חשבונך, הזן את הסיסמה שלך ולאחר מכן לחץ על מחק חשבון. זוהי פעולה קבועה שלא ניתן לבטלה. החשבון שלך יושמד מהשרת הזה, ובקשת מחיקה תישלח לשרתים אחרים. לא מובטח שכל השרתים ינקו את חשבונך.",
"security.tokens.revoke": "Revoke", "security.tokens.revoke": "בטל",
"security.update_email.fail": "Update email failed.", "security.update_email.fail": "עדכון האימייל נכשל.",
"security.update_email.success": "Email successfully updated.", "security.update_email.success": "האימייל עודכן בהצלחה.",
"security.update_password.fail": "Update password failed.", "security.update_password.fail": "עדכון הסיסמא נכשל.",
"security.update_password.success": "Password successfully updated.", "security.update_password.success": "הסיסמה עודכנה בהצלחה.",
"signup_panel.subtitle": "Sign up now to discuss.", "signup_panel.subtitle": "הירשם כעת כדי לדון.",
"signup_panel.title": "New to {site_title}?", "signup_panel.title": "חדש ל{site_title}?",
"soapbox_config.authenticated_profile_hint": "Users must be logged-in to view replies and media on user profiles.", "soapbox_config.authenticated_profile_hint": "משתמשים חייבים להיות מחוברים כדי לראות תגובות ומדיה בפרופילי משתמש.",
"soapbox_config.authenticated_profile_label": "Profiles require authentication", "soapbox_config.authenticated_profile_label": "פרופילים שדורשים אימות",
"soapbox_config.copyright_footer.meta_fields.label_placeholder": "Copyright footer", "soapbox_config.copyright_footer.meta_fields.label_placeholder": "כותרת תחתונה של זכויות יוצרים",
"soapbox_config.crypto_address.meta_fields.address_placeholder": "Address", "soapbox_config.crypto_address.meta_fields.address_placeholder": "כתובת",
"soapbox_config.crypto_address.meta_fields.note_placeholder": "Note (optional)", "soapbox_config.crypto_address.meta_fields.note_placeholder": "הערה (אפשרי)",
"soapbox_config.crypto_address.meta_fields.ticker_placeholder": "Ticker", "soapbox_config.crypto_address.meta_fields.ticker_placeholder": "טיקר",
"soapbox_config.crypto_donate_panel_limit.meta_fields.limit_placeholder": "Number of items to display in the crypto homepage widget", "soapbox_config.crypto_donate_panel_limit.meta_fields.limit_placeholder": "מספר הפריטים להצגה בווידג'ט דף הבית של קריפטו",
"soapbox_config.custom_css.meta_fields.url_placeholder": "URL", "soapbox_config.custom_css.meta_fields.url_placeholder": "URL",
"soapbox_config.display_fqn_label": "Display domain (eg @user@domain) for local accounts.", "soapbox_config.display_fqn_label": "הצג דומיין (למשל @user@domain) עבור חשבונות מקומיים.",
"soapbox_config.fields.brand_color_label": "Brand color", "soapbox_config.fields.brand_color_label": "צבע מותג",
"soapbox_config.fields.crypto_address.add": "Add new crypto address", "soapbox_config.fields.crypto_address.add": "הוסף כתובת קריפטו חדשה",
"soapbox_config.fields.crypto_addresses_label": "Cryptocurrency addresses", "soapbox_config.fields.crypto_addresses_label": "כתובות של מטבעות קריפטוגרפיים",
"soapbox_config.fields.home_footer.add": "Add new Home Footer Item", "soapbox_config.fields.home_footer.add": "Add new Home Footer Item",
"soapbox_config.fields.home_footer_fields_label": "Home footer items", "soapbox_config.fields.home_footer_fields_label": "Home footer items",
"soapbox_config.fields.logo_label": "Logo", "soapbox_config.fields.logo_label": "Logo",
"soapbox_config.fields.promo_panel.add": "Add new Promo panel item", "soapbox_config.fields.promo_panel.add": "הוסף פריטי פאנל פרומו חדשים",
"soapbox_config.fields.promo_panel_fields_label": "Promo panel items", "soapbox_config.fields.promo_panel_fields_label": "פריטי פאנל לפרומו",
"soapbox_config.fields.theme_label": "Default theme", "soapbox_config.fields.theme_label": "ערכת נושא המוגדרת כברירת מחדל",
"soapbox_config.greentext_label": "Enable greentext support", "soapbox_config.greentext_label": "אפשר תמיכה ב-greentext",
"soapbox_config.hints.crypto_addresses": "Add cryptocurrency addresses so users of your site can donate to you. Order matters, and you must use lowercase ticker values.", "soapbox_config.hints.crypto_addresses": "הוסף כתובות של מטבעות קריפטוגרפיים כדי שמשתמשי האתר שלך יוכלו לתרום לך. יש חשיבות לסדר, ועליך להשתמש בערכי טיקרים קטנים.",
"soapbox_config.hints.home_footer_fields": "You can have custom defined links displayed on the footer of your static pages", "soapbox_config.hints.home_footer_fields": "אתה יכול להציג קישורים מוגדרים בהתאמה אישית בכותרת התחתונה של הדפים הסטטיים שלך",
"soapbox_config.hints.logo": "SVG. At most 2 MB. Will be displayed to 50px height, maintaining aspect ratio", "soapbox_config.hints.logo": "SVG. לכל היותר 2 מגה-בייט. יוצג בגובה של 50 פיקסלים, תוך שמירה על יחס רוחב-גובה",
"soapbox_config.hints.promo_panel_fields": "You can have custom defined links displayed on the right panel of the timelines page.", "soapbox_config.hints.promo_panel_fields": "אתה יכול להציג קישורים מוגדרים בהתאמה אישית בחלונית לצד דף ציר הזמן.",
"soapbox_config.hints.promo_panel_icons": "{ link }", "soapbox_config.hints.promo_panel_icons": "{ link }",
"soapbox_config.hints.promo_panel_icons.link": "Soapbox Icons List", "soapbox_config.hints.promo_panel_icons.link": "רשימת אייקוני סבוניה",
"soapbox_config.home_footer.meta_fields.label_placeholder": "Label", "soapbox_config.home_footer.meta_fields.label_placeholder": "תווית",
"soapbox_config.home_footer.meta_fields.url_placeholder": "URL", "soapbox_config.home_footer.meta_fields.url_placeholder": "URL",
"soapbox_config.promo_panel.meta_fields.icon_placeholder": "Icon", "soapbox_config.promo_panel.meta_fields.icon_placeholder": "סמל",
"soapbox_config.promo_panel.meta_fields.label_placeholder": "Label", "soapbox_config.promo_panel.meta_fields.label_placeholder": "תווית",
"soapbox_config.promo_panel.meta_fields.url_placeholder": "URL", "soapbox_config.promo_panel.meta_fields.url_placeholder": "URL",
"soapbox_config.raw_json_hint": "Edit the settings data directly. Changes made directly to the JSON file will override the form fields above. Click Save to apply your changes.", "soapbox_config.raw_json_hint": "ערוך את נתוני ההגדרות ישירות. שינויים שנעשו ישירות בקובץ JSON יעקפו את שדות הטופס שלמעלה. לחץ על שמור כדי להחיל את השינויים שלך.",
"soapbox_config.raw_json_label": "Advanced: Edit raw JSON data", "soapbox_config.raw_json_label": "מתקדם: ערוך נתוני JSON גולמיים",
"soapbox_config.save": "Save", "soapbox_config.save": "שמור",
"soapbox_config.saved": "Soapbox config saved!", "soapbox_config.saved": "תצורת סבוניה נשמרה!",
"soapbox_config.verified_can_edit_name_label": "Allow verified users to edit their own display name.", "soapbox_config.verified_can_edit_name_label": "אפשר למשתמשים מאומתים לערוך את שם התצוגה שלהם.",
"status.admin_account": "Open moderation interface for @{name}", "status.admin_account": "פתח ממשק ניהול ל@{name}",
"status.admin_status": "Open this post in the moderation interface", "status.admin_status": "פתח את הפוסט הזה בממשק הניהול",
"status.block": "Block @{name}", "status.block": "חסום @{name}",
"status.bookmark": "Bookmark", "status.bookmark": "סימניה",
"status.bookmarked": "Bookmark added.", "status.bookmarked": "סימניה נוספה.",
"status.cancel_reblog_private": "Un-repost", "status.cancel_reblog_private": "הסר הדהוד",
"status.cannot_reblog": "לא ניתן להדהד הודעה זו", "status.cannot_reblog": "לא ניתן להדהד הודעה זו",
"status.chat": "Chat with @{name}", "status.chat": "שוחח עם @{name}",
"status.copy": "Copy link to post", "status.copy": "העתק קישור לפוסט",
"status.delete": "מחיקה", "status.delete": "מחיקה",
"status.detailed_status": "Detailed conversation view", "status.detailed_status": "תצוגת שיחה מפורטת",
"status.direct": "Direct message @{name}", "status.direct": "הודעה ישירה @{name}",
"status.embed": "הטמעה", "status.embed": "הטמעה",
"status.favourite": "חיבוב", "status.favourite": "חיבוב",
"status.filtered": "Filtered", "status.filtered": "מסונן",
"status.load_more": "עוד", "status.load_more": "עוד",
"status.media_hidden": "מדיה מוסתרת", "status.media_hidden": "מדיה מוסתרת",
"status.mention": "פניה אל @{name}", "status.mention": "פניה אל @{name}",
"status.more": "עוד", "status.more": "עוד",
"status.mute": "Mute @{name}", "status.mute": "השתק @{name}",
"status.mute_conversation": "השתקת שיחה", "status.mute_conversation": "השתקת שיחה",
"status.open": "הרחבת הודעה", "status.open": "הרחבת הודעה",
"status.pin": "לקבע באודות", "status.pin": "לקבע באודות",

View File

@ -12,6 +12,7 @@ export default {
'de': () => import(/* webpackChunkName: "locale_de" */'./de.json'), 'de': () => import(/* webpackChunkName: "locale_de" */'./de.json'),
'el': () => import(/* webpackChunkName: "locale_el" */'./el.json'), 'el': () => import(/* webpackChunkName: "locale_el" */'./el.json'),
'en': () => import(/* webpackChunkName: "locale_en" */'./en.json'), 'en': () => import(/* webpackChunkName: "locale_en" */'./en.json'),
'en-Shaw': () => import(/* webpackChunkName: "locale_en-Shaw" */'./en-Shaw.json'),
'eo': () => import(/* webpackChunkName: "locale_eo" */'./eo.json'), 'eo': () => import(/* webpackChunkName: "locale_eo" */'./eo.json'),
'es-AR': () => import(/* webpackChunkName: "locale_es-AR" */'./es-AR.json'), 'es-AR': () => import(/* webpackChunkName: "locale_es-AR" */'./es-AR.json'),
'es': () => import(/* webpackChunkName: "locale_es" */'./es.json'), 'es': () => import(/* webpackChunkName: "locale_es" */'./es.json'),

View File

@ -1,19 +1,114 @@
import { Map as ImmutableMap } from 'immutable'; import { Map as ImmutableMap } from 'immutable';
import { INSTANCE_REMEMBER_SUCCESS } from 'soapbox/actions/instance';
import reducer from '../instance'; import reducer from '../instance';
describe('instance reducer', () => { describe('instance reducer', () => {
it('should return the initial state', () => { it('should return the initial state', () => {
expect(reducer(undefined, {})).toEqual(ImmutableMap({ expect(reducer(undefined, {})).toEqual(ImmutableMap({
max_toot_chars: 500,
description_limit: 1500, description_limit: 1500,
poll_limits: ImmutableMap({ configuration: ImmutableMap({
max_expiration: 2629746, statuses: ImmutableMap({
max_option_chars: 25, max_characters: 500,
max_options: 4, max_media_attachments: 4,
min_expiration: 300, }),
polls: ImmutableMap({
max_options: 4,
max_characters_per_option: 25,
min_expiration: 300,
max_expiration: 2629746,
}),
}), }),
version: '0.0.0', version: '0.0.0',
})); }));
}); });
describe('INSTANCE_REMEMBER_SUCCESS', () => {
it('normalizes Pleroma instance with Mastodon configuration format', () => {
const action = {
type: INSTANCE_REMEMBER_SUCCESS,
instance: require('soapbox/__fixtures__/pleroma-instance.json'),
};
const result = reducer(undefined, action);
const expected = {
configuration: {
statuses: {
max_characters: 5000,
max_media_attachments: Infinity,
},
polls: {
max_options: 20,
max_characters_per_option: 200,
min_expiration: 0,
max_expiration: 31536000,
},
},
};
expect(result.toJS()).toMatchObject(expected);
});
it('normalizes Mastodon instance with retained configuration', () => {
const action = {
type: INSTANCE_REMEMBER_SUCCESS,
instance: require('soapbox/__fixtures__/mastodon-instance.json'),
};
const result = reducer(undefined, action);
const expected = {
configuration: {
statuses: {
max_characters: 500,
max_media_attachments: 4,
characters_reserved_per_url: 23,
},
media_attachments: {
image_size_limit: 10485760,
image_matrix_limit: 16777216,
video_size_limit: 41943040,
video_frame_rate_limit: 60,
video_matrix_limit: 2304000,
},
polls: {
max_options: 4,
max_characters_per_option: 50,
min_expiration: 300,
max_expiration: 2629746,
},
},
};
expect(result.toJS()).toMatchObject(expected);
});
it('normalizes Mastodon 3.0.0 instance with default configuration', () => {
const action = {
type: INSTANCE_REMEMBER_SUCCESS,
instance: require('soapbox/__fixtures__/mastodon-3.0.0-instance.json'),
};
const result = reducer(undefined, action);
const expected = {
configuration: {
statuses: {
max_characters: 500,
max_media_attachments: 4,
},
polls: {
max_options: 4,
max_characters_per_option: 25,
min_expiration: 300,
max_expiration: 2629746,
},
},
};
expect(result.toJS()).toMatchObject(expected);
});
});
}); });

View File

@ -16,6 +16,7 @@ describe('user_lists reducer', () => {
groups: ImmutableMap(), groups: ImmutableMap(),
groups_removed_accounts: ImmutableMap(), groups_removed_accounts: ImmutableMap(),
pinned: ImmutableMap(), pinned: ImmutableMap(),
birthday_reminders: ImmutableMap(),
})); }));
}); });
}); });

View File

@ -16,6 +16,8 @@ export default function alerts(state = initialState, action) {
title: action.title, title: action.title,
message: action.message, message: action.message,
severity: action.severity || 'info', severity: action.severity || 'info',
actionLabel: action.actionLabel,
actionLink: action.actionLink,
})); }));
case ALERT_DISMISS: case ALERT_DISMISS:
return state.filterNot(item => item.get('key') === action.alert.key); return state.filterNot(item => item.get('key') === action.alert.key);

View File

@ -4,6 +4,8 @@ import { ADMIN_CONFIG_UPDATE_REQUEST, ADMIN_CONFIG_UPDATE_SUCCESS } from 'soapbo
import { PLEROMA_PRELOAD_IMPORT } from 'soapbox/actions/preload'; import { PLEROMA_PRELOAD_IMPORT } from 'soapbox/actions/preload';
import KVStore from 'soapbox/storage/kv_store'; import KVStore from 'soapbox/storage/kv_store';
import { ConfigDB } from 'soapbox/utils/config_db'; import { ConfigDB } from 'soapbox/utils/config_db';
import { parseVersion, PLEROMA } from 'soapbox/utils/features';
import { isNumber } from 'soapbox/utils/numbers';
import { import {
INSTANCE_REMEMBER_SUCCESS, INSTANCE_REMEMBER_SUCCESS,
@ -28,21 +30,69 @@ const nodeinfoToInstance = nodeinfo => {
}); });
}; };
// Set Mastodon defaults, overridden by Pleroma servers // Use Mastodon defaults
const initialState = ImmutableMap({ const initialState = ImmutableMap({
max_toot_chars: 500,
description_limit: 1500, description_limit: 1500,
poll_limits: ImmutableMap({ configuration: ImmutableMap({
max_expiration: 2629746, statuses: ImmutableMap({
max_option_chars: 25, max_characters: 500,
max_options: 4, max_media_attachments: 4,
min_expiration: 300, }),
polls: ImmutableMap({
max_options: 4,
max_characters_per_option: 25,
min_expiration: 300,
max_expiration: 2629746,
}),
}), }),
version: '0.0.0', version: '0.0.0',
}); });
// Build Mastodon configuration from Pleroma instance
const pleromaToMastodonConfig = instance => {
return {
statuses: ImmutableMap({
max_characters: instance.get('max_toot_chars'),
}),
polls: ImmutableMap({
max_options: instance.getIn(['poll_limits', 'max_options']),
max_characters_per_option: instance.getIn(['poll_limits', 'max_option_chars']),
min_expiration: instance.getIn(['poll_limits', 'min_expiration']),
max_expiration: instance.getIn(['poll_limits', 'max_expiration']),
}),
};
};
// Use new value only if old value is undefined
const mergeDefined = (oldVal, newVal) => oldVal === undefined ? newVal : oldVal;
// Get the software's default attachment limit
const getAttachmentLimit = software => software === PLEROMA ? Infinity : 4;
// Normalize instance (Pleroma, Mastodon, etc.) to Mastodon's format
const normalizeInstance = instance => {
const { software } = parseVersion(instance.get('version'));
const mastodonConfig = pleromaToMastodonConfig(instance);
return instance.withMutations(instance => {
// Merge configuration
instance.update('configuration', ImmutableMap(), configuration => (
configuration.mergeDeepWith(mergeDefined, mastodonConfig)
));
// If max attachments isn't set, check the backend software
instance.updateIn(['configuration', 'statuses', 'max_media_attachments'], value => {
return isNumber(value) ? value : getAttachmentLimit(software);
});
// Merge defaults & cleanup
instance.mergeDeepWith(mergeDefined, initialState);
instance.deleteAll(['max_toot_chars', 'poll_limits']);
});
};
const importInstance = (state, instance) => { const importInstance = (state, instance) => {
return initialState.mergeDeep(instance); return normalizeInstance(instance);
}; };
const importNodeinfo = (state, nodeinfo) => { const importNodeinfo = (state, nodeinfo) => {

View File

@ -10,6 +10,7 @@ import {
FOLLOW_REQUEST_AUTHORIZE_SUCCESS, FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
FOLLOW_REQUEST_REJECT_SUCCESS, FOLLOW_REQUEST_REJECT_SUCCESS,
PINNED_ACCOUNTS_FETCH_SUCCESS, PINNED_ACCOUNTS_FETCH_SUCCESS,
BIRTHDAY_REMINDERS_FETCH_SUCCESS,
} from '../actions/accounts'; } from '../actions/accounts';
import { import {
BLOCKS_FETCH_SUCCESS, BLOCKS_FETCH_SUCCESS,
@ -55,6 +56,7 @@ const initialState = ImmutableMap({
groups: ImmutableMap(), groups: ImmutableMap(),
groups_removed_accounts: ImmutableMap(), groups_removed_accounts: ImmutableMap(),
pinned: ImmutableMap(), pinned: ImmutableMap(),
birthday_reminders: ImmutableMap(),
}); });
const normalizeList = (state, type, id, accounts, next) => { const normalizeList = (state, type, id, accounts, next) => {
@ -131,6 +133,8 @@ export default function userLists(state = initialState, action) {
return state.updateIn(['groups_removed_accounts', action.groupId, 'items'], list => list.filterNot(item => item === action.id)); return state.updateIn(['groups_removed_accounts', action.groupId, 'items'], list => list.filterNot(item => item === action.id));
case PINNED_ACCOUNTS_FETCH_SUCCESS: case PINNED_ACCOUNTS_FETCH_SUCCESS:
return normalizeList(state, 'pinned', action.id, action.accounts, action.next); return normalizeList(state, 'pinned', action.id, action.accounts, action.next);
case BIRTHDAY_REMINDERS_FETCH_SUCCESS:
return state.setIn(['birthday_reminders', action.id], ImmutableOrderedSet(action.accounts.map(item => item.id)));
default: default:
return state; return state;
} }

View File

@ -171,6 +171,8 @@ export const getAlerts = createSelector([getAlertsBase], (base) => {
arr.push({ arr.push({
message: item.get('message'), message: item.get('message'),
title: item.get('title'), title: item.get('title'),
actionLabel: item.get('actionLabel'),
actionLink: item.get('actionLink'),
key: item.get('key'), key: item.get('key'),
className: `snackbar snackbar--${item.get('severity', 'info')}`, className: `snackbar snackbar--${item.get('severity', 'info')}`,
activeClassName: 'snackbar--active', activeClassName: 'snackbar--active',

View File

@ -94,22 +94,6 @@ describe('getFeatures', () => {
}); });
}); });
describe('attachmentLimit', () => {
it('is 4 by default', () => {
const instance = ImmutableMap({ version: '3.1.4' });
const features = getFeatures(instance);
expect(features.attachmentLimit).toEqual(4);
});
it('is Infinity for Pleroma', () => {
const instance = ImmutableMap({
version: '2.7.2 (compatible; Pleroma 1.1.50-42-g3d9ac6ae-develop)',
});
const features = getFeatures(instance);
expect(features.attachmentLimit).toEqual(Infinity);
});
});
describe('focalPoint', () => { describe('focalPoint', () => {
it('is true for Mastodon 2.3.0+', () => { it('is true for Mastodon 2.3.0+', () => {
const instance = ImmutableMap({ version: '2.3.0' }); const instance = ImmutableMap({ version: '2.3.0' });

View File

@ -49,7 +49,6 @@ export const getFeatures = createSelector([
]), ]),
emojiReacts: v.software === PLEROMA && gte(v.version, '2.0.0'), emojiReacts: v.software === PLEROMA && gte(v.version, '2.0.0'),
emojiReactsRGI: v.software === PLEROMA && gte(v.version, '2.2.49'), emojiReactsRGI: v.software === PLEROMA && gte(v.version, '2.2.49'),
attachmentLimit: v.software === PLEROMA ? Infinity : 4,
focalPoint: v.software === MASTODON && gte(v.compatVersion, '2.3.0'), focalPoint: v.software === MASTODON && gte(v.compatVersion, '2.3.0'),
importAPI: v.software === PLEROMA, importAPI: v.software === PLEROMA,
importMutes: v.software === PLEROMA && gte(v.version, '2.2.0'), importMutes: v.software === PLEROMA && gte(v.version, '2.2.0'),
@ -65,6 +64,10 @@ export const getFeatures = createSelector([
resetPasswordAPI: v.software === PLEROMA, resetPasswordAPI: v.software === PLEROMA,
exposableReactions: features.includes('exposable_reactions'), exposableReactions: features.includes('exposable_reactions'),
accountSubscriptions: v.software === PLEROMA && gte(v.version, '1.0.0'), accountSubscriptions: v.software === PLEROMA && gte(v.version, '1.0.0'),
accountNotifies: any([
v.software === MASTODON && gte(v.compatVersion, '3.3.0'),
v.software === PLEROMA && gte(v.version, '2.4.50'),
]),
unrestrictedLists: v.software === PLEROMA, unrestrictedLists: v.software === PLEROMA,
accountByUsername: v.software === PLEROMA, accountByUsername: v.software === PLEROMA,
profileDirectory: any([ profileDirectory: any([
@ -79,6 +82,7 @@ export const getFeatures = createSelector([
explicitAddressing: v.software === PLEROMA && gte(v.version, '1.0.0'), explicitAddressing: v.software === PLEROMA && gte(v.version, '1.0.0'),
accountEndorsements: v.software === PLEROMA && gte(v.version, '2.4.50'), accountEndorsements: v.software === PLEROMA && gte(v.version, '2.4.50'),
quotePosts: v.software === PLEROMA && gte(v.version, '2.4.50'), quotePosts: v.software === PLEROMA && gte(v.version, '2.4.50'),
birthdays: v.software === PLEROMA && gte(v.version, '2.4.50'),
}; };
}); });

View File

@ -554,3 +554,9 @@ a .account__avatar {
padding-right: 3px; padding-right: 3px;
} }
} }
.account__birthday {
display: flex;
align-items: center;
white-space: nowrap;
}

View File

@ -33,6 +33,7 @@
.datepicker .react-datepicker { .datepicker .react-datepicker {
box-shadow: 0 0 6px 0 rgb(0 0 0 / 30%); box-shadow: 0 0 6px 0 rgb(0 0 0 / 30%);
font-family: inherit;
font-size: 12px; font-size: 12px;
border: 0; border: 0;
border-radius: 10px; border-radius: 10px;

View File

@ -89,3 +89,18 @@
padding-bottom: 8px !important; padding-bottom: 8px !important;
} }
} }
.notification-birthday span[type="button"] {
&:focus,
&:hover,
&:active {
text-decoration: underline;
cursor: pointer;
}
}
.columns-area .notification-birthday {
.notification__message {
padding-top: 0;
}
}

View File

@ -22,7 +22,8 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
&__join-date { &__join-date,
&__birthday {
display: flex; display: flex;
font-size: 14px; font-size: 14px;
color: var(--primary-text-color--faint); color: var(--primary-text-color--faint);

View File

@ -55,4 +55,19 @@
.notification-bar-wrapper { .notification-bar-wrapper {
transform: translateY(1px); transform: translateY(1px);
} }
.notification-bar-action a {
@include font-roboto;
font-size: 16px;
color: white;
font-weight: 700;
text-decoration: none;
text-transform: none;
&:hover,
&:active,
&:focus {
text-decoration: underline;
}
}
} }

View File

@ -809,6 +809,7 @@ a.status-card.compact:hover {
text-overflow: ellipsis; text-overflow: ellipsis;
-webkit-line-clamp: 6; -webkit-line-clamp: 6;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
max-height: 114px;
margin-top: 5px; margin-top: 5px;
font-size: 14px; font-size: 14px;

View File

@ -634,6 +634,61 @@ code {
} }
} }
} }
.datepicker {
padding: 0;
margin-bottom: 8px;
border: none;
&__hint {
padding-bottom: 0;
color: var(--primary-text-color);
font-size: 14px;
font-style: unset;
}
.react-datepicker {
&__header {
padding-top: 4px;
}
&__input-container {
border: 1px solid var(--highlight-text-color);
input {
border: none;
}
}
}
&__years,
&__months {
display: flex;
justify-content: space-between;
align-items: center;
margin: 0 4px;
font-size: 16px;
}
&__button {
width: 28px;
margin: 0;
padding: 4px;
background: transparent;
color: var(--primary-text-color);
&:hover,
&:active,
&:focus {
background: none;
}
.svg-icon {
height: 20px;
width: 20px;
}
}
}
} }
.block-icon { .block-icon {

View File

@ -126,7 +126,8 @@ If it's not documented, it's because I inherited it from Mastodon and I don't kn
groups: {}, groups: {},
followers: {}, followers: {},
mutes: {}, mutes: {},
favourited_by: {} favourited_by: {},
birthday_reminders: {}
} }
``` ```
@ -391,6 +392,9 @@ If it's not documented, it's because I inherited it from Mastodon and I don't kn
mention: true, mention: true,
poll: true, poll: true,
reblog: true reblog: true
},
birthdays: {
show: true
} }
}, },
theme: 'azure', theme: 'azure',

View File

@ -118,7 +118,7 @@
"qrcode.react": "^1.0.0", "qrcode.react": "^1.0.0",
"react": "^16.13.1", "react": "^16.13.1",
"react-color": "^2.18.1", "react-color": "^2.18.1",
"react-datepicker": "^4.1.1", "react-datepicker": "^4.6.0",
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-helmet": "^6.0.0", "react-helmet": "^6.0.0",
"react-hotkeys": "^1.1.4", "react-hotkeys": "^1.1.4",

View File

@ -3292,10 +3292,10 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0" whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0" whatwg-url "^8.0.0"
date-fns@^2.0.1: date-fns@^2.24.0:
version "2.23.0" version "2.28.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2"
integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==
debug@2.6.9, debug@^2.6.9: debug@2.6.9, debug@^2.6.9:
version "2.6.9" version "2.6.9"
@ -7820,16 +7820,16 @@ react-color@^2.18.1:
reactcss "^1.2.0" reactcss "^1.2.0"
tinycolor2 "^1.4.1" tinycolor2 "^1.4.1"
react-datepicker@^4.1.1: react-datepicker@^4.6.0:
version "4.2.1" version "4.6.0"
resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.2.1.tgz#72caf5055bc7c4eb0279c1f6d7624ded053edc4c" resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.6.0.tgz#10fc7c5b9c72df5c3e29712d559cb3fe73fd9f62"
integrity sha512-0gcvHMnX8rS1fV90PjjsB7MQdsWNU77JeVHf6bbwK9HnFxgwjVflTx40ebKmHV+leqe+f+FgUP9Nvqbe5RGyfA== integrity sha512-JGSQnQSQYUkS7zvSaZuyHv5lxp3wMrN7GXV0VA0E9Ax9fL3Bb6E1pSXjL6C3WoeuV8dt/mItQfRkPpRGCrl/OA==
dependencies: dependencies:
"@popperjs/core" "^2.9.2" "@popperjs/core" "^2.9.2"
classnames "^2.2.6" classnames "^2.2.6"
date-fns "^2.0.1" date-fns "^2.24.0"
prop-types "^15.7.2" prop-types "^15.7.2"
react-onclickoutside "^6.10.0" react-onclickoutside "^6.12.0"
react-popper "^2.2.5" react-popper "^2.2.5"
react-dom@^16.13.1: react-dom@^16.13.1:
@ -7959,10 +7959,10 @@ react-notification@^6.8.4:
dependencies: dependencies:
prop-types "^15.6.2" prop-types "^15.6.2"
react-onclickoutside@^6.10.0: react-onclickoutside@^6.12.0:
version "6.12.0" version "6.12.1"
resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.0.tgz#c63db2e3c2c852b288160cdb6cff443604e28db4" resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz#92dddd28f55e483a1838c5c2930e051168c1e96b"
integrity sha512-oPlOTYcISLHfpMog2lUZMFSbqOs4LFcA4+vo7fpfevB5v9Z0D5VBDBkfeO5lv+hpEcGoaGk67braLT+QT+eICA== integrity sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q==
react-overlays@^0.9.0: react-overlays@^0.9.0:
version "0.9.3" version "0.9.3"