diff --git a/.eslintrc.js b/.eslintrc.js index 8bc6e08951..6a2116d7bb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -293,6 +293,7 @@ module.exports = { '.*rc.js', 'ide-helper.js', 'config/webpack/**/*', + 'config/formatjs-formatter.js', ], env: { diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml index e282e2ab72..b67c503e95 100644 --- a/.github/workflows/check-i18n.yml +++ b/.github/workflows/check-i18n.yml @@ -41,8 +41,7 @@ jobs: - name: Check for missing strings in English JSON run: | - yarn build:development - yarn manage:translations en + yarn i18n:extract --throws git diff --exit-code - name: Check locale file normalization diff --git a/app/javascript/locales/index.js b/app/javascript/locales/index.js index 421cb7fab0..6e57e3ddc4 100644 --- a/app/javascript/locales/index.js +++ b/app/javascript/locales/index.js @@ -7,3 +7,16 @@ export function setLocale(locale) { export function getLocale() { return theLocale; } + +export function onProviderError(error) { + // Silent the error, like upstream does + if(process.env.NODE_ENV === 'production') return; + + // This browser does not advertise Intl support for this locale, we only print a warning + // As-per the spec, the browser should select the best matching locale + if(typeof error === "object" && error.message.match("MISSING_DATA")) { + console.warn(error.message); + } + + console.error(error); +} diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index c040edb58b..6e8ddb2279 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -1,4 +1,4 @@ -import IntlMessageFormat from 'intl-messageformat'; +import { IntlMessageFormat } from 'intl-messageformat'; import { defineMessages } from 'react-intl'; import { List as ImmutableList } from 'immutable'; diff --git a/app/javascript/mastodon/components/domain.tsx b/app/javascript/mastodon/components/domain.tsx index db18635be1..f4a3b9d4b6 100644 --- a/app/javascript/mastodon/components/domain.tsx +++ b/app/javascript/mastodon/components/domain.tsx @@ -1,7 +1,6 @@ import { useCallback } from 'react'; -import type { InjectedIntl } from 'react-intl'; -import { defineMessages, injectIntl } from 'react-intl'; +import { defineMessages, useIntl } from 'react-intl'; import { IconButton } from './icon_button'; @@ -15,9 +14,11 @@ const messages = defineMessages({ interface Props { domain: string; onUnblockDomain: (domain: string) => void; - intl: InjectedIntl; } -const _Domain: React.FC = ({ domain, onUnblockDomain, intl }) => { + +export const Domain: React.FC = ({ domain, onUnblockDomain }) => { + const intl = useIntl(); + const handleDomainUnblock = useCallback(() => { onUnblockDomain(domain); }, [domain, onUnblockDomain]); @@ -41,5 +42,3 @@ const _Domain: React.FC = ({ domain, onUnblockDomain, intl }) => { ); }; - -export const Domain = injectIntl(_Domain); diff --git a/app/javascript/mastodon/components/load_gap.tsx b/app/javascript/mastodon/components/load_gap.tsx index e6d3060eb3..7e2cd447b9 100644 --- a/app/javascript/mastodon/components/load_gap.tsx +++ b/app/javascript/mastodon/components/load_gap.tsx @@ -1,7 +1,6 @@ import { useCallback } from 'react'; -import type { InjectedIntl } from 'react-intl'; -import { injectIntl, defineMessages } from 'react-intl'; +import { useIntl, defineMessages } from 'react-intl'; import { Icon } from 'mastodon/components/icon'; @@ -13,10 +12,11 @@ interface Props { disabled: boolean; maxId: string; onClick: (maxId: string) => void; - intl: InjectedIntl; } -const _LoadGap: React.FC = ({ disabled, maxId, onClick, intl }) => { +export const LoadGap: React.FC = ({ disabled, maxId, onClick }) => { + const intl = useIntl(); + const handleClick = useCallback(() => { onClick(maxId); }, [maxId, onClick]); @@ -32,5 +32,3 @@ const _LoadGap: React.FC = ({ disabled, maxId, onClick, intl }) => { ); }; - -export const LoadGap = injectIntl(_LoadGap); diff --git a/app/javascript/mastodon/components/relative_timestamp.tsx b/app/javascript/mastodon/components/relative_timestamp.tsx index aaa424dca6..e4a8437d0e 100644 --- a/app/javascript/mastodon/components/relative_timestamp.tsx +++ b/app/javascript/mastodon/components/relative_timestamp.tsx @@ -1,6 +1,6 @@ import { Component } from 'react'; -import type { InjectedIntl } from 'react-intl'; +import type { IntlShape } from 'react-intl'; import { injectIntl, defineMessages } from 'react-intl'; const messages = defineMessages({ @@ -103,7 +103,7 @@ const getUnitDelay = (units: string) => { }; export const timeAgoString = ( - intl: InjectedIntl, + intl: IntlShape, date: Date, now: number, year: number, @@ -155,7 +155,7 @@ export const timeAgoString = ( }; const timeRemainingString = ( - intl: InjectedIntl, + intl: IntlShape, date: Date, now: number, timeGiven = true @@ -190,7 +190,7 @@ const timeRemainingString = ( }; interface Props { - intl: InjectedIntl; + intl: IntlShape; timestamp: string; year: number; futureDate?: boolean; @@ -201,7 +201,7 @@ interface States { } class RelativeTimestamp extends Component { state = { - now: this.props.intl.now(), + now: Date.now(), }; static defaultProps = { @@ -223,7 +223,7 @@ class RelativeTimestamp extends Component { UNSAFE_componentWillReceiveProps(nextProps: Props) { if (this.props.timestamp !== nextProps.timestamp) { - this.setState({ now: this.props.intl.now() }); + this.setState({ now: Date.now() }); } } @@ -253,7 +253,7 @@ class RelativeTimestamp extends Component { : Math.max(updateInterval, unitRemainder); this._timer = window.setTimeout(() => { - this.setState({ now: this.props.intl.now() }); + this.setState({ now: Date.now() }); }, delay); } diff --git a/app/javascript/mastodon/containers/admin_component.jsx b/app/javascript/mastodon/containers/admin_component.jsx index f5fa53f08e..562151fe24 100644 --- a/app/javascript/mastodon/containers/admin_component.jsx +++ b/app/javascript/mastodon/containers/admin_component.jsx @@ -1,12 +1,11 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { IntlProvider, addLocaleData } from 'react-intl'; +import { IntlProvider } from 'react-intl'; -import { getLocale } from '../locales'; +import { getLocale, onProviderError } from '../locales'; -const { localeData, messages } = getLocale(); -addLocaleData(localeData); +const { messages } = getLocale(); export default class AdminComponent extends PureComponent { @@ -19,7 +18,7 @@ export default class AdminComponent extends PureComponent { const { locale, children } = this.props; return ( - + {children} ); diff --git a/app/javascript/mastodon/containers/compose_container.jsx b/app/javascript/mastodon/containers/compose_container.jsx index b93399aa91..751015d18d 100644 --- a/app/javascript/mastodon/containers/compose_container.jsx +++ b/app/javascript/mastodon/containers/compose_container.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { IntlProvider, addLocaleData } from 'react-intl'; +import { IntlProvider } from 'react-intl'; import { Provider } from 'react-redux'; @@ -9,11 +9,10 @@ import { fetchCustomEmojis } from '../actions/custom_emojis'; import { hydrateStore } from '../actions/store'; import Compose from '../features/standalone/compose'; import initialState from '../initial_state'; -import { getLocale } from '../locales'; +import { getLocale, onProviderError } from '../locales'; import { store } from '../store'; -const { localeData, messages } = getLocale(); -addLocaleData(localeData); +const { messages } = getLocale(); if (initialState) { store.dispatch(hydrateStore(initialState)); @@ -31,7 +30,7 @@ export default class TimelineContainer extends PureComponent { const { locale } = this.props; return ( - + diff --git a/app/javascript/mastodon/containers/mastodon.jsx b/app/javascript/mastodon/containers/mastodon.jsx index 5be163f5a4..c4d4611a2d 100644 --- a/app/javascript/mastodon/containers/mastodon.jsx +++ b/app/javascript/mastodon/containers/mastodon.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { IntlProvider, addLocaleData } from 'react-intl'; +import { IntlProvider } from 'react-intl'; import { Helmet } from 'react-helmet'; import { BrowserRouter, Route } from 'react-router-dom'; @@ -16,11 +16,10 @@ import { connectUserStream } from 'mastodon/actions/streaming'; import ErrorBoundary from 'mastodon/components/error_boundary'; import UI from 'mastodon/features/ui'; import initialState, { title as siteTitle } from 'mastodon/initial_state'; -import { getLocale } from 'mastodon/locales'; +import { getLocale, onProviderError } from 'mastodon/locales'; import { store } from 'mastodon/store'; -const { localeData, messages } = getLocale(); -addLocaleData(localeData); +const { messages } = getLocale(); const title = process.env.NODE_ENV === 'production' ? siteTitle : `${siteTitle} (Dev)`; @@ -83,7 +82,7 @@ export default class Mastodon extends PureComponent { const { locale } = this.props; return ( - + diff --git a/app/javascript/mastodon/containers/media_container.jsx b/app/javascript/mastodon/containers/media_container.jsx index 7ed8f1719d..84eab1cae1 100644 --- a/app/javascript/mastodon/containers/media_container.jsx +++ b/app/javascript/mastodon/containers/media_container.jsx @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; import { createPortal } from 'react-dom'; -import { IntlProvider, addLocaleData } from 'react-intl'; +import { IntlProvider } from 'react-intl'; import { fromJS } from 'immutable'; @@ -14,11 +14,10 @@ import Audio from 'mastodon/features/audio'; import Card from 'mastodon/features/status/components/card'; import MediaModal from 'mastodon/features/ui/components/media_modal'; import Video from 'mastodon/features/video'; -import { getLocale } from 'mastodon/locales'; +import { getLocale, onProviderError } from 'mastodon/locales'; import { getScrollbarWidth } from 'mastodon/utils/scrollbar'; -const { localeData, messages } = getLocale(); -addLocaleData(localeData); +const { messages } = getLocale(); const MEDIA_COMPONENTS = { MediaGallery, Video, Card, Poll, Hashtag, Audio }; @@ -84,7 +83,7 @@ export default class MediaContainer extends PureComponent { } return ( - + <> {[].map.call(components, (component, i) => { const componentName = component.getAttribute('data-component'); diff --git a/app/javascript/mastodon/features/onboarding/follows.jsx b/app/javascript/mastodon/features/onboarding/follows.jsx index 3807ce9227..8b4ad0b087 100644 --- a/app/javascript/mastodon/features/onboarding/follows.jsx +++ b/app/javascript/mastodon/features/onboarding/follows.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { FormattedMessage, FormattedHTMLMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; @@ -77,7 +77,7 @@ class Follows extends PureComponent { {loadedContent} -

+

{chunks} }} />

diff --git a/app/javascript/mastodon/features/onboarding/share.jsx b/app/javascript/mastodon/features/onboarding/share.jsx index 1895af912b..6871793026 100644 --- a/app/javascript/mastodon/features/onboarding/share.jsx +++ b/app/javascript/mastodon/features/onboarding/share.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import { PureComponent } from 'react'; -import { defineMessages, injectIntl, FormattedMessage, FormattedHTMLMessage } from 'react-intl'; +import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Link } from 'react-router-dom'; @@ -168,9 +168,9 @@ class Share extends PureComponent { -

-

-

+

{chunks} }} />

+

{chunks} }} />

+

{chunks} }} />

