diff --git a/apps/app-frontend/src/components/ui/world/WorldItem.vue b/apps/app-frontend/src/components/ui/world/WorldItem.vue index f9b4470003..ba4597bd58 100644 --- a/apps/app-frontend/src/components/ui/world/WorldItem.vue +++ b/apps/app-frontend/src/components/ui/world/WorldItem.vue @@ -244,7 +244,7 @@ const messages = defineMessages({
{{ formatMessage(plans[plan].description) }}
diff --git a/apps/frontend/src/composables/auth/scopes.ts b/apps/frontend/src/composables/auth/scopes.ts index 15e78f7da2..dc9747e540 100644 --- a/apps/frontend/src/composables/auth/scopes.ts +++ b/apps/frontend/src/composables/auth/scopes.ts @@ -199,7 +199,7 @@ export const scopeMessages = defineMessages({ }, patCreateDescription: { id: 'scopes.patCreate.description', - defaultMessage: 'Create personal API tokens', + defaultMessage: 'Create personal access tokens', }, patReadLabel: { id: 'scopes.patRead.label', @@ -207,7 +207,7 @@ export const scopeMessages = defineMessages({ }, patReadDescription: { id: 'scopes.patRead.description', - defaultMessage: 'View created API tokens', + defaultMessage: 'View created personal access tokens', }, patWriteLabel: { id: 'scopes.patWrite.label', @@ -215,7 +215,7 @@ export const scopeMessages = defineMessages({ }, patWriteDescription: { id: 'scopes.patWrite.description', - defaultMessage: 'Edit personal API tokens', + defaultMessage: 'Edit personal access tokens', }, patDeleteLabel: { id: 'scopes.patDelete.label', @@ -223,7 +223,7 @@ export const scopeMessages = defineMessages({ }, patDeleteDescription: { id: 'scopes.patDelete.description', - defaultMessage: 'Delete your personal API tokens', + defaultMessage: 'Delete your personal access tokens', }, sessionReadLabel: { id: 'scopes.sessionRead.label', diff --git a/apps/frontend/src/composables/use-server-install-content.ts b/apps/frontend/src/composables/use-server-install-content.ts index 75b3c0d232..248b7896ac 100644 --- a/apps/frontend/src/composables/use-server-install-content.ts +++ b/apps/frontend/src/composables/use-server-install-content.ts @@ -61,7 +61,7 @@ export interface UseServerInstallContentOptions { const messages = defineMessages({ unsupportedContentType: { id: 'discover.install.error.unsupported-content-type', - defaultMessage: 'This content type cannot be installed to a server from browse.', + defaultMessage: 'This content type cannot be installed to a server from Discover.', }, noServerWorld: { id: 'discover.install.error.no-server-world', diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index 4638aaf646..e603705f19 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -5,9 +5,24 @@ "action.continue": { "message": "Continue" }, + "admin.affiliates.affiliate-code-count": { + "message": "{count, plural, one {# affiliate code} other {# affiliate codes}}" + }, + "admin.batch-credit.email-preview.subscription-days": { + "message": "To make up for it, we've added {days, plural, one {# day} other {# days}} to your Modrinth Servers subscription." + }, "admin.billing.error.not-found": { "message": "User not found" }, + "admin.server-transfers.transfer-count": { + "message": "{count, plural, one {# transfer} other {# transfers}}" + }, + "admin.transfer-modal.selected-servers": { + "message": "{count, plural, one {# server selected} other {# servers selected}}" + }, + "admin.transfer-modal.unknown-nodes": { + "message": "{count, plural, one {Unknown node} other {Unknown nodes}}" + }, "app-marketing.download.description": { "message": "Our desktop app is available across all platforms, choose your desired version." }, @@ -123,7 +138,7 @@ "message": "∞ MB" }, "app-marketing.features.performance.infinite-times-infinite-mb": { - "message": "∞ * ∞ MB" + "message": "∞ × ∞ MB" }, "app-marketing.features.performance.less-than-150mb": { "message": "< 150 MB" @@ -1067,6 +1082,9 @@ "dashboard.projects.links.discord-invite.label": { "message": "Discord invite" }, + "dashboard.projects.links.header.edit": { + "message": "Edit links" + }, "dashboard.projects.links.issue-tracker.description": { "message": "A place for users to report bugs, issues, and concerns about your project." }, @@ -1092,7 +1110,7 @@ "message": "Source code" }, "dashboard.projects.links.wiki-page.description": { - "message": "A page containing information, documentation, and help for the project." + "message": "A page containing information, documentation, and help for the project" }, "dashboard.projects.links.wiki-page.label": { "message": "Wiki page" @@ -1356,19 +1374,19 @@ "message": "No server world is available for install." }, "discover.install.error.unsupported-content-type": { - "message": "This content type cannot be installed to a server from browse." + "message": "This content type cannot be installed to a server from Discover." }, "discover.install.heading.reset-modpack": { "message": "Selecting modpack to install after reset" }, "discover.seo.description": { - "message": "Search and browse thousands of Minecraft {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}} on Modrinth with instant, accurate search results. Our filters help you quickly find the best Minecraft {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}}." + "message": "Search and browse thousands of Minecraft {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} server {servers} other {projects}} on Modrinth with instant, accurate search results. Our filters help you quickly find the best Minecraft {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} server {servers} other {projects}}." }, "discover.seo.title": { - "message": "Search {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}}" + "message": "Search {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} server {servers} other {projects}}" }, "discover.seo.title-with-query": { - "message": "Search {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} other {projects}} | {query}" + "message": "Search {projectType, select, mod {mods} modpack {modpacks} resourcepack {resource packs} shader {shaders} plugin {plugins} datapack {datapacks} server {servers} other {projects}} | {query}" }, "error.collection.404.list_item.1": { "message": "You may have mistyped the collection's URL." @@ -2090,6 +2108,9 @@ "moderation.page.technicalReview": { "message": "Tech review" }, + "moderation.tech-review.other-traces-also-marked": { + "message": "({count, plural, one {# other trace also marked} other {# other traces also marked}})" + }, "muralpay.account-type.checking": { "message": "Checking" }, @@ -2357,6 +2378,9 @@ "muralpay.warning.wallet-address": { "message": "Double-check your wallet address. Funds sent to an incorrect address cannot be recovered." }, + "organization.settings.projects.edit-links.affected-projects": { + "message": "Changes will be applied to {count, plural, one {# project} other {# projects}}." + }, "profile.bio.fallback.creator": { "message": "A Modrinth creator." }, @@ -2381,6 +2405,9 @@ "profile.button.set-affiliate": { "message": "Set as affiliate" }, + "profile.collection.projects-count": { + "message": "{count, plural, one {# project} other {# projects}}" + }, "profile.details.label.auth-providers": { "message": "Auth providers" }, @@ -2898,10 +2925,10 @@ "message": "Visit projects dashboard" }, "project.stats.downloads-label": { - "message": "download{count, plural, one {} other {s}}" + "message": "{count, plural, one {download} other {downloads}}" }, "project.stats.followers-label": { - "message": "follower{count, plural, one {} other {s}}" + "message": "{count, plural, one {follower} other {followers}}" }, "project.status.archived.message": { "message": "{title} has been archived. {title} will not receive any further updates unless the author decides to unarchive the project." @@ -3099,25 +3126,25 @@ "message": "Write organizations" }, "scopes.patCreate.description": { - "message": "Create personal API tokens" + "message": "Create personal access tokens" }, "scopes.patCreate.label": { "message": "Create PATs" }, "scopes.patDelete.description": { - "message": "Delete your personal API tokens" + "message": "Delete your personal access tokens" }, "scopes.patDelete.label": { "message": "Delete PATs" }, "scopes.patRead.description": { - "message": "View created API tokens" + "message": "View created personal access tokens" }, "scopes.patRead.label": { "message": "Read PATs" }, "scopes.patWrite.description": { - "message": "Edit personal API tokens" + "message": "Edit personal access tokens" }, "scopes.patWrite.label": { "message": "Write PATs" @@ -3326,6 +3353,9 @@ "servers.plan.small.description": { "message": "Perfect for 1–5 friends with a few light mods." }, + "servers.purchase.step.plan.billed": { + "message": "billed {interval, select, monthly {monthly} quarterly {quarterly} yearly {yearly} other {{interval}}}" + }, "settings.account.button.complete-setup": { "message": "Complete setup" }, @@ -3488,6 +3518,12 @@ "settings.account.security.two-factor.description": { "message": "Add an additional layer of security to your account during login." }, + "settings.account.security.two-factor.modal.remove.header": { + "message": "Remove 2FA" + }, + "settings.account.security.two-factor.modal.setup.header": { + "message": "Setup 2FA" + }, "settings.account.security.two-factor.title": { "message": "Two-factor authentication" }, @@ -3665,21 +3701,12 @@ "settings.billing.interval.month": { "message": "month" }, - "settings.billing.interval.monthly": { - "message": "monthly" - }, "settings.billing.interval.quarter": { "message": "quarter" }, - "settings.billing.interval.quarterly.adjective": { - "message": "quarterly" - }, "settings.billing.interval.year": { "message": "year" }, - "settings.billing.interval.yearly": { - "message": "yearly" - }, "settings.billing.midas.benefits.ad-free": { "message": "Ad-free browsing on modrinth.com and Modrinth App" }, @@ -3764,9 +3791,6 @@ "settings.billing.price.per-interval": { "message": "{price} / {interval}" }, - "settings.billing.price.slash-interval": { - "message": "/{interval}" - }, "settings.billing.pyro.cpu": { "message": "{shared} Shared CPUs (Bursts up to {bursts} CPUs)" }, @@ -3834,16 +3858,16 @@ "message": "Subscriptions" }, "settings.billing.switch.switching-to-interval": { - "message": "Switching to {interval}" + "message": "Switching to {interval, select, monthly {monthly} yearly {yearly} other {{interval}}}" }, "settings.billing.switch.to-interval": { - "message": "Switch to {interval}" + "message": "Switch to {interval, select, monthly {monthly} yearly {yearly} other {{interval}}}" }, "settings.billing.switch.tooltip.monthly-additional-per-year": { "message": "Monthly billing will cost you an additional {amount} per year" }, "settings.billing.switches-to-billing-on": { - "message": "Switches to {interval} billing on {date}" + "message": "Switches to {interval, select, monthly {monthly} yearly {yearly} other {{interval}}} billing on {date}" }, "settings.billing.update-method": { "message": "Update method" diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue index 0e4ae85771..bd1d122fda 100644 --- a/apps/frontend/src/pages/[type]/[id].vue +++ b/apps/frontend/src/pages/[type]/[id].vue @@ -1368,7 +1368,7 @@ const messages = defineMessages({ }, downloadsStat: { id: 'project.stats.downloads-label', - defaultMessage: 'download{count, plural, one {} other {s}}', + defaultMessage: '{count, plural, one {download} other {downloads}}', }, errorLoadingProject: { id: 'project.error.loading', @@ -1398,7 +1398,7 @@ const messages = defineMessages({ }, followersStat: { id: 'project.stats.followers-label', - defaultMessage: 'follower{count, plural, one {} other {s}}', + defaultMessage: '{count, plural, one {follower} other {followers}}', }, galleryTab: { id: 'project.gallery.title', diff --git a/apps/frontend/src/pages/admin/affiliates.vue b/apps/frontend/src/pages/admin/affiliates.vue index 92925757ce..aa7ac40e48 100644 --- a/apps/frontend/src/pages/admin/affiliates.vue +++ b/apps/frontend/src/pages/admin/affiliates.vue @@ -61,8 +61,10 @@ {{ userGroup.user.username }} - {{ userGroup.affiliates.length }} affiliate code{{ - userGroup.affiliates.length === 1 ? '' : 's' + {{ + formatMessage(messages.affiliateCodeCount, { + count: userGroup.affiliates.length, + }) }} @@ -92,9 +94,11 @@ import { Avatar, ButtonStyled, ConfirmModal, + defineMessages, injectModrinthClient, injectNotificationManager, StyledInput, + useVIntl, } from '@modrinth/ui' import type { User } from '@modrinth/utils' import { useQuery } from '@tanstack/vue-query' @@ -102,6 +106,14 @@ import { computed, ref } from 'vue' const client = injectModrinthClient() const { handleError } = injectNotificationManager() +const { formatMessage } = useVIntl() + +const messages = defineMessages({ + affiliateCodeCount: { + id: 'admin.affiliates.affiliate-code-count', + defaultMessage: '{count, plural, one {# affiliate code} other {# affiliate codes}}', + }, +}) type UserGroup = { user: User diff --git a/apps/frontend/src/pages/admin/servers/transfers.vue b/apps/frontend/src/pages/admin/servers/transfers.vue index 04627f4885..f8665953ff 100644 --- a/apps/frontend/src/pages/admin/servers/transfers.vue +++ b/apps/frontend/src/pages/admin/servers/transfers.vue @@ -65,7 +65,7 @@ - {{ batch.log_count }} transfer{{ batch.log_count === 1 ? '' : 's' }} + {{ formatMessage(messages.transferCount, { count: batch.log_count }) }}