i18n: handle plurals

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
environments/review-i18n-tgt8u8/deployments/2422
marcin mikołajczak 2 years ago
parent f61b2bb96c
commit 88e2c011a1

@ -86,7 +86,7 @@ const COMPOSE_SET_STATUS = 'COMPOSE_SET_STATUS';
const messages = defineMessages({
exceededImageSizeLimit: { id: 'upload_error.image_size_limit', defaultMessage: 'Image exceeds the current file size limit ({limit})' },
exceededVideoSizeLimit: { id: 'upload_error.video_size_limit', defaultMessage: 'Video exceeds the current file size limit ({limit})' },
exceededVideoDurationLimit: { id: 'upload_error.video_duration_limit', defaultMessage: 'Video exceeds the current duration limit ({limit} seconds)' },
exceededVideoDurationLimit: { id: 'upload_error.video_duration_limit', defaultMessage: 'Video exceeds the current duration limit ({limit, plural, one {# second} other {# seconds}})' },
scheduleError: { id: 'compose.invalid_schedule', defaultMessage: 'You must schedule a post at least 5 minutes out.' },
success: { id: 'compose.submit_success', defaultMessage: 'Your post was sent' },
editSuccess: { id: 'compose.edit_success', defaultMessage: 'Your post was edited' },

@ -47,7 +47,7 @@ const MAX_QUEUED_NOTIFICATIONS = 40;
defineMessages({
mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
group: { id: 'notifications.group', defaultMessage: '{count} notifications' },
group: { id: 'notifications.group', defaultMessage: '{count, plural, one {# notification} other {# notifications}}' },
});
const fetchRelatedRelationships = (dispatch: AppDispatch, notifications: APIEntity[]) => {

@ -11,7 +11,7 @@ import { compareId } from 'soapbox/utils/comparators';
const messages = defineMessages({
title: { id: 'admin.latest_accounts_panel.title', defaultMessage: 'Latest Accounts' },
expand: { id: 'admin.latest_accounts_panel.more', defaultMessage: 'Click to see {count} {count, plural, one {account} other {accounts}}' },
expand: { id: 'admin.latest_accounts_panel.more', defaultMessage: 'Click to see {count, plural, one {# account} other {# accounts}}' },
});
interface ILatestAccountsPanel {

@ -19,7 +19,7 @@ const messages = defineMessages({
accept: { id: 'chat_message_list_intro.actions.accept', defaultMessage: 'Accept' },
leaveChat: { id: 'chat_message_list_intro.actions.leave_chat', defaultMessage: 'Leave chat' },
report: { id: 'chat_message_list_intro.actions.report', defaultMessage: 'Report' },
messageLifespan: { id: 'chat_message_list_intro.actions.message_lifespan', defaultMessage: 'Messages older than {day} days are deleted.' },
messageLifespan: { id: 'chat_message_list_intro.actions.message_lifespan', defaultMessage: 'Messages older than {day, plural, one {# day} other {# days}} are deleted.' },
});
const ChatMessageListIntro = () => {

@ -38,8 +38,8 @@ const messages = defineMessages({
autoDelete14Days: { id: 'chat_settings.auto_delete.14days', defaultMessage: '14 days' },
autoDelete30Days: { id: 'chat_settings.auto_delete.30days', defaultMessage: '30 days' },
autoDelete90Days: { id: 'chat_settings.auto_delete.90days', defaultMessage: '90 days' },
autoDeleteMessage: { id: 'chat_window.auto_delete_label', defaultMessage: 'Auto-delete after {day} days' },
autoDeleteMessageTooltip: { id: 'chat_window.auto_delete_tooltip', defaultMessage: 'Chat messages are set to auto-delete after {day} days upon sending.' },
autoDeleteMessage: { id: 'chat_window.auto_delete_label', defaultMessage: 'Auto-delete after {day, plural, one {# day} other {# days}}' },
autoDeleteMessageTooltip: { id: 'chat_window.auto_delete_tooltip', defaultMessage: 'Chat messages are set to auto-delete after {day, plural, one {# day} other {# days}} upon sending.' },
});
const ChatPageMain = () => {

@ -27,7 +27,7 @@ const messages = defineMessages({
unblockUser: { id: 'chat_settings.options.unblock_user', defaultMessage: 'Unblock @{acct}' },
leaveChat: { id: 'chat_settings.options.leave_chat', defaultMessage: 'Leave Chat' },
autoDeleteLabel: { id: 'chat_settings.auto_delete.label', defaultMessage: 'Auto-delete messages' },
autoDeleteDays: { id: 'chat_settings.auto_delete.days', defaultMessage: '{day} days' },
autoDeleteDays: { id: 'chat_settings.auto_delete.days', defaultMessage: '{day, plural, one {# day} other {# days}}' },
});
const ChatSettings = () => {

@ -13,8 +13,8 @@ import ChatPaneHeader from './chat-pane-header';
import ChatSettings from './chat-settings';
const messages = defineMessages({
autoDeleteMessage: { id: 'chat_window.auto_delete_label', defaultMessage: 'Auto-delete after {day} days' },
autoDeleteMessageTooltip: { id: 'chat_window.auto_delete_tooltip', defaultMessage: 'Chat messages are set to auto-delete after {day} days upon sending.' },
autoDeleteMessage: { id: 'chat_window.auto_delete_label', defaultMessage: 'Auto-delete after {day, plural, one {# day} other {# days}}' },
autoDeleteMessageTooltip: { id: 'chat_window.auto_delete_tooltip', defaultMessage: 'Chat messages are set to auto-delete after {day, plural, one {# day} other {# days}} upon sending.' },
});
const LinkWrapper = ({ enabled, to, children }: { enabled: boolean, to: string, children: React.ReactNode }): JSX.Element => {

@ -5,7 +5,7 @@ import { length } from 'stringz';
import ProgressCircle from 'soapbox/components/progress-circle';
const messages = defineMessages({
title: { id: 'compose.character_counter.title', defaultMessage: 'Used {chars} out of {maxChars} characters' },
title: { id: 'compose.character_counter.title', defaultMessage: 'Used {chars} out of {maxChars} {maxChars, plural, one {character} other {characters}}' },
});
interface IVisualCharacterCounter {

@ -8,7 +8,7 @@ import { useInstance, useSoapboxConfig } from 'soapbox/hooks';
import SiteWallet from './site-wallet';
const messages = defineMessages({
actionTitle: { id: 'crypto_donate_panel.actions.view', defaultMessage: 'Click to see {count} {count, plural, one {wallet} other {wallets}}' },
actionTitle: { id: 'crypto_donate_panel.actions.view', defaultMessage: 'Click to see {count, plural, one {# wallet} other {# wallets}}' },
});
interface ICryptoDonatePanel {

@ -138,7 +138,7 @@ const buildMessage = (
others: totalCount && totalCount > 0 ? (
<FormattedMessage
id='notification.others'
defaultMessage=' + {count} {count, plural, one {other} other {others}}'
defaultMessage=' + {count, plural, one {# other} other {# others}}'
values={{ count: totalCount - 1 }}
/>
) : '',

@ -57,7 +57,7 @@ const ProfileFamiliarFollowers: React.FC<IProfileFamiliarFollowers> = ({ account
<span className='hover:underline cursor-pointer' role='presentation' onClick={openFamiliarFollowersModal}>
<FormattedMessage
id='account.familiar_followers.more'
defaultMessage='{count} {count, plural, one {other} other {others}} you follow'
defaultMessage='{count, plural, one {# other} other {# others}} you follow'
values={{ count: familiarFollowerIds.size - familiarFollowers.size }}
/>
</span>,
@ -77,4 +77,4 @@ const ProfileFamiliarFollowers: React.FC<IProfileFamiliarFollowers> = ({ account
);
};
export default ProfileFamiliarFollowers;
export default ProfileFamiliarFollowers;

@ -38,7 +38,7 @@ const TrendsPanel = ({ limit }: ITrendsPanel) => {
<Widget
title={<FormattedMessage id='trends.title' defaultMessage='Trends' />}
action={
<Link to='/search' onClick={setHashtagsFilter}>
<Link className='text-right' to='/search' onClick={setHashtagsFilter}>
<Text tag='span' theme='primary' size='sm' className='hover:underline'>
{intl.formatMessage(messages.viewAll)}
</Text>

@ -37,7 +37,7 @@ const WhoToFollowPanel = ({ limit }: IWhoToFollowPanel) => {
<Widget
title={<FormattedMessage id='who_to_follow.title' defaultMessage='People To Follow' />}
action={
<Link to='/suggestions'>
<Link className='text-right' to='/suggestions'>
<Text tag='span' theme='primary' size='sm' className='hover:underline'>
<FormattedMessage id='feed_suggestions.view_all' defaultMessage='View all' />
</Text>

@ -61,7 +61,7 @@ const AgeVerification = () => {
<Text theme='muted' size='sm'>
<FormattedMessage
id='age_verification.body'
defaultMessage='{siteTitle} requires users to be at least {ageMinimum} years old to access its platform. Anyone under the age of {ageMinimum} years old cannot access this platform.'
defaultMessage='{siteTitle} requires users to be at least {ageMinimum, plural, one {# year} other {# years}} years old to access its platform. Anyone under the age of {ageMinimum, plural, one {# year} other {# years}} old cannot access this platform.'
values={{
siteTitle: instance.title,
ageMinimum,

@ -18,7 +18,7 @@
"account.endorse.success": "You are now featuring @{acct} on your profile",
"account.familiar_followers": "Followed by {accounts}",
"account.familiar_followers.empty": "No one you know follows {name}.",
"account.familiar_followers.more": "{count} {count, plural, one {other} other {others}} you follow",
"account.familiar_followers.more": "{count, plural, one {# other} other {# others}} you follow",
"account.follow": "Follow",
"account.followers": "Followers",
"account.followers.empty": "No one follows this user yet.",
@ -102,7 +102,7 @@
"admin.dashcounters.user_count_label": "total users",
"admin.dashwidgets.email_list_header": "Email list",
"admin.dashwidgets.software_header": "Software",
"admin.latest_accounts_panel.more": "Click to see {count} {count, plural, one {account} other {accounts}}",
"admin.latest_accounts_panel.more": "Click to see {count, plural, one {# account} other {# accounts}}",
"admin.latest_accounts_panel.title": "Latest Accounts",
"admin.moderation_log.empty_message": "You have not performed any moderation actions yet. When you do, a history will be shown here.",
"admin.reports.actions.close": "Close",
@ -139,7 +139,7 @@
"admin_nav.awaiting_approval": "Waitlist",
"admin_nav.dashboard": "Dashboard",
"admin_nav.reports": "Reports",
"age_verification.body": "{siteTitle} requires users to be at least {ageMinimum} years old to access its platform. Anyone under the age of {ageMinimum} years old cannot access this platform.",
"age_verification.body": "{siteTitle} requires users to be at least {ageMinimum, plural, one {# year} other {# years}} years old to access its platform. Anyone under the age of {ageMinimum, plural, one {# year} other {# years}} old cannot access this platform.",
"age_verification.fail": "You must be {ageMinimum, plural, one {# year} other {# years}} old or older.",
"age_verification.header": "Enter your birth date",
"alert.unexpected.body": "We're sorry for the interruption. If the problem persists, please reach out to our support team. You may also try to {clearCookies} (this will log you out).",
@ -215,7 +215,7 @@
"chat_message_list.network_failure.title": "Whoops!",
"chat_message_list_intro.actions.accept": "Accept",
"chat_message_list_intro.actions.leave_chat": "Leave chat",
"chat_message_list_intro.actions.message_lifespan": "Messages older than {day} days are deleted.",
"chat_message_list_intro.actions.message_lifespan": "Messages older than {day, plural, one {# day} other {# days}} are deleted.",
"chat_message_list_intro.actions.report": "Report",
"chat_message_list_intro.intro": "wants to start a chat with you",
"chat_message_list_intro.leave_chat.confirm": "Leave Chat",
@ -233,7 +233,7 @@
"chat_settings.auto_delete.30days": "30 days",
"chat_settings.auto_delete.7days": "7 days",
"chat_settings.auto_delete.90days": "90 days",
"chat_settings.auto_delete.days": "{day} days",
"chat_settings.auto_delete.days": "{day, plural, one {# day} other {# days}}",
"chat_settings.auto_delete.hint": "Sent messages will auto-delete after the time period selected",
"chat_settings.auto_delete.label": "Auto-delete messages",
"chat_settings.block.confirm": "Block",
@ -250,8 +250,8 @@
"chat_settings.unblock.confirm": "Unblock",
"chat_settings.unblock.heading": "Unblock @{acct}",
"chat_settings.unblock.message": "Unblocking will allow this profile to direct message you and view your content.",
"chat_window.auto_delete_label": "Auto-delete after {day} days",
"chat_window.auto_delete_tooltip": "Chat messages are set to auto-delete after {day} days upon sending.",
"chat_window.auto_delete_label": "Auto-delete after {day, plural, one {# day} other {# days}}",
"chat_window.auto_delete_tooltip": "Chat messages are set to auto-delete after {day, plural, one {# day} other {# days}} upon sending.",
"chats.actions.copy": "Copy",
"chats.actions.delete": "Delete message",
"chats.actions.deleteForMe": "Delete for me",
@ -348,7 +348,7 @@
"common.cancel": "Cancel",
"common.error": "Something isn't right. Try reloading the page.",
"compare_history_modal.header": "Edit history",
"compose.character_counter.title": "Used {chars} out of {maxChars} characters",
"compose.character_counter.title": "Used {chars} out of {maxChars} {maxChars, plural, one {character} other {characters}}",
"compose.edit_success": "Your post was edited",
"compose.invalid_schedule": "You must schedule a post at least 5 minutes out.",
"compose.submit_success": "Your post was sent!",
@ -476,7 +476,7 @@
"confirmations.unfollow.confirm": "Unfollow",
"crypto_donate.explanation_box.message": "{siteTitle} accepts cryptocurrency donations. You may send a donation to any of the addresses below. Thank you for your support!",
"crypto_donate.explanation_box.title": "Sending cryptocurrency donations",
"crypto_donate_panel.actions.view": "Click to see {count} {count, plural, one {wallet} other {wallets}}",
"crypto_donate_panel.actions.view": "Click to see {count, plural, one {# wallet} other {# wallets}}",
"crypto_donate_panel.heading": "Donate Cryptocurrency",
"crypto_donate_panel.intro.message": "{siteTitle} accepts cryptocurrency donations to fund our service. Thank you for your support!",
"datepicker.day": "Day",
@ -881,7 +881,7 @@
"notification.mentioned": "{name} mentioned you",
"notification.move": "{name} moved to {targetName}",
"notification.name": "{link}{others}",
"notification.others": " + {count} {count, plural, one {other} other {others}}",
"notification.others": " + {count, plural, one {# other} other {# others}}",
"notification.pleroma:chat_mention": "{name} sent you a message",
"notification.pleroma:emoji_reaction": "{name} reacted to your post",
"notification.pleroma:event_reminder": "An event you are participating in starts soon",
@ -900,7 +900,7 @@
"notifications.filter.mentions": "Mentions",
"notifications.filter.polls": "Poll results",
"notifications.filter.statuses": "Updates from people you follow",
"notifications.group": "{count} notifications",
"notifications.group": "{count, plural, one {# notification} other {# notifications}}",
"notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}",
"oauth_consumer.tooltip": "Sign in with {provider}",
"oauth_consumers.title": "Other ways to sign in",
@ -1325,7 +1325,7 @@
"upload_error.image_size_limit": "Image exceeds the current file size limit ({limit})",
"upload_error.limit": "File upload limit exceeded.",
"upload_error.poll": "File upload not allowed with polls.",
"upload_error.video_duration_limit": "Video exceeds the current duration limit ({limit} seconds)",
"upload_error.video_duration_limit": "Video exceeds the current duration limit ({limit, plural, one {# second} other {# seconds}})",
"upload_error.video_size_limit": "Video exceeds the current file size limit ({limit})",
"upload_form.description": "Describe for the visually impaired",
"upload_form.preview": "Preview",

Loading…
Cancel
Save