diff --git a/app/javascript/mastodon/load_locale.js b/app/javascript/mastodon/load_locale.js new file mode 100644 index 0000000000..1cda470c25 --- /dev/null +++ b/app/javascript/mastodon/load_locale.js @@ -0,0 +1,14 @@ +import { setLocale } from "./locales"; + +export async function loadLocale() { + const locale = document.querySelector('html').lang || 'en'; + + const localeData = await import( + /* webpackMode: "lazy" */ + /* webpackChunkName: "locales/vanilla/[request]" */ + /* webpackInclude: /\.json$/ */ + /* webpackPreload: true */ + `mastodon/locales/${locale}.json`); + + setLocale({ messages: localeData }); +} diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json deleted file mode 100644 index d446989ab6..0000000000 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ /dev/null @@ -1,4484 +0,0 @@ -[ - { - "descriptors": [ - { - "defaultMessage": "Oops!", - "id": "alert.unexpected.title" - }, - { - "defaultMessage": "An unexpected error occurred.", - "id": "alert.unexpected.message" - }, - { - "defaultMessage": "Rate limited", - "id": "alert.rate_limited.title" - }, - { - "defaultMessage": "Please retry after {retry_time, time, medium}.", - "id": "alert.rate_limited.message" - } - ], - "path": "app/javascript/mastodon/actions/alerts.json" - }, - { - "descriptors": [ - { - "defaultMessage": "File upload limit exceeded.", - "id": "upload_error.limit" - }, - { - "defaultMessage": "File upload not allowed with polls.", - "id": "upload_error.poll" - } - ], - "path": "app/javascript/mastodon/actions/compose.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{name} mentioned you", - "id": "notification.mention" - }, - { - "defaultMessage": "{count} notifications", - "id": "notifications.group" - } - ], - "path": "app/javascript/mastodon/actions/notifications.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Follow", - "id": "account.follow" - }, - { - "defaultMessage": "Unfollow", - "id": "account.unfollow" - }, - { - "defaultMessage": "Awaiting approval. Click to cancel follow request", - "id": "account.requested" - }, - { - "defaultMessage": "Unblock @{name}", - "id": "account.unblock" - }, - { - "defaultMessage": "Unmute @{name}", - "id": "account.unmute" - }, - { - "defaultMessage": "Mute notifications from @{name}", - "id": "account.mute_notifications" - }, - { - "defaultMessage": "Unmute notifications from @{name}", - "id": "account.unmute_notifications" - }, - { - "defaultMessage": "Mute @{name}", - "id": "account.mute" - }, - { - "defaultMessage": "Block @{name}", - "id": "account.block" - } - ], - "path": "app/javascript/mastodon/components/account.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Other", - "id": "report.categories.other" - }, - { - "defaultMessage": "Spam", - "id": "report.categories.spam" - }, - { - "defaultMessage": "Content violates one or more server rules", - "id": "report.categories.violation" - } - ], - "path": "app/javascript/mastodon/components/admin/ReportReasonSelector.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Loading...", - "id": "loading_indicator.label" - }, - { - "defaultMessage": "Sign-up month", - "id": "admin.dashboard.retention.cohort" - }, - { - "defaultMessage": "New users", - "id": "admin.dashboard.retention.cohort_size" - }, - { - "defaultMessage": "Average", - "id": "admin.dashboard.retention.average" - }, - { - "defaultMessage": "User retention rate by day after sign-up", - "id": "admin.dashboard.daily_retention" - }, - { - "defaultMessage": "User retention rate by month after sign-up", - "id": "admin.dashboard.monthly_retention" - } - ], - "path": "app/javascript/mastodon/components/admin/Retention.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Trending now", - "id": "trends.trending_now" - } - ], - "path": "app/javascript/mastodon/components/admin/Trends.json" - }, - { - "descriptors": [ - { - "defaultMessage": "(unprocessed)", - "id": "attachments_list.unprocessed" - } - ], - "path": "app/javascript/mastodon/components/attachment_list.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{count} per week", - "id": "autosuggest_hashtag.per_week" - } - ], - "path": "app/javascript/mastodon/components/autosuggest_hashtag.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Back", - "id": "column_back_button.label" - } - ], - "path": "app/javascript/mastodon/components/column_back_button_slim.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Back", - "id": "column_back_button.label" - } - ], - "path": "app/javascript/mastodon/components/column_back_button.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Show settings", - "id": "column_header.show_settings" - }, - { - "defaultMessage": "Hide settings", - "id": "column_header.hide_settings" - }, - { - "defaultMessage": "Move column to the left", - "id": "column_header.moveLeft_settings" - }, - { - "defaultMessage": "Move column to the right", - "id": "column_header.moveRight_settings" - }, - { - "defaultMessage": "Unpin", - "id": "column_header.unpin" - }, - { - "defaultMessage": "Pin", - "id": "column_header.pin" - }, - { - "defaultMessage": "Back", - "id": "column_back_button.label" - } - ], - "path": "app/javascript/mastodon/components/column_header.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{count, plural, one {{counter} Post} other {{counter} Posts}}", - "id": "account.statuses_counter" - }, - { - "defaultMessage": "{count, plural, one {{counter} Following} other {{counter} Following}}", - "id": "account.following_counter" - }, - { - "defaultMessage": "{count, plural, one {{counter} Follower} other {{counter} Followers}}", - "id": "account.followers_counter" - } - ], - "path": "app/javascript/mastodon/components/common_counter.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Dismiss", - "id": "dismissable_banner.dismiss" - } - ], - "path": "app/javascript/mastodon/components/dismissable_banner.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Unblock domain {domain}", - "id": "account.unblock_domain" - } - ], - "path": "app/javascript/mastodon/components/domain.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Edited {count, plural, one {# time} other {# times}}", - "id": "status.edited_x_times" - }, - { - "defaultMessage": "{name} created {date}", - "id": "status.history.created" - }, - { - "defaultMessage": "{name} edited {date}", - "id": "status.history.edited" - }, - { - "defaultMessage": "Edited {date}", - "id": "status.edited" - } - ], - "path": "app/javascript/mastodon/components/edited_timestamp/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.", - "id": "error.unexpected_crash.explanation_addons" - }, - { - "defaultMessage": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.", - "id": "error.unexpected_crash.explanation" - }, - { - "defaultMessage": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "id": "error.unexpected_crash.next_steps_addons" - }, - { - "defaultMessage": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.", - "id": "error.unexpected_crash.next_steps" - }, - { - "defaultMessage": "Report issue", - "id": "errors.unexpected_crash.report_issue" - }, - { - "defaultMessage": "Copy stacktrace to clipboard", - "id": "errors.unexpected_crash.copy_stacktrace" - } - ], - "path": "app/javascript/mastodon/components/error_boundary.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {# days}}", - "id": "trends.counter_by_accounts" - } - ], - "path": "app/javascript/mastodon/components/hashtag.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Load more", - "id": "status.load_more" - } - ], - "path": "app/javascript/mastodon/components/load_gap.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Load more", - "id": "status.load_more" - } - ], - "path": "app/javascript/mastodon/components/load_more.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{count, plural, one {# new item} other {# new items}}", - "id": "load_pending" - } - ], - "path": "app/javascript/mastodon/components/load_pending.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{number, plural, one {Hide image} other {Hide images}}", - "id": "media_gallery.toggle_visible" - }, - { - "defaultMessage": "Not available", - "id": "status.uncached_media_warning" - }, - { - "defaultMessage": "Sensitive content", - "id": "status.sensitive_warning" - }, - { - "defaultMessage": "Media hidden", - "id": "status.media_hidden" - } - ], - "path": "app/javascript/mastodon/components/media_gallery.json" - }, - { - "descriptors": [ - { - "defaultMessage": "You need to login to access this resource.", - "id": "not_signed_in_indicator.not_signed_in" - } - ], - "path": "app/javascript/mastodon/components/not_signed_in_indicator.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Put it back", - "id": "picture_in_picture.restore" - } - ], - "path": "app/javascript/mastodon/components/picture_in_picture_placeholder.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Closed", - "id": "poll.closed" - }, - { - "defaultMessage": "You voted for this answer", - "id": "poll.voted" - }, - { - "defaultMessage": "{votes, plural, one {# vote} other {# votes}}", - "id": "poll.votes" - }, - { - "defaultMessage": "{count, plural, one {# person} other {# people}}", - "id": "poll.total_people" - }, - { - "defaultMessage": "{count, plural, one {# vote} other {# votes}}", - "id": "poll.total_votes" - }, - { - "defaultMessage": "Vote", - "id": "poll.vote" - }, - { - "defaultMessage": "Refresh", - "id": "poll.refresh" - } - ], - "path": "app/javascript/mastodon/components/poll.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Loading…", - "id": "regeneration_indicator.label" - }, - { - "defaultMessage": "Your home feed is being prepared!", - "id": "regeneration_indicator.sublabel" - } - ], - "path": "app/javascript/mastodon/components/regeneration_indicator.json" - }, - { - "descriptors": [ - { - "defaultMessage": "today", - "id": "relative_time.today" - }, - { - "defaultMessage": "now", - "id": "relative_time.just_now" - }, - { - "defaultMessage": "just now", - "id": "relative_time.full.just_now" - }, - { - "defaultMessage": "{number}s", - "id": "relative_time.seconds" - }, - { - "defaultMessage": "{number, plural, one {# second} other {# seconds}} ago", - "id": "relative_time.full.seconds" - }, - { - "defaultMessage": "{number}m", - "id": "relative_time.minutes" - }, - { - "defaultMessage": "{number, plural, one {# minute} other {# minutes}} ago", - "id": "relative_time.full.minutes" - }, - { - "defaultMessage": "{number}h", - "id": "relative_time.hours" - }, - { - "defaultMessage": "{number, plural, one {# hour} other {# hours}} ago", - "id": "relative_time.full.hours" - }, - { - "defaultMessage": "{number}d", - "id": "relative_time.days" - }, - { - "defaultMessage": "{number, plural, one {# day} other {# days}} ago", - "id": "relative_time.full.days" - }, - { - "defaultMessage": "Moments remaining", - "id": "time_remaining.moments" - }, - { - "defaultMessage": "{number, plural, one {# second} other {# seconds}} left", - "id": "time_remaining.seconds" - }, - { - "defaultMessage": "{number, plural, one {# minute} other {# minutes}} left", - "id": "time_remaining.minutes" - }, - { - "defaultMessage": "{number, plural, one {# hour} other {# hours}} left", - "id": "time_remaining.hours" - }, - { - "defaultMessage": "{number, plural, one {# day} other {# days}} left", - "id": "time_remaining.days" - } - ], - "path": "app/javascript/mastodon/components/relative_timestamp.json" - }, - { - "descriptors": [ - { - "defaultMessage": "People using this server during the last 30 days (Monthly Active Users)", - "id": "server_banner.about_active_users" - }, - { - "defaultMessage": "{domain} is part of the decentralized social network powered by {mastodon}.", - "id": "server_banner.introduction" - }, - { - "defaultMessage": "Administered by:", - "id": "server_banner.administered_by" - }, - { - "defaultMessage": "Server stats:", - "id": "server_banner.server_stats" - }, - { - "defaultMessage": "active users", - "id": "server_banner.active_users" - }, - { - "defaultMessage": "Learn more", - "id": "server_banner.learn_more" - } - ], - "path": "app/javascript/mastodon/components/server_banner.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{count}K", - "id": "units.short.thousand" - }, - { - "defaultMessage": "{count}M", - "id": "units.short.million" - }, - { - "defaultMessage": "{count}B", - "id": "units.short.billion" - } - ], - "path": "app/javascript/mastodon/components/short_number.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Delete", - "id": "status.delete" - }, - { - "defaultMessage": "Delete & re-draft", - "id": "status.redraft" - }, - { - "defaultMessage": "Edit", - "id": "status.edit" - }, - { - "defaultMessage": "Privately mention @{name}", - "id": "status.direct" - }, - { - "defaultMessage": "Mention @{name}", - "id": "status.mention" - }, - { - "defaultMessage": "Mute @{name}", - "id": "account.mute" - }, - { - "defaultMessage": "Block @{name}", - "id": "account.block" - }, - { - "defaultMessage": "Reply", - "id": "status.reply" - }, - { - "defaultMessage": "Share", - "id": "status.share" - }, - { - "defaultMessage": "More", - "id": "status.more" - }, - { - "defaultMessage": "Reply to thread", - "id": "status.replyAll" - }, - { - "defaultMessage": "Boost", - "id": "status.reblog" - }, - { - "defaultMessage": "Boost with original visibility", - "id": "status.reblog_private" - }, - { - "defaultMessage": "Unboost", - "id": "status.cancel_reblog_private" - }, - { - "defaultMessage": "This post cannot be boosted", - "id": "status.cannot_reblog" - }, - { - "defaultMessage": "Favourite", - "id": "status.favourite" - }, - { - "defaultMessage": "Bookmark", - "id": "status.bookmark" - }, - { - "defaultMessage": "Remove bookmark", - "id": "status.remove_bookmark" - }, - { - "defaultMessage": "Expand this status", - "id": "status.open" - }, - { - "defaultMessage": "Report @{name}", - "id": "status.report" - }, - { - "defaultMessage": "Mute conversation", - "id": "status.mute_conversation" - }, - { - "defaultMessage": "Unmute conversation", - "id": "status.unmute_conversation" - }, - { - "defaultMessage": "Pin on profile", - "id": "status.pin" - }, - { - "defaultMessage": "Unpin from profile", - "id": "status.unpin" - }, - { - "defaultMessage": "Embed", - "id": "status.embed" - }, - { - "defaultMessage": "Open moderation interface for @{name}", - "id": "status.admin_account" - }, - { - "defaultMessage": "Open this post in the moderation interface", - "id": "status.admin_status" - }, - { - "defaultMessage": "Open moderation interface for {domain}", - "id": "status.admin_domain" - }, - { - "defaultMessage": "Copy link to post", - "id": "status.copy" - }, - { - "defaultMessage": "Hide post", - "id": "status.hide" - }, - { - "defaultMessage": "Block domain {domain}", - "id": "account.block_domain" - }, - { - "defaultMessage": "Unblock domain {domain}", - "id": "account.unblock_domain" - }, - { - "defaultMessage": "Unmute @{name}", - "id": "account.unmute" - }, - { - "defaultMessage": "Unblock @{name}", - "id": "account.unblock" - }, - { - "defaultMessage": "Filter this post", - "id": "status.filter" - }, - { - "defaultMessage": "Open original page", - "id": "account.open_original_page" - } - ], - "path": "app/javascript/mastodon/components/status_action_bar.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Translated from {lang} using {provider}", - "id": "status.translated_from_with" - }, - { - "defaultMessage": "Show original", - "id": "status.show_original" - }, - { - "defaultMessage": "Translate", - "id": "status.translate" - }, - { - "defaultMessage": "Read more", - "id": "status.read_more" - }, - { - "defaultMessage": "Show more", - "id": "status.show_more" - }, - { - "defaultMessage": "Show less", - "id": "status.show_less" - } - ], - "path": "app/javascript/mastodon/components/status_content.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Public", - "id": "privacy.public.short" - }, - { - "defaultMessage": "Unlisted", - "id": "privacy.unlisted.short" - }, - { - "defaultMessage": "Followers only", - "id": "privacy.private.short" - }, - { - "defaultMessage": "Mentioned people only", - "id": "privacy.direct.short" - }, - { - "defaultMessage": "Edited {date}", - "id": "status.edited" - }, - { - "defaultMessage": "Filtered", - "id": "status.filtered" - }, - { - "defaultMessage": "Show anyway", - "id": "status.show_filter_reason" - }, - { - "defaultMessage": "Pinned post", - "id": "status.pinned" - }, - { - "defaultMessage": "{name} boosted", - "id": "status.reblogged_by" - }, - { - "defaultMessage": "Private mention", - "id": "status.direct_indicator" - }, - { - "defaultMessage": "Replied to {name}", - "id": "status.replied_to" - } - ], - "path": "app/javascript/mastodon/components/status.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{resource} from other servers are not displayed.", - "id": "timeline_hint.remote_resource_not_displayed" - }, - { - "defaultMessage": "Browse more on the original profile", - "id": "account.browse_more_on_origin_server" - } - ], - "path": "app/javascript/mastodon/components/timeline_hint.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Unfollow", - "id": "confirmations.unfollow.confirm" - }, - { - "defaultMessage": "Are you sure you want to unfollow {name}?", - "id": "confirmations.unfollow.message" - } - ], - "path": "app/javascript/mastodon/containers/account_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Block entire domain", - "id": "confirmations.domain_block.confirm" - }, - { - "defaultMessage": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "id": "confirmations.domain_block.message" - } - ], - "path": "app/javascript/mastodon/containers/domain_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Delete", - "id": "confirmations.delete.confirm" - }, - { - "defaultMessage": "Are you sure you want to delete this status?", - "id": "confirmations.delete.message" - }, - { - "defaultMessage": "Delete & redraft", - "id": "confirmations.redraft.confirm" - }, - { - "defaultMessage": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", - "id": "confirmations.redraft.message" - }, - { - "defaultMessage": "Reply", - "id": "confirmations.reply.confirm" - }, - { - "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "id": "confirmations.reply.message" - }, - { - "defaultMessage": "Edit", - "id": "confirmations.edit.confirm" - }, - { - "defaultMessage": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "id": "confirmations.edit.message" - }, - { - "defaultMessage": "Block entire domain", - "id": "confirmations.domain_block.confirm" - }, - { - "defaultMessage": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "id": "confirmations.domain_block.message" - } - ], - "path": "app/javascript/mastodon/containers/status_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "About", - "id": "column.about" - }, - { - "defaultMessage": "Server rules", - "id": "about.rules" - }, - { - "defaultMessage": "Moderated servers", - "id": "about.blocks" - }, - { - "defaultMessage": "Limited", - "id": "about.domain_blocks.silenced.title" - }, - { - "defaultMessage": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.", - "id": "about.domain_blocks.silenced.explanation" - }, - { - "defaultMessage": "Suspended", - "id": "about.domain_blocks.suspended.title" - }, - { - "defaultMessage": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.", - "id": "about.domain_blocks.suspended.explanation" - }, - { - "defaultMessage": "Decentralized social media powered by {mastodon}", - "id": "about.powered_by" - }, - { - "defaultMessage": "Administered by:", - "id": "server_banner.administered_by" - }, - { - "defaultMessage": "Contact:", - "id": "about.contact" - }, - { - "defaultMessage": "This information has not been made available on this server.", - "id": "about.not_available" - }, - { - "defaultMessage": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.", - "id": "about.domain_blocks.preamble" - }, - { - "defaultMessage": "Reason not available", - "id": "about.domain_blocks.no_reason_available" - }, - { - "defaultMessage": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.", - "id": "about.disclaimer" - } - ], - "path": "app/javascript/mastodon/features/about/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Account suspended", - "id": "empty_column.account_suspended" - }, - { - "defaultMessage": "Profile unavailable", - "id": "empty_column.account_unavailable" - } - ], - "path": "app/javascript/mastodon/features/account_gallery/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Posts", - "id": "account.posts" - }, - { - "defaultMessage": "Posts and replies", - "id": "account.posts_with_replies" - }, - { - "defaultMessage": "Media", - "id": "account.media" - } - ], - "path": "app/javascript/mastodon/features/account_timeline/components/header.json" - }, - { - "descriptors": [ - { - "defaultMessage": "This profile has been hidden by the moderators of {domain}.", - "id": "limited_account_hint.title" - }, - { - "defaultMessage": "Show profile anyway", - "id": "limited_account_hint.action" - } - ], - "path": "app/javascript/mastodon/features/account_timeline/components/limited_account_hint.json" - }, - { - "descriptors": [ - { - "defaultMessage": "In Memoriam.", - "id": "account.in_memoriam" - } - ], - "path": "app/javascript/mastodon/features/account_timeline/components/memorial_note.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{name} has indicated that their new account is now:", - "id": "account.moved_to" - }, - { - "defaultMessage": "Go to profile", - "id": "account.go_to_profile" - } - ], - "path": "app/javascript/mastodon/features/account_timeline/components/moved_note.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Withdraw request", - "id": "confirmations.cancel_follow_request.confirm" - }, - { - "defaultMessage": "Unfollow", - "id": "confirmations.unfollow.confirm" - }, - { - "defaultMessage": "Block entire domain", - "id": "confirmations.domain_block.confirm" - }, - { - "defaultMessage": "Are you sure you want to unfollow {name}?", - "id": "confirmations.unfollow.message" - }, - { - "defaultMessage": "Are you sure you want to withdraw your request to follow {name}?", - "id": "confirmations.cancel_follow_request.message" - }, - { - "defaultMessage": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "id": "confirmations.domain_block.message" - } - ], - "path": "app/javascript/mastodon/features/account_timeline/containers/header_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Older posts", - "id": "timeline_hint.resources.statuses" - }, - { - "defaultMessage": "Account suspended", - "id": "empty_column.account_suspended" - }, - { - "defaultMessage": "Profile unavailable", - "id": "empty_column.account_unavailable" - }, - { - "defaultMessage": "No posts found", - "id": "empty_column.account_timeline" - } - ], - "path": "app/javascript/mastodon/features/account_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Click to add a note", - "id": "account_note.placeholder" - }, - { - "defaultMessage": "Saved", - "id": "generic.saved" - }, - { - "defaultMessage": "Note", - "id": "account.account_note_header" - } - ], - "path": "app/javascript/mastodon/features/account/components/account_note.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Last post on {date}", - "id": "account.featured_tags.last_status_at" - }, - { - "defaultMessage": "No posts", - "id": "account.featured_tags.last_status_never" - }, - { - "defaultMessage": "{name}'s featured hashtags", - "id": "account.featured_tags.title" - } - ], - "path": "app/javascript/mastodon/features/account/components/featured_tags.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{name} has requested to follow you", - "id": "account.requested_follow" - }, - { - "defaultMessage": "Authorize", - "id": "follow_request.authorize" - }, - { - "defaultMessage": "Reject", - "id": "follow_request.reject" - } - ], - "path": "app/javascript/mastodon/features/account/components/follow_request_note.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Unfollow", - "id": "account.unfollow" - }, - { - "defaultMessage": "Follow", - "id": "account.follow" - }, - { - "defaultMessage": "Withdraw follow request", - "id": "account.cancel_follow_request" - }, - { - "defaultMessage": "Awaiting approval. Click to cancel follow request", - "id": "account.requested" - }, - { - "defaultMessage": "Unblock @{name}", - "id": "account.unblock" - }, - { - "defaultMessage": "Edit profile", - "id": "account.edit_profile" - }, - { - "defaultMessage": "Ownership of this link was checked on {date}", - "id": "account.link_verified_on" - }, - { - "defaultMessage": "This account privacy status is set to locked. The owner manually reviews who can follow them.", - "id": "account.locked_info" - }, - { - "defaultMessage": "Mention @{name}", - "id": "account.mention" - }, - { - "defaultMessage": "Privately mention @{name}", - "id": "account.direct" - }, - { - "defaultMessage": "Unmute @{name}", - "id": "account.unmute" - }, - { - "defaultMessage": "Block @{name}", - "id": "account.block" - }, - { - "defaultMessage": "Mute @{name}", - "id": "account.mute" - }, - { - "defaultMessage": "Report @{name}", - "id": "account.report" - }, - { - "defaultMessage": "Share @{name}'s profile", - "id": "account.share" - }, - { - "defaultMessage": "Media", - "id": "account.media" - }, - { - "defaultMessage": "Block domain {domain}", - "id": "account.block_domain" - }, - { - "defaultMessage": "Unblock domain {domain}", - "id": "account.unblock_domain" - }, - { - "defaultMessage": "Hide boosts from @{name}", - "id": "account.hide_reblogs" - }, - { - "defaultMessage": "Show boosts from @{name}", - "id": "account.show_reblogs" - }, - { - "defaultMessage": "Notify me when @{name} posts", - "id": "account.enable_notifications" - }, - { - "defaultMessage": "Stop notifying me when @{name} posts", - "id": "account.disable_notifications" - }, - { - "defaultMessage": "Pinned posts", - "id": "navigation_bar.pins" - }, - { - "defaultMessage": "Preferences", - "id": "navigation_bar.preferences" - }, - { - "defaultMessage": "Follow requests", - "id": "navigation_bar.follow_requests" - }, - { - "defaultMessage": "Favourites", - "id": "navigation_bar.favourites" - }, - { - "defaultMessage": "Lists", - "id": "navigation_bar.lists" - }, - { - "defaultMessage": "Followed hashtags", - "id": "navigation_bar.followed_tags" - }, - { - "defaultMessage": "Blocked users", - "id": "navigation_bar.blocks" - }, - { - "defaultMessage": "Blocked domains", - "id": "navigation_bar.domain_blocks" - }, - { - "defaultMessage": "Muted users", - "id": "navigation_bar.mutes" - }, - { - "defaultMessage": "Feature on profile", - "id": "account.endorse" - }, - { - "defaultMessage": "Don't feature on profile", - "id": "account.unendorse" - }, - { - "defaultMessage": "Add or Remove from lists", - "id": "account.add_or_remove_from_list" - }, - { - "defaultMessage": "Open moderation interface for @{name}", - "id": "status.admin_account" - }, - { - "defaultMessage": "Open moderation interface for {domain}", - "id": "status.admin_domain" - }, - { - "defaultMessage": "Change subscribed languages", - "id": "account.languages" - }, - { - "defaultMessage": "Open original page", - "id": "account.open_original_page" - }, - { - "defaultMessage": "Follows you", - "id": "account.follows_you" - }, - { - "defaultMessage": "Blocked", - "id": "account.blocked" - }, - { - "defaultMessage": "Muted", - "id": "account.muted" - }, - { - "defaultMessage": "Domain blocked", - "id": "account.domain_blocked" - }, - { - "defaultMessage": "Bot", - "id": "account.badges.bot" - }, - { - "defaultMessage": "Group", - "id": "account.badges.group" - }, - { - "defaultMessage": "Joined", - "id": "account.joined_short" - } - ], - "path": "app/javascript/mastodon/features/account/components/header.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Play", - "id": "video.play" - }, - { - "defaultMessage": "Pause", - "id": "video.pause" - }, - { - "defaultMessage": "Mute sound", - "id": "video.mute" - }, - { - "defaultMessage": "Unmute sound", - "id": "video.unmute" - }, - { - "defaultMessage": "Download file", - "id": "video.download" - }, - { - "defaultMessage": "Hide audio", - "id": "audio.hide" - }, - { - "defaultMessage": "Sensitive content", - "id": "status.sensitive_warning" - }, - { - "defaultMessage": "Media hidden", - "id": "status.media_hidden" - } - ], - "path": "app/javascript/mastodon/features/audio/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Blocked users", - "id": "column.blocks" - }, - { - "defaultMessage": "You haven't blocked any users yet.", - "id": "empty_column.blocks" - } - ], - "path": "app/javascript/mastodon/features/blocks/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Bookmarks", - "id": "column.bookmarks" - }, - { - "defaultMessage": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.", - "id": "empty_column.bookmarked_statuses" - } - ], - "path": "app/javascript/mastodon/features/bookmarked_statuses/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Creating an account on {domain} is currently not possible, but please keep in mind that you do not need an account specifically on {domain} to use Mastodon.", - "id": "closed_registrations_modal.description" - }, - { - "defaultMessage": "Signing up on Mastodon", - "id": "closed_registrations_modal.title" - }, - { - "defaultMessage": "Mastodon is decentralized, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!", - "id": "closed_registrations_modal.preamble" - }, - { - "defaultMessage": "On this server", - "id": "interaction_modal.on_this_server" - }, - { - "defaultMessage": "On a different server", - "id": "interaction_modal.on_another_server" - }, - { - "defaultMessage": "Since Mastodon is decentralized, you can create an account on another server and still interact with this one.", - "id": "closed_registrations.other_server_instructions" - }, - { - "defaultMessage": "Find another server", - "id": "closed_registrations_modal.find_another_server" - } - ], - "path": "app/javascript/mastodon/features/closed_registrations_modal/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Media only", - "id": "community.column_settings.media_only" - } - ], - "path": "app/javascript/mastodon/features/community_timeline/components/column_settings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Local timeline", - "id": "column.community" - }, - { - "defaultMessage": "These are the most recent public posts from people whose accounts are hosted by {domain}.", - "id": "dismissable_banner.community_timeline" - }, - { - "defaultMessage": "The local timeline is empty. Write something publicly to get the ball rolling!", - "id": "empty_column.community" - } - ], - "path": "app/javascript/mastodon/features/community_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Edit profile", - "id": "account.edit_profile" - }, - { - "defaultMessage": "Pinned posts", - "id": "navigation_bar.pins" - }, - { - "defaultMessage": "Preferences", - "id": "navigation_bar.preferences" - }, - { - "defaultMessage": "Follow requests", - "id": "navigation_bar.follow_requests" - }, - { - "defaultMessage": "Favourites", - "id": "navigation_bar.favourites" - }, - { - "defaultMessage": "Lists", - "id": "navigation_bar.lists" - }, - { - "defaultMessage": "Followed hashtags", - "id": "navigation_bar.followed_tags" - }, - { - "defaultMessage": "Blocked users", - "id": "navigation_bar.blocks" - }, - { - "defaultMessage": "Blocked domains", - "id": "navigation_bar.domain_blocks" - }, - { - "defaultMessage": "Muted users", - "id": "navigation_bar.mutes" - }, - { - "defaultMessage": "Muted words", - "id": "navigation_bar.filters" - }, - { - "defaultMessage": "Logout", - "id": "navigation_bar.logout" - }, - { - "defaultMessage": "Bookmarks", - "id": "navigation_bar.bookmarks" - } - ], - "path": "app/javascript/mastodon/features/compose/components/action_bar.json" - }, - { - "descriptors": [ - { - "defaultMessage": "What is on your mind?", - "id": "compose_form.placeholder" - }, - { - "defaultMessage": "Write your warning here", - "id": "compose_form.spoiler_placeholder" - }, - { - "defaultMessage": "Publish", - "id": "compose_form.publish" - }, - { - "defaultMessage": "{publish}!", - "id": "compose_form.publish_loud" - }, - { - "defaultMessage": "Save changes", - "id": "compose_form.save_changes" - } - ], - "path": "app/javascript/mastodon/features/compose/components/compose_form.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Insert emoji", - "id": "emoji_button.label" - }, - { - "defaultMessage": "Search...", - "id": "emoji_button.search" - }, - { - "defaultMessage": "Custom", - "id": "emoji_button.custom" - }, - { - "defaultMessage": "Frequently used", - "id": "emoji_button.recent" - }, - { - "defaultMessage": "Search results", - "id": "emoji_button.search_results" - }, - { - "defaultMessage": "People", - "id": "emoji_button.people" - }, - { - "defaultMessage": "Nature", - "id": "emoji_button.nature" - }, - { - "defaultMessage": "Food & Drink", - "id": "emoji_button.food" - }, - { - "defaultMessage": "Activity", - "id": "emoji_button.activity" - }, - { - "defaultMessage": "Travel & Places", - "id": "emoji_button.travel" - }, - { - "defaultMessage": "Objects", - "id": "emoji_button.objects" - }, - { - "defaultMessage": "Symbols", - "id": "emoji_button.symbols" - }, - { - "defaultMessage": "Flags", - "id": "emoji_button.flags" - }, - { - "defaultMessage": "No matching emojis found", - "id": "emoji_button.not_found" - } - ], - "path": "app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Change language", - "id": "compose.language.change" - }, - { - "defaultMessage": "Search languages...", - "id": "compose.language.search" - }, - { - "defaultMessage": "Clear", - "id": "emoji_button.clear" - } - ], - "path": "app/javascript/mastodon/features/compose/components/language_dropdown.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Edit profile", - "id": "navigation_bar.edit_profile" - } - ], - "path": "app/javascript/mastodon/features/compose/components/navigation_bar.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Add a poll", - "id": "poll_button.add_poll" - }, - { - "defaultMessage": "Remove poll", - "id": "poll_button.remove_poll" - } - ], - "path": "app/javascript/mastodon/features/compose/components/poll_button.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Choice {number}", - "id": "compose_form.poll.option_placeholder" - }, - { - "defaultMessage": "Add a choice", - "id": "compose_form.poll.add_option" - }, - { - "defaultMessage": "Remove this choice", - "id": "compose_form.poll.remove_option" - }, - { - "defaultMessage": "Poll duration", - "id": "compose_form.poll.duration" - }, - { - "defaultMessage": "Change poll to allow multiple choices", - "id": "compose_form.poll.switch_to_multiple" - }, - { - "defaultMessage": "Change poll to allow for a single choice", - "id": "compose_form.poll.switch_to_single" - }, - { - "defaultMessage": "{number, plural, one {# minute} other {# minutes}}", - "id": "intervals.full.minutes" - }, - { - "defaultMessage": "{number, plural, one {# hour} other {# hours}}", - "id": "intervals.full.hours" - }, - { - "defaultMessage": "{number, plural, one {# day} other {# days}}", - "id": "intervals.full.days" - } - ], - "path": "app/javascript/mastodon/features/compose/components/poll_form.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Public", - "id": "privacy.public.short" - }, - { - "defaultMessage": "Visible for all", - "id": "privacy.public.long" - }, - { - "defaultMessage": "Unlisted", - "id": "privacy.unlisted.short" - }, - { - "defaultMessage": "Visible for all, but opted-out of discovery features", - "id": "privacy.unlisted.long" - }, - { - "defaultMessage": "Followers only", - "id": "privacy.private.short" - }, - { - "defaultMessage": "Visible for followers only", - "id": "privacy.private.long" - }, - { - "defaultMessage": "Mentioned people only", - "id": "privacy.direct.short" - }, - { - "defaultMessage": "Visible for mentioned users only", - "id": "privacy.direct.long" - }, - { - "defaultMessage": "Adjust status privacy", - "id": "privacy.change" - } - ], - "path": "app/javascript/mastodon/features/compose/components/privacy_dropdown.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Cancel", - "id": "reply_indicator.cancel" - } - ], - "path": "app/javascript/mastodon/features/compose/components/reply_indicator.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Dismiss suggestion", - "id": "suggestions.dismiss" - }, - { - "defaultMessage": "You might be interested in…", - "id": "suggestions.header" - }, - { - "defaultMessage": "Profiles", - "id": "search_results.accounts" - }, - { - "defaultMessage": "Posts", - "id": "search_results.statuses" - }, - { - "defaultMessage": "Searching posts by their content is not enabled on this Mastodon server.", - "id": "search_results.statuses_fts_disabled" - }, - { - "defaultMessage": "Hashtags", - "id": "search_results.hashtags" - }, - { - "defaultMessage": "{count, plural, one {# result} other {# results}}", - "id": "search_results.total" - } - ], - "path": "app/javascript/mastodon/features/compose/components/search_results.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Search", - "id": "search.placeholder" - }, - { - "defaultMessage": "Search or paste URL", - "id": "search.search_or_paste" - }, - { - "defaultMessage": "Open URL in Mastodon", - "id": "search.quick_action.open_url" - }, - { - "defaultMessage": "Go to hashtag {x}", - "id": "search.quick_action.go_to_hashtag" - }, - { - "defaultMessage": "Go to profile {x}", - "id": "search.quick_action.go_to_account" - }, - { - "defaultMessage": "Posts matching {x}", - "id": "search.quick_action.status_search" - }, - { - "defaultMessage": "Profiles matching {x}", - "id": "search.quick_action.account_search" - }, - { - "defaultMessage": "Recent searches", - "id": "search_popout.recent" - }, - { - "defaultMessage": "No recent searches", - "id": "search.no_recent_searches" - }, - { - "defaultMessage": "Quick actions", - "id": "search_popout.quick_actions" - } - ], - "path": "app/javascript/mastodon/features/compose/components/search.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Add images, a video or an audio file", - "id": "upload_button.label" - } - ], - "path": "app/javascript/mastodon/features/compose/components/upload_button.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Processing…", - "id": "upload_progress.processing" - }, - { - "defaultMessage": "Uploading…", - "id": "upload_progress.label" - } - ], - "path": "app/javascript/mastodon/features/compose/components/upload_progress.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Delete", - "id": "upload_form.undo" - }, - { - "defaultMessage": "Edit", - "id": "upload_form.edit" - }, - { - "defaultMessage": "No description added", - "id": "upload_form.description_missing" - } - ], - "path": "app/javascript/mastodon/features/compose/components/upload.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to log out?", - "id": "confirmations.logout.message" - }, - { - "defaultMessage": "Log out", - "id": "confirmations.logout.confirm" - } - ], - "path": "app/javascript/mastodon/features/compose/containers/navigation_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}", - "id": "compose_form.sensitive.marked" - }, - { - "defaultMessage": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}", - "id": "compose_form.sensitive.unmarked" - }, - { - "defaultMessage": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}", - "id": "compose_form.sensitive.hide" - } - ], - "path": "app/javascript/mastodon/features/compose/containers/sensitive_button_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Text is hidden behind warning", - "id": "compose_form.spoiler.marked" - }, - { - "defaultMessage": "Text is not hidden", - "id": "compose_form.spoiler.unmarked" - } - ], - "path": "app/javascript/mastodon/features/compose/containers/spoiler_button_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "id": "compose_form.lock_disclaimer" - }, - { - "defaultMessage": "locked", - "id": "compose_form.lock_disclaimer.lock" - }, - { - "defaultMessage": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", - "id": "compose_form.hashtag_warning" - }, - { - "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", - "id": "compose_form.encryption_warning" - }, - { - "defaultMessage": "Learn more", - "id": "compose_form.direct_message_warning_learn_more" - } - ], - "path": "app/javascript/mastodon/features/compose/containers/warning_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Getting started", - "id": "getting_started.heading" - }, - { - "defaultMessage": "Home", - "id": "tabs_bar.home" - }, - { - "defaultMessage": "Notifications", - "id": "tabs_bar.notifications" - }, - { - "defaultMessage": "Federated timeline", - "id": "navigation_bar.public_timeline" - }, - { - "defaultMessage": "Local timeline", - "id": "navigation_bar.community_timeline" - }, - { - "defaultMessage": "Preferences", - "id": "navigation_bar.preferences" - }, - { - "defaultMessage": "Logout", - "id": "navigation_bar.logout" - }, - { - "defaultMessage": "Compose new post", - "id": "navigation_bar.compose" - }, - { - "defaultMessage": "Are you sure you want to log out?", - "id": "confirmations.logout.message" - }, - { - "defaultMessage": "Log out", - "id": "confirmations.logout.confirm" - } - ], - "path": "app/javascript/mastodon/features/compose/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "More", - "id": "status.more" - }, - { - "defaultMessage": "View conversation", - "id": "conversation.open" - }, - { - "defaultMessage": "Reply", - "id": "status.reply" - }, - { - "defaultMessage": "Mark as read", - "id": "conversation.mark_as_read" - }, - { - "defaultMessage": "Delete conversation", - "id": "conversation.delete" - }, - { - "defaultMessage": "Mute conversation", - "id": "status.mute_conversation" - }, - { - "defaultMessage": "Unmute conversation", - "id": "status.unmute_conversation" - }, - { - "defaultMessage": "With {names}", - "id": "conversation.with" - } - ], - "path": "app/javascript/mastodon/features/direct_timeline/components/conversation.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Reply", - "id": "confirmations.reply.confirm" - }, - { - "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "id": "confirmations.reply.message" - } - ], - "path": "app/javascript/mastodon/features/direct_timeline/containers/conversation_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Private mentions", - "id": "column.direct" - }, - { - "defaultMessage": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.", - "id": "compose_form.encryption_warning" - }, - { - "defaultMessage": "Learn more", - "id": "compose_form.direct_message_warning_learn_more" - }, - { - "defaultMessage": "You don't have any private mentions yet. When you send or receive one, it will show up here.", - "id": "empty_column.direct" - } - ], - "path": "app/javascript/mastodon/features/direct_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Unfollow", - "id": "account.unfollow" - }, - { - "defaultMessage": "Follow", - "id": "account.follow" - }, - { - "defaultMessage": "Withdraw follow request", - "id": "account.cancel_follow_request" - }, - { - "defaultMessage": "Withdraw request", - "id": "confirmations.cancel_follow_request.confirm" - }, - { - "defaultMessage": "Awaiting approval. Click to cancel follow request", - "id": "account.requested" - }, - { - "defaultMessage": "Unblock", - "id": "account.unblock_short" - }, - { - "defaultMessage": "Unmute", - "id": "account.unmute_short" - }, - { - "defaultMessage": "Unfollow", - "id": "confirmations.unfollow.confirm" - }, - { - "defaultMessage": "Edit profile", - "id": "account.edit_profile" - }, - { - "defaultMessage": "Are you sure you want to unfollow {name}?", - "id": "confirmations.unfollow.message" - }, - { - "defaultMessage": "Are you sure you want to withdraw your request to follow {name}?", - "id": "confirmations.cancel_follow_request.message" - }, - { - "defaultMessage": "Posts", - "id": "account.posts" - }, - { - "defaultMessage": "Followers", - "id": "account.followers" - }, - { - "defaultMessage": "Following", - "id": "account.following" - } - ], - "path": "app/javascript/mastodon/features/directory/components/account_card.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Browse profiles", - "id": "column.directory" - }, - { - "defaultMessage": "Recently active", - "id": "directory.recently_active" - }, - { - "defaultMessage": "New arrivals", - "id": "directory.new_arrivals" - }, - { - "defaultMessage": "From {domain} only", - "id": "directory.local" - }, - { - "defaultMessage": "From known fediverse", - "id": "directory.federated" - } - ], - "path": "app/javascript/mastodon/features/directory/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Blocked domains", - "id": "column.domain_blocks" - }, - { - "defaultMessage": "Unblock domain {domain}", - "id": "account.unblock_domain" - }, - { - "defaultMessage": "There are no blocked domains yet.", - "id": "empty_column.domain_blocks" - } - ], - "path": "app/javascript/mastodon/features/domain_blocks/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Explore", - "id": "explore.title" - }, - { - "defaultMessage": "Search results", - "id": "explore.search_results" - }, - { - "defaultMessage": "Posts", - "id": "explore.trending_statuses" - }, - { - "defaultMessage": "Hashtags", - "id": "explore.trending_tags" - }, - { - "defaultMessage": "People", - "id": "explore.suggested_follows" - }, - { - "defaultMessage": "News", - "id": "explore.trending_links" - } - ], - "path": "app/javascript/mastodon/features/explore/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "These news stories are being talked about by people on this and other servers of the decentralized network right now.", - "id": "dismissable_banner.explore_links" - }, - { - "defaultMessage": "Nothing is trending right now. Check back later!", - "id": "empty_column.explore_statuses" - } - ], - "path": "app/javascript/mastodon/features/explore/links.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Search for {q}", - "id": "search_results.title" - }, - { - "defaultMessage": "Could not find anything for these search terms", - "id": "search_results.nothing_found" - }, - { - "defaultMessage": "All", - "id": "search_results.all" - }, - { - "defaultMessage": "Profiles", - "id": "search_results.accounts" - }, - { - "defaultMessage": "Hashtags", - "id": "search_results.hashtags" - }, - { - "defaultMessage": "Posts", - "id": "search_results.statuses" - } - ], - "path": "app/javascript/mastodon/features/explore/results.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Nothing is trending right now. Check back later!", - "id": "empty_column.explore_statuses" - }, - { - "defaultMessage": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.", - "id": "dismissable_banner.explore_statuses" - } - ], - "path": "app/javascript/mastodon/features/explore/statuses.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Nothing is trending right now. Check back later!", - "id": "empty_column.explore_statuses" - } - ], - "path": "app/javascript/mastodon/features/explore/suggestions.json" - }, - { - "descriptors": [ - { - "defaultMessage": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.", - "id": "dismissable_banner.explore_tags" - }, - { - "defaultMessage": "Nothing is trending right now. Check back later!", - "id": "empty_column.explore_statuses" - } - ], - "path": "app/javascript/mastodon/features/explore/tags.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Favourites", - "id": "column.favourites" - }, - { - "defaultMessage": "You don't have any favourite posts yet. When you favourite one, it will show up here.", - "id": "empty_column.favourited_statuses" - } - ], - "path": "app/javascript/mastodon/features/favourited_statuses/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Refresh", - "id": "refresh" - }, - { - "defaultMessage": "No one has favourited this post yet. When someone does, they will show up here.", - "id": "empty_column.favourites" - } - ], - "path": "app/javascript/mastodon/features/favourites/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Expired filter!", - "id": "filter_modal.added.expired_title" - }, - { - "defaultMessage": "This filter category has expired, you will need to change the expiration date for it to apply.", - "id": "filter_modal.added.expired_explanation" - }, - { - "defaultMessage": "Context mismatch!", - "id": "filter_modal.added.context_mismatch_title" - }, - { - "defaultMessage": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", - "id": "filter_modal.added.context_mismatch_explanation" - }, - { - "defaultMessage": "settings page", - "id": "filter_modal.added.settings_link" - }, - { - "defaultMessage": "Filter added!", - "id": "filter_modal.added.title" - }, - { - "defaultMessage": "This post has been added to the following filter category: {title}.", - "id": "filter_modal.added.short_explanation" - }, - { - "defaultMessage": "Filter settings", - "id": "filter_modal.added.review_and_configure_title" - }, - { - "defaultMessage": "To review and further configure this filter category, go to the {settings_link}.", - "id": "filter_modal.added.review_and_configure" - }, - { - "defaultMessage": "Done", - "id": "report.close" - } - ], - "path": "app/javascript/mastodon/features/filters/added_to_filter.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Search or create", - "id": "filter_modal.select_filter.search" - }, - { - "defaultMessage": "Clear", - "id": "emoji_button.clear" - }, - { - "defaultMessage": "expired", - "id": "filter_modal.select_filter.expired" - }, - { - "defaultMessage": "does not apply to this context", - "id": "filter_modal.select_filter.context_mismatch" - }, - { - "defaultMessage": "New category: {name}", - "id": "filter_modal.select_filter.prompt_new" - }, - { - "defaultMessage": "Filter this post", - "id": "filter_modal.select_filter.title" - }, - { - "defaultMessage": "Use an existing category or create a new one", - "id": "filter_modal.select_filter.subtitle" - } - ], - "path": "app/javascript/mastodon/features/filters/select_filter.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Authorize", - "id": "follow_request.authorize" - }, - { - "defaultMessage": "Reject", - "id": "follow_request.reject" - } - ], - "path": "app/javascript/mastodon/features/follow_requests/components/account_authorize.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Follow requests", - "id": "column.follow_requests" - }, - { - "defaultMessage": "You don't have any follow requests yet. When you receive one, it will show up here.", - "id": "empty_column.follow_requests" - }, - { - "defaultMessage": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.", - "id": "follow_requests.unlocked_explanation" - } - ], - "path": "app/javascript/mastodon/features/follow_requests/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Followed hashtags", - "id": "followed_tags" - }, - { - "defaultMessage": "You have not followed any hashtags yet. When you do, they will show up here.", - "id": "empty_column.followed_tags" - } - ], - "path": "app/javascript/mastodon/features/followed_tags/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Followers", - "id": "timeline_hint.resources.followers" - }, - { - "defaultMessage": "Account suspended", - "id": "empty_column.account_suspended" - }, - { - "defaultMessage": "Profile unavailable", - "id": "empty_column.account_unavailable" - }, - { - "defaultMessage": "No one follows this user yet.", - "id": "account.followers.empty" - } - ], - "path": "app/javascript/mastodon/features/followers/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Follows", - "id": "timeline_hint.resources.follows" - }, - { - "defaultMessage": "Account suspended", - "id": "empty_column.account_suspended" - }, - { - "defaultMessage": "Profile unavailable", - "id": "empty_column.account_unavailable" - }, - { - "defaultMessage": "This user doesn't follow anyone yet.", - "id": "account.follows.empty" - } - ], - "path": "app/javascript/mastodon/features/following/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Previous", - "id": "lightbox.previous" - }, - { - "defaultMessage": "Next", - "id": "lightbox.next" - }, - { - "defaultMessage": "Announcement", - "id": "announcement.announcement" - } - ], - "path": "app/javascript/mastodon/features/getting_started/components/announcements.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Trending now", - "id": "trends.trending_now" - } - ], - "path": "app/javascript/mastodon/features/getting_started/components/trends.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Home", - "id": "tabs_bar.home" - }, - { - "defaultMessage": "Notifications", - "id": "tabs_bar.notifications" - }, - { - "defaultMessage": "Federated timeline", - "id": "navigation_bar.public_timeline" - }, - { - "defaultMessage": "Settings", - "id": "column_subheading.settings" - }, - { - "defaultMessage": "Local timeline", - "id": "navigation_bar.community_timeline" - }, - { - "defaultMessage": "Explore", - "id": "navigation_bar.explore" - }, - { - "defaultMessage": "Private mentions", - "id": "navigation_bar.direct" - }, - { - "defaultMessage": "Bookmarks", - "id": "navigation_bar.bookmarks" - }, - { - "defaultMessage": "Preferences", - "id": "navigation_bar.preferences" - }, - { - "defaultMessage": "Follow requests", - "id": "navigation_bar.follow_requests" - }, - { - "defaultMessage": "Favourites", - "id": "navigation_bar.favourites" - }, - { - "defaultMessage": "Blocked users", - "id": "navigation_bar.blocks" - }, - { - "defaultMessage": "Blocked domains", - "id": "navigation_bar.domain_blocks" - }, - { - "defaultMessage": "Muted users", - "id": "navigation_bar.mutes" - }, - { - "defaultMessage": "Pinned posts", - "id": "navigation_bar.pins" - }, - { - "defaultMessage": "Lists", - "id": "navigation_bar.lists" - }, - { - "defaultMessage": "Discover", - "id": "navigation_bar.discover" - }, - { - "defaultMessage": "Personal", - "id": "navigation_bar.personal" - }, - { - "defaultMessage": "Security", - "id": "navigation_bar.security" - }, - { - "defaultMessage": "Getting started", - "id": "getting_started.heading" - } - ], - "path": "app/javascript/mastodon/features/getting_started/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Enter hashtags…", - "id": "hashtag.column_settings.select.placeholder" - }, - { - "defaultMessage": "No suggestions found", - "id": "hashtag.column_settings.select.no_options_message" - }, - { - "defaultMessage": "Any of these", - "id": "hashtag.column_settings.tag_mode.any" - }, - { - "defaultMessage": "All of these", - "id": "hashtag.column_settings.tag_mode.all" - }, - { - "defaultMessage": "None of these", - "id": "hashtag.column_settings.tag_mode.none" - }, - { - "defaultMessage": "Include additional tags in this column", - "id": "hashtag.column_settings.tag_toggle" - }, - { - "defaultMessage": "Local only", - "id": "community.column_settings.local_only" - } - ], - "path": "app/javascript/mastodon/features/hashtag_timeline/components/column_settings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Follow hashtag", - "id": "hashtag.follow" - }, - { - "defaultMessage": "Unfollow hashtag", - "id": "hashtag.unfollow" - }, - { - "defaultMessage": "or {additional}", - "id": "hashtag.column_header.tag_mode.any" - }, - { - "defaultMessage": "and {additional}", - "id": "hashtag.column_header.tag_mode.all" - }, - { - "defaultMessage": "without {additional}", - "id": "hashtag.column_header.tag_mode.none" - }, - { - "defaultMessage": "There is nothing in this hashtag yet.", - "id": "empty_column.hashtag" - } - ], - "path": "app/javascript/mastodon/features/hashtag_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Basic", - "id": "home.column_settings.basic" - }, - { - "defaultMessage": "Show boosts", - "id": "home.column_settings.show_reblogs" - }, - { - "defaultMessage": "Show replies", - "id": "home.column_settings.show_replies" - } - ], - "path": "app/javascript/mastodon/features/home_timeline/components/column_settings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Home", - "id": "column.home" - }, - { - "defaultMessage": "Show announcements", - "id": "home.show_announcements" - }, - { - "defaultMessage": "Hide announcements", - "id": "home.hide_announcements" - }, - { - "defaultMessage": "Your home timeline is empty! Follow more people to fill it up. {suggestions}", - "id": "empty_column.home" - }, - { - "defaultMessage": "See some suggestions", - "id": "empty_column.home.suggestions" - } - ], - "path": "app/javascript/mastodon/features/home_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Copied", - "id": "copypaste.copied" - }, - { - "defaultMessage": "Copy", - "id": "copypaste.copy" - }, - { - "defaultMessage": "Reply to {name}'s post", - "id": "interaction_modal.title.reply" - }, - { - "defaultMessage": "With an account on Mastodon, you can respond to this post.", - "id": "interaction_modal.description.reply" - }, - { - "defaultMessage": "Boost {name}'s post", - "id": "interaction_modal.title.reblog" - }, - { - "defaultMessage": "With an account on Mastodon, you can boost this post to share it with your own followers.", - "id": "interaction_modal.description.reblog" - }, - { - "defaultMessage": "Favourite {name}'s post", - "id": "interaction_modal.title.favourite" - }, - { - "defaultMessage": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.", - "id": "interaction_modal.description.favourite" - }, - { - "defaultMessage": "Follow {name}", - "id": "interaction_modal.title.follow" - }, - { - "defaultMessage": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.", - "id": "interaction_modal.description.follow" - }, - { - "defaultMessage": "Create account", - "id": "sign_in_banner.create_account" - }, - { - "defaultMessage": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.", - "id": "interaction_modal.preamble" - }, - { - "defaultMessage": "On this server", - "id": "interaction_modal.on_this_server" - }, - { - "defaultMessage": "Login", - "id": "sign_in_banner.sign_in" - }, - { - "defaultMessage": "On a different server", - "id": "interaction_modal.on_another_server" - }, - { - "defaultMessage": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.", - "id": "interaction_modal.other_server_instructions" - } - ], - "path": "app/javascript/mastodon/features/interaction_modal/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Keyboard Shortcuts", - "id": "keyboard_shortcuts.heading" - }, - { - "defaultMessage": "Hotkey", - "id": "keyboard_shortcuts.hotkey" - }, - { - "defaultMessage": "Description", - "id": "keyboard_shortcuts.description" - }, - { - "defaultMessage": "to reply", - "id": "keyboard_shortcuts.reply" - }, - { - "defaultMessage": "to mention author", - "id": "keyboard_shortcuts.mention" - }, - { - "defaultMessage": "to open author's profile", - "id": "keyboard_shortcuts.profile" - }, - { - "defaultMessage": "to favourite", - "id": "keyboard_shortcuts.favourite" - }, - { - "defaultMessage": "to boost", - "id": "keyboard_shortcuts.boost" - }, - { - "defaultMessage": "to open status", - "id": "keyboard_shortcuts.enter" - }, - { - "defaultMessage": "to open media", - "id": "keyboard_shortcuts.open_media" - }, - { - "defaultMessage": "to show/hide text behind CW", - "id": "keyboard_shortcuts.toggle_hidden" - }, - { - "defaultMessage": "to show/hide media", - "id": "keyboard_shortcuts.toggle_sensitivity" - }, - { - "defaultMessage": "to move up in the list", - "id": "keyboard_shortcuts.up" - }, - { - "defaultMessage": "to move down in the list", - "id": "keyboard_shortcuts.down" - }, - { - "defaultMessage": "to focus a status in one of the columns", - "id": "keyboard_shortcuts.column" - }, - { - "defaultMessage": "to focus the compose textarea", - "id": "keyboard_shortcuts.compose" - }, - { - "defaultMessage": "to start a brand new post", - "id": "keyboard_shortcuts.toot" - }, - { - "defaultMessage": "to show/hide CW field", - "id": "keyboard_shortcuts.spoilers" - }, - { - "defaultMessage": "to navigate back", - "id": "keyboard_shortcuts.back" - }, - { - "defaultMessage": "to focus search", - "id": "keyboard_shortcuts.search" - }, - { - "defaultMessage": "to un-focus compose textarea/search", - "id": "keyboard_shortcuts.unfocus" - }, - { - "defaultMessage": "to open home timeline", - "id": "keyboard_shortcuts.home" - }, - { - "defaultMessage": "to open notifications column", - "id": "keyboard_shortcuts.notifications" - }, - { - "defaultMessage": "to open local timeline", - "id": "keyboard_shortcuts.local" - }, - { - "defaultMessage": "to open federated timeline", - "id": "keyboard_shortcuts.federated" - }, - { - "defaultMessage": "to open direct messages column", - "id": "keyboard_shortcuts.direct" - }, - { - "defaultMessage": "to open \"get started\" column", - "id": "keyboard_shortcuts.start" - }, - { - "defaultMessage": "to open favourites list", - "id": "keyboard_shortcuts.favourites" - }, - { - "defaultMessage": "to open pinned posts list", - "id": "keyboard_shortcuts.pinned" - }, - { - "defaultMessage": "to open your profile", - "id": "keyboard_shortcuts.my_profile" - }, - { - "defaultMessage": "to open blocked users list", - "id": "keyboard_shortcuts.blocked" - }, - { - "defaultMessage": "to open muted users list", - "id": "keyboard_shortcuts.muted" - }, - { - "defaultMessage": "to open follow requests list", - "id": "keyboard_shortcuts.requests" - }, - { - "defaultMessage": "to display this legend", - "id": "keyboard_shortcuts.legend" - } - ], - "path": "app/javascript/mastodon/features/keyboard_shortcuts/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Remove from list", - "id": "lists.account.remove" - }, - { - "defaultMessage": "Add to list", - "id": "lists.account.add" - } - ], - "path": "app/javascript/mastodon/features/list_adder/components/list.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Remove from list", - "id": "lists.account.remove" - }, - { - "defaultMessage": "Add to list", - "id": "lists.account.add" - } - ], - "path": "app/javascript/mastodon/features/list_editor/components/account.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Change title", - "id": "lists.edit.submit" - } - ], - "path": "app/javascript/mastodon/features/list_editor/components/edit_list_form.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Search among people you follow", - "id": "lists.search" - } - ], - "path": "app/javascript/mastodon/features/list_editor/components/search.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to permanently delete this list?", - "id": "confirmations.delete_list.message" - }, - { - "defaultMessage": "Delete", - "id": "confirmations.delete_list.confirm" - }, - { - "defaultMessage": "Any followed user", - "id": "lists.replies_policy.followed" - }, - { - "defaultMessage": "No one", - "id": "lists.replies_policy.none" - }, - { - "defaultMessage": "Members of the list", - "id": "lists.replies_policy.list" - }, - { - "defaultMessage": "Edit list", - "id": "lists.edit" - }, - { - "defaultMessage": "Delete list", - "id": "lists.delete" - }, - { - "defaultMessage": "Show replies to:", - "id": "lists.replies_policy.title" - }, - { - "defaultMessage": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.", - "id": "empty_column.list" - } - ], - "path": "app/javascript/mastodon/features/list_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "New list title", - "id": "lists.new.title_placeholder" - }, - { - "defaultMessage": "Add list", - "id": "lists.new.create" - } - ], - "path": "app/javascript/mastodon/features/lists/components/new_list_form.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Lists", - "id": "column.lists" - }, - { - "defaultMessage": "Your lists", - "id": "lists.subheading" - }, - { - "defaultMessage": "You don't have any lists yet. When you create one, it will show up here.", - "id": "empty_column.lists" - } - ], - "path": "app/javascript/mastodon/features/lists/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Muted users", - "id": "column.mutes" - }, - { - "defaultMessage": "You haven't muted any users yet.", - "id": "empty_column.mutes" - } - ], - "path": "app/javascript/mastodon/features/mutes/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Clear notifications", - "id": "notifications.clear" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/clear_column_button.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Highlight unread notifications", - "id": "notifications.column_settings.unread_notifications.highlight" - }, - { - "defaultMessage": "Show filter bar", - "id": "notifications.column_settings.filter_bar.show_bar" - }, - { - "defaultMessage": "Display all categories", - "id": "notifications.column_settings.filter_bar.advanced" - }, - { - "defaultMessage": "Desktop notifications", - "id": "notifications.column_settings.alert" - }, - { - "defaultMessage": "Show in column", - "id": "notifications.column_settings.show" - }, - { - "defaultMessage": "Play sound", - "id": "notifications.column_settings.sound" - }, - { - "defaultMessage": "Push notifications", - "id": "notifications.column_settings.push" - }, - { - "defaultMessage": "Desktop notifications are unavailable due to previously denied browser permissions request", - "id": "notifications.permission_denied" - }, - { - "defaultMessage": "Desktop notifications are unavailable because the required permission has not been granted.", - "id": "notifications.permission_required" - }, - { - "defaultMessage": "Unread notifications", - "id": "notifications.column_settings.unread_notifications.category" - }, - { - "defaultMessage": "Quick filter bar", - "id": "notifications.column_settings.filter_bar.category" - }, - { - "defaultMessage": "New followers:", - "id": "notifications.column_settings.follow" - }, - { - "defaultMessage": "New follow requests:", - "id": "notifications.column_settings.follow_request" - }, - { - "defaultMessage": "Favourites:", - "id": "notifications.column_settings.favourite" - }, - { - "defaultMessage": "Mentions:", - "id": "notifications.column_settings.mention" - }, - { - "defaultMessage": "Boosts:", - "id": "notifications.column_settings.reblog" - }, - { - "defaultMessage": "Poll results:", - "id": "notifications.column_settings.poll" - }, - { - "defaultMessage": "New posts:", - "id": "notifications.column_settings.status" - }, - { - "defaultMessage": "Edits:", - "id": "notifications.column_settings.update" - }, - { - "defaultMessage": "New sign-ups:", - "id": "notifications.column_settings.admin.sign_up" - }, - { - "defaultMessage": "New reports:", - "id": "notifications.column_settings.admin.report" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/column_settings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Mentions", - "id": "notifications.filter.mentions" - }, - { - "defaultMessage": "Favourites", - "id": "notifications.filter.favourites" - }, - { - "defaultMessage": "Boosts", - "id": "notifications.filter.boosts" - }, - { - "defaultMessage": "Poll results", - "id": "notifications.filter.polls" - }, - { - "defaultMessage": "Follows", - "id": "notifications.filter.follows" - }, - { - "defaultMessage": "Updates from people you follow", - "id": "notifications.filter.statuses" - }, - { - "defaultMessage": "All", - "id": "notifications.filter.all" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/filter_bar.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Authorize", - "id": "follow_request.authorize" - }, - { - "defaultMessage": "Reject", - "id": "follow_request.reject" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/follow_request.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Grant permission.", - "id": "notifications.grant_permission" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/grant_permission_button.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{name} favourited your status", - "id": "notification.favourite" - }, - { - "defaultMessage": "{name} followed you", - "id": "notification.follow" - }, - { - "defaultMessage": "Your poll has ended", - "id": "notification.own_poll" - }, - { - "defaultMessage": "A poll you have voted in has ended", - "id": "notification.poll" - }, - { - "defaultMessage": "{name} boosted your status", - "id": "notification.reblog" - }, - { - "defaultMessage": "{name} just posted", - "id": "notification.status" - }, - { - "defaultMessage": "{name} edited a post", - "id": "notification.update" - }, - { - "defaultMessage": "{name} signed up", - "id": "notification.admin.sign_up" - }, - { - "defaultMessage": "{name} reported {target}", - "id": "notification.admin.report" - }, - { - "defaultMessage": "{name} has requested to follow you", - "id": "notification.follow_request" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/notification.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Never miss a thing", - "id": "notifications_permission_banner.title" - }, - { - "defaultMessage": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.", - "id": "notifications_permission_banner.how_to_control" - }, - { - "defaultMessage": "Enable desktop notifications", - "id": "notifications_permission_banner.enable" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/notifications_permission_banner.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Open report", - "id": "report_notification.open" - }, - { - "defaultMessage": "Other", - "id": "report_notification.categories.other" - }, - { - "defaultMessage": "Spam", - "id": "report_notification.categories.spam" - }, - { - "defaultMessage": "Rule violation", - "id": "report_notification.categories.violation" - }, - { - "defaultMessage": "{count, plural, one {# post} other {# posts}} attached", - "id": "report_notification.attached_statuses" - } - ], - "path": "app/javascript/mastodon/features/notifications/components/report.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to permanently clear all your notifications?", - "id": "notifications.clear_confirmation" - }, - { - "defaultMessage": "Clear notifications", - "id": "notifications.clear" - }, - { - "defaultMessage": "Desktop notifications can't be enabled, as browser permission has been denied before", - "id": "notifications.permission_denied_alert" - } - ], - "path": "app/javascript/mastodon/features/notifications/containers/column_settings_container.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Notifications", - "id": "column.notifications" - }, - { - "defaultMessage": "Mark every notification as read", - "id": "notifications.mark_as_read" - }, - { - "defaultMessage": "You don't have any notifications yet. When other people interact with you, you will see it here.", - "id": "empty_column.notifications" - } - ], - "path": "app/javascript/mastodon/features/notifications/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Unfortunately, no results can be shown right now. You can try using search or browsing the explore page to find people to follow, or try again later.", - "id": "onboarding.follows.empty" - }, - { - "defaultMessage": "Popular on Mastodon", - "id": "onboarding.follows.title" - }, - { - "defaultMessage": "You curate your own home feed. The more people you follow, the more active and interesting it will be. These profiles may be a good starting point—you can always unfollow them later!", - "id": "onboarding.follows.lead" - }, - { - "defaultMessage": "Did you know? Since Mastodon is decentralized, some profiles you come across will be hosted on servers other than yours. And yet you can interact with them seamlessly! Their server is in the second half of their username!", - "id": "onboarding.tips.accounts_from_other_servers" - }, - { - "defaultMessage": "Take me back", - "id": "onboarding.actions.back" - } - ], - "path": "app/javascript/mastodon/features/onboarding/follows.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Hello #Mastodon!", - "id": "onboarding.compose.template" - }, - { - "defaultMessage": "You've made it!", - "id": "onboarding.start.title" - }, - { - "defaultMessage": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", - "id": "onboarding.start.lead" - }, - { - "defaultMessage": "Customize your profile", - "id": "onboarding.steps.setup_profile.title" - }, - { - "defaultMessage": "Others are more likely to interact with you with a filled out profile.", - "id": "onboarding.steps.setup_profile.body" - }, - { - "defaultMessage": "Follow {count, plural, one {one person} other {# people}}", - "id": "onboarding.steps.follow_people.title" - }, - { - "defaultMessage": "You curate your own feed. Let's fill it with interesting people.", - "id": "onboarding.steps.follow_people.body" - }, - { - "defaultMessage": "Make your first post", - "id": "onboarding.steps.publish_status.title" - }, - { - "defaultMessage": "Say hello to the world.", - "id": "onboarding.steps.publish_status.body" - }, - { - "defaultMessage": "Share your profile", - "id": "onboarding.steps.share_profile.title" - }, - { - "defaultMessage": "Let your friends know how to find you on Mastodon!", - "id": "onboarding.steps.share_profile.body" - }, - { - "defaultMessage": "Want to skip right ahead?", - "id": "onboarding.start.skip" - }, - { - "defaultMessage": "See what's trending", - "id": "onboarding.actions.go_to_explore" - }, - { - "defaultMessage": "Don't show this screen again", - "id": "onboarding.actions.close" - } - ], - "path": "app/javascript/mastodon/features/onboarding/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "I'm {username} on #Mastodon! Come follow me at {url}", - "id": "onboarding.share.message" - }, - { - "defaultMessage": "Copied", - "id": "copypaste.copied" - }, - { - "defaultMessage": "Copy to clipboard", - "id": "copypaste.copy_to_clipboard" - }, - { - "defaultMessage": "Share your profile", - "id": "onboarding.share.title" - }, - { - "defaultMessage": "Let people know how they can find you on Mastodon!", - "id": "onboarding.share.lead" - }, - { - "defaultMessage": "Did you know? You can verify your account by putting a link to your Mastodon profile on your own website and adding the website to your profile. No fees or documents necessary!", - "id": "onboarding.tips.verification" - }, - { - "defaultMessage": "Did you know? If you feel like {domain} is not a great server choice for you in the future, you can move to another Mastodon server without losing your followers. You can even host your own server!", - "id": "onboarding.tips.migration" - }, - { - "defaultMessage": "Did you know? You can secure your account by setting up two-factor authentication in your account settings. It works with any TOTP app of your choice, no phone number necessary!", - "id": "onboarding.tips.2fa" - }, - { - "defaultMessage": "Possible next steps:", - "id": "onboarding.share.next_steps" - }, - { - "defaultMessage": "Go to your home feed", - "id": "onboarding.actions.go_to_home" - }, - { - "defaultMessage": "See what's trending", - "id": "onboarding.actions.go_to_explore" - }, - { - "defaultMessage": "Take me back", - "id": "onboarding.action.back" - } - ], - "path": "app/javascript/mastodon/features/onboarding/share.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Reply", - "id": "status.reply" - }, - { - "defaultMessage": "Reply to thread", - "id": "status.replyAll" - }, - { - "defaultMessage": "Boost", - "id": "status.reblog" - }, - { - "defaultMessage": "Boost with original visibility", - "id": "status.reblog_private" - }, - { - "defaultMessage": "Unboost", - "id": "status.cancel_reblog_private" - }, - { - "defaultMessage": "This post cannot be boosted", - "id": "status.cannot_reblog" - }, - { - "defaultMessage": "Favourite", - "id": "status.favourite" - }, - { - "defaultMessage": "Reply", - "id": "confirmations.reply.confirm" - }, - { - "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "id": "confirmations.reply.message" - }, - { - "defaultMessage": "Expand this status", - "id": "status.open" - } - ], - "path": "app/javascript/mastodon/features/picture_in_picture/components/footer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - } - ], - "path": "app/javascript/mastodon/features/picture_in_picture/components/header.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Pinned post", - "id": "column.pins" - } - ], - "path": "app/javascript/mastodon/features/pinned_statuses/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Privacy Policy", - "id": "privacy_policy.title" - }, - { - "defaultMessage": "Last updated {date}", - "id": "privacy_policy.last_updated" - } - ], - "path": "app/javascript/mastodon/features/privacy_policy/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Media only", - "id": "community.column_settings.media_only" - }, - { - "defaultMessage": "Remote only", - "id": "community.column_settings.remote_only" - } - ], - "path": "app/javascript/mastodon/features/public_timeline/components/column_settings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Federated timeline", - "id": "column.public" - }, - { - "defaultMessage": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.", - "id": "dismissable_banner.public_timeline" - }, - { - "defaultMessage": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", - "id": "empty_column.public" - } - ], - "path": "app/javascript/mastodon/features/public_timeline/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Refresh", - "id": "refresh" - }, - { - "defaultMessage": "No one has boosted this post yet. When someone does, they will show up here.", - "id": "status.reblogs.empty" - } - ], - "path": "app/javascript/mastodon/features/reblogs/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "I don't like it", - "id": "report.reasons.dislike" - }, - { - "defaultMessage": "It is not something you want to see", - "id": "report.reasons.dislike_description" - }, - { - "defaultMessage": "It's spam", - "id": "report.reasons.spam" - }, - { - "defaultMessage": "Malicious links, fake engagement, or repetitive replies", - "id": "report.reasons.spam_description" - }, - { - "defaultMessage": "It violates server rules", - "id": "report.reasons.violation" - }, - { - "defaultMessage": "You are aware that it breaks specific rules", - "id": "report.reasons.violation_description" - }, - { - "defaultMessage": "It's something else", - "id": "report.reasons.other" - }, - { - "defaultMessage": "The issue does not fit into other categories", - "id": "report.reasons.other_description" - }, - { - "defaultMessage": "post", - "id": "report.category.title_status" - }, - { - "defaultMessage": "profile", - "id": "report.category.title_account" - }, - { - "defaultMessage": "Tell us what's going on with this {type}", - "id": "report.category.title" - }, - { - "defaultMessage": "Choose the best match", - "id": "report.category.subtitle" - }, - { - "defaultMessage": "Next", - "id": "report.next" - } - ], - "path": "app/javascript/mastodon/features/report/category.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Type or paste additional comments", - "id": "report.placeholder" - }, - { - "defaultMessage": "Is there anything else you think we should know?", - "id": "report.comment.title" - }, - { - "defaultMessage": "The account is from another server. Send an anonymized copy of the report there as well?", - "id": "report.forward_hint" - }, - { - "defaultMessage": "Forward to {target}", - "id": "report.forward" - }, - { - "defaultMessage": "Submit report", - "id": "report.submit" - } - ], - "path": "app/javascript/mastodon/features/report/comment.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Public", - "id": "privacy.public.short" - }, - { - "defaultMessage": "Unlisted", - "id": "privacy.unlisted.short" - }, - { - "defaultMessage": "Followers only", - "id": "privacy.private.short" - }, - { - "defaultMessage": "Mentioned people only", - "id": "privacy.direct.short" - } - ], - "path": "app/javascript/mastodon/features/report/components/status_check_box.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Which rules are being violated?", - "id": "report.rules.title" - }, - { - "defaultMessage": "Select all that apply", - "id": "report.rules.subtitle" - }, - { - "defaultMessage": "Next", - "id": "report.next" - } - ], - "path": "app/javascript/mastodon/features/report/rules.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are there any posts that back up this report?", - "id": "report.statuses.title" - }, - { - "defaultMessage": "Select all that apply", - "id": "report.statuses.subtitle" - }, - { - "defaultMessage": "Next", - "id": "report.next" - } - ], - "path": "app/javascript/mastodon/features/report/statuses.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Thanks for reporting, we'll look into this.", - "id": "report.thanks.title_actionable" - }, - { - "defaultMessage": "Don't want to see this?", - "id": "report.thanks.title" - }, - { - "defaultMessage": "While we review this, you can take action against @{name}:", - "id": "report.thanks.take_action_actionable" - }, - { - "defaultMessage": "Here are your options for controlling what you see on Mastodon:", - "id": "report.thanks.take_action" - }, - { - "defaultMessage": "Unfollow @{name}", - "id": "report.unfollow" - }, - { - "defaultMessage": "You are following this account. To not see their posts in your home feed anymore, unfollow them.", - "id": "report.unfollow_explanation" - }, - { - "defaultMessage": "Unfollow", - "id": "account.unfollow" - }, - { - "defaultMessage": "Mute @{name}", - "id": "account.mute" - }, - { - "defaultMessage": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.", - "id": "report.mute_explanation" - }, - { - "defaultMessage": "Mute", - "id": "report.mute" - }, - { - "defaultMessage": "Muted", - "id": "account.muted" - }, - { - "defaultMessage": "Block @{name}", - "id": "account.block" - }, - { - "defaultMessage": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.", - "id": "report.block_explanation" - }, - { - "defaultMessage": "Block", - "id": "report.block" - }, - { - "defaultMessage": "Blocked", - "id": "account.blocked" - }, - { - "defaultMessage": "Done", - "id": "report.close" - } - ], - "path": "app/javascript/mastodon/features/report/thanks.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Delete", - "id": "status.delete" - }, - { - "defaultMessage": "Delete & re-draft", - "id": "status.redraft" - }, - { - "defaultMessage": "Edit", - "id": "status.edit" - }, - { - "defaultMessage": "Privately mention @{name}", - "id": "status.direct" - }, - { - "defaultMessage": "Mention @{name}", - "id": "status.mention" - }, - { - "defaultMessage": "Reply", - "id": "status.reply" - }, - { - "defaultMessage": "Boost", - "id": "status.reblog" - }, - { - "defaultMessage": "Boost with original visibility", - "id": "status.reblog_private" - }, - { - "defaultMessage": "Unboost", - "id": "status.cancel_reblog_private" - }, - { - "defaultMessage": "This post cannot be boosted", - "id": "status.cannot_reblog" - }, - { - "defaultMessage": "Favourite", - "id": "status.favourite" - }, - { - "defaultMessage": "Bookmark", - "id": "status.bookmark" - }, - { - "defaultMessage": "More", - "id": "status.more" - }, - { - "defaultMessage": "Mute @{name}", - "id": "status.mute" - }, - { - "defaultMessage": "Mute conversation", - "id": "status.mute_conversation" - }, - { - "defaultMessage": "Unmute conversation", - "id": "status.unmute_conversation" - }, - { - "defaultMessage": "Block @{name}", - "id": "status.block" - }, - { - "defaultMessage": "Report @{name}", - "id": "status.report" - }, - { - "defaultMessage": "Share", - "id": "status.share" - }, - { - "defaultMessage": "Pin on profile", - "id": "status.pin" - }, - { - "defaultMessage": "Unpin from profile", - "id": "status.unpin" - }, - { - "defaultMessage": "Embed", - "id": "status.embed" - }, - { - "defaultMessage": "Open moderation interface for @{name}", - "id": "status.admin_account" - }, - { - "defaultMessage": "Open this post in the moderation interface", - "id": "status.admin_status" - }, - { - "defaultMessage": "Open moderation interface for {domain}", - "id": "status.admin_domain" - }, - { - "defaultMessage": "Copy link to post", - "id": "status.copy" - }, - { - "defaultMessage": "Block domain {domain}", - "id": "account.block_domain" - }, - { - "defaultMessage": "Unblock domain {domain}", - "id": "account.unblock_domain" - }, - { - "defaultMessage": "Unmute @{name}", - "id": "account.unmute" - }, - { - "defaultMessage": "Unblock @{name}", - "id": "account.unblock" - }, - { - "defaultMessage": "Open original page", - "id": "account.open_original_page" - } - ], - "path": "app/javascript/mastodon/features/status/components/action_bar.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Sensitive content", - "id": "status.sensitive_warning" - } - ], - "path": "app/javascript/mastodon/features/status/components/card.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Public", - "id": "privacy.public.short" - }, - { - "defaultMessage": "Unlisted", - "id": "privacy.unlisted.short" - }, - { - "defaultMessage": "Followers only", - "id": "privacy.private.short" - }, - { - "defaultMessage": "Mentioned people only", - "id": "privacy.direct.short" - }, - { - "defaultMessage": "Private mention", - "id": "status.direct_indicator" - } - ], - "path": "app/javascript/mastodon/features/status/components/detailed_status.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Delete", - "id": "confirmations.delete.confirm" - }, - { - "defaultMessage": "Are you sure you want to delete this status?", - "id": "confirmations.delete.message" - }, - { - "defaultMessage": "Delete & redraft", - "id": "confirmations.redraft.confirm" - }, - { - "defaultMessage": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", - "id": "confirmations.redraft.message" - }, - { - "defaultMessage": "Show more for all", - "id": "status.show_more_all" - }, - { - "defaultMessage": "Show less for all", - "id": "status.show_less_all" - }, - { - "defaultMessage": "{user} posted {attachmentCount, plural, one {an attachment} other {# attachments}}", - "id": "status.title.with_attachments" - }, - { - "defaultMessage": "Detailed conversation view", - "id": "status.detailed_status" - }, - { - "defaultMessage": "Reply", - "id": "confirmations.reply.confirm" - }, - { - "defaultMessage": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "id": "confirmations.reply.message" - }, - { - "defaultMessage": "Block entire domain", - "id": "confirmations.domain_block.confirm" - }, - { - "defaultMessage": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", - "id": "confirmations.domain_block.message" - } - ], - "path": "app/javascript/mastodon/features/status/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Change subscribed languages for {target}", - "id": "subscribed_languages.target" - }, - { - "defaultMessage": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.", - "id": "subscribed_languages.lead" - }, - { - "defaultMessage": "Save changes", - "id": "subscribed_languages.save" - } - ], - "path": "app/javascript/mastodon/features/subscribed_languages_modal/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to block {name}?", - "id": "confirmations.block.message" - }, - { - "defaultMessage": "Cancel", - "id": "confirmation_modal.cancel" - }, - { - "defaultMessage": "Block & Report", - "id": "confirmations.block.block_and_report" - }, - { - "defaultMessage": "Block", - "id": "confirmations.block.confirm" - } - ], - "path": "app/javascript/mastodon/features/ui/components/block_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Unboost", - "id": "status.cancel_reblog_private" - }, - { - "defaultMessage": "Boost", - "id": "status.reblog" - }, - { - "defaultMessage": "Public", - "id": "privacy.public.short" - }, - { - "defaultMessage": "Unlisted", - "id": "privacy.unlisted.short" - }, - { - "defaultMessage": "Followers only", - "id": "privacy.private.short" - }, - { - "defaultMessage": "Mentioned people only", - "id": "privacy.direct.short" - }, - { - "defaultMessage": "You can press {combo} to skip this next time", - "id": "boost_modal.combo" - } - ], - "path": "app/javascript/mastodon/features/ui/components/boost_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Copied", - "id": "copypaste.copied" - }, - { - "defaultMessage": "404", - "id": "bundle_column_error.routing.title" - }, - { - "defaultMessage": "The requested page could not be found. Are you sure the URL in the address bar is correct?", - "id": "bundle_column_error.routing.body" - }, - { - "defaultMessage": "Network error", - "id": "bundle_column_error.network.title" - }, - { - "defaultMessage": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.", - "id": "bundle_column_error.network.body" - }, - { - "defaultMessage": "Oh, no!", - "id": "bundle_column_error.error.title" - }, - { - "defaultMessage": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.", - "id": "bundle_column_error.error.body" - }, - { - "defaultMessage": "Try again", - "id": "bundle_column_error.retry" - }, - { - "defaultMessage": "Copy error report", - "id": "bundle_column_error.copy_stacktrace" - }, - { - "defaultMessage": "Go back home", - "id": "bundle_column_error.return" - } - ], - "path": "app/javascript/mastodon/features/ui/components/bundle_column_error.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Something went wrong while loading this component.", - "id": "bundle_modal_error.message" - }, - { - "defaultMessage": "Try again", - "id": "bundle_modal_error.retry" - }, - { - "defaultMessage": "Close", - "id": "bundle_modal_error.close" - } - ], - "path": "app/javascript/mastodon/features/ui/components/bundle_modal_error.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{name} created {date}", - "id": "status.history.created" - }, - { - "defaultMessage": "{name} edited {date}", - "id": "status.history.edited" - } - ], - "path": "app/javascript/mastodon/features/ui/components/compare_history_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Cancel", - "id": "confirmation_modal.cancel" - } - ], - "path": "app/javascript/mastodon/features/ui/components/confirmation_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to log out?", - "id": "confirmations.logout.message" - }, - { - "defaultMessage": "Log out", - "id": "confirmations.logout.confirm" - }, - { - "defaultMessage": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.", - "id": "moved_to_account_banner.text" - }, - { - "defaultMessage": "Your account {disabledAccount} is currently disabled.", - "id": "disabled_account_banner.text" - }, - { - "defaultMessage": "Account settings", - "id": "disabled_account_banner.account_settings" - } - ], - "path": "app/javascript/mastodon/features/ui/components/disabled_account_banner.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Embed", - "id": "status.embed" - }, - { - "defaultMessage": "Embed this status on your website by copying the code below.", - "id": "embed.instructions" - }, - { - "defaultMessage": "Here is what it will look like:", - "id": "embed.preview" - } - ], - "path": "app/javascript/mastodon/features/ui/components/embed_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Filter a post", - "id": "filter_modal.title.status" - } - ], - "path": "app/javascript/mastodon/features/ui/components/filter_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Apply", - "id": "upload_modal.apply" - }, - { - "defaultMessage": "Applying…", - "id": "upload_modal.applying" - }, - { - "defaultMessage": "A quick brown fox jumps over the lazy dog", - "id": "upload_modal.description_placeholder" - }, - { - "defaultMessage": "Choose image", - "id": "upload_modal.choose_image" - }, - { - "defaultMessage": "You have unsaved changes to the media description or preview, discard them anyway?", - "id": "confirmations.discard_edit_media.message" - }, - { - "defaultMessage": "Discard", - "id": "confirmations.discard_edit_media.confirm" - }, - { - "defaultMessage": "Describe for people who are hard of hearing", - "id": "upload_form.audio_description" - }, - { - "defaultMessage": "Describe for people who are deaf, hard of hearing, blind or have low vision", - "id": "upload_form.video_description" - }, - { - "defaultMessage": "Describe for people who are blind or have low vision", - "id": "upload_form.description" - }, - { - "defaultMessage": "Analyzing picture…", - "id": "upload_modal.analyzing_picture" - }, - { - "defaultMessage": "Preparing OCR…", - "id": "upload_modal.preparing_ocr" - }, - { - "defaultMessage": "Edit media", - "id": "upload_modal.edit_media" - }, - { - "defaultMessage": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.", - "id": "upload_modal.hint" - }, - { - "defaultMessage": "Change thumbnail", - "id": "upload_form.thumbnail" - }, - { - "defaultMessage": "Detect text from picture", - "id": "upload_modal.detect_text" - }, - { - "defaultMessage": "Preview ({ratio})", - "id": "upload_modal.preview_label" - } - ], - "path": "app/javascript/mastodon/features/ui/components/focal_point_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Follow requests", - "id": "navigation_bar.follow_requests" - } - ], - "path": "app/javascript/mastodon/features/ui/components/follow_requests_column_link.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Publish", - "id": "compose_form.publish_form" - }, - { - "defaultMessage": "Create account", - "id": "sign_in_banner.create_account" - }, - { - "defaultMessage": "Login", - "id": "sign_in_banner.sign_in" - } - ], - "path": "app/javascript/mastodon/features/ui/components/header.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - } - ], - "path": "app/javascript/mastodon/features/ui/components/image_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Are you sure you want to log out?", - "id": "confirmations.logout.message" - }, - { - "defaultMessage": "Log out", - "id": "confirmations.logout.confirm" - }, - { - "defaultMessage": "About", - "id": "footer.about" - }, - { - "defaultMessage": "Status", - "id": "footer.status" - }, - { - "defaultMessage": "Invite people", - "id": "footer.invite" - }, - { - "defaultMessage": "Profiles directory", - "id": "footer.directory" - }, - { - "defaultMessage": "Privacy policy", - "id": "footer.privacy_policy" - }, - { - "defaultMessage": "Get the app", - "id": "footer.get_app" - }, - { - "defaultMessage": "Keyboard shortcuts", - "id": "footer.keyboard_shortcuts" - }, - { - "defaultMessage": "View source code", - "id": "footer.source_code" - } - ], - "path": "app/javascript/mastodon/features/ui/components/link_footer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Previous", - "id": "lightbox.previous" - }, - { - "defaultMessage": "Next", - "id": "lightbox.next" - } - ], - "path": "app/javascript/mastodon/features/ui/components/media_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "{number, plural, one {# minute} other {# minutes}}", - "id": "intervals.full.minutes" - }, - { - "defaultMessage": "{number, plural, one {# hour} other {# hours}}", - "id": "intervals.full.hours" - }, - { - "defaultMessage": "{number, plural, one {# day} other {# days}}", - "id": "intervals.full.days" - }, - { - "defaultMessage": "Indefinite", - "id": "mute_modal.indefinite" - }, - { - "defaultMessage": "Are you sure you want to mute {name}?", - "id": "confirmations.mute.message" - }, - { - "defaultMessage": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.", - "id": "confirmations.mute.explanation" - }, - { - "defaultMessage": "Hide notifications from this user?", - "id": "mute_modal.hide_notifications" - }, - { - "defaultMessage": "Duration", - "id": "mute_modal.duration" - }, - { - "defaultMessage": "Cancel", - "id": "confirmation_modal.cancel" - }, - { - "defaultMessage": "Mute", - "id": "confirmations.mute.confirm" - } - ], - "path": "app/javascript/mastodon/features/ui/components/mute_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Home", - "id": "tabs_bar.home" - }, - { - "defaultMessage": "Notifications", - "id": "tabs_bar.notifications" - }, - { - "defaultMessage": "Explore", - "id": "explore.title" - }, - { - "defaultMessage": "Local", - "id": "tabs_bar.local_timeline" - }, - { - "defaultMessage": "Federated", - "id": "tabs_bar.federated_timeline" - }, - { - "defaultMessage": "Private mentions", - "id": "navigation_bar.direct" - }, - { - "defaultMessage": "Favourites", - "id": "navigation_bar.favourites" - }, - { - "defaultMessage": "Bookmarks", - "id": "navigation_bar.bookmarks" - }, - { - "defaultMessage": "Lists", - "id": "navigation_bar.lists" - }, - { - "defaultMessage": "Preferences", - "id": "navigation_bar.preferences" - }, - { - "defaultMessage": "Follows and followers", - "id": "navigation_bar.follows_and_followers" - }, - { - "defaultMessage": "About", - "id": "navigation_bar.about" - }, - { - "defaultMessage": "Search", - "id": "navigation_bar.search" - } - ], - "path": "app/javascript/mastodon/features/ui/components/navigation_panel.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Close", - "id": "lightbox.close" - }, - { - "defaultMessage": "Report {target}", - "id": "report.target" - } - ], - "path": "app/javascript/mastodon/features/ui/components/report_modal.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Create account", - "id": "sign_in_banner.create_account" - }, - { - "defaultMessage": "Login to follow profiles or hashtags, favourite, share and reply to posts. You can also interact from your account on a different server.", - "id": "sign_in_banner.text" - }, - { - "defaultMessage": "Login", - "id": "sign_in_banner.sign_in" - } - ], - "path": "app/javascript/mastodon/features/ui/components/sign_in_banner.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Drag & drop to upload", - "id": "upload_area.title" - } - ], - "path": "app/javascript/mastodon/features/ui/components/upload_area.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Compress image view box", - "id": "lightbox.compress" - }, - { - "defaultMessage": "Expand image view box", - "id": "lightbox.expand" - } - ], - "path": "app/javascript/mastodon/features/ui/components/zoomable_image.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Your draft will be lost if you leave Mastodon.", - "id": "ui.beforeunload" - } - ], - "path": "app/javascript/mastodon/features/ui/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Play", - "id": "video.play" - }, - { - "defaultMessage": "Pause", - "id": "video.pause" - }, - { - "defaultMessage": "Mute sound", - "id": "video.mute" - }, - { - "defaultMessage": "Unmute sound", - "id": "video.unmute" - }, - { - "defaultMessage": "Hide video", - "id": "video.hide" - }, - { - "defaultMessage": "Expand video", - "id": "video.expand" - }, - { - "defaultMessage": "Close video", - "id": "video.close" - }, - { - "defaultMessage": "Full screen", - "id": "video.fullscreen" - }, - { - "defaultMessage": "Exit full screen", - "id": "video.exit_fullscreen" - }, - { - "defaultMessage": "Sensitive content", - "id": "status.sensitive_warning" - }, - { - "defaultMessage": "Media hidden", - "id": "status.media_hidden" - } - ], - "path": "app/javascript/mastodon/features/video/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "That username is taken. Try another", - "id": "username.taken" - }, - { - "defaultMessage": "Password confirmation exceeds the maximum password length", - "id": "password_confirmation.exceeds_maxlength" - }, - { - "defaultMessage": "Password confirmation does not match", - "id": "password_confirmation.mismatching" - } - ], - "path": "app/javascript/packs/public.json" - } -] \ No newline at end of file diff --git a/app/javascript/mastodon/locales/whitelist_af.json b/app/javascript/mastodon/locales/whitelist_af.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_af.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_an.json b/app/javascript/mastodon/locales/whitelist_an.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_an.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ar.json b/app/javascript/mastodon/locales/whitelist_ar.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ar.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ast.json b/app/javascript/mastodon/locales/whitelist_ast.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ast.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_be.json b/app/javascript/mastodon/locales/whitelist_be.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_be.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_bg.json b/app/javascript/mastodon/locales/whitelist_bg.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_bg.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_bn.json b/app/javascript/mastodon/locales/whitelist_bn.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_bn.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_br.json b/app/javascript/mastodon/locales/whitelist_br.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_br.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_bs.json b/app/javascript/mastodon/locales/whitelist_bs.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_bs.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ca.json b/app/javascript/mastodon/locales/whitelist_ca.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ca.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ckb.json b/app/javascript/mastodon/locales/whitelist_ckb.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ckb.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_co.json b/app/javascript/mastodon/locales/whitelist_co.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_co.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_cs.json b/app/javascript/mastodon/locales/whitelist_cs.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_cs.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_csb.json b/app/javascript/mastodon/locales/whitelist_csb.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_csb.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_cy.json b/app/javascript/mastodon/locales/whitelist_cy.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_cy.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_da.json b/app/javascript/mastodon/locales/whitelist_da.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_da.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_de.json b/app/javascript/mastodon/locales/whitelist_de.json deleted file mode 100644 index c311ad0489..0000000000 --- a/app/javascript/mastodon/locales/whitelist_de.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "account.badges.bot", - "compose_form.publish_loud", - "search_results.hashtags" -] diff --git a/app/javascript/mastodon/locales/whitelist_el.json b/app/javascript/mastodon/locales/whitelist_el.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_el.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_en-GB.json b/app/javascript/mastodon/locales/whitelist_en-GB.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_en-GB.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_en.json b/app/javascript/mastodon/locales/whitelist_en.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_en.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_eo.json b/app/javascript/mastodon/locales/whitelist_eo.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_eo.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_es-AR.json b/app/javascript/mastodon/locales/whitelist_es-AR.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_es-AR.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_es-MX.json b/app/javascript/mastodon/locales/whitelist_es-MX.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_es-MX.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_es.json b/app/javascript/mastodon/locales/whitelist_es.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_es.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_et.json b/app/javascript/mastodon/locales/whitelist_et.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_et.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_eu.json b/app/javascript/mastodon/locales/whitelist_eu.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_eu.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_fa.json b/app/javascript/mastodon/locales/whitelist_fa.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_fa.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_fi.json b/app/javascript/mastodon/locales/whitelist_fi.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_fi.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_fo.json b/app/javascript/mastodon/locales/whitelist_fo.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_fo.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_fr-QC.json b/app/javascript/mastodon/locales/whitelist_fr-QC.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_fr-QC.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_fr.json b/app/javascript/mastodon/locales/whitelist_fr.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_fr.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_fy.json b/app/javascript/mastodon/locales/whitelist_fy.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_fy.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ga.json b/app/javascript/mastodon/locales/whitelist_ga.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ga.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_gd.json b/app/javascript/mastodon/locales/whitelist_gd.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_gd.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_gl.json b/app/javascript/mastodon/locales/whitelist_gl.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_gl.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_he.json b/app/javascript/mastodon/locales/whitelist_he.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_he.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_hi.json b/app/javascript/mastodon/locales/whitelist_hi.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_hi.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_hr.json b/app/javascript/mastodon/locales/whitelist_hr.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_hr.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_hu.json b/app/javascript/mastodon/locales/whitelist_hu.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_hu.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_hy.json b/app/javascript/mastodon/locales/whitelist_hy.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_hy.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_id.json b/app/javascript/mastodon/locales/whitelist_id.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_id.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ig.json b/app/javascript/mastodon/locales/whitelist_ig.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ig.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_io.json b/app/javascript/mastodon/locales/whitelist_io.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_io.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_is.json b/app/javascript/mastodon/locales/whitelist_is.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_is.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_it.json b/app/javascript/mastodon/locales/whitelist_it.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_it.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ja.json b/app/javascript/mastodon/locales/whitelist_ja.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ja.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ka.json b/app/javascript/mastodon/locales/whitelist_ka.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ka.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_kab.json b/app/javascript/mastodon/locales/whitelist_kab.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_kab.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_kk.json b/app/javascript/mastodon/locales/whitelist_kk.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_kk.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_kn.json b/app/javascript/mastodon/locales/whitelist_kn.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_kn.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ko.json b/app/javascript/mastodon/locales/whitelist_ko.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ko.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ku.json b/app/javascript/mastodon/locales/whitelist_ku.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ku.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_kw.json b/app/javascript/mastodon/locales/whitelist_kw.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_kw.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_la.json b/app/javascript/mastodon/locales/whitelist_la.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_la.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_lt.json b/app/javascript/mastodon/locales/whitelist_lt.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_lt.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_lv.json b/app/javascript/mastodon/locales/whitelist_lv.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_lv.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_mk.json b/app/javascript/mastodon/locales/whitelist_mk.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_mk.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ml.json b/app/javascript/mastodon/locales/whitelist_ml.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ml.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_mr.json b/app/javascript/mastodon/locales/whitelist_mr.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_mr.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ms.json b/app/javascript/mastodon/locales/whitelist_ms.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ms.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_my.json b/app/javascript/mastodon/locales/whitelist_my.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_my.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_nl.json b/app/javascript/mastodon/locales/whitelist_nl.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_nl.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_nn.json b/app/javascript/mastodon/locales/whitelist_nn.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_nn.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_no.json b/app/javascript/mastodon/locales/whitelist_no.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_no.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_oc.json b/app/javascript/mastodon/locales/whitelist_oc.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_oc.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_pa.json b/app/javascript/mastodon/locales/whitelist_pa.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_pa.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_pl.json b/app/javascript/mastodon/locales/whitelist_pl.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_pl.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_pt-BR.json b/app/javascript/mastodon/locales/whitelist_pt-BR.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_pt-BR.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_pt-PT.json b/app/javascript/mastodon/locales/whitelist_pt-PT.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_pt-PT.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ro.json b/app/javascript/mastodon/locales/whitelist_ro.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ro.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ru.json b/app/javascript/mastodon/locales/whitelist_ru.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ru.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sa.json b/app/javascript/mastodon/locales/whitelist_sa.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sa.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sc.json b/app/javascript/mastodon/locales/whitelist_sc.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sc.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sco.json b/app/javascript/mastodon/locales/whitelist_sco.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sco.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_si.json b/app/javascript/mastodon/locales/whitelist_si.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_si.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sk.json b/app/javascript/mastodon/locales/whitelist_sk.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sk.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sl.json b/app/javascript/mastodon/locales/whitelist_sl.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sl.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sq.json b/app/javascript/mastodon/locales/whitelist_sq.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sq.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sr-Latn.json b/app/javascript/mastodon/locales/whitelist_sr-Latn.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sr-Latn.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sr.json b/app/javascript/mastodon/locales/whitelist_sr.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sr.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_sv.json b/app/javascript/mastodon/locales/whitelist_sv.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_sv.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_szl.json b/app/javascript/mastodon/locales/whitelist_szl.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_szl.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ta.json b/app/javascript/mastodon/locales/whitelist_ta.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ta.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_tai.json b/app/javascript/mastodon/locales/whitelist_tai.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_tai.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_te.json b/app/javascript/mastodon/locales/whitelist_te.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_te.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_th.json b/app/javascript/mastodon/locales/whitelist_th.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_th.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_tr.json b/app/javascript/mastodon/locales/whitelist_tr.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_tr.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_tt.json b/app/javascript/mastodon/locales/whitelist_tt.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_tt.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ug.json b/app/javascript/mastodon/locales/whitelist_ug.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ug.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_uk.json b/app/javascript/mastodon/locales/whitelist_uk.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_uk.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_ur.json b/app/javascript/mastodon/locales/whitelist_ur.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_ur.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_uz.json b/app/javascript/mastodon/locales/whitelist_uz.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_uz.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_vi.json b/app/javascript/mastodon/locales/whitelist_vi.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_vi.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_zgh.json b/app/javascript/mastodon/locales/whitelist_zgh.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_zgh.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_zh-CN.json b/app/javascript/mastodon/locales/whitelist_zh-CN.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_zh-CN.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_zh-HK.json b/app/javascript/mastodon/locales/whitelist_zh-HK.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_zh-HK.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/locales/whitelist_zh-TW.json b/app/javascript/mastodon/locales/whitelist_zh-TW.json deleted file mode 100644 index 0d4f101c7a..0000000000 --- a/app/javascript/mastodon/locales/whitelist_zh-TW.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/app/javascript/mastodon/polyfills/base_polyfills.ts b/app/javascript/mastodon/polyfills/base_polyfills.ts index e008d8f025..3cde1b1ede 100644 --- a/app/javascript/mastodon/polyfills/base_polyfills.ts +++ b/app/javascript/mastodon/polyfills/base_polyfills.ts @@ -1,5 +1,3 @@ -import 'intl'; -import 'intl/locale-data/jsonp/en'; import 'core-js/features/object/assign'; import 'core-js/features/object/values'; import 'core-js/features/symbol'; diff --git a/app/javascript/mastodon/polyfills/index.ts b/app/javascript/mastodon/polyfills/index.ts index 6d2e5426e4..b2dbfdac0a 100644 --- a/app/javascript/mastodon/polyfills/index.ts +++ b/app/javascript/mastodon/polyfills/index.ts @@ -2,6 +2,8 @@ // If there are no polyfills, then this is just Promise.resolve() which means // it will execute in the same tick of the event loop (i.e. near-instant). +import { loadIntlPolyfills } from './intl'; + function importBasePolyfills() { return import(/* webpackChunkName: "base_polyfills" */ './base_polyfills'); } @@ -13,7 +15,6 @@ function importExtraPolyfills() { export function loadPolyfills() { const needsBasePolyfills = !( 'toBlob' in HTMLCanvasElement.prototype && - 'Intl' in window && 'assign' in Object && 'values' in Object && 'Symbol' in window && @@ -32,6 +33,7 @@ export function loadPolyfills() { ); return Promise.all([ + loadIntlPolyfills(), needsBasePolyfills && importBasePolyfills(), needsExtraPolyfills && importExtraPolyfills(), ]); diff --git a/app/javascript/mastodon/polyfills/intl.ts b/app/javascript/mastodon/polyfills/intl.ts new file mode 100644 index 0000000000..4d5ee3ccf9 --- /dev/null +++ b/app/javascript/mastodon/polyfills/intl.ts @@ -0,0 +1,105 @@ +// import { shouldPolyfill as shouldPolyfillCanonicalLocales } from '@formatjs/intl-getcanonicallocales/should-polyfill'; +// import { shouldPolyfill as shouldPolyfillLocale } from '@formatjs/intl-locale/should-polyfill'; +import { shouldPolyfill as shoudPolyfillPluralRules } from '@formatjs/intl-pluralrules/should-polyfill'; +// import { shouldPolyfill as shouldPolyfillNumberFormat } from '@formatjs/intl-numberformat/should-polyfill'; +// import { shouldPolyfill as shouldPolyfillIntlDateTimeFormat } from '@formatjs/intl-datetimeformat/should-polyfill'; +// import { shouldPolyfill as shouldPolyfillIntlRelativeTimeFormat } from '@formatjs/intl-relativetimeformat/should-polyfill'; + +// async function loadGetCanonicalLocalesPolyfill() { +// // This platform already supports Intl.getCanonicalLocales +// if (shouldPolyfillCanonicalLocales()) { +// await import('@formatjs/intl-getcanonicallocales/polyfill'); +// } +// } + +// async function loadLocalePolyfill() { +// // This platform already supports Intl.Locale +// if (shouldPolyfillLocale()) { +// await import('@formatjs/intl-locale/polyfill'); +// } +// } + +// async function loadIntlNumberFormatPolyfill(locale: string) { +// const unsupportedLocale = shouldPolyfillNumberFormat(locale); +// // This locale is supported +// if (!unsupportedLocale) { +// return; +// } +// // Load the polyfill 1st BEFORE loading data +// await import('@formatjs/intl-numberformat/polyfill-force'); +// await import(`@formatjs/intl-numberformat/locale-data/${unsupportedLocale}`); +// } + +// async function loadIntlDateTimeFormatPolyfill(locale: string) { +// const unsupportedLocale = shouldPolyfillIntlDateTimeFormat(locale); +// // This locale is supported +// if (!unsupportedLocale) { +// return; +// } +// // Load the polyfill 1st BEFORE loading data +// await import('@formatjs/intl-datetimeformat/polyfill-force'); + +// // Parallelize CLDR data loading +// const dataPolyfills = [ +// import('@formatjs/intl-datetimeformat/add-all-tz'), +// import(`@formatjs/intl-datetimeformat/locale-data/${unsupportedLocale}`), +// ]; +// await Promise.all(dataPolyfills); +// } + +async function loadIntlPluralRulesPolyfills(locale: string) { + const unsupportedLocale = shoudPolyfillPluralRules(locale); + // This locale is supported + if (!unsupportedLocale) { + return; + } + // Load the polyfill 1st BEFORE loading data + await import( + /* webpackChunkName: "i18n-pluralrules-polyfill" */ '@formatjs/intl-pluralrules/polyfill-force' + ); + await import( + /* webpackChunkName: "i18n-pluralrules-polyfill-[request]" */ `@formatjs/intl-pluralrules/locale-data/${unsupportedLocale}` + ); +} + +// async function loadIntlRelativeTimeFormatPolyfill(locale: string) { +// const unsupportedLocale = shouldPolyfillIntlRelativeTimeFormat(locale); +// // This locale is supported +// if (!unsupportedLocale) { +// return; +// } +// // Load the polyfill 1st BEFORE loading data +// await import( +// /* webpackChunkName: "i18n-relativetimeformat-polyfill" */ +// '@formatjs/intl-relativetimeformat/polyfill-force' +// ); +// await import( +// /* webpackChunkName: "i18n-relativetimeformat-polyfill-[request]" */ +// `@formatjs/intl-relativetimeformat/locale-data/${unsupportedLocale}` +// ); +// } + +export async function loadIntlPolyfills() { + const locale = document.querySelector('html')?.lang || 'en'; + + // order is important here + + // Supported in IE11 and most other browsers, not useful + // await loadGetCanonicalLocalesPolyfill() + + // Supported in IE11 and most other browsers, not useful + // await loadLocalePolyfill() + + // Supported in IE11 and most other browsers, not useful + // await loadIntlNumberFormatPolyfill(locale) + + // Supported in IE11 and most other browsers, not useful + // await loadIntlDateTimeFormatPolyfill(locale) + + // Supported from Safari 13+, may still be useful + await loadIntlPluralRulesPolyfills(locale); + + // This is not used yet in the codebase yet + // Supported from Safari 14+ + // await loadIntlRelativeTimeFormatPolyfill(locale); +} diff --git a/app/javascript/mastodon/service_worker/web_push_locales.js b/app/javascript/mastodon/service_worker/web_push_locales.js index 3912f75c7d..89ae20007b 100644 --- a/app/javascript/mastodon/service_worker/web_push_locales.js +++ b/app/javascript/mastodon/service_worker/web_push_locales.js @@ -10,7 +10,7 @@ const filtered = {}; const filenames = fs.readdirSync(path.resolve(__dirname, '../locales')); filenames.forEach(filename => { - if (!filename.match(/\.json$/) || filename.match(/defaultMessages|whitelist/)) return; + if (!filename.match(/\.json$/)) return; const content = fs.readFileSync(path.resolve(__dirname, `../locales/${filename}`), 'utf-8'); const full = JSON.parse(content); diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js index 54247e6f66..77187a59ed 100644 --- a/app/javascript/mastodon/service_worker/web_push_notifications.js +++ b/app/javascript/mastodon/service_worker/web_push_notifications.js @@ -1,4 +1,4 @@ -import IntlMessageFormat from 'intl-messageformat'; +import { IntlMessageFormat } from 'intl-messageformat'; import { unescape } from 'lodash'; diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 29fd5cde9b..01ab8f8f4b 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,10 +1,11 @@ import './public-path'; import { start } from '../mastodon/common'; +import { loadLocale } from '../mastodon/load_locale'; import { loadPolyfills } from '../mastodon/polyfills'; start(); -loadPolyfills().then(async () => { +loadPolyfills().then(loadLocale).then(async () => { const { default: main } = await import('mastodon/main'); return main(); diff --git a/app/javascript/packs/public.jsx b/app/javascript/packs/public.jsx index 7f42e57d97..7e86a21b85 100644 --- a/app/javascript/packs/public.jsx +++ b/app/javascript/packs/public.jsx @@ -2,7 +2,7 @@ import './public-path'; import { createRoot } from 'react-dom/client'; -import * as IntlMessageFormat from 'intl-messageformat'; +import { IntlMessageFormat } from 'intl-messageformat'; import { defineMessages } from 'react-intl'; import { delegate } from '@rails/ujs'; @@ -14,6 +14,7 @@ import { start } from '../mastodon/common'; import { timeAgoString } from '../mastodon/components/relative_timestamp'; import emojify from '../mastodon/features/emoji/emoji'; import loadKeyboardExtensions from '../mastodon/load_keyboard_extensions'; +import { loadLocale } from '../mastodon/load_locale'; import { getLocale } from '../mastodon/locales'; import { loadPolyfills } from '../mastodon/polyfills'; import ready from '../mastodon/ready'; @@ -29,7 +30,7 @@ const messages = defineMessages({ }); function loaded() { - const { localeData } = getLocale(); + const { messages: localeData } = getLocale(); const scrollToDetailedStatus = () => { const history = createBrowserHistory(); @@ -249,6 +250,7 @@ function main() { } loadPolyfills() + .then(loadLocale) .then(main) .then(loadKeyboardExtensions) .catch(error => { diff --git a/app/javascript/packs/share.jsx b/app/javascript/packs/share.jsx index 0f3b84549d..f9fc785618 100644 --- a/app/javascript/packs/share.jsx +++ b/app/javascript/packs/share.jsx @@ -3,6 +3,7 @@ import { createRoot } from 'react-dom/client'; import { start } from '../mastodon/common'; import ComposeContainer from '../mastodon/containers/compose_container'; +import { loadLocale } from '../mastodon/load_locale'; import { loadPolyfills } from '../mastodon/polyfills'; import ready from '../mastodon/ready'; @@ -25,6 +26,6 @@ function main() { ready(loaded); } -loadPolyfills().then(main).catch(error => { +loadPolyfills().then(loadLocale).then(main).catch(error => { console.error(error); }); diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 7eda8f5a09..af5dc799ba 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -29,9 +29,9 @@ = javascript_pack_tag "locales", crossorigin: 'anonymous' - if @theme - if @theme[:supported_locales].include? I18n.locale.to_s - = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", crossorigin: 'anonymous' + = preload_pack_asset "locales/#{@theme[:flavour]}/#{I18n.locale}-json.js" - elsif @theme[:supported_locales].include? 'en' - = javascript_pack_tag "locales/#{@theme[:flavour]}/en", crossorigin: 'anonymous' + = preload_pack_asset "locales/#{@theme[:flavour]}/en-json.js" = csrf_meta_tags unless skip_csrf_meta_tags? %meta{ name: 'style-nonce', content: request.content_security_policy_nonce } diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index 210ac101dc..a5f9514b48 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -15,9 +15,9 @@ = javascript_pack_tag 'locales', crossorigin: 'anonymous' - if @theme - if @theme[:supported_locales].include? I18n.locale.to_s - = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", crossorigin: 'anonymous' + = preload_pack_asset "locales/#{@theme[:flavour]}/#{I18n.locale}-json.js" - elsif @theme[:supported_locales].include? 'en' - = javascript_pack_tag "locales/#{@theme[:flavour]}/en", crossorigin: 'anonymous' + = preload_pack_asset "locales/#{@theme[:flavour]}/en-json.js" = render partial: 'layouts/theme', object: @core = render partial: 'layouts/theme', object: @theme diff --git a/app/views/media/player.html.haml b/app/views/media/player.html.haml index c907d5c60a..6fc238c720 100644 --- a/app/views/media/player.html.haml +++ b/app/views/media/player.html.haml @@ -3,9 +3,9 @@ = javascript_pack_tag 'locales', crossorigin: 'anonymous' - if @theme - if @theme[:supported_locales].include? I18n.locale.to_s - = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", crossorigin: 'anonymous' + = preload_pack_asset "locales/#{@theme[:flavour]}/#{I18n.locale}-json.js" - elsif @theme[:supported_locales].include? 'en' - = javascript_pack_tag "locales/#{@theme[:flavour]}/en", crossorigin: 'anonymous' + = preload_pack_asset "locales/#{@theme[:flavour]}/en-json.js" = render partial: 'layouts/theme', object: @core = render partial: 'layouts/theme', object: @theme diff --git a/babel.config.js b/babel.config.js index 986d605495..0eb877cc32 100644 --- a/babel.config.js +++ b/babel.config.js @@ -22,7 +22,7 @@ module.exports = (api) => { ['@babel/env', envOptions], ], plugins: [ - ['react-intl', { messagesDir: './build/messages' }], + ['formatjs'], 'preval', '@babel/plugin-transform-optional-chaining', '@babel/plugin-transform-nullish-coalescing-operator', diff --git a/config/formatjs-formatter.js b/config/formatjs-formatter.js new file mode 100644 index 0000000000..9be5dd7e26 --- /dev/null +++ b/config/formatjs-formatter.js @@ -0,0 +1,14 @@ +const path = require('path'); + +const upstreamTranslations = require(path.join(__dirname, "../app/javascript/mastodon/locales/en.json")); +const currentTranslations = require(path.join(__dirname, "../app/javascript/flavours/glitch/locales/en.json")); + +exports.format = (msgs) => { + const results = {}; + for (const [id, msg] of Object.entries(msgs)) { + if (!upstreamTranslations[id]) { + results[id] = currentTranslations[id] || msg.defaultMessage; + } + } + return results; +}; diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js deleted file mode 100644 index 2fd71a295d..0000000000 --- a/config/webpack/generateLocalePacks.js +++ /dev/null @@ -1,76 +0,0 @@ -// A message from upstream: -// ======================== -// To avoid adding a lot of boilerplate, locale packs are -// automatically generated here. These are written into the tmp/ -// directory and then used to generate locale_en.js, locale_fr.js, etc. - -// Glitch note: -// ============ -// This code has been entirely rewritten to support glitch flavours. -// However, the underlying process is exactly the same. - -const { existsSync, readdirSync, writeFileSync } = require('fs'); -const { join, resolve } = require('path'); - -const { mkdirp } = require('mkdirp'); -const rimraf = require('rimraf'); - -const { flavours } = require('./configuration'); - -module.exports = Object.keys(flavours).reduce(function (map, entry) { - const flavour = flavours[entry]; - if (!flavour.locales) { - return map; - } - const locales = readdirSync(flavour.locales).filter(filename => { - return /\.json$/.test(filename) && - !/defaultMessages/.test(filename) && - !/whitelist/.test(filename); - }).map(filename => filename.replace(/\.json$/, '')); - - let inherited_locales_path = null; - if (flavour.inherit_locales && flavours[flavour.inherit_locales]?.locales) { - inherited_locales_path = flavours[flavour.inherit_locales]?.locales; - } - - const outPath = resolve('tmp', 'locales', entry); - - rimraf.sync(outPath); - mkdirp.sync(outPath); - - locales.forEach(function (locale) { - const localePath = join(outPath, `${locale}.js`); - const baseLocale = locale.split('-')[0]; // e.g. 'zh-TW' -> 'zh' - const localeDataPath = [ - // first try react-intl - `node_modules/react-intl/locale-data/${baseLocale}.js`, - // then check locales/locale-data - `app/javascript/mastodon/locales/locale-data/${baseLocale}.js`, - // fall back to English (this is what react-intl does anyway) - 'node_modules/react-intl/locale-data/en.js', - ].filter( - filename => existsSync(filename), - ).map( - filename => filename.replace(/(?:node_modules|app\/javascript)\//, ''), - )[0]; - const localeContent = `// -// locales/${entry}/${locale}.js -// automatically generated by generateLocalePacks.js -// - -${inherited_locales_path ? `import inherited from '../../../${inherited_locales_path}/${locale}.json';` : ''} -import messages from '../../../${flavour.locales}/${locale}.json'; -import localeData from '${localeDataPath}'; -import { setLocale } from 'locales'; - -setLocale({ - localeData, - ${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'}, -}); -`; - writeFileSync(localePath, localeContent, 'utf8'); - map[`locales/${entry}/${locale}`] = localePath; - }); - - return map; -}, {}); diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 469ba42f9c..1f330cb663 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -7,7 +7,6 @@ const webpack = require('webpack'); const AssetsManifestPlugin = require('webpack-assets-manifest'); const { env, settings, core, flavours, output } = require('./configuration'); -const localePacks = require('./generateLocalePacks'); const rules = require('./rules'); function reducePacks (data, into = {}) { @@ -49,7 +48,6 @@ function reducePacks (data, into = {}) { const entries = Object.assign( { locales: resolve('app', 'javascript', 'locales') }, - localePacks, reducePacks(core), Object.values(flavours).reduce((map, data) => reducePacks(data, map), {}), ); diff --git a/config/webpack/translationRunner.js b/config/webpack/translationRunner.js index efc39fc658..77534c9de3 100644 --- a/config/webpack/translationRunner.js +++ b/config/webpack/translationRunner.js @@ -1,124 +1,3 @@ -const fs = require('fs'); -const path = require('path'); +console.error("The localisation functionality has been refactored, please see the Localisation section in the development documentation (https://docs.joinmastodon.org/dev/code/#localizations)"); -// eslint-disable-next-line import/order -const { default: manageTranslations, readMessageFiles } = require('react-intl-translations-manager'); - -const RFC5646_REGEXP = /^[a-z]{2,3}(?:-(?:x|[A-Za-z]{2,4}))*$/; - -const rootDirectory = path.resolve(__dirname, '..', '..'); -const externalDefaultMessages = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales', 'defaultMessages.json'); -const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'flavours', 'glitch', 'locales'); -const messagesDirectory = path.resolve(rootDirectory, 'build', 'messages'); -const availableLanguages = fs.readdirSync(translationsDirectory).reduce((languages, filename) => { - const basename = path.basename(filename, '.json'); - if (RFC5646_REGEXP.test(basename)) { - languages.push(basename); - } - return languages; -}, []); - -const testRFC5646 = language => { - if (!RFC5646_REGEXP.test(language)) { - throw new Error('Not RFC5646 name'); - } -}; - -const testAvailability = language => { - if (!availableLanguages.includes(language)) { - throw new Error('Not an available language'); - } -}; - -const validateLanguages = (languages, validators) => { - const invalidLanguages = languages.reduce((acc, language) => { - try { - validators.forEach(validator => validator(language)); - } catch (error) { - acc.push({ language, error }); - } - return acc; - }, []); - - if (invalidLanguages.length > 0) { - console.error(` -Error: Specified invalid LANGUAGES: -${invalidLanguages.map(({ language, error }) => `* ${language}: ${error.message}`).join('\n')} - -Use yarn "manage:translations -- --help" for usage information -`); - process.exit(1); - } -}; - -const usage = `Usage: yarn manage:translations [OPTIONS] [LANGUAGES] - -Manage JavaScript translation files in Mastodon. Generates and update translations in translationsDirectory: ${translationsDirectory} - -LANGUAGES -The RFC5646 language tag for the language you want to test or fix. If you want to input multiple languages, separate them with space. - -Available languages: -${availableLanguages.join(', ')} -`; - -const { argv } = require('yargs') - .usage(usage) - .option('f', { - alias: 'force', - default: false, - describe: 'force using the provided languages. create files if not exists.', - type: 'boolean', - }); - -// check if message directory exists -if (!fs.existsSync(messagesDirectory)) { - console.error(` -Error: messagesDirectory not exists -(${messagesDirectory}) -Try to run "yarn build:development" first`); - process.exit(1); -} - -// determine the languages list -const languages = (argv._.length > 0) ? argv._ : availableLanguages; - -// validate languages -validateLanguages(languages, [ - testRFC5646, - !argv.force && testAvailability, -].filter(Boolean)); - -// Override `provideExtractedMessages` to ignore translation strings provided upstream already -const provideExtractedMessages = () => { - const extractedMessages = readMessageFiles(messagesDirectory); - const originalExtractedMessages = JSON.parse(fs.readFileSync(externalDefaultMessages, 'utf8')); - const originalKeys = new Set(); - - originalExtractedMessages.forEach(file => { - file.descriptors.forEach(descriptor => { - originalKeys.add(descriptor.id); - }); - }); - - extractedMessages.forEach(file => { - file.descriptors = file.descriptors.filter((descriptor) => !originalKeys.has(descriptor.id)); - }); - - return extractedMessages.filter((file) => file.descriptors.length > 0); -}; - -// manage translations -manageTranslations({ - messagesDirectory, - translationsDirectory, - detectDuplicateIds: false, - singleMessagesFile: true, - languages, - jsonOptions: { - trailingNewline: true, - }, - overrideCoreMethods: { - provideExtractedMessages, - }, -}); +process.exit(1); diff --git a/package.json b/package.json index 0e78ceeee4..fad2a113a7 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", "manage:translations": "node ./config/webpack/translationRunner.js", + "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' '--ignore=**/*.d.ts' --out-file app/javascript/flavours/glitch/locales/en.json --format config/formatjs-formatter.js", "start": "node ./streaming/index.js", "test": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:typecheck && ${npm_execpath} run test:jest", "test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass", @@ -34,6 +35,7 @@ "@babel/preset-react": "^7.22.3", "@babel/preset-typescript": "^7.21.5", "@babel/runtime": "^7.22.3", + "@formatjs/intl-pluralrules": "^5.2.2", "@gamestdio/websocket": "^0.3.2", "@github/webauthn-json": "^2.1.1", "@rails/ujs": "^6.1.7", @@ -44,9 +46,9 @@ "autoprefixer": "^10.4.14", "axios": "^1.4.0", "babel-loader": "^8.3.0", + "babel-plugin-formatjs": "^10.5.1", "babel-plugin-lodash": "^3.3.4", "babel-plugin-preval": "^5.1.0", - "babel-plugin-react-intl": "^6.2.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "blurhash": "^2.0.5", "classnames": "^2.3.2", @@ -72,9 +74,7 @@ "http-link-header": "^1.1.1", "immutable": "^4.3.0", "imports-loader": "^1.2.0", - "intl": "^1.2.5", - "intl-messageformat": "^2.2.0", - "intl-relativeformat": "^6.4.3", + "intl-messageformat": "^10.3.5", "js-yaml": "^4.1.0", "jsdom": "^22.1.0", "lodash": "^4.17.21", @@ -96,7 +96,7 @@ "react-hotkeys": "^1.1.4", "react-immutable-proptypes": "^2.2.0", "react-immutable-pure-component": "^2.2.2", - "react-intl": "^2.9.0", + "react-intl": "^6.4.2", "react-motion": "^0.5.2", "react-notification": "^6.8.5", "react-overlays": "^5.2.1", @@ -142,6 +142,7 @@ "ws": "^8.12.1" }, "devDependencies": { + "@formatjs/cli": "^6.1.1", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "@types/babel__core": "^7.20.1", @@ -162,7 +163,6 @@ "@types/react-dom": "^18.2.4", "@types/react-helmet": "^6.1.6", "@types/react-immutable-proptypes": "^2.1.0", - "@types/react-intl": "2.3.18", "@types/react-motion": "^0.0.34", "@types/react-overlays": "^3.1.0", "@types/react-router-dom": "^5.3.3", @@ -196,7 +196,6 @@ "jest-environment-jsdom": "^29.5.0", "lint-staged": "^13.2.2", "prettier": "^2.8.8", - "react-intl-translations-manager": "^5.0.3", "react-test-renderer": "^18.2.0", "stylelint": "^15.6.2", "stylelint-config-standard-scss": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index 44a1ec91de..959fa8bd64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,7 +24,7 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== @@ -36,7 +36,28 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== -"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.1", "@babel/core@^7.7.2": +"@babel/core@^7.10.4", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/core@^7.22.1": version "7.22.1" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== @@ -57,7 +78,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": +"@babel/generator@^7.21.5", "@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": version "7.22.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== @@ -90,7 +111,7 @@ "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/types" "^7.19.0" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.1": version "7.22.1" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== @@ -164,7 +185,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-environment-visitor@^7.22.1": +"@babel/helper-environment-visitor@^7.21.5", "@babel/helper-environment-visitor@^7.22.1": version "7.22.1" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== @@ -333,7 +354,7 @@ "@babel/traverse" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/helpers@^7.22.0": +"@babel/helpers@^7.21.5", "@babel/helpers@^7.22.0": version "7.22.3" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== @@ -351,7 +372,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== @@ -460,7 +481,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.21.4", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@7", "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.21.4", "@babel/plugin-syntax-jsx@^7.7.2": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== @@ -1135,7 +1156,16 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/template@^7.21.9": version "7.21.9" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== @@ -1144,7 +1174,23 @@ "@babel/parser" "^7.21.9" "@babel/types" "^7.21.5" -"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.7", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": +"@babel/traverse@7": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== @@ -1160,7 +1206,16 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.12.11", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== + dependencies: + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4": version "7.22.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== @@ -1335,6 +1390,11 @@ dependencies: "@floating-ui/core" "^1.0.1" +"@formatjs/cli@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.1.1.tgz#089d6d25fe96490f8d1401a53705b3cdfefd7afb" + integrity sha512-prUblUQRJwFQqfmBtRWXZFKX+QmhXQkBKRl54hWTCwenskorK6+LTlm9TFbUDhfib2Xt3iDsjk7o9LpeU/AQCw== + "@formatjs/ecma402-abstract@1.15.0": version "1.15.0" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.15.0.tgz#0a285a5dc69889e15d53803bd5036272e23e5a18" @@ -1343,6 +1403,13 @@ "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" +"@formatjs/fast-memoize@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" + integrity sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA== + dependencies: + tslib "^2.4.0" + "@formatjs/icu-messageformat-parser@2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.4.0.tgz#e165f3594c68416ce15f63793768251de2a85f88" @@ -1360,6 +1427,24 @@ "@formatjs/ecma402-abstract" "1.15.0" tslib "^2.4.0" +"@formatjs/intl-displaynames@6.3.2": + version "6.3.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.3.2.tgz#be169393a132eed9ca9c10ccb9d22ab150e24c90" + integrity sha512-kBOh0O7QYKLUqaZujLSEF2+au017plPp63R6Hrokl+oDtLyTt9y9pEuCTbOKh/P8CC9THnDLKRKgeVWZw5Ek8A== + dependencies: + "@formatjs/ecma402-abstract" "1.15.0" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + +"@formatjs/intl-listformat@7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.2.2.tgz#d787932b5d6f1f936c73c5fec531692ab7069c7a" + integrity sha512-YIruRGwUrmgVOXjWi6VbwPcRNBkEfgK2DFjyyqopCmpfJ+39vnl46oLpVchErnuXs6kkARy5GcGaGV7xRsH4lw== + dependencies: + "@formatjs/ecma402-abstract" "1.15.0" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + "@formatjs/intl-localematcher@0.2.32": version "0.2.32" resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz#00d4d307cd7d514b298e15a11a369b86c8933ec1" @@ -1367,17 +1452,27 @@ dependencies: tslib "^2.4.0" -"@formatjs/intl-unified-numberformat@^3.3.3": - version "3.3.6" - resolved "https://registry.yarnpkg.com/@formatjs/intl-unified-numberformat/-/intl-unified-numberformat-3.3.6.tgz#ab69818f7568894023cb31fdb5b5c7eed62c6537" - integrity sha512-VQYswh9Pxf4kN6FQvKprAQwSJrF93eJstCDPM1HIt3c3O6NqPFWNWhZ91PLTppOV11rLYsFK11ZxiGbnLNiPTg== +"@formatjs/intl-pluralrules@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-5.2.2.tgz#6322d20a6d0172459e4faf4b0f06603c931673aa" + integrity sha512-mEbnbRzsSCIYqaBmrmUlOsPu5MG6KfMcnzekPzUrUucX2dNiI1KWBGHK6IoXl5c8zx60L1NXJ6cSQ7akoc15SQ== dependencies: - "@formatjs/intl-utils" "^2.2.5" + "@formatjs/ecma402-abstract" "1.15.0" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" -"@formatjs/intl-utils@^2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.2.5.tgz#eaafd94df3d102ee13e54e80f992a33868a6b1e8" - integrity sha512-p7gcmazKROteL4IECCp03Qrs790fZ8tbemUAjQu0+K0AaAlK49rI1SIFFq3LzDUAqXIshV95JJhRe/yXxkal5g== +"@formatjs/intl@2.7.2": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.7.2.tgz#83dc77080a984d4883195bed39eedd947ebfd3d7" + integrity sha512-ziiQfnXwY0/rXhtohSAmYMqDjRsihoMKdl8H2aA+FvxG9638E0XrvfBFCb+1HhimNiuqRz5fTY7F/bZtsJxsjA== + dependencies: + "@formatjs/ecma402-abstract" "1.15.0" + "@formatjs/fast-memoize" "2.0.1" + "@formatjs/icu-messageformat-parser" "2.4.0" + "@formatjs/intl-displaynames" "6.3.2" + "@formatjs/intl-listformat" "7.2.2" + intl-messageformat "10.3.5" + tslib "^2.4.0" "@formatjs/ts-transformer@3.13.1": version "3.13.1" @@ -1933,7 +2028,29 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== -"@types/babel__core@^7.1.12", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.3", "@types/babel__core@^7.20.1": +"@types/babel__core@*", "@types/babel__core@^7.1.7": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__core@^7.1.12", "@types/babel__core@^7.1.14": + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__core@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== @@ -1951,6 +2068,13 @@ dependencies: "@babel/types" "^7.0.0" +"@types/babel__helper-plugin-utils@^7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@types/babel__helper-plugin-utils/-/babel__helper-plugin-utils-7.10.0.tgz#dcd2416f9c189d5837ab2a276368cf67134efe78" + integrity sha512-60YtHzhQ9HAkToHVV+TB4VLzBn9lrfgrsOjiJMtbv/c1jPdekBxaByd6DMsGBzROXWoIL6U3lEFvvbu69RkUoA== + dependencies: + "@types/babel__core" "*" + "@types/babel__template@*": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" @@ -1966,6 +2090,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/babel__traverse@^7.1.7": + version "7.18.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" + integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== + dependencies: + "@babel/types" "^7.3.0" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -2253,11 +2384,6 @@ "@types/prop-types" "*" immutable "^3.8.2" -"@types/react-intl@2.3.18": - version "2.3.18" - resolved "https://registry.yarnpkg.com/@types/react-intl/-/react-intl-2.3.18.tgz#fd2d8b7f4d0a1dd05b5f1784ab0d7fe1786a690d" - integrity sha512-DVNJs49zUxKRZng8VuILE886Yihdsf3yLr5vHk9zJrmF8SyRSK3sxNSvikAKxNkv9hX55XBTJShz6CkJnbNjgg== - "@types/react-motion@^0.0.34": version "0.0.34" resolved "https://registry.yarnpkg.com/@types/react-motion/-/react-motion-0.0.34.tgz#789ff2063e2f7fbb6085d291135c442e8b35291a" @@ -2338,7 +2464,16 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.0.26", "@types/react@^18.2.7": +"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.0.26": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" + integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^18.2.7": version "18.2.7" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.7.tgz#dfb4518042a3117a045b8c222316f83414a783b3" integrity sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw== @@ -2372,11 +2507,6 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== -"@types/schema-utils@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/schema-utils/-/schema-utils-1.0.0.tgz#295d36f01e2cb8bc3207ca1d9a68e210db6b40cb" - integrity sha512-YesPanU1+WCigC/Aj1Mga8UCOjHIfMNHZ3zzDsUY7lI8GlKnh/Kv2QwJOQ+jNQ36Ru7IfzSedlG14hppYaN13A== - "@types/semver@^7.3.12": version "7.3.13" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" @@ -3219,6 +3349,23 @@ babel-loader@^8.3.0: make-dir "^3.1.0" schema-utils "^2.6.5" +babel-plugin-formatjs@^10.5.1: + version "10.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-formatjs/-/babel-plugin-formatjs-10.5.1.tgz#9baeccb590538fb1915ef85fb7dfd13aedd8b1fa" + integrity sha512-IkwrKjl2Zg6br2wuayPIsaPF92RzGgh5WdQj+A/9zokpYeIF7sscZGwwHmeTSoPnIAAENvjRMm/escMQkp+eKg== + dependencies: + "@babel/core" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "7" + "@babel/traverse" "7" + "@babel/types" "^7.12.11" + "@formatjs/icu-messageformat-parser" "2.4.0" + "@formatjs/ts-transformer" "3.13.1" + "@types/babel__core" "^7.1.7" + "@types/babel__helper-plugin-utils" "^7.10.0" + "@types/babel__traverse" "^7.1.7" + tslib "^2.4.0" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3303,19 +3450,6 @@ babel-plugin-preval@^5.1.0: babel-plugin-macros "^3.0.1" require-from-string "^2.0.2" -babel-plugin-react-intl@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-6.2.0.tgz#ac51ca757f318938792fc91e1747515e9225386a" - integrity sha512-ajGpa14mLzyDgdOS75DRlQ0aEL+q7iSCB77613YUPOZbxnAvfB0wg+gLngbd/43eKRw7a4y+IzO3P8kDHl40nA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/helper-plugin-utils" "^7.0.0" - "@types/babel__core" "^7.1.3" - "@types/schema-utils" "^1.0.0" - fs-extra "^8.1.0" - intl-messageformat-parser "^4.1.1" - schema-utils "^2.2.0" - babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" @@ -3756,7 +3890,7 @@ chalk@5.2.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== -chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -5756,15 +5890,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -5936,7 +6061,7 @@ glob@^10.2.5, glob@^10.2.6: minipass "^5.0.0 || ^6.0.2" path-scurry "^1.7.0" -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -6521,48 +6646,17 @@ intersection-observer@^0.12.0: resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== -intl-format-cache@^2.0.5: - version "2.2.9" - resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.2.9.tgz#fb560de20c549cda20b569cf1ffb6dc62b5b93b4" - integrity sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ== - -intl-messageformat-parser@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" - integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= - -intl-messageformat-parser@^4.1.1: - version "4.1.4" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-4.1.4.tgz#98f3415e6990d44bebf2e0ad8e4cfbacf3ef5ed3" - integrity sha512-zV4kBUD1yhxSyaXm6bGhmP4HFH9Gh4pRQwNn+xq5P+B1dT8mpaAfU75nfUn4HgddIB6pyFnzM5MQjO55UpJwkQ== +intl-messageformat@10.3.5, intl-messageformat@^10.3.5: + version "10.3.5" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.5.tgz#f55684fc663e62616ad59d3a504ea0cac3f267b7" + integrity sha512-6kPkftF8Jg3XJCkGKa5OD+nYQ+qcSxF4ZkuDdXZ6KGG0VXn+iblJqRFyDdm9VvKcMyC0Km2+JlVQffFM52D0YA== dependencies: - "@formatjs/intl-unified-numberformat" "^3.3.3" + "@formatjs/ecma402-abstract" "1.15.0" + "@formatjs/fast-memoize" "2.0.1" + "@formatjs/icu-messageformat-parser" "2.4.0" + tslib "^2.4.0" -intl-messageformat@^2.0.0, intl-messageformat@^2.1.0, intl-messageformat@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz#345bcd46de630b7683330c2e52177ff5eab484fc" - integrity sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw= - dependencies: - intl-messageformat-parser "1.4.0" - -intl-relativeformat@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz#6aca95d019ec8d30b6c5653b6629f9983ea5b6c5" - integrity sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw== - dependencies: - intl-messageformat "^2.0.0" - -intl-relativeformat@^6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-6.4.3.tgz#cb5559e1e257cc2e763583502012a354bb777efe" - integrity sha512-VxZXZfhuX/zBVfxzE/J6kPUpsyWKYjqtZ3jVGZwr6wzK5BOLVpe1vSlwCQX56w5UjlpL63fS8Nxq0kgTyf1gJA== - -intl@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde" - integrity sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94= - -invariant@^2.1.1, invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -7618,13 +7712,6 @@ json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -9602,26 +9689,21 @@ react-immutable-pure-component@^2.2.2: resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz#3014d3e20cd5a7a4db73b81f1f1464f4d351684b" integrity sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A== -react-intl-translations-manager@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/react-intl-translations-manager/-/react-intl-translations-manager-5.0.3.tgz#aee010ecf35975673e033ca5d7d3f4147894324d" - integrity sha512-EfBeugnOGFcdUbQyY9TqBMbuauQ8wm73ZqFr0UqCljhbXl7YDHQcVzclWFRkVmlUffzxitLQFhAZEVVeRNQSwA== +react-intl@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.4.2.tgz#cf4f49f5f89e66e0975927783d0d270e708314fd" + integrity sha512-q8QyLZfbyqV3Ifa7vtjRrgfSQPGTR6Fi+u9tP/CuzhUPl9DJEPIrvUFhlBryKtRW2qNASqchaP/79Obip+h6oA== dependencies: - chalk "^2.3.2" - glob "^7.1.2" - json-stable-stringify "^1.0.1" - mkdirp "^0.5.1" - -react-intl@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-2.9.0.tgz#c97c5d17d4718f1575fdbd5a769f96018a3b1843" - integrity sha512-27jnDlb/d2A7mSJwrbOBnUgD+rPep+abmoJE511Tf8BnoONIAUehy/U1zZCHGO17mnOwMWxqN4qC0nW11cD6rA== - dependencies: - hoist-non-react-statics "^3.3.0" - intl-format-cache "^2.0.5" - intl-messageformat "^2.1.0" - intl-relativeformat "^2.1.0" - invariant "^2.1.1" + "@formatjs/ecma402-abstract" "1.15.0" + "@formatjs/icu-messageformat-parser" "2.4.0" + "@formatjs/intl" "2.7.2" + "@formatjs/intl-displaynames" "6.3.2" + "@formatjs/intl-listformat" "7.2.2" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/react" "16 || 17 || 18" + hoist-non-react-statics "^3.3.2" + intl-messageformat "10.3.5" + tslib "^2.4.0" "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.2.0: version "18.2.0" @@ -10333,7 +10415,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.2.0, schema-utils@^2.6.5: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -11659,11 +11741,6 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"