diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue
index 653b50ae2f..d2a0e75100 100644
--- a/apps/app-frontend/src/App.vue
+++ b/apps/app-frontend/src/App.vue
@@ -176,6 +176,7 @@ const {
handleBrowseModpacks,
searchModpacks,
getProjectVersions,
+ getLoaderManifest,
setModpackAlreadyInstalledModal,
handleModpackDuplicateCreateAnyway,
handleModpackDuplicateGoToInstance,
@@ -1108,6 +1109,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
:fetch-existing-instance-names="fetchExistingInstanceNames"
:search-modpacks="searchModpacks"
:get-project-versions="getProjectVersions"
+ :get-loader-manifest="getLoaderManifest"
@create="handleCreate"
@browse-modpacks="handleBrowseModpacks"
/>
diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json
index f7f558ae65..b67cec96ea 100644
--- a/apps/app-frontend/src/locales/en-US/index.json
+++ b/apps/app-frontend/src/locales/en-US/index.json
@@ -38,6 +38,18 @@
"app.browse.install-content-to-instance": {
"message": "Install content to instance"
},
+ "app.browse.project-type.modpacks": {
+ "message": "Modpacks"
+ },
+ "app.browse.server.install": {
+ "message": "Install"
+ },
+ "app.browse.server.installed": {
+ "message": "Installed"
+ },
+ "app.browse.server.installing": {
+ "message": "Installing"
+ },
"app.export-modal.description-placeholder": {
"message": "Enter modpack description..."
},
diff --git a/apps/app-frontend/src/pages/Browse.vue b/apps/app-frontend/src/pages/Browse.vue
index dcbe484463..ccf5039a24 100644
--- a/apps/app-frontend/src/pages/Browse.vue
+++ b/apps/app-frontend/src/pages/Browse.vue
@@ -34,6 +34,7 @@ import { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'
import ContextMenu from '@/components/ui/ContextMenu.vue'
import { get_project_v3, get_search_results_v3 } from '@/helpers/cache.js'
import { process_listener } from '@/helpers/events'
+import { get_loader_versions as getLoaderManifest } from '@/helpers/metadata'
import { get_by_profile_path } from '@/helpers/process'
import {
get as getInstance,
@@ -441,10 +442,26 @@ const messages = defineMessages({
id: 'app.browse.install-content-to-instance',
defaultMessage: 'Install content to instance',
},
+ installToServer: {
+ id: 'app.browse.server.install',
+ defaultMessage: 'Install',
+ },
+ installedToServer: {
+ id: 'app.browse.server.installed',
+ defaultMessage: 'Installed',
+ },
+ installingToServer: {
+ id: 'app.browse.server.installing',
+ defaultMessage: 'Installing',
+ },
modLoaderProvidedByInstance: {
id: 'search.filter.locked.instance-loader.title',
defaultMessage: 'Loader is provided by the instance',
},
+ modpacksProjectType: {
+ id: 'app.browse.project-type.modpacks',
+ defaultMessage: 'Modpacks',
+ },
modLoaderProvidedByServer: {
id: 'search.filter.locked.server-loader.title',
defaultMessage: 'Loader is provided by the server',
@@ -550,7 +567,9 @@ const selectableProjectTypes = computed(() => {
const suffix = queryString ? `?${queryString}` : ''
if (isSetupServerContext.value) {
- return [{ label: 'Modpacks', href: `/browse/modpack${suffix}` }]
+ return [
+ { label: formatMessage(messages.modpacksProjectType), href: `/browse/modpack${suffix}` },
+ ]
}
if (isFromWorlds.value) {
@@ -730,7 +749,13 @@ function getCardActions(
return [
{
key: 'install',
- label: isInstalling ? 'Installing' : isInstalled ? 'Installed' : 'Install',
+ label: formatMessage(
+ isInstalling
+ ? messages.installingToServer
+ : isInstalled
+ ? messages.installedToServer
+ : messages.installToServer,
+ ),
icon: isInstalled ? CheckIcon : PlusIcon,
disabled: isInstalled || isInstalling,
color: 'brand',
@@ -972,6 +997,7 @@ provideBrowseManager({
:on-back="onServerFlowBack"
:search-modpacks="searchServerModpacks"
:get-project-versions="getServerProjectVersions"
+ :get-loader-manifest="getLoaderManifest"
@hide="() => {}"
@browse-modpacks="() => {}"
@create="handleServerModpackFlowCreate"
diff --git a/apps/app-frontend/src/providers/setup/creation-modal.ts b/apps/app-frontend/src/providers/setup/creation-modal.ts
index 4020fe8b37..a08fd4f51a 100644
--- a/apps/app-frontend/src/providers/setup/creation-modal.ts
+++ b/apps/app-frontend/src/providers/setup/creation-modal.ts
@@ -11,6 +11,7 @@ import type ModpackAlreadyInstalledModal from '@/components/ui/modal/ModpackAlre
import { trackEvent } from '@/helpers/analytics'
import { get_project_versions, get_search_results } from '@/helpers/cache.js'
import { import_instance } from '@/helpers/import.js'
+import { get_loader_versions as getLoaderManifest } from '@/helpers/metadata.js'
import { create_profile_and_install, create_profile_and_install_from_file } from '@/helpers/pack'
import { create, list } from '@/helpers/profile.js'
import type { InstanceLoader } from '@/helpers/types'
@@ -165,6 +166,7 @@ export function setupCreationModal(notificationManager: AbstractWebNotificationM
handleBrowseModpacks,
searchModpacks,
getProjectVersions,
+ getLoaderManifest,
setModpackAlreadyInstalledModal,
handleModpackDuplicateCreateAnyway,
handleModpackDuplicateGoToInstance,
diff --git a/apps/frontend/src/pages/admin/emails.vue b/apps/frontend/src/pages/admin/emails.vue
index 232b77ef63..3b7674b4c8 100644
--- a/apps/frontend/src/pages/admin/emails.vue
+++ b/apps/frontend/src/pages/admin/emails.vue
@@ -1,6 +1,6 @@
diff --git a/packages/ui/src/components/flows/creation-flow-modal/components/ImportInstanceStage.vue b/packages/ui/src/components/flows/creation-flow-modal/components/ImportInstanceStage.vue
index b10cff0330..1e56011c95 100644
--- a/packages/ui/src/components/flows/creation-flow-modal/components/ImportInstanceStage.vue
+++ b/packages/ui/src/components/flows/creation-flow-modal/components/ImportInstanceStage.vue
@@ -2,19 +2,21 @@
- Launcher instances
+ {{
+ formatMessage(messages.launcherInstancesTitle)
+ }}
-
+
- Detecting launcher instances...
+ {{ formatMessage(messages.detectingLauncherInstances) }}
@@ -23,7 +25,7 @@
v-if="ctx.importLaunchers.value.length > 0"
v-model="ctx.importSearchQuery.value"
:icon="SearchIcon"
- placeholder="Search instance name"
+ :placeholder="formatMessage(messages.searchInstanceNamePlaceholder)"
/>
@@ -75,7 +77,9 @@
-
+
@@ -83,10 +87,14 @@
>
-
+
@@ -96,6 +104,7 @@
diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json
index 816b286a68..764dbdd55f 100644
--- a/packages/ui/src/locales/en-US/index.json
+++ b/packages/ui/src/locales/en-US/index.json
@@ -491,6 +491,276 @@
"content.selection-bar.selected-count-simple": {
"defaultMessage": "{count, number} selected"
},
+ "creation-flow.button.create-instance": {
+ "defaultMessage": "Create instance"
+ },
+ "creation-flow.button.create-world": {
+ "defaultMessage": "Create world"
+ },
+ "creation-flow.button.finish": {
+ "defaultMessage": "Finish"
+ },
+ "creation-flow.button.import": {
+ "defaultMessage": "Import"
+ },
+ "creation-flow.button.import-instances": {
+ "defaultMessage": "Import {count, plural, one {# instance} other {# instances}}"
+ },
+ "creation-flow.button.setup-server": {
+ "defaultMessage": "Setup server"
+ },
+ "creation-flow.modal.custom-setup.build-number.label": {
+ "defaultMessage": "Build number"
+ },
+ "creation-flow.modal.custom-setup.build-number.placeholder": {
+ "defaultMessage": "Select build number"
+ },
+ "creation-flow.modal.custom-setup.build-number.search-placeholder": {
+ "defaultMessage": "Search build number..."
+ },
+ "creation-flow.modal.custom-setup.content-loader.label": {
+ "defaultMessage": "Content loader"
+ },
+ "creation-flow.modal.custom-setup.game-version.placeholder": {
+ "defaultMessage": "Select game version"
+ },
+ "creation-flow.modal.custom-setup.game-version.search-placeholder": {
+ "defaultMessage": "Search game version..."
+ },
+ "creation-flow.modal.custom-setup.icon.remove": {
+ "defaultMessage": "Remove icon"
+ },
+ "creation-flow.modal.custom-setup.icon.select": {
+ "defaultMessage": "Select icon"
+ },
+ "creation-flow.modal.custom-setup.loader-version-type.latest": {
+ "defaultMessage": "Latest"
+ },
+ "creation-flow.modal.custom-setup.loader-version-type.other": {
+ "defaultMessage": "Other"
+ },
+ "creation-flow.modal.custom-setup.loader-version-type.stable": {
+ "defaultMessage": "Stable"
+ },
+ "creation-flow.modal.custom-setup.loader-version.label": {
+ "defaultMessage": "Loader version"
+ },
+ "creation-flow.modal.custom-setup.loader-version.placeholder": {
+ "defaultMessage": "Select loader version"
+ },
+ "creation-flow.modal.custom-setup.loader-version.search-placeholder": {
+ "defaultMessage": "Search loader version..."
+ },
+ "creation-flow.modal.custom-setup.loader.label": {
+ "defaultMessage": "Loader"
+ },
+ "creation-flow.modal.custom-setup.name.label": {
+ "defaultMessage": "Name"
+ },
+ "creation-flow.modal.custom-setup.name.placeholder": {
+ "defaultMessage": "Enter instance name"
+ },
+ "creation-flow.modal.custom-setup.options.no-versions-available": {
+ "defaultMessage": "No versions available"
+ },
+ "creation-flow.modal.final-config.additional-settings.title": {
+ "defaultMessage": "Additional settings"
+ },
+ "creation-flow.modal.final-config.backup.before-reset-server.name": {
+ "defaultMessage": "Before reset server"
+ },
+ "creation-flow.modal.final-config.difficulty.easy": {
+ "defaultMessage": "Easy"
+ },
+ "creation-flow.modal.final-config.difficulty.hard": {
+ "defaultMessage": "Hard"
+ },
+ "creation-flow.modal.final-config.difficulty.label": {
+ "defaultMessage": "Difficulty"
+ },
+ "creation-flow.modal.final-config.difficulty.normal": {
+ "defaultMessage": "Normal"
+ },
+ "creation-flow.modal.final-config.difficulty.peaceful": {
+ "defaultMessage": "Peaceful"
+ },
+ "creation-flow.modal.final-config.game-version.placeholder": {
+ "defaultMessage": "Select game version"
+ },
+ "creation-flow.modal.final-config.gamemode.creative": {
+ "defaultMessage": "Creative"
+ },
+ "creation-flow.modal.final-config.gamemode.hardcore": {
+ "defaultMessage": "Hardcore"
+ },
+ "creation-flow.modal.final-config.gamemode.label": {
+ "defaultMessage": "Gamemode"
+ },
+ "creation-flow.modal.final-config.gamemode.survival": {
+ "defaultMessage": "Survival"
+ },
+ "creation-flow.modal.final-config.generate-structures.description": {
+ "defaultMessage": "Controls whether villages, strongholds, and other structures generate in new chunks."
+ },
+ "creation-flow.modal.final-config.generate-structures.label": {
+ "defaultMessage": "Generate structures"
+ },
+ "creation-flow.modal.final-config.generator-settings-json.placeholder": {
+ "defaultMessage": "Enter generator settings JSON"
+ },
+ "creation-flow.modal.final-config.generator-settings.custom": {
+ "defaultMessage": "Custom"
+ },
+ "creation-flow.modal.final-config.generator-settings.default": {
+ "defaultMessage": "Default"
+ },
+ "creation-flow.modal.final-config.generator-settings.description": {
+ "defaultMessage": "Used for advanced world customization such as custom Superflat layers."
+ },
+ "creation-flow.modal.final-config.generator-settings.flat": {
+ "defaultMessage": "Flat"
+ },
+ "creation-flow.modal.final-config.generator-settings.label": {
+ "defaultMessage": "Generator settings"
+ },
+ "creation-flow.modal.final-config.generator-settings.placeholder": {
+ "defaultMessage": "Select generator settings"
+ },
+ "creation-flow.modal.final-config.world-name.label": {
+ "defaultMessage": "World name"
+ },
+ "creation-flow.modal.final-config.world-name.placeholder": {
+ "defaultMessage": "Enter world name"
+ },
+ "creation-flow.modal.final-config.world-seed.description": {
+ "defaultMessage": "Leave blank for a random seed."
+ },
+ "creation-flow.modal.final-config.world-seed.label-with-optional": {
+ "defaultMessage": "World seed (Optional)"
+ },
+ "creation-flow.modal.final-config.world-seed.placeholder": {
+ "defaultMessage": "Enter world seed"
+ },
+ "creation-flow.modal.final-config.world-type.amplified": {
+ "defaultMessage": "Amplified"
+ },
+ "creation-flow.modal.final-config.world-type.default": {
+ "defaultMessage": "Default"
+ },
+ "creation-flow.modal.final-config.world-type.label": {
+ "defaultMessage": "World type"
+ },
+ "creation-flow.modal.final-config.world-type.large-biomes": {
+ "defaultMessage": "Large Biomes"
+ },
+ "creation-flow.modal.final-config.world-type.placeholder": {
+ "defaultMessage": "Select world type"
+ },
+ "creation-flow.modal.final-config.world-type.single-biome": {
+ "defaultMessage": "Single Biome"
+ },
+ "creation-flow.modal.final-config.world-type.superflat": {
+ "defaultMessage": "Superflat"
+ },
+ "creation-flow.modal.import-instance.action.add": {
+ "defaultMessage": "Add"
+ },
+ "creation-flow.modal.import-instance.custom-launcher.name": {
+ "defaultMessage": "Custom ({pathName})"
+ },
+ "creation-flow.modal.import-instance.detecting-launcher-instances": {
+ "defaultMessage": "Detecting launcher instances..."
+ },
+ "creation-flow.modal.import-instance.launcher-instances.title": {
+ "defaultMessage": "Launcher instances"
+ },
+ "creation-flow.modal.import-instance.launcher-path.add": {
+ "defaultMessage": "Add launcher path"
+ },
+ "creation-flow.modal.import-instance.launcher-path.placeholder": {
+ "defaultMessage": "Path to launcher..."
+ },
+ "creation-flow.modal.import-instance.notification.no-instances-found.text": {
+ "defaultMessage": "No importable instances were found at the specified path."
+ },
+ "creation-flow.modal.import-instance.notification.no-instances-found.title": {
+ "defaultMessage": "No instances found"
+ },
+ "creation-flow.modal.import-instance.search.placeholder": {
+ "defaultMessage": "Search instance name"
+ },
+ "creation-flow.modal.import-instance.selection.clear-all": {
+ "defaultMessage": "Clear all"
+ },
+ "creation-flow.modal.modpack.action.browse": {
+ "defaultMessage": "Browse modpacks"
+ },
+ "creation-flow.modal.modpack.action.import": {
+ "defaultMessage": "Import modpack"
+ },
+ "creation-flow.modal.modpack.known-modpack.prompt": {
+ "defaultMessage": "Already know the modpack you want to install?"
+ },
+ "creation-flow.modal.modpack.search.no-results": {
+ "defaultMessage": "No results found"
+ },
+ "creation-flow.modal.modpack.search.placeholder": {
+ "defaultMessage": "Search for modpack"
+ },
+ "creation-flow.modal.setup-type.instance.description": {
+ "defaultMessage": "An instance is a Minecraft setup with a specific loader, version, and mods."
+ },
+ "creation-flow.modal.setup-type.option.custom-setup.description": {
+ "defaultMessage": "Start from scratch by picking a loader and game version."
+ },
+ "creation-flow.modal.setup-type.option.custom-setup.title": {
+ "defaultMessage": "Custom setup"
+ },
+ "creation-flow.modal.setup-type.option.import-instance.description": {
+ "defaultMessage": "Import an instance from Prism, CurseForge, or similar."
+ },
+ "creation-flow.modal.setup-type.option.import-instance.title": {
+ "defaultMessage": "Import instance"
+ },
+ "creation-flow.modal.setup-type.option.modpack-base.description": {
+ "defaultMessage": "Use a popular modpack or upload one as your starting point."
+ },
+ "creation-flow.modal.setup-type.option.modpack-base.title": {
+ "defaultMessage": "Modpack base"
+ },
+ "creation-flow.modal.setup-type.option.vanilla-minecraft.description": {
+ "defaultMessage": "Classic Minecraft with no mods or plugins."
+ },
+ "creation-flow.modal.setup-type.option.vanilla-minecraft.title": {
+ "defaultMessage": "Vanilla Minecraft"
+ },
+ "creation-flow.modal.setup-type.title.installation": {
+ "defaultMessage": "Select installation type"
+ },
+ "creation-flow.modal.setup-type.title.instance": {
+ "defaultMessage": "Choose instance type"
+ },
+ "creation-flow.modal.setup-type.title.world": {
+ "defaultMessage": "Select world type"
+ },
+ "creation-flow.title.choose-modpack": {
+ "defaultMessage": "Choose modpack"
+ },
+ "creation-flow.title.create-instance": {
+ "defaultMessage": "Create instance"
+ },
+ "creation-flow.title.create-world": {
+ "defaultMessage": "Create world"
+ },
+ "creation-flow.title.import-instance": {
+ "defaultMessage": "Import instance"
+ },
+ "creation-flow.title.reset-server": {
+ "defaultMessage": "Reset server"
+ },
+ "creation-flow.title.set-up-server": {
+ "defaultMessage": "Set up server"
+ },
"files.conflict-modal.header": {
"defaultMessage": "Extract summary"
},
@@ -3062,6 +3332,51 @@
"servers.region.western-europe": {
"defaultMessage": "Western Europe"
},
+ "servers.setup.onboarding.installation-failed.text": {
+ "defaultMessage": "An unexpected error occurred while installing. Please try again later."
+ },
+ "servers.setup.onboarding.installation-failed.title": {
+ "defaultMessage": "Installation failed"
+ },
+ "servers.setup.onboarding.modpack-upload-failed.text": {
+ "defaultMessage": "An unexpected error occurred while uploading. Please try again later."
+ },
+ "servers.setup.onboarding.modpack-upload-failed.title": {
+ "defaultMessage": "Modpack upload failed"
+ },
+ "servers.setup.onboarding.setup-server.button": {
+ "defaultMessage": "Setup server"
+ },
+ "servers.setup.onboarding.step.choose.description": {
+ "defaultMessage": "Pick your favorite modpack from Modrinth, or choose a loader and add the mods you want."
+ },
+ "servers.setup.onboarding.step.choose.title": {
+ "defaultMessage": "Choose what to play"
+ },
+ "servers.setup.onboarding.step.configure-world.description": {
+ "defaultMessage": "Set up your world just like singleplayer. Choose your gamemode and world seed."
+ },
+ "servers.setup.onboarding.step.configure-world.title": {
+ "defaultMessage": "Configure your world"
+ },
+ "servers.setup.onboarding.step.invite-friends.description": {
+ "defaultMessage": "Share your server with friends by copying the address and letting them know which mods they'll need to join."
+ },
+ "servers.setup.onboarding.step.invite-friends.title": {
+ "defaultMessage": "Invite your friends"
+ },
+ "servers.setup.onboarding.steps.heading": {
+ "defaultMessage": "Setup your server (~2mins)"
+ },
+ "servers.setup.onboarding.uploading.progress": {
+ "defaultMessage": "Uploading ({percent, number}%)"
+ },
+ "servers.setup.onboarding.welcome.description": {
+ "defaultMessage": "Your server is ready. Here's what you need to do to start playing!"
+ },
+ "servers.setup.onboarding.welcome.title": {
+ "defaultMessage": "Welcome to Modrinth Hosting"
+ },
"servers.setup.rate-limit.text": {
"defaultMessage": "You are being rate limited. Please try again later."
},