From 64b4ebb491b76b4d5105fcbb361ba16621424f74 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 27 Apr 2026 13:02:46 +0100 Subject: [PATCH 1/3] feat: world switching page implementation --- .../src/pages/hosting/manage/Worlds.vue | 7 + .../src/pages/hosting/manage/index.js | 3 +- apps/app-frontend/src/routes.js | 8 + .../src/pages/hosting/manage/[id]/worlds.vue | 30 ++ .../hosting/manage/components/WorldCard.vue | 311 ++++++++++++++++++ .../layouts/wrapped/hosting/manage/root.vue | 122 ++++--- .../layouts/wrapped/hosting/manage/worlds.vue | 288 ++++++++++++++++ packages/ui/src/layouts/wrapped/index.ts | 1 + 8 files changed, 719 insertions(+), 51 deletions(-) create mode 100644 apps/app-frontend/src/pages/hosting/manage/Worlds.vue create mode 100644 apps/frontend/src/pages/hosting/manage/[id]/worlds.vue create mode 100644 packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue create mode 100644 packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue diff --git a/apps/app-frontend/src/pages/hosting/manage/Worlds.vue b/apps/app-frontend/src/pages/hosting/manage/Worlds.vue new file mode 100644 index 0000000000..3df6f264ee --- /dev/null +++ b/apps/app-frontend/src/pages/hosting/manage/Worlds.vue @@ -0,0 +1,7 @@ + + + diff --git a/apps/app-frontend/src/pages/hosting/manage/index.js b/apps/app-frontend/src/pages/hosting/manage/index.js index 50052e3f9e..e06f46e2a2 100644 --- a/apps/app-frontend/src/pages/hosting/manage/index.js +++ b/apps/app-frontend/src/pages/hosting/manage/index.js @@ -3,5 +3,6 @@ import Content from './Content.vue' import Files from './Files.vue' import Index from './Index.vue' import Overview from './Overview.vue' +import Worlds from './Worlds.vue' -export { Backups, Content, Files, Index, Overview } +export { Backups, Content, Files, Index, Overview, Worlds } diff --git a/apps/app-frontend/src/routes.js b/apps/app-frontend/src/routes.js index c12306b5ad..410869c46a 100644 --- a/apps/app-frontend/src/routes.js +++ b/apps/app-frontend/src/routes.js @@ -57,6 +57,14 @@ export default new createRouter({ breadcrumb: [{ name: '?Server' }], }, }, + { + path: 'worlds', + name: 'ServerManageWorlds', + component: Hosting.Worlds, + meta: { + breadcrumb: [{ name: '?Server' }], + }, + }, { path: 'files', name: 'ServerManageFiles', diff --git a/apps/frontend/src/pages/hosting/manage/[id]/worlds.vue b/apps/frontend/src/pages/hosting/manage/[id]/worlds.vue new file mode 100644 index 0000000000..5305138f0a --- /dev/null +++ b/apps/frontend/src/pages/hosting/manage/[id]/worlds.vue @@ -0,0 +1,30 @@ + + + diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue b/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue new file mode 100644 index 0000000000..db1aacf0bf --- /dev/null +++ b/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue @@ -0,0 +1,311 @@ + + + diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue index f9159ad088..a92662ab14 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue @@ -22,8 +22,8 @@ class="flex min-h-[calc(100vh-4rem)] items-center justify-center text-contrast" >

- Your server's node, where your Modrinth Server is physically hosted, is not accessible - at the moment. We are working to resolve the issue as quickly as possible. + {{ formatMessage(messages.nodeUnavailableDescription) }}

- Your data is safe and will not be lost, and your server will be back online as soon as - the issue is resolved. + {{ formatMessage(messages.nodeUnavailableDataDescription) }}

- If reloading does not work initially, please contact Modrinth Support via the chat - bubble in the bottom right corner and we'll be happy to help. + {{ formatMessage(messages.nodeUnavailableSupportDescription) }}

@@ -132,7 +129,7 @@ >
- An internal error occurred while installing your server. Don't fret — try - reinstalling your server, and if the problem persists, please contact Modrinth - support with your server's debug information. + {{ formatMessage(messages.installInternalErrorDescription) }}
- An error occurred while installing your server because Modrinth Hosting does not - support the version of Minecraft or the loader you specified. Try reinstalling - your server with a different version or loader, and if the problem persists, - please contact Modrinth Support with your server's debug information. + {{ formatMessage(messages.installUnsupportedVersionDescription) }}
-
+
- + @@ -271,7 +257,7 @@ @click="openServerSettingsModal('installation')" > - Change Loader + {{ formatMessage(messages.changeLoader) }}
@@ -295,7 +281,7 @@ class="mb-4 flex w-full flex-row items-center gap-4 rounded-2xl bg-bg-red p-4 text-contrast" > - Something went wrong... + {{ formatMessage(messages.websocketError) }}
- Hang on, we're reconnecting to your server. + {{ formatMessage(messages.websocketReconnecting) }}
-

Server data

+

+ {{ formatMessage(messages.serverDataTitle) }} +

{{
 			safeStringify(serverData)
 		}}
@@ -362,6 +350,7 @@ import { SettingsIcon, TransferIcon, TriangleAlertIcon, + WorldIcon, XIcon, } from '@modrinth/assets' import type { Stats } from '@modrinth/utils' @@ -488,6 +477,33 @@ const settingsHintMessages = defineMessages({ }, }) +const messages = defineMessages({ + serverSettings: { + id: 'servers.manage.server-settings', + defaultMessage: 'Server settings', + }, + overviewNav: { + id: 'servers.manage.nav.overview', + defaultMessage: 'Overview', + }, + contentNav: { + id: 'servers.manage.nav.content', + defaultMessage: 'Content', + }, + worldsNav: { + id: 'servers.manage.nav.worlds', + defaultMessage: 'Worlds', + }, + filesNav: { + id: 'servers.manage.nav.files', + defaultMessage: 'Files', + }, + backupsNav: { + id: 'servers.manage.nav.backups', + defaultMessage: 'Backups', + }, +}) + // disabled, keeping the animation logic cos it's really nice and we might want to re-enable in future const DISABLE_LOADING_ANIM = true @@ -768,25 +784,31 @@ watch(serverData, (data) => { const navLinks = computed(() => [ { - label: 'Overview', + label: formatMessage(messages.overviewNav), href: `/hosting/manage/${props.serverId}`, icon: LayoutTemplateIcon, subpages: [], }, { - label: 'Content', + label: formatMessage(messages.contentNav), href: `/hosting/manage/${props.serverId}/content`, icon: BoxesIcon, subpages: ['mods', 'datapacks'], }, { - label: 'Files', + label: formatMessage(messages.worldsNav), + href: `/hosting/manage/${props.serverId}/worlds`, + icon: WorldIcon, + subpages: [], + }, + { + label: formatMessage(messages.filesNav), href: `/hosting/manage/${props.serverId}/files`, icon: FolderOpenIcon, subpages: [], }, { - label: 'Backups', + label: formatMessage(messages.backupsNav), href: `/hosting/manage/${props.serverId}/backups`, icon: DatabaseBackupIcon, subpages: [], diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue b/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue new file mode 100644 index 0000000000..8079184675 --- /dev/null +++ b/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue @@ -0,0 +1,288 @@ + + + diff --git a/packages/ui/src/layouts/wrapped/index.ts b/packages/ui/src/layouts/wrapped/index.ts index d91f53ee78..4916f26783 100644 --- a/packages/ui/src/layouts/wrapped/index.ts +++ b/packages/ui/src/layouts/wrapped/index.ts @@ -5,3 +5,4 @@ export { default as ServersManageFilesPage } from './hosting/manage/files.vue' export { default as ServersManagePageIndex } from './hosting/manage/index.vue' export { default as ServersManageOverviewPage } from './hosting/manage/overview.vue' export { default as ServersManageRootLayout } from './hosting/manage/root.vue' +export { default as ServersManageWorldsPage } from './hosting/manage/worlds.vue' From 668f47fe15b8805d5b7c12ae866bae605e606a48 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 27 Apr 2026 13:06:08 +0100 Subject: [PATCH 2/3] fix: lint + i18n --- apps/frontend/src/locales/en-US/index.json | 3 + .../hosting/manage/components/WorldCard.vue | 6 +- .../layouts/wrapped/hosting/manage/root.vue | 265 ++++++++++++++++-- .../layouts/wrapped/hosting/manage/worlds.vue | 10 +- packages/ui/src/locales/en-US/index.json | 186 ++++++++++++ 5 files changed, 431 insertions(+), 39 deletions(-) diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index 3ff2360a0f..360a90866a 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -3002,6 +3002,9 @@ "search.filter.locked.server.sync": { "message": "Sync with server" }, + "servers.manage.worlds.meta.title": { + "message": "Worlds - {server} - Modrinth" + }, "servers.notice.actions": { "message": "Actions" }, diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue b/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue index db1aacf0bf..c338121c9f 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue @@ -95,9 +95,9 @@
{{ world.name }} - @@ -178,8 +178,8 @@ diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue index a92662ab14..4eff631093 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/root.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/root.vue @@ -478,6 +478,139 @@ const settingsHintMessages = defineMessages({ }) const messages = defineMessages({ + serverPreparingTitle: { + id: 'servers.manage.status.preparing.title', + defaultMessage: "We're getting your server ready", + }, + serverPreparingDescription: { + id: 'servers.manage.status.preparing.description', + defaultMessage: "Your server's hardware is being prepared and will be available shortly!", + }, + serverUpgradingTitle: { + id: 'servers.manage.status.upgrading.title', + defaultMessage: 'Server upgrading', + }, + serverUpgradingDescription: { + id: 'servers.manage.status.upgrading.description', + defaultMessage: + "Your server's hardware is currently being upgraded and will be back online shortly!", + }, + serverSuspendedTitle: { + id: 'servers.manage.status.suspended.title', + defaultMessage: 'Server suspended', + }, + suspendedCancelledDescription: { + id: 'servers.manage.status.suspended.cancelled-description', + defaultMessage: + 'Your subscription has been cancelled.\nContact Modrinth Support if you believe this is an error.', + }, + suspendedReasonDescription: { + id: 'servers.manage.status.suspended.reason-description', + defaultMessage: + 'Your server has been suspended: {reason}\nContact Modrinth Support if you believe this is an error.', + }, + suspendedDescription: { + id: 'servers.manage.status.suspended.description', + defaultMessage: + 'Your server has been suspended.\nContact Modrinth Support if you believe this is an error.', + }, + generalErrorTitle: { + id: 'servers.manage.error.general.title', + defaultMessage: 'An error occurred.', + }, + genericErrorMessage: { + id: 'servers.manage.error.general.message', + defaultMessage: 'An unexpected error occurred.', + }, + contactSupportDescription: { + id: 'servers.manage.error.contact-support', + defaultMessage: 'Please contact Modrinth Support.', + }, + nodeUnavailableTitle: { + id: 'servers.manage.error.node-unavailable.title', + defaultMessage: 'Server Node Unavailable', + }, + nodeUnavailableDescription: { + id: 'servers.manage.error.node-unavailable.description', + defaultMessage: + "Your server's node, where your Modrinth Server is physically hosted, is not accessible at the moment. We are working to resolve the issue as quickly as possible.", + }, + nodeUnavailableDataDescription: { + id: 'servers.manage.error.node-unavailable.data-description', + defaultMessage: + 'Your data is safe and will not be lost, and your server will be back online as soon as the issue is resolved.', + }, + nodeUnavailableSupportDescription: { + id: 'servers.manage.error.node-unavailable.support-description', + defaultMessage: + "If reloading does not work initially, please contact Modrinth Support via the chat bubble in the bottom right corner and we'll be happy to help.", + }, + installInvalidVersionDescription: { + id: 'servers.manage.error.install.invalid-version.description', + defaultMessage: + 'An invalid loader or Minecraft version was specified and could not be installed.', + }, + installRecentMinecraftVersionNotice: { + id: 'servers.manage.error.install.invalid-version.recent-minecraft', + defaultMessage: + 'If this version of Minecraft was released recently, please check if Modrinth Hosting supports it.', + }, + installModpackCompatibilityNotice: { + id: 'servers.manage.error.install.invalid-version.modpack-compatibility', + defaultMessage: + "If you've installed a modpack, it may have been packaged incorrectly or may not be compatible with the loader.", + }, + installChangeLoaderNotice: { + id: 'servers.manage.error.install.invalid-version.change-loader', + defaultMessage: + 'Your server may need to be reinstalled with a valid mod loader and version. You can change the loader by clicking the "Change Loader" button.', + }, + installSupportNotice: { + id: 'servers.manage.error.install.invalid-version.support', + defaultMessage: "If you're stuck, please contact Modrinth Support with the information below:", + }, + installInternalErrorDescription: { + id: 'servers.manage.error.install.internal.description', + defaultMessage: + "An internal error occurred while installing your server. Don't fret - try reinstalling your server, and if the problem persists, please contact Modrinth support with your server's debug information.", + }, + installUnsupportedVersionDescription: { + id: 'servers.manage.error.install.unsupported-version.description', + defaultMessage: + "An error occurred while installing your server because Modrinth Hosting does not support the version of Minecraft or the loader you specified. Try reinstalling your server with a different version or loader, and if the problem persists, please contact Modrinth Support with your server's debug information.", + }, + installationErrorTitle: { + id: 'servers.manage.error.install.title', + defaultMessage: 'Installation error', + }, + unknownError: { + id: 'servers.manage.error.unknown', + defaultMessage: 'Unknown error', + }, + copyDebugInfo: { + id: 'servers.manage.error.copy-debug-info', + defaultMessage: 'Copy Debug Info', + }, + openInstallationLog: { + id: 'servers.manage.error.open-installation-log', + defaultMessage: 'Open Installation Log', + }, + changeLoader: { + id: 'servers.manage.error.change-loader', + defaultMessage: 'Change Loader', + }, + websocketError: { + id: 'servers.manage.websocket.error', + defaultMessage: 'Something went wrong...', + }, + websocketReconnecting: { + id: 'servers.manage.websocket.reconnecting', + defaultMessage: "Hang on, we're reconnecting to your server.", + }, + serverDataTitle: { + id: 'servers.manage.debug.server-data', + defaultMessage: 'Server data', + }, serverSettings: { id: 'servers.manage.server-settings', defaultMessage: 'Server settings', @@ -502,6 +635,67 @@ const messages = defineMessages({ id: 'servers.manage.nav.backups', defaultMessage: 'Backups', }, + errorDismissingNotice: { + id: 'servers.manage.notice.dismiss-error', + defaultMessage: 'Error dismissing notice', + }, + failedToRetryInstallation: { + id: 'servers.manage.install.retry-error', + defaultMessage: 'Failed to retry installation', + }, + serverIdLabel: { + id: 'servers.manage.error-details.server-id', + defaultMessage: 'Server ID', + }, + nodeLabel: { + id: 'servers.manage.error-details.node', + defaultMessage: 'Node', + }, + errorMessageLabel: { + id: 'servers.manage.error-details.error-message', + defaultMessage: 'Error message', + }, + timestampLabel: { + id: 'servers.manage.error-details.timestamp', + defaultMessage: 'Timestamp', + }, + errorNameLabel: { + id: 'servers.manage.error-details.error-name', + defaultMessage: 'Error Name', + }, + originalErrorLabel: { + id: 'servers.manage.error-details.original-error', + defaultMessage: 'Original Error', + }, + stackTraceLabel: { + id: 'servers.manage.error-details.stack-trace', + defaultMessage: 'Stack Trace', + }, + unknownLabel: { + id: 'servers.manage.error-details.unknown', + defaultMessage: 'Unknown', + }, + nodePingFailed: { + id: 'servers.manage.error.node-ping-failed', + defaultMessage: 'Unable to reach node. Ping test failed.', + }, + goToBillingSettings: { + id: 'servers.manage.action.go-to-billing-settings', + defaultMessage: 'Go to billing settings', + }, + goBackToAllServers: { + id: 'servers.manage.action.go-back-to-all-servers', + defaultMessage: 'Go back to all servers', + }, + reload: { + id: 'servers.manage.action.reload', + defaultMessage: 'Reload', + }, + debugInfo: { + id: 'servers.manage.error.debug-info', + defaultMessage: + 'Server ID: {serverId}\nError: {error}\nKind: {kind}\nProject ID: {projectId}\nVersion ID: {versionId}\nLog: {log}', + }, }) // disabled, keeping the animation logic cos it's really nice and we might want to re-enable in future @@ -520,8 +714,14 @@ const isLoading = ref(true) const isMounted = ref(true) const copied = ref(false) const installError = ref(null) -const errorTitle = ref('Error') -const errorMessage = ref('An unexpected error occurred.') +type InstallErrorTitle = 'generic' | 'installation' +const errorTitle = ref('generic') +const errorTitleLabel = computed(() => + errorTitle.value === 'installation' + ? formatMessage(messages.installationErrorTitle) + : formatMessage(messages.generalErrorTitle), +) +const errorMessage = ref(formatMessage(messages.genericErrorMessage)) const errorLog = ref('') const errorLogFile = ref('') const isOnboarding = computed(() => serverData.value?.flows?.intro) @@ -824,7 +1024,7 @@ const surveyNotice = computed(() => serverData.value?.notices?.find((n) => n.lev async function dismissNotice(noticeId: number) { await client.archon.servers_v0.dismissNotice(props.serverId, noticeId).catch((err) => { addNotification({ - title: 'Error dismissing notice', + title: formatMessage(messages.errorDismissingNotice), text: err, type: 'error', }) @@ -928,7 +1128,7 @@ async function handleContentRetry() { } catch (err) { addNotification({ type: 'error', - text: err instanceof Error ? err.message : 'Failed to retry installation', + text: err instanceof Error ? err.message : formatMessage(messages.failedToRetryInstallation), }) } } @@ -978,9 +1178,9 @@ const handleInstallationResult = async (data: Archon.Websocket.v0.WSInstallation case 'err': { console.log('failed to install') console.log(data) - errorTitle.value = 'Installation error' - errorMessage.value = data.reason ?? 'Unknown error' - installError.value = new Error(data.reason ?? 'Unknown error') + errorTitle.value = 'installation' + errorMessage.value = data.reason ?? formatMessage(messages.unknownError) + installError.value = new Error(errorMessage.value) try { let files = await client.kyros.files_v0.listDirectory('/', 1, 100) @@ -1038,8 +1238,8 @@ const onReinstall = async ( } installError.value = null - errorTitle.value = 'Error' - errorMessage.value = 'An unexpected error occurred.' + errorTitle.value = 'generic' + errorMessage.value = formatMessage(messages.genericErrorMessage) modrinthServersConsole.clear() @@ -1108,62 +1308,64 @@ const nodeAccessible = ref(true) const nodeUnavailableDetails = computed(() => [ { - label: 'Server ID', + label: formatMessage(messages.serverIdLabel), value: props.serverId, type: 'inline' as const, }, { - label: 'Node', + label: formatMessage(messages.nodeLabel), value: (serverError.value?.responseData as { hostname?: string } | undefined)?.hostname ?? serverData.value?.datacenter ?? - 'Unknown', + formatMessage(messages.unknownLabel), type: 'inline' as const, }, { - label: 'Error message', + label: formatMessage(messages.errorMessageLabel), value: nodeAccessible.value - ? (serverError.value?.message ?? 'Unknown') - : 'Unable to reach node. Ping test failed.', + ? (serverError.value?.message ?? formatMessage(messages.unknownLabel)) + : formatMessage(messages.nodePingFailed), type: 'block' as const, }, ]) const suspendedDescription = computed(() => { if (serverData.value?.suspension_reason === 'cancelled') { - return 'Your subscription has been cancelled.\nContact Modrinth Support if you believe this is an error.' + return formatMessage(messages.suspendedCancelledDescription) } if (serverData.value?.suspension_reason) { - return `Your server has been suspended: ${serverData.value.suspension_reason}\nContact Modrinth Support if you believe this is an error.` + return formatMessage(messages.suspendedReasonDescription, { + reason: serverData.value.suspension_reason, + }) } - return 'Your server has been suspended.\nContact Modrinth Support if you believe this is an error.' + return formatMessage(messages.suspendedDescription) }) const generalErrorDetails = computed(() => [ { - label: 'Server ID', + label: formatMessage(messages.serverIdLabel), value: props.serverId, type: 'inline' as const, }, { - label: 'Timestamp', + label: formatMessage(messages.timestampLabel), value: String(new Date().toISOString()), type: 'inline' as const, }, { - label: 'Error Name', + label: formatMessage(messages.errorNameLabel), value: serverError.value?.name, type: 'inline' as const, }, { - label: 'Error Message', + label: formatMessage(messages.errorMessageLabel), value: serverError.value?.message, type: 'block' as const, }, ...(serverError.value?.originalError ? [ { - label: 'Original Error', + label: formatMessage(messages.originalErrorLabel), value: String(serverError.value.originalError), type: 'hidden' as const, }, @@ -1172,7 +1374,7 @@ const generalErrorDetails = computed(() => [ ...(serverError.value?.stack ? [ { - label: 'Stack Trace', + label: formatMessage(messages.stackTraceLabel), value: serverError.value.stack, type: 'hidden' as const, }, @@ -1181,26 +1383,33 @@ const generalErrorDetails = computed(() => [ ]) const suspendedAction = computed(() => ({ - label: 'Go to billing settings', + label: formatMessage(messages.goToBillingSettings), onClick: () => props.navigateToBilling?.(), color: 'brand' as const, })) const generalErrorAction = computed(() => ({ - label: 'Go back to all servers', + label: formatMessage(messages.goBackToAllServers), onClick: () => props.navigateToServers?.(), color: 'brand' as const, })) const nodeUnavailableAction = computed(() => ({ - label: 'Reload', + label: formatMessage(messages.reload), onClick: () => props.reloadPage(), color: 'brand' as const, disabled: false, })) const copyServerDebugInfo = () => { - const debugInfo = `Server ID: ${serverData.value?.server_id}\nError: ${errorMessage.value}\nKind: ${serverData.value?.upstream?.kind}\nProject ID: ${serverData.value?.upstream?.project_id}\nVersion ID: ${serverData.value?.upstream?.version_id}\nLog: ${errorLog.value}` + const debugInfo = formatMessage(messages.debugInfo, { + serverId: serverData.value?.server_id ?? '', + error: errorMessage.value, + kind: serverData.value?.upstream?.kind ?? '', + projectId: serverData.value?.upstream?.project_id ?? '', + versionId: serverData.value?.upstream?.version_id ?? '', + log: errorLog.value, + }) navigator.clipboard.writeText(debugInfo) copied.value = true setTimeout(() => { diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue b/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue index 8079184675..2e6b9a70d2 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/worlds.vue @@ -10,10 +10,7 @@ class="min-h-[19.75rem] animate-pulse rounded-2xl border border-solid border-surface-5 bg-bg-raised shadow-xl" />
-
+
Do not attempt to purchase a new server." }, @@ -3221,15 +3317,39 @@ "servers.manage.error.title": { "defaultMessage": "Servers could not be loaded" }, + "servers.manage.error.unknown": { + "defaultMessage": "Unknown error" + }, "servers.manage.handle-error.title": { "defaultMessage": "An error occurred" }, + "servers.manage.install.retry-error": { + "defaultMessage": "Failed to retry installation" + }, + "servers.manage.nav.backups": { + "defaultMessage": "Backups" + }, + "servers.manage.nav.content": { + "defaultMessage": "Content" + }, + "servers.manage.nav.files": { + "defaultMessage": "Files" + }, + "servers.manage.nav.overview": { + "defaultMessage": "Overview" + }, + "servers.manage.nav.worlds": { + "defaultMessage": "Worlds" + }, "servers.manage.new-server-button": { "defaultMessage": "New server" }, "servers.manage.no-servers-found": { "defaultMessage": "No servers found." }, + "servers.manage.notice.dismiss-error": { + "defaultMessage": "Error dismissing notice" + }, "servers.manage.purchase-unavailable.text": { "defaultMessage": "Payment information is still loading. Opening checkout as soon as it is ready." }, @@ -3260,6 +3380,9 @@ "servers.manage.search-placeholder": { "defaultMessage": "Search {count} {count, plural, one {server} other {servers}}..." }, + "servers.manage.server-settings": { + "defaultMessage": "Server settings" + }, "servers.manage.servers-title": { "defaultMessage": "Modrinth Hosting" }, @@ -3272,6 +3395,69 @@ "servers.manage.settings-hint.title": { "defaultMessage": "Your server settings have moved" }, + "servers.manage.status.preparing.description": { + "defaultMessage": "Your server's hardware is being prepared and will be available shortly!" + }, + "servers.manage.status.preparing.title": { + "defaultMessage": "We're getting your server ready" + }, + "servers.manage.status.suspended.cancelled-description": { + "defaultMessage": "Your subscription has been cancelled.\nContact Modrinth Support if you believe this is an error." + }, + "servers.manage.status.suspended.description": { + "defaultMessage": "Your server has been suspended.\nContact Modrinth Support if you believe this is an error." + }, + "servers.manage.status.suspended.reason-description": { + "defaultMessage": "Your server has been suspended: {reason}\nContact Modrinth Support if you believe this is an error." + }, + "servers.manage.status.suspended.title": { + "defaultMessage": "Server suspended" + }, + "servers.manage.status.upgrading.description": { + "defaultMessage": "Your server's hardware is currently being upgraded and will be back online shortly!" + }, + "servers.manage.status.upgrading.title": { + "defaultMessage": "Server upgrading" + }, + "servers.manage.websocket.error": { + "defaultMessage": "Something went wrong..." + }, + "servers.manage.websocket.reconnecting": { + "defaultMessage": "Hang on, we're reconnecting to your server." + }, + "servers.manage.worlds.card.active": { + "defaultMessage": "Active" + }, + "servers.manage.worlds.card.create": { + "defaultMessage": "Create world" + }, + "servers.manage.worlds.card.created": { + "defaultMessage": "Created" + }, + "servers.manage.worlds.card.edit": { + "defaultMessage": "Edit world" + }, + "servers.manage.worlds.card.empty-description": { + "defaultMessage": "New world instance" + }, + "servers.manage.worlds.card.installed-content": { + "defaultMessage": "Installed content" + }, + "servers.manage.worlds.card.last-active": { + "defaultMessage": "Last active" + }, + "servers.manage.worlds.card.none": { + "defaultMessage": "None" + }, + "servers.manage.worlds.card.not-tracked-yet": { + "defaultMessage": "Not tracked yet" + }, + "servers.manage.worlds.card.settings": { + "defaultMessage": "World settings" + }, + "servers.manage.worlds.slot-name": { + "defaultMessage": "World #{index}" + }, "servers.medal-listing.countdown.remaining": { "defaultMessage": "{days} {days, plural, one {day} other {days}} {hours} {hours, plural, one {hour} other {hours}} {minutes} {minutes, plural, one {minute} other {minutes}} {seconds} {seconds, plural, one {second} other {seconds}} remaining..." }, From ce99c35288b5505f6efedbd4114a1cbfdeb6ce23 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Mon, 27 Apr 2026 14:13:17 +0100 Subject: [PATCH 3/3] feat: world card alignment --- .../layouts/wrapped/hosting/manage/components/WorldCard.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue b/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue index c338121c9f..fbf4244d45 100644 --- a/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue +++ b/packages/ui/src/layouts/wrapped/hosting/manage/components/WorldCard.vue @@ -74,8 +74,8 @@
-

{{ world.name }}

-

+

{{ world.name }}

+

{{ formatMessage(messages.newWorldInstance) }}

@@ -83,7 +83,7 @@
-