-
-
- {{ formatMessage(messages.downloading, { version: downloadingVersion }) }}
-
-
-
+
+
+ {{ formatMessage(messages.downloading, { version: downloadingVersion }) }}
+
+
{{ formatMessage(developerModeEnabled) }}
diff --git a/apps/app-frontend/src/features/settings/instance-defaults/java-and-memory-settings/index.vue b/apps/app-frontend/src/features/settings/instance-defaults/java-and-memory-settings/index.vue
index f7f8c0e1acf..29b62b4133d 100644
--- a/apps/app-frontend/src/features/settings/instance-defaults/java-and-memory-settings/index.vue
+++ b/apps/app-frontend/src/features/settings/instance-defaults/java-and-memory-settings/index.vue
@@ -1,8 +1,8 @@
+
- {{ formatMessage(messages.javaLocation, { version: javaVersion }) }}
+ {{ formatMessage(messages.javaLocation, { version: majorVersion }) }}
updateJavaVersion(majorVersion, selection)"
/>
diff --git a/apps/app-frontend/src/helpers/instance.ts b/apps/app-frontend/src/helpers/instance.ts
index 72eb4686d8d..2e3ed494b6b 100644
--- a/apps/app-frontend/src/helpers/instance.ts
+++ b/apps/app-frontend/src/helpers/instance.ts
@@ -397,17 +397,6 @@ export async function rebuild_synced_options(instanceId?: string): Promise
return await invoke('plugin:instance|instance_rebuild_synced_options', { instanceId })
}
-export interface JavaVersion {
- parsed_version: number
- version: string
- architecture: string
- path: string
-}
-
-export async function get_optimal_jre_key(instanceId: string): Promise {
- return await invoke('plugin:instance|instance_get_optimal_jre_key', { instanceId })
-}
-
export async function list(): Promise {
return await invoke('plugin:instance|instance_list')
}
diff --git a/apps/app-frontend/src/helpers/jre.js b/apps/app-frontend/src/helpers/jre.js
deleted file mode 100644
index 294606a5761..00000000000
--- a/apps/app-frontend/src/helpers/jre.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * All theseus API calls return serialized values (both return values and errors);
- * So, for example, addDefaultInstance creates a blank instance object, where the Rust struct is serialized,
- * and deserialized into a usable JS object.
- */
-import { queryOptions } from '@tanstack/vue-query'
-import { invoke } from '@tauri-apps/api/core'
-
-/*
-
-JavaVersion {
- path: Path
- version: String
-}
-
-*/
-
-export async function get_java_versions() {
- return await invoke('plugin:jre|get_java_versions')
-}
-
-export async function set_java_version(javaVersion) {
- return await invoke('plugin:jre|set_java_version', { javaVersion })
-}
-
-// Finds all the installation of Java 7, if it exists
-// Returns [JavaVersion]
-export async function find_filtered_jres(version) {
- return await invoke('plugin:jre|jre_find_filtered_jres', { version })
-}
-
-// Gets java version from a specific path by trying to run 'java -version' on it.
-// This also validates it, as it returns null if no valid java version is found at the path
-export async function get_jre(path) {
- return await invoke('plugin:jre|jre_get_jre', { path })
-}
-
-// Tests JRE version by running 'java -version' on it.
-// Returns true if the version is valid, and matches given (after extraction)
-export async function test_jre(path, majorVersion) {
- return await invoke('plugin:jre|jre_test_jre', { path, majorVersion })
-}
-
-// Automatically installs specified java version
-export async function auto_install_java(javaVersion) {
- return await invoke('plugin:jre|jre_auto_install_java', { javaVersion })
-}
-
-// Get max memory in KiB
-export async function get_max_memory() {
- return await invoke('plugin:jre|jre_get_max_memory')
-}
-
-export function maxMemoryQueryOptions() {
- return queryOptions({
- queryKey: ['system', 'memory', 'total'],
- networkMode: 'always',
- queryFn: get_max_memory,
- staleTime: Infinity,
- gcTime: Infinity,
- })
-}
diff --git a/apps/app-frontend/src/locales/ar-SA/index.json b/apps/app-frontend/src/locales/ar-SA/index.json
index 418ff447944..b05f9f6c6a3 100644
--- a/apps/app-frontend/src/locales/ar-SA/index.json
+++ b/apps/app-frontend/src/locales/ar-SA/index.json
@@ -953,27 +953,18 @@
"app.java-detection.title": {
"message": "حدد تثبيت Java"
},
- "app.java-selector.already-installed": {
- "message": "مثبت بالفعل"
- },
"app.java-selector.browse": {
"message": "تصفح"
},
"app.java-selector.detect": {
"message": "كشف"
},
- "app.java-selector.install-recommended": {
- "message": "التثبيت موصى به"
- },
"app.java-selector.installing": {
"message": "جاري التثبيت..."
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "اختبار تثبيت Java"
- },
"app.library.actions.label": {
"message": "إجراءات المكتبة"
},
@@ -3863,9 +3854,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "أدخل أمر ما قبل الإطلاق..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "إجراءات تشغيل اللعب إضافية مخصصة"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "تعمل الخطافات (Hooks) في مجلد العمل الخاص بالنسخة، مع المتغيرات التالية:"
},
@@ -3986,9 +3974,6 @@
"instance.settings.tabs.synced-options.shared-settings.description": {
"message": "تمكين تجاوز للحفاظ على إعدادات متزامنة منفصلة لهذه النسخة."
},
- "instance.settings.tabs.window": {
- "message": "إعدادات نافذة مخصصة"
- },
"instance.settings.tabs.window.fullscreen": {
"message": "ملء الشاشة"
},
diff --git a/apps/app-frontend/src/locales/cs-CZ/index.json b/apps/app-frontend/src/locales/cs-CZ/index.json
index d867b6325ed..91e5eefb2da 100644
--- a/apps/app-frontend/src/locales/cs-CZ/index.json
+++ b/apps/app-frontend/src/locales/cs-CZ/index.json
@@ -1019,27 +1019,18 @@
"app.java-detection.title": {
"message": "Vybrat instalaci Javy"
},
- "app.java-selector.already-installed": {
- "message": "Již nainstalováno"
- },
"app.java-selector.browse": {
"message": "Procházet"
},
"app.java-selector.detect": {
"message": "Detekovat"
},
- "app.java-selector.install-recommended": {
- "message": "Doporučeno nainstalovat"
- },
"app.java-selector.installing": {
"message": "Instalování..."
},
"app.java-selector.path.placeholder": {
"message": "/cesta/k/javě"
},
- "app.java-selector.test-installation": {
- "message": "Otestovat instalaci Javy"
- },
"app.library.actions.label": {
"message": "Akce knihovny"
},
diff --git a/apps/app-frontend/src/locales/de-CH/index.json b/apps/app-frontend/src/locales/de-CH/index.json
index cac11107450..ba94be9bc8d 100644
--- a/apps/app-frontend/src/locales/de-CH/index.json
+++ b/apps/app-frontend/src/locales/de-CH/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Java-Installation auswählen"
},
- "app.java-selector.already-installed": {
- "message": "Bereits installiert"
- },
"app.java-selector.browse": {
"message": "Durchsuchen"
},
"app.java-selector.detect": {
"message": "Erkennen"
},
- "app.java-selector.install-recommended": {
- "message": "Empfohlenes installieren"
- },
"app.java-selector.installing": {
"message": "Wird installiert..."
},
"app.java-selector.path.placeholder": {
"message": "/pfad/zu/java"
},
- "app.java-selector.test-installation": {
- "message": "Java-Installation testen"
- },
"app.library.actions.label": {
"message": "Bibliotheksaktionen"
},
@@ -4094,9 +4085,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Ausgeführter Befehl nach dem Starten des Spiels eingeben..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Eigene Hooks für den Spielstart"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Hooks werden im Arbeitsverzeichnis der Instanz mit den folgenden Variablen ausgeführt:"
},
@@ -4229,9 +4217,6 @@
"instance.settings.tabs.syncing": {
"message": "Synchronisierung"
},
- "instance.settings.tabs.window": {
- "message": "Benutzerdefinierte Fenstereinstellungen"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Deine Instanz verwendet die vorgegebenen Fenstereinstellungen, solange du diese hier nicht überschreibst."
},
diff --git a/apps/app-frontend/src/locales/de-DE/index.json b/apps/app-frontend/src/locales/de-DE/index.json
index f6024bf086d..5e6e7e90042 100644
--- a/apps/app-frontend/src/locales/de-DE/index.json
+++ b/apps/app-frontend/src/locales/de-DE/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Java-Installation auswählen"
},
- "app.java-selector.already-installed": {
- "message": "Bereits installiert"
- },
"app.java-selector.browse": {
"message": "Durchsuchen"
},
"app.java-selector.detect": {
"message": "Erkennen"
},
- "app.java-selector.install-recommended": {
- "message": "Empfohlenes installieren"
- },
"app.java-selector.installing": {
"message": "Wird installiert..."
},
"app.java-selector.path.placeholder": {
"message": "/pfad/zu/java"
},
- "app.java-selector.test-installation": {
- "message": "Java-Installation testen"
- },
"app.library.actions.label": {
"message": "Bibliotheksaktionen"
},
@@ -4094,9 +4085,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Vor dem Start auszuführenden Befehl eingeben..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Eigene Hooks für den Spielstart"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Hooks werden im Arbeitsverzeichnis der Instanz mit den folgenden Variablen ausgeführt:"
},
@@ -4229,9 +4217,6 @@
"instance.settings.tabs.syncing": {
"message": "Synchronisierung"
},
- "instance.settings.tabs.window": {
- "message": "Benutzerdefinierte Fenstereinstellungen"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Deine Instanz verwendet die vorgegebenen Fenstereinstellungen, solange du diese hier nicht überschreibst."
},
diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json
index ea544deade9..55356c89c81 100644
--- a/apps/app-frontend/src/locales/en-US/index.json
+++ b/apps/app-frontend/src/locales/en-US/index.json
@@ -1022,26 +1022,47 @@
"app.java-detection.title": {
"message": "Select Java installation"
},
- "app.java-selector.already-installed": {
- "message": "Already installed"
- },
"app.java-selector.browse": {
"message": "Browse"
},
+ "app.java-selector.copy-failed-title": {
+ "message": "Failed to copy path"
+ },
+ "app.java-selector.copy-path": {
+ "message": "Copy path"
+ },
"app.java-selector.detect": {
"message": "Detect"
},
- "app.java-selector.install-recommended": {
- "message": "Install recommended"
+ "app.java-selector.edit-path": {
+ "message": "Edit path"
+ },
+ "app.java-selector.install-java": {
+ "message": "Install Java {version}"
},
"app.java-selector.installing": {
"message": "Installing..."
},
+ "app.java-selector.invalid": {
+ "message": "Invalid"
+ },
+ "app.java-selector.more-options": {
+ "message": "More Java options"
+ },
+ "app.java-selector.not-set": {
+ "message": "No Java selected"
+ },
+ "app.java-selector.path-copied-text": {
+ "message": "The Java path has been copied to your clipboard."
+ },
+ "app.java-selector.path-copied-title": {
+ "message": "Path copied"
+ },
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "Test Java installation"
+ "app.java-selector.valid": {
+ "message": "Valid"
},
"app.library.actions.label": {
"message": "Library actions"
@@ -3995,6 +4016,12 @@
"instance.settings.defaults.open-app-settings": {
"message": "Manage default settings"
},
+ "instance.settings.reset-setting-to-default": {
+ "message": "Reset {setting} to default"
+ },
+ "instance.settings.reset-to-default": {
+ "message": "Reset to default"
+ },
"instance.settings.sidebar.label.game": {
"message": "Game"
},
@@ -4145,9 +4172,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Enter pre-launch command..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Custom game launch hooks"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Hooks run in the working directory of the instance, with the following variables:"
},
@@ -4197,19 +4221,19 @@
"message": "Enter Java arguments..."
},
"instance.settings.tabs.java.environment-variables": {
- "message": "Custom environment variables"
+ "message": "Environment variables"
},
"instance.settings.tabs.java.hooks": {
"message": "Hooks"
},
"instance.settings.tabs.java.java-arguments": {
- "message": "Custom Java arguments"
+ "message": "Java arguments"
},
"instance.settings.tabs.java.java-installation": {
- "message": "Custom Java installation"
+ "message": "Java installation"
},
"instance.settings.tabs.java.java-memory": {
- "message": "Custom memory allocation"
+ "message": "Memory allocation"
},
"instance.settings.tabs.java.java-path-placeholder": {
"message": "/path/to/java"
@@ -4217,6 +4241,9 @@
"instance.settings.tabs.java.label": {
"message": "Java and memory"
},
+ "instance.settings.tabs.java.recommended-java-version": {
+ "message": "Java {version} is recommended for the Minecraft version of this instance."
+ },
"instance.settings.tabs.sharing": {
"message": "Sharing"
},
@@ -4280,9 +4307,6 @@
"instance.settings.tabs.syncing": {
"message": "Syncing"
},
- "instance.settings.tabs.window": {
- "message": "Custom window settings"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Your instance uses the default window settings unless you override them here."
},
@@ -4313,6 +4337,9 @@
"instance.settings.tabs.window.width.enter": {
"message": "Enter width..."
},
+ "instance.settings.using-defaults": {
+ "message": "Using defaults"
+ },
"instance.shared-instance.error.title": {
"message": "Something has gone wrong"
},
diff --git a/apps/app-frontend/src/locales/es-419/index.json b/apps/app-frontend/src/locales/es-419/index.json
index 6dcf99bf87a..d9a0bbe2957 100644
--- a/apps/app-frontend/src/locales/es-419/index.json
+++ b/apps/app-frontend/src/locales/es-419/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Seleccionar instalación de Java"
},
- "app.java-selector.already-installed": {
- "message": "Ya está instalado"
- },
"app.java-selector.browse": {
"message": "Buscar"
},
"app.java-selector.detect": {
"message": "Detectar"
},
- "app.java-selector.install-recommended": {
- "message": "Instalar recomendado"
- },
"app.java-selector.installing": {
"message": "Instalando..."
},
"app.java-selector.path.placeholder": {
"message": "/ruta/a/java"
},
- "app.java-selector.test-installation": {
- "message": "Probar instalación de Java"
- },
"app.library.actions.label": {
"message": "Acciones de la Biblioteca"
},
@@ -4076,9 +4067,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Introduce el comando pre-inicio..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Hooks del juego personalizados"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Todas estas se ejecutan en el directorio de trabajo de la instancia, con las siguientes variables:"
},
@@ -4211,9 +4199,6 @@
"instance.settings.tabs.syncing": {
"message": "Sincronización"
},
- "instance.settings.tabs.window": {
- "message": "Configuración de ventanas personalizadas"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "La instancia utiliza la configuración de la ventana predeterminada a menos que los sobrescriba aquí."
},
diff --git a/apps/app-frontend/src/locales/es-ES/index.json b/apps/app-frontend/src/locales/es-ES/index.json
index 57de55b745f..c7467d77255 100644
--- a/apps/app-frontend/src/locales/es-ES/index.json
+++ b/apps/app-frontend/src/locales/es-ES/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Seleccionar instalación de Java"
},
- "app.java-selector.already-installed": {
- "message": "Ya instalado"
- },
"app.java-selector.browse": {
"message": "Explorar"
},
"app.java-selector.detect": {
"message": "Detectar"
},
- "app.java-selector.install-recommended": {
- "message": "Instalación recomendada"
- },
"app.java-selector.installing": {
"message": "Instalando..."
},
"app.java-selector.path.placeholder": {
"message": "/ruta/a/java"
},
- "app.java-selector.test-installation": {
- "message": "Probar instalación de Java"
- },
"app.library.actions.label": {
"message": "Acciones de la librería"
},
@@ -4076,9 +4067,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Introducir comando previo al lanzamiento..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Hooks de lanzamiento de juego personalizados"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Todas estas se ejecutan en el directorio de trabajo de la instancia, con las siguientes variables:"
},
@@ -4211,9 +4199,6 @@
"instance.settings.tabs.syncing": {
"message": "Sincronizando"
},
- "instance.settings.tabs.window": {
- "message": "Configuración de ventanas personalizadas"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Tu instancia utiliza los ajustes de ventana predeterminados a menos que los cambies aquí."
},
diff --git a/apps/app-frontend/src/locales/fi-FI/index.json b/apps/app-frontend/src/locales/fi-FI/index.json
index 56d91e8997c..05685985a59 100644
--- a/apps/app-frontend/src/locales/fi-FI/index.json
+++ b/apps/app-frontend/src/locales/fi-FI/index.json
@@ -905,9 +905,6 @@
"app.java-detection.selected": {
"message": "Valittu"
},
- "app.java-selector.already-installed": {
- "message": "On jo asennettu"
- },
"app.java-selector.installing": {
"message": "Asennetaan..."
},
diff --git a/apps/app-frontend/src/locales/fr-FR/index.json b/apps/app-frontend/src/locales/fr-FR/index.json
index 410fcadd04e..9049284ef6e 100644
--- a/apps/app-frontend/src/locales/fr-FR/index.json
+++ b/apps/app-frontend/src/locales/fr-FR/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Sélectionner l'installation Java"
},
- "app.java-selector.already-installed": {
- "message": "Déjà installé"
- },
"app.java-selector.browse": {
"message": "Naviguer"
},
"app.java-selector.detect": {
"message": "Détecter"
},
- "app.java-selector.install-recommended": {
- "message": "Télécharger les fichiers recommandés"
- },
"app.java-selector.installing": {
"message": "Installation..."
},
"app.java-selector.path.placeholder": {
"message": "/chemin/vers/java"
},
- "app.java-selector.test-installation": {
- "message": "Tester l'installation Java"
- },
"app.library.actions.label": {
"message": "Actions de la bibliothèque"
},
@@ -4022,9 +4013,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Entrez la commande de pré-lancement..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Hooks de lancement du jeu personnalisé"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Les hooks s’exécutent dans le répertoire de travail de l’instance et disposent des variables suivantes :"
},
@@ -4157,9 +4145,6 @@
"instance.settings.tabs.syncing": {
"message": "Synchronisation"
},
- "instance.settings.tabs.window": {
- "message": "Paramètres de fenêtre personnalisée"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Votre instance utilise les paramètres de fenêtre par défaut, sauf si vous les remplacez ici."
},
diff --git a/apps/app-frontend/src/locales/he-IL/index.json b/apps/app-frontend/src/locales/he-IL/index.json
index 4215cdc5f00..8112921be5d 100644
--- a/apps/app-frontend/src/locales/he-IL/index.json
+++ b/apps/app-frontend/src/locales/he-IL/index.json
@@ -860,27 +860,18 @@
"app.java-detection.title": {
"message": "בחירה בהתקנת ג'אבה"
},
- "app.java-selector.already-installed": {
- "message": "כבר מותקן"
- },
"app.java-selector.browse": {
"message": "עיון"
},
"app.java-selector.detect": {
"message": "זהה"
},
- "app.java-selector.install-recommended": {
- "message": "הורד מומלץ"
- },
"app.java-selector.installing": {
"message": "מתקין..."
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "בדוק את הגרסה המותקנת של ג'אבה"
- },
"app.library.actions.label": {
"message": "פעולות ספרייה"
},
@@ -1895,9 +1886,6 @@
"instance.settings.tabs.syncing": {
"message": "מסנכרן"
},
- "instance.settings.tabs.window": {
- "message": "הגדרות חלון מותאמות אישית"
- },
"instance.settings.tabs.window.fullscreen": {
"message": "מסך מלא"
},
diff --git a/apps/app-frontend/src/locales/hu-HU/index.json b/apps/app-frontend/src/locales/hu-HU/index.json
index ce05d64edba..0fbc470eedf 100644
--- a/apps/app-frontend/src/locales/hu-HU/index.json
+++ b/apps/app-frontend/src/locales/hu-HU/index.json
@@ -956,27 +956,18 @@
"app.java-detection.title": {
"message": "Java-telepítés kiválasztása"
},
- "app.java-selector.already-installed": {
- "message": "Már telepítve van"
- },
"app.java-selector.browse": {
"message": "Tallózás"
},
"app.java-selector.detect": {
"message": "Észlelés"
},
- "app.java-selector.install-recommended": {
- "message": "Ajánlott verzió telepítése"
- },
"app.java-selector.installing": {
"message": "Telepítés..."
},
"app.java-selector.path.placeholder": {
"message": "/eleresi/ut/a/javahoz"
},
- "app.java-selector.test-installation": {
- "message": "Java-telepítés tesztelése"
- },
"app.library.actions.label": {
"message": "Könyvtárműveletek"
},
@@ -3866,9 +3857,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Írjon be indítás előtti parancsokat..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Egyéni játékindítási hookok"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "A hookok a példány munkakönyvtárában futnak, a következő változókkal:"
},
@@ -4001,9 +3989,6 @@
"instance.settings.tabs.syncing": {
"message": "Szinkronizálás"
},
- "instance.settings.tabs.window": {
- "message": "Egyéni ablakbeállítások"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "A példányod az alapértelmezett ablak beállításaidat használja ameddig nem írod azokat felül itt."
},
diff --git a/apps/app-frontend/src/locales/it-IT/index.json b/apps/app-frontend/src/locales/it-IT/index.json
index 22dd75bc231..1ce95fcc7a6 100644
--- a/apps/app-frontend/src/locales/it-IT/index.json
+++ b/apps/app-frontend/src/locales/it-IT/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Seleziona l'installazione di Java"
},
- "app.java-selector.already-installed": {
- "message": "Già installata"
- },
"app.java-selector.browse": {
"message": "Seleziona"
},
"app.java-selector.detect": {
"message": "Rileva"
},
- "app.java-selector.install-recommended": {
- "message": "Installa consigliata"
- },
"app.java-selector.installing": {
"message": "Installazione..."
},
"app.java-selector.path.placeholder": {
"message": "/percorso/di/java"
},
- "app.java-selector.test-installation": {
- "message": "Conferma dell'installazione di Java"
- },
"app.library.actions.label": {
"message": "Azioni sulla libreria"
},
@@ -4142,9 +4133,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Inserisci comando pre-avvio..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Hook di avvio personalizzati"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Gli hook si eseguono nella cartella principale dell'istanza, con le seguenti variabili:"
},
@@ -4277,9 +4265,6 @@
"instance.settings.tabs.syncing": {
"message": "Sincronizzazione"
},
- "instance.settings.tabs.window": {
- "message": "Impostazioni della finestra personalizzate"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "L'istanza userà le impostazioni di finestra predefinite a meno che non le sovrascrivi qui."
},
diff --git a/apps/app-frontend/src/locales/ja-JP/index.json b/apps/app-frontend/src/locales/ja-JP/index.json
index ad460f5ac91..f96c588eb16 100644
--- a/apps/app-frontend/src/locales/ja-JP/index.json
+++ b/apps/app-frontend/src/locales/ja-JP/index.json
@@ -1004,27 +1004,18 @@
"app.java-detection.title": {
"message": "使用するJavaを選んでください"
},
- "app.java-selector.already-installed": {
- "message": "インストール済み"
- },
"app.java-selector.browse": {
"message": "探す"
},
"app.java-selector.detect": {
"message": "検出"
},
- "app.java-selector.install-recommended": {
- "message": "推奨をインストール"
- },
"app.java-selector.installing": {
"message": "インストール中…"
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "Javaのインストールをテスト"
- },
"app.library.actions.label": {
"message": "ライブラリの操作"
},
@@ -3224,9 +3215,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "起動前のコマンドを入力…"
},
- "instance.settings.tabs.hooks.title": {
- "message": "カスタムゲーム起動フック"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "フックはインスタンスの現在のディレクトリで実行され、以下の環境変数が利用可能です:"
},
@@ -3344,9 +3332,6 @@
"instance.settings.tabs.synced-options.shared-settings.description": {
"message": "このインスタンスに対して同期設定を個別に保持するための上書きを有効にします。"
},
- "instance.settings.tabs.window": {
- "message": "カスタムウィンドウの設定"
- },
"instance.settings.tabs.window.fullscreen": {
"message": "フルスクリーン"
},
diff --git a/apps/app-frontend/src/locales/ko-KR/index.json b/apps/app-frontend/src/locales/ko-KR/index.json
index e435f5fdac6..f64c18e6faa 100644
--- a/apps/app-frontend/src/locales/ko-KR/index.json
+++ b/apps/app-frontend/src/locales/ko-KR/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Java 설치 위치 선택"
},
- "app.java-selector.already-installed": {
- "message": "이미 설치됨"
- },
"app.java-selector.browse": {
"message": "찾아보기"
},
"app.java-selector.detect": {
"message": "감지"
},
- "app.java-selector.install-recommended": {
- "message": "권장 버전 설치"
- },
"app.java-selector.installing": {
"message": "설치 중..."
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "Java 설치 테스트"
- },
"app.library.actions.label": {
"message": "라이브러리 동작"
},
@@ -4076,9 +4067,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "실행 전 명령어 입력..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "맞춤형 게임 실행 처리"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "훅은 인스턴스의 작업 디렉터리에서 실행되며, 다음 환경 변수를 따릅니다:"
},
@@ -4211,9 +4199,6 @@
"instance.settings.tabs.syncing": {
"message": "동기화"
},
- "instance.settings.tabs.window": {
- "message": "창 맞춤 설정"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "여기에서 별도로 설정하지 않으면 이 인스턴스에는 기본 창 설정이 적용됩니다."
},
diff --git a/apps/app-frontend/src/locales/nl-NL/index.json b/apps/app-frontend/src/locales/nl-NL/index.json
index 9c2ce56ff3c..9c2b3d7d912 100644
--- a/apps/app-frontend/src/locales/nl-NL/index.json
+++ b/apps/app-frontend/src/locales/nl-NL/index.json
@@ -995,27 +995,18 @@
"app.java-detection.title": {
"message": "Selecteer Java-installatie"
},
- "app.java-selector.already-installed": {
- "message": "Al geïnstalleerd"
- },
"app.java-selector.browse": {
"message": "Bladeren"
},
"app.java-selector.detect": {
"message": "Detecteren"
},
- "app.java-selector.install-recommended": {
- "message": "Aanbevolen instantie"
- },
"app.java-selector.installing": {
"message": "Installeren..."
},
"app.java-selector.path.placeholder": {
"message": "/pad/naar/java"
},
- "app.java-selector.test-installation": {
- "message": "Java-installatie testen"
- },
"app.library.actions.label": {
"message": "Bibliotheek acties"
},
@@ -4016,9 +4007,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Voer commando voor het opstarten in..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Aangepaste opstart haakjes"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Hooks worden uitgevoerd in de werkfolder van de instantie, met de volgende variabelen:"
},
@@ -4151,9 +4139,6 @@
"instance.settings.tabs.syncing": {
"message": "Syncen"
},
- "instance.settings.tabs.window": {
- "message": "Aangepaste venster instellingen"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Je instantie gebruikt de standaard vensterwaarden tenzij je ze hier overschrijft."
},
diff --git a/apps/app-frontend/src/locales/pl-PL/index.json b/apps/app-frontend/src/locales/pl-PL/index.json
index 515f63bc930..a143cb745e3 100644
--- a/apps/app-frontend/src/locales/pl-PL/index.json
+++ b/apps/app-frontend/src/locales/pl-PL/index.json
@@ -1010,27 +1010,18 @@
"app.java-detection.title": {
"message": "Wybierz instalację Java"
},
- "app.java-selector.already-installed": {
- "message": "Już zainstalowano"
- },
"app.java-selector.browse": {
"message": "Przeglądaj"
},
"app.java-selector.detect": {
"message": "Wykryj"
},
- "app.java-selector.install-recommended": {
- "message": "Zainstaluj zalecane"
- },
"app.java-selector.installing": {
"message": "Instalowanie..."
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "Testuj instalację Java"
- },
"app.library.actions.label": {
"message": "Opcje biblioteki"
},
@@ -4010,9 +4001,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Wpisz komendę przed uruchomieniem..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Niestandardowe polecenia uruchamiania gry"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Haki uruchamiane w katalogu roboczym instancji, z następującymi zmiennymi:"
},
@@ -4145,9 +4133,6 @@
"instance.settings.tabs.syncing": {
"message": "Synchronizacja"
},
- "instance.settings.tabs.window": {
- "message": "Niestandardowe ustawienia okna"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Twoja instancja używa domyślnych ustawień okna, chyba że podasz je tutaj."
},
diff --git a/apps/app-frontend/src/locales/pt-BR/index.json b/apps/app-frontend/src/locales/pt-BR/index.json
index fa19a293ba6..db64e2ff708 100644
--- a/apps/app-frontend/src/locales/pt-BR/index.json
+++ b/apps/app-frontend/src/locales/pt-BR/index.json
@@ -1022,27 +1022,18 @@
"app.java-detection.title": {
"message": "Selecionar instalação Java"
},
- "app.java-selector.already-installed": {
- "message": "Já instalado"
- },
"app.java-selector.browse": {
"message": "Navegar"
},
"app.java-selector.detect": {
"message": "Detectar"
},
- "app.java-selector.install-recommended": {
- "message": "Instalação recomendada"
- },
"app.java-selector.installing": {
"message": "Instalando..."
},
"app.java-selector.path.placeholder": {
"message": "/caminho/ao/java"
},
- "app.java-selector.test-installation": {
- "message": "Instalação de teste Java"
- },
"app.library.actions.label": {
"message": "Ações da livraria"
},
@@ -4076,9 +4067,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Insira o comando ao iniciar..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Customizar ganchos de inicialização do jogo"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Ganchos são executados no diretório de trabalho da instância, com as seguintes variáveis:"
},
@@ -4211,9 +4199,6 @@
"instance.settings.tabs.syncing": {
"message": "Sincronização"
},
- "instance.settings.tabs.window": {
- "message": "Personalizar configurações de janela"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Sua instância usa as configurações de janela padrão, a menos que você as altere aqui."
},
diff --git a/apps/app-frontend/src/locales/pt-PT/index.json b/apps/app-frontend/src/locales/pt-PT/index.json
index 6b3019dde8d..fe30ad3d6e1 100644
--- a/apps/app-frontend/src/locales/pt-PT/index.json
+++ b/apps/app-frontend/src/locales/pt-PT/index.json
@@ -851,27 +851,18 @@
"app.java-detection.columns.path": {
"message": "Caminho"
},
- "app.java-selector.already-installed": {
- "message": "Já instalado"
- },
"app.java-selector.browse": {
"message": "Navegar"
},
"app.java-selector.detect": {
"message": "Detetar"
},
- "app.java-selector.install-recommended": {
- "message": "Recomenda-se a instalação"
- },
"app.java-selector.installing": {
"message": "A instalar..."
},
"app.java-selector.path.placeholder": {
"message": "/caminho/para/java"
},
- "app.java-selector.test-installation": {
- "message": "Testar a instalação do Java"
- },
"app.library.actions.label": {
"message": "Ações da biblioteca"
},
diff --git a/apps/app-frontend/src/locales/ru-RU/index.json b/apps/app-frontend/src/locales/ru-RU/index.json
index bd04e84d44c..2070b25d22b 100644
--- a/apps/app-frontend/src/locales/ru-RU/index.json
+++ b/apps/app-frontend/src/locales/ru-RU/index.json
@@ -998,27 +998,18 @@
"app.java-detection.title": {
"message": "Выбор расположения Java"
},
- "app.java-selector.already-installed": {
- "message": "Уже установлена"
- },
"app.java-selector.browse": {
"message": "Обзор"
},
"app.java-selector.detect": {
"message": "Обнаружить"
},
- "app.java-selector.install-recommended": {
- "message": "Установить рекомендуемую"
- },
"app.java-selector.installing": {
"message": "Установка..."
},
"app.java-selector.path.placeholder": {
"message": "/путь/к/java"
},
- "app.java-selector.test-installation": {
- "message": "Проверить установку Java"
- },
"app.library.actions.label": {
"message": "Действия в библиотеке"
},
@@ -4031,9 +4022,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Введите команду перед запуском..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Переопределение команд запуска игры"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Команды выполняются в рабочем каталоге сборки. Переменные:"
},
@@ -4166,9 +4154,6 @@
"instance.settings.tabs.syncing": {
"message": "Синхронизация"
},
- "instance.settings.tabs.window": {
- "message": "Переопределение настроек окна"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Ваша сборка использует настройки окна по умолчанию, пока вы не замените их здесь."
},
diff --git a/apps/app-frontend/src/locales/sv-SE/index.json b/apps/app-frontend/src/locales/sv-SE/index.json
index 504484a3074..f013650a36e 100644
--- a/apps/app-frontend/src/locales/sv-SE/index.json
+++ b/apps/app-frontend/src/locales/sv-SE/index.json
@@ -977,27 +977,18 @@
"app.java-detection.title": {
"message": "Välj java-installation"
},
- "app.java-selector.already-installed": {
- "message": "Redan installerad"
- },
"app.java-selector.browse": {
"message": "Bläddra"
},
"app.java-selector.detect": {
"message": "Hitta"
},
- "app.java-selector.install-recommended": {
- "message": "Installation rekommenderas"
- },
"app.java-selector.installing": {
"message": "Installerar..."
},
"app.java-selector.path.placeholder": {
"message": "/sökväg/till/java"
},
- "app.java-selector.test-installation": {
- "message": "Testa Java-installationen"
- },
"app.library.actions.label": {
"message": "Biblioteksåtgärder"
},
@@ -3707,9 +3698,6 @@
"instance.settings.tabs.syncing": {
"message": "Synkronisering"
},
- "instance.settings.tabs.window": {
- "message": "Anpassade fönsterinställningar"
- },
"instance.settings.tabs.window.fullscreen": {
"message": "Helskärm"
},
diff --git a/apps/app-frontend/src/locales/tr-TR/index.json b/apps/app-frontend/src/locales/tr-TR/index.json
index 66515838daf..e8bdede5e12 100644
--- a/apps/app-frontend/src/locales/tr-TR/index.json
+++ b/apps/app-frontend/src/locales/tr-TR/index.json
@@ -971,27 +971,18 @@
"app.java-detection.title": {
"message": "Java kurulumunu seç"
},
- "app.java-selector.already-installed": {
- "message": "Zaten kuruldu"
- },
"app.java-selector.browse": {
"message": "Göz at"
},
"app.java-selector.detect": {
"message": "Tespit et"
},
- "app.java-selector.install-recommended": {
- "message": "Önerileni kur"
- },
"app.java-selector.installing": {
"message": "Kuruluyor..."
},
"app.java-selector.path.placeholder": {
"message": "/java/kurulum/yolu"
},
- "app.java-selector.test-installation": {
- "message": "Java kurulumunu dene"
- },
"app.library.actions.label": {
"message": "Kütüphane eylemleri"
},
@@ -3467,9 +3458,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Başlatma öncesi komutu girin..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Özel oyun başlatma kancaları"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Kancalar, örneğin çalışma dizininde aşağıdaki değişkenlerle çalıştırılır:"
},
@@ -3584,9 +3572,6 @@
"instance.settings.tabs.synced-options.shared-settings.description": {
"message": "Bu örnek için, eşitlenmiş bir ayarı ayrı tutmak üzere bir geçersiz kılmayı etkinleştirin."
},
- "instance.settings.tabs.window": {
- "message": "Özel pencere ayarları"
- },
"instance.settings.tabs.window.fullscreen": {
"message": "Tam Ekran"
},
diff --git a/apps/app-frontend/src/locales/uk-UA/index.json b/apps/app-frontend/src/locales/uk-UA/index.json
index b964c05307e..9c2990cffb6 100644
--- a/apps/app-frontend/src/locales/uk-UA/index.json
+++ b/apps/app-frontend/src/locales/uk-UA/index.json
@@ -1013,27 +1013,18 @@
"app.java-detection.title": {
"message": "Вибір інсталяції Java"
},
- "app.java-selector.already-installed": {
- "message": "Уже встановлено"
- },
"app.java-selector.browse": {
"message": "Огляд"
},
"app.java-selector.detect": {
"message": "Виявити"
},
- "app.java-selector.install-recommended": {
- "message": "Установити рекомендоване"
- },
"app.java-selector.installing": {
"message": "Установлюємо..."
},
"app.java-selector.path.placeholder": {
"message": "/шлях/до/java"
},
- "app.java-selector.test-installation": {
- "message": "Протестувати інсталяцію Java"
- },
"app.library.actions.label": {
"message": "Дії з бібліотекою"
},
@@ -4079,9 +4070,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Уведіть команду, що виконуватиметься перед запуском…"
},
- "instance.settings.tabs.hooks.title": {
- "message": "Власні параметри запуску"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Параметри працюють в каталозі примірника з наступними змінними:"
},
@@ -4214,9 +4202,6 @@
"instance.settings.tabs.syncing": {
"message": "Синхронізація"
},
- "instance.settings.tabs.window": {
- "message": "Власні налаштування вікна"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "Ваш примірник використовуватиме усталені налаштування вікна, якщо ви їх не перезапишете тут."
},
diff --git a/apps/app-frontend/src/locales/vi-VN/index.json b/apps/app-frontend/src/locales/vi-VN/index.json
index e9969419d27..3b80b44f04f 100644
--- a/apps/app-frontend/src/locales/vi-VN/index.json
+++ b/apps/app-frontend/src/locales/vi-VN/index.json
@@ -950,27 +950,18 @@
"app.java-detection.title": {
"message": "Chọn bản cài đặt Java"
},
- "app.java-selector.already-installed": {
- "message": "Đã được cài đặt"
- },
"app.java-selector.browse": {
"message": "Duyệt"
},
"app.java-selector.detect": {
"message": "Dò tìm"
},
- "app.java-selector.install-recommended": {
- "message": "Cài bản được đề xuất"
- },
"app.java-selector.installing": {
"message": "Đang cài đặt..."
},
"app.java-selector.path.placeholder": {
"message": "/đường/dẫn/đến/java"
},
- "app.java-selector.test-installation": {
- "message": "Kiểm tra bản cài đặt Java"
- },
"app.library.actions.label": {
"message": "Thao tác thư viện"
},
@@ -3785,9 +3776,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Nhập lệnh trước khi khởi chạy..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "Hook khởi chạy trò chơi tùy chỉnh"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "Hook chạy trong thư mục làm việc của bản cài đặt với các biến sau:"
},
@@ -3911,9 +3899,6 @@
"instance.settings.tabs.synced-options.shared-settings.description": {
"message": "Bật ghi đè để giữ một cài đặt đã đồng bộ riêng cho bản cài đặt này."
},
- "instance.settings.tabs.window": {
- "message": "Cài đặt cửa sổ tùy chỉnh"
- },
"instance.settings.tabs.window.fullscreen": {
"message": "Toàn màn hình"
},
diff --git a/apps/app-frontend/src/locales/zh-CN/index.json b/apps/app-frontend/src/locales/zh-CN/index.json
index d526f40d43c..f0ecd314d67 100644
--- a/apps/app-frontend/src/locales/zh-CN/index.json
+++ b/apps/app-frontend/src/locales/zh-CN/index.json
@@ -1013,27 +1013,18 @@
"app.java-detection.title": {
"message": "选择Java配置"
},
- "app.java-selector.already-installed": {
- "message": "已安装"
- },
"app.java-selector.browse": {
"message": "浏览"
},
"app.java-selector.detect": {
"message": "检测"
},
- "app.java-selector.install-recommended": {
- "message": "安装推荐版本"
- },
"app.java-selector.installing": {
"message": "正在安装……"
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "测试"
- },
"app.library.actions.label": {
"message": "实例库操作"
},
@@ -3983,9 +3974,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "输入启动前命令……"
},
- "instance.settings.tabs.hooks.title": {
- "message": "自定义启动钩子"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "在此实例工作目录中的钩柄遵循以下这些变量:"
},
@@ -4118,9 +4106,6 @@
"instance.settings.tabs.syncing": {
"message": "同步"
},
- "instance.settings.tabs.window": {
- "message": "自定义窗口设置"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "您的实例使用默认的窗口设置,除非您在这里覆盖它们。"
},
diff --git a/apps/app-frontend/src/locales/zh-TW/index.json b/apps/app-frontend/src/locales/zh-TW/index.json
index ff991b49595..5934cef81fe 100644
--- a/apps/app-frontend/src/locales/zh-TW/index.json
+++ b/apps/app-frontend/src/locales/zh-TW/index.json
@@ -1007,27 +1007,18 @@
"app.java-detection.title": {
"message": "選擇 Java 安裝"
},
- "app.java-selector.already-installed": {
- "message": "已安裝"
- },
"app.java-selector.browse": {
"message": "瀏覽"
},
"app.java-selector.detect": {
"message": "偵測"
},
- "app.java-selector.install-recommended": {
- "message": "建議安裝"
- },
"app.java-selector.installing": {
"message": "正在安裝..."
},
"app.java-selector.path.placeholder": {
"message": "/path/to/java"
},
- "app.java-selector.test-installation": {
- "message": "測試 Java 安裝"
- },
"app.library.actions.label": {
"message": "遊戲庫動作"
},
@@ -4064,9 +4055,6 @@
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "輸入啟動前指令..."
},
- "instance.settings.tabs.hooks.title": {
- "message": "自訂遊戲啟動掛勾"
- },
"instance.settings.tabs.hooks.variables.description": {
"message": "掛勾會在實例的工作目錄中執行,可使用以下變數:"
},
@@ -4199,9 +4187,6 @@
"instance.settings.tabs.syncing": {
"message": "同步"
},
- "instance.settings.tabs.window": {
- "message": "自訂視窗設定"
- },
"instance.settings.tabs.window.default-settings-description": {
"message": "你的實例會使用預設的視窗設定,除非你在這裡覆寫這些設定。"
},
diff --git a/apps/app-frontend/src/pages/instance/query-options.ts b/apps/app-frontend/src/pages/instance/query-options.ts
index 4b24d1af5b5..7835ce62ce1 100644
--- a/apps/app-frontend/src/pages/instance/query-options.ts
+++ b/apps/app-frontend/src/pages/instance/query-options.ts
@@ -11,9 +11,16 @@ import {
} from '@/helpers/instance'
import { loadInstanceContentData } from '@/helpers/instance-content'
import { get_by_instance_id } from '@/helpers/process'
+import type { GameInstance } from '@/helpers/types'
import { refreshWorlds } from '@/helpers/worlds'
+import { getRecommendedJavaVersion } from '@/platform/app-lib/instances/commands'
import { refreshSharedInstanceLock } from '@/platform/app-lib/shared-instances/commands'
+type RecommendedJavaInstance = Pick<
+ GameInstance,
+ 'id' | 'game_version' | 'loader' | 'loader_version'
+>
+
export const instanceKeys = {
all: ['instances'] as const,
list: () => [...instanceKeys.all, 'list'] as const,
@@ -41,6 +48,14 @@ export const instanceKeys = {
[...instanceKeys.sharedUpdatePreviews(instanceId), userId] as const,
sharedLock: (instanceId: string) => ['sharedInstanceLock', instanceId] as const,
sharedMembers: (instanceId: string) => ['sharedInstanceUsers', instanceId] as const,
+ recommendedJava: (instance: RecommendedJavaInstance) =>
+ [
+ ...instanceKeys.detail(instance.id),
+ 'recommended-java',
+ instance.game_version,
+ instance.loader,
+ instance.loader_version ?? null,
+ ] as const,
}
export const screenshotKeys = {
@@ -86,6 +101,15 @@ export function screenshotGroupsQueryOptions() {
})
}
+export function instanceRecommendedJavaQueryOptions(instance: RecommendedJavaInstance) {
+ return queryOptions({
+ queryKey: instanceKeys.recommendedJava(instance),
+ networkMode: 'always',
+ queryFn: () => getRecommendedJavaVersion(instance.id),
+ staleTime: Infinity,
+ })
+}
+
export function instanceDetailQueryOptions(instanceId: string) {
return queryOptions({
queryKey: instanceKeys.detail(instanceId),
diff --git a/apps/app-frontend/src/platform/app-lib/instances/commands.ts b/apps/app-frontend/src/platform/app-lib/instances/commands.ts
new file mode 100644
index 00000000000..de27bd48ad0
--- /dev/null
+++ b/apps/app-frontend/src/platform/app-lib/instances/commands.ts
@@ -0,0 +1,5 @@
+import { invoke } from '@tauri-apps/api/core'
+
+export function getRecommendedJavaVersion(instanceId: string): Promise {
+ return invoke('plugin:instance|instance_get_recommended_java_version', { instanceId })
+}
diff --git a/apps/app-frontend/src/platform/app-lib/jre/commands.ts b/apps/app-frontend/src/platform/app-lib/jre/commands.ts
new file mode 100644
index 00000000000..531deb35037
--- /dev/null
+++ b/apps/app-frontend/src/platform/app-lib/jre/commands.ts
@@ -0,0 +1,27 @@
+import { invoke } from '@tauri-apps/api/core'
+
+import type { JavaVersion } from './types'
+
+export function getJavaVersions(): Promise> {
+ return invoke('plugin:jre|get_java_versions')
+}
+
+export function setJavaVersion(javaVersion: Partial): Promise {
+ return invoke('plugin:jre|set_java_version', { javaVersion })
+}
+
+export function findFilteredJres(version: number | null): Promise {
+ return invoke('plugin:jre|jre_find_filtered_jres', { version })
+}
+
+export function getJre(path: string): Promise {
+ return invoke('plugin:jre|jre_get_jre', { path })
+}
+
+export function autoInstallJava(javaVersion: number): Promise {
+ return invoke('plugin:jre|jre_auto_install_java', { javaVersion })
+}
+
+export function getMaxMemory(): Promise {
+ return invoke('plugin:jre|jre_get_max_memory')
+}
diff --git a/apps/app-frontend/src/platform/app-lib/jre/types.ts b/apps/app-frontend/src/platform/app-lib/jre/types.ts
new file mode 100644
index 00000000000..4df9e160f98
--- /dev/null
+++ b/apps/app-frontend/src/platform/app-lib/jre/types.ts
@@ -0,0 +1,6 @@
+export interface JavaVersion {
+ parsed_version: number
+ version: string
+ architecture: string
+ path: string
+}
diff --git a/apps/app-frontend/src/platform/dialogs.ts b/apps/app-frontend/src/platform/dialogs.ts
new file mode 100644
index 00000000000..0bc366a3a97
--- /dev/null
+++ b/apps/app-frontend/src/platform/dialogs.ts
@@ -0,0 +1,5 @@
+import { open } from '@tauri-apps/plugin-dialog'
+
+export function pickFile(): Promise {
+ return open({ multiple: false, directory: false })
+}
diff --git a/apps/app-frontend/src/shared/unsaved-changes/types.ts b/apps/app-frontend/src/shared/unsaved-changes/types.ts
new file mode 100644
index 00000000000..2fe7563e8c2
--- /dev/null
+++ b/apps/app-frontend/src/shared/unsaved-changes/types.ts
@@ -0,0 +1,8 @@
+export type UnsavedChangesController = {
+ hasChanges: () => boolean
+ getOriginal: () => Record
+ getModified: () => Record
+ isSaving: () => boolean
+ reset: () => void
+ save: () => void | Promise
+}
diff --git a/apps/app-frontend/src/shared/unsaved-changes/use-unsaved-changes-host.ts b/apps/app-frontend/src/shared/unsaved-changes/use-unsaved-changes-host.ts
new file mode 100644
index 00000000000..78834f2a6c0
--- /dev/null
+++ b/apps/app-frontend/src/shared/unsaved-changes/use-unsaved-changes-host.ts
@@ -0,0 +1,37 @@
+import { computed, ref } from 'vue'
+
+import type { UnsavedChangesController } from './types'
+
+const emptyState: Record = {}
+
+export function useUnsavedChangesHost() {
+ const popup = ref<{ nudge: () => void } | null>(null)
+ const controller = ref(null)
+
+ const original = computed(() => controller.value?.getOriginal() ?? emptyState)
+ const modified = computed(() => controller.value?.getModified() ?? emptyState)
+ const saving = computed(() => controller.value?.isSaving() ?? false)
+ const hasUnsavedChanges = computed(
+ () => (controller.value?.hasChanges() ?? false) || saving.value,
+ )
+
+ function canLeave(): boolean {
+ if (!hasUnsavedChanges.value) return true
+ popup.value?.nudge()
+ return false
+ }
+
+ function register(next: UnsavedChangesController | null): void {
+ controller.value = next
+ }
+
+ function reset(): void {
+ controller.value?.reset()
+ }
+
+ function save(): void {
+ void controller.value?.save()
+ }
+
+ return { popup, original, modified, saving, hasUnsavedChanges, canLeave, register, reset, save }
+}
diff --git a/apps/app/build.rs b/apps/app/build.rs
index 7692786d7d6..48825652443 100644
--- a/apps/app/build.rs
+++ b/apps/app/build.rs
@@ -226,6 +226,7 @@ fn main() {
"instance_get_linked_modpack_info",
"instance_get_linked_modpack_content",
"instance_get_optimal_jre_key",
+ "instance_get_recommended_java_version",
"instance_get_full_path",
"instance_get_mod_full_path",
"instance_list_screenshots",
diff --git a/apps/app/src/api/instance.rs b/apps/app/src/api/instance.rs
index f319046e000..56eb01ebdc8 100644
--- a/apps/app/src/api/instance.rs
+++ b/apps/app/src/api/instance.rs
@@ -47,6 +47,7 @@ pub fn init() -> tauri::plugin::TauriPlugin {
instance_get_linked_modpack_info,
instance_get_linked_modpack_content,
instance_get_optimal_jre_key,
+ instance_get_recommended_java_version,
instance_get_full_path,
instance_get_mod_full_path,
instance_list_screenshots,
@@ -1148,6 +1149,13 @@ pub async fn instance_get_optimal_jre_key(
Ok(theseus::instance::get_optimal_jre_key(instance_id).await?)
}
+#[tauri::command]
+pub async fn instance_get_recommended_java_version(
+ instance_id: &str,
+) -> Result {
+ Ok(theseus::instance::get_recommended_java_version(instance_id).await?)
+}
+
#[tauri::command]
pub async fn instance_check_installed(
instance_id: &str,
diff --git a/packages/app-lib/src/api/instance.rs b/packages/app-lib/src/api/instance.rs
index ae4baee4062..03b0bda55f7 100644
--- a/packages/app-lib/src/api/instance.rs
+++ b/packages/app-lib/src/api/instance.rs
@@ -50,7 +50,7 @@ pub use self::icon::{
pub(crate) use self::icon::{
cache_icon, cache_icon_from_path, migrate_legacy_icons,
};
-pub use self::install::get_optimal_jre_key;
+pub use self::install::{get_optimal_jre_key, get_recommended_java_version};
pub(crate) use self::lifecycle::create;
pub use self::lifecycle::{edit, remove, set_synced_option};
pub use self::paths::{get_full_path, get_mod_full_path};
diff --git a/packages/app-lib/src/api/instance/install.rs b/packages/app-lib/src/api/instance/install.rs
index 4d48981e340..29df24639a5 100644
--- a/packages/app-lib/src/api/instance/install.rs
+++ b/packages/app-lib/src/api/instance/install.rs
@@ -1,10 +1,11 @@
-use crate::state::{JavaVersion, State};
+use crate::launcher::profile::ResolvedVersion;
+use crate::state::{InstanceLaunchContext, JavaVersion, State};
use anyhow::Context;
-pub async fn get_optimal_jre_key(
+async fn resolve_launch_version_info(
instance_id: &str,
-) -> crate::Result
diff --git a/packages/ui/src/layouts/wrapped/settings/AccountSocialSettings.vue b/packages/ui/src/layouts/wrapped/settings/AccountSocialSettings.vue
index b4e706bf8cb..956871a2ea9 100644
--- a/packages/ui/src/layouts/wrapped/settings/AccountSocialSettings.vue
+++ b/packages/ui/src/layouts/wrapped/settings/AccountSocialSettings.vue
@@ -515,7 +515,7 @@ const messages = defineMessages({
},
hostingRestriction: {
id: 'settings.social.blocked-users.restriction.hosting',
- defaultMessage: 'Invite you to manage a Modrinth Hosting server.',
+ defaultMessage: 'Invite you to manage a Modrinth Hosting server',
},
userColumn: {
id: 'settings.social.blocked-users.column.user',
diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json
index e1c5aa74ea9..d10da04a4d6 100644
--- a/packages/ui/src/locales/en-US/index.json
+++ b/packages/ui/src/locales/en-US/index.json
@@ -7545,7 +7545,7 @@
"defaultMessage": "Send you friend requests"
},
"settings.social.blocked-users.restriction.hosting": {
- "defaultMessage": "Invite you to manage a Modrinth Hosting server."
+ "defaultMessage": "Invite you to manage a Modrinth Hosting server"
},
"settings.social.blocked-users.restriction.shared-instances": {
"defaultMessage": "Invite you to shared instances"