diff --git a/README.md b/README.md index 54f4aa9aa3..669c5e46fa 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Minecraft: Java Edition 26.3, rewritten in Rust. Same worlds, same rules, same t ## Download -Get **the Horizon launcher** from [playhorizon.dev](https://playhorizon.dev) or [the launcher releases](https://github.com/horizon-rust/horizon/releases?q=launcher-v&expanded=true) (Linux x86-64, macOS on Apple Silicon, macOS on Intel from the next Nightly, Windows x64). It installs and updates the game, prepares its files from your copy of Minecraft, and updates itself. +Get **the Horizon launcher** from [playhorizon.dev](https://playhorizon.dev) or [the launcher releases](https://github.com/horizon-rust/horizon/releases?q=launcher&expanded=true) (Linux x86-64, macOS on Apple Silicon, macOS on Intel from the next Nightly, Windows x64). It installs and updates the game, prepares its files from your copy of Minecraft, and updates itself. **You need** a Microsoft account that owns Java Edition ([why](docs/microsoft-account.md)) and a GPU with Vulkan or OpenGL 3.3 (Linux), Vulkan or DirectX 12 (Windows), or a Mac (Apple Silicon, or Intel from the next Nightly). An existing Minecraft install (official launcher, Prism, MultiMC...) is reused; without one, Play downloads 26.3 from Mojang for your account. Step by step: [Install and first launch](https://playhorizon.dev/docs/install). diff --git a/docs/versioning.md b/docs/versioning.md index 261f462e35..a797fd1cae 100644 --- a/docs/versioning.md +++ b/docs/versioning.md @@ -75,6 +75,7 @@ Installs made before 0.2 run old code that compares tags number by number, so to | --- | --- | --- | | Launcher 0.16.0 and older, updating itself | Looks only at `launcher-v` tags and takes one above its own version. Never sees `launcher@`. | **The bridge**: one last `launcher-v0.17.0`, built with the new code. Old launchers take it as usual; it knows it is a `launcher-v` release and takes `launcher@0.2.0` next. Two updates, both by themselves. | | Launcher 0.16.0 and older, installing games | Sorts `v0.2.0` below every dated release and below the versions it has installed, so it never offers it. | Once the launcher has updated itself (above), it offers `v0.2.0` like any update. Until then a player can install `v0.2.0` by hand on the Versions page (it is listed last). | +| Launcher that can't replace itself: opened from its disk image, a macOS app not moved out of Downloads (macOS runs it from a read-only copy), a `.zip` opened in Explorer without extracting it, a folder it can't write (#9287) | Finds every update and fails to put it in place at each check. Launchers released before #9287 say so only on Settings' Launcher line ("the update failed: …"), so the player sees nothing and stays on that version (launcher 0.2.0 seen on 2026-11-04 with 0.2.40 out). Newer ones say "A new version is available" with **Download again**. | Download the launcher again once from playhorizon.dev and put it where it can write: Applications on macOS, an extracted folder or `horizon-launcher-setup.exe` on Windows. It updates itself from then on. Nothing in a release can reach such a copy: it fails before it runs anything new. | | Launcher that never updates itself (`HORIZON_LAUNCHER_NO_SELF_UPDATE`, a package) | As above, without the bridge. | Update the package, or install `v0.2.0` by hand. | | `horizon-server` from before the bridge | Reads GitHub's *latest* release and installs it only if its tag compares higher: `v0.2.0` never does. `--version ` skips the comparison. A server never updates itself: its supervisor only logs a notice every 6 hours, and the running process keeps its old code until the service restarts. | **The game bridge**: the last dated release, built with the new code, made stable (*latest*) before `v0.2.0` is published. `v0.2.0` then spends at least 6 hours as a beta, so *latest* stays the bridge for that long (the longer it stays a beta, the more servers are caught). An owner who runs `horizon-server update` in that time gets the bridge, and the command runs the new code at once, so the next `horizon-server update` takes `v0.2.0` once it is stable. The log notice only changes after the service restarts. An owner on old code after that time is told the server is up to date, and runs `horizon-server update --version v0.2.0` once. 0.2.0's notes say so. | | Servers the launcher hosts (Servers page) | Set up from the launcher's installed versions. | Follow the launcher. | diff --git a/launcher/README.md b/launcher/README.md index cd62af1b5a..9901b92b5a 100644 --- a/launcher/README.md +++ b/launcher/README.md @@ -286,8 +286,16 @@ themselves come from their download links, which that limit doesn't cover. It also updates itself from GitHub releases tagged `launcher@X.Y.Z` (the game's are `nightly`, and `vX.Y.Z` before 2026-10-28; neither is ever taken for the other). Before 0.2 they were `launcher-vX.Y.Z` and `vYYYY.MM.DD`: -every 0.2 tag counts as newer than all of those (docs/versioning.md). It downloads the new build, replaces its -own binary, and offers "Restart" in the footer. Development builds and +every 0.2 tag counts as newer than all of those (docs/versioning.md). It downloads the new build, checks it +against the release's signed `SHA256SUMS`, and says "A new version is available" in the sidebar with +**Update**: the window closes, the launcher's own file runs again as the installer (`apply-update`, +`src/update_handoff.rs`), which waits for the window's process to exit, puts the new launcher in place (the +binary, the `.app` bundle or the AppImage) and starts it. Closing the window with an update downloaded installs +it the same way, so the next start is the new launcher. When the installer can't put it in place, the old +launcher starts again and says why. A copy that can't replace itself says so at once and offers **Download +again** (the website's install page): one in a read-only folder (the disk image, or the read-only copy macOS +runs a downloaded app from until it is moved to Applications), or Windows' temporary copy of a program opened +inside a `.zip`. `horizon-launcher update` replaces it at once. Development builds and `HORIZON_LAUNCHER_NO_SELF_UPDATE=1` never replace themselves. On Linux the release also comes as an AppImage, `horizon-launcher-linux-x86_64.AppImage`: one file diff --git a/launcher/lang/af.json b/launcher/lang/af.json index 6c964189df..779b56a7bd 100644 --- a/launcher/lang/af.json +++ b/launcher/lang/af.json @@ -454,7 +454,9 @@ "runs {command} after": "hardloop {command} na", "downloaded": "afgelaai", "24/7 online": "24/7 aanlyn", - "Updated to {version}. Restart the launcher to use it.": "Opgedateer na {version}. Herbegin die lanseerder om dit te gebruik.", + "A new version is available": "'n Nuwe weergawe is beskikbaar", + "Download again": "Laai weer af", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Hierdie kopie van die lanseerder kan homself nie vervang nie. Laai dit een keer weer af; daarna werk dit homself op.", "Any MCP client": "Enige MCP-kliënt", "{name}'s cape is kept.": "{name} se kaap word gehou.", "Not reviewed by the Horizon registry": "Nie hersien deur die Horizon-register nie", @@ -633,7 +635,6 @@ "Copied": "Gekopieer", "Couldn't load patch notes. {error}": "Kon nie pleisternotas laai nie. {error}", "Couldn't load releases. {error}": "Kon nie vrystellings laai nie. {error}", - "Launcher updated to {version}": "Launcher opgedateer na {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Bestuur weergawes", @@ -840,7 +841,6 @@ "Something went wrong.": "Iets het verkeerd geloop.", "Instances": "Instansies", "Join the Discord": "Sluit aan by die Discord", - "Restart to update": "Herbegin om op te dateer", "Duplicate…": "Dupliseer …", "Create a desktop shortcut": "Skep 'n lessenaarkortpad", "Remove the desktop shortcut": "Verwyder die lessenaarkortpad", diff --git a/launcher/lang/ar.json b/launcher/lang/ar.json index 0bc6567e56..40b739065c 100644 --- a/launcher/lang/ar.json +++ b/launcher/lang/ar.json @@ -456,7 +456,9 @@ "runs {command} after": "يشغل {command} بعد ذلك", "downloaded": "تم التنزيل", "24/7 online": "متصل على مدار الساعة", - "Updated to {version}. Restart the launcher to use it.": "تم التحديث إلى {version}. أعد تشغيل المشغل لاستخدامه.", + "A new version is available": "يتوفر إصدار جديد", + "Download again": "نزّله مرة أخرى", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "لا تستطيع هذه النسخة من المشغّل استبدال نفسها. نزّله مرة أخرى مرة واحدة؛ بعد ذلك يحدّث نفسه بنفسه.", "Any MCP client": "أي عميل MCP", "{name}'s cape is kept.": "تم الاحتفاظ برداء {name}.", "Not reviewed by the Horizon registry": "لم يتم مراجعته من قِبل سجل هورايزون", @@ -635,7 +637,6 @@ "Copied": "تم النسخ", "Couldn't load patch notes. {error}": "تعذر تحميل ملاحظات التحديث. {error}", "Couldn't load releases. {error}": "تعذر تحميل الإصدارات. {error}", - "Launcher updated to {version}": "تم تحديث المشغل إلى {version}", "Launcher {version}": "المشغل {version}", "Launcher {version} {percent}%": "المشغل {version} {percent}%", "Manage versions": "إدارة الإصدارات", @@ -842,7 +843,6 @@ "Something went wrong.": "حدث خطأ ما.", "Instances": "Instances", "Join the Discord": "Join the Discord", - "Restart to update": "Restart to update", "Duplicate…": "Duplicate…", "Create a desktop shortcut": "Create a desktop shortcut", "Remove the desktop shortcut": "Remove the desktop shortcut", diff --git a/launcher/lang/az.json b/launcher/lang/az.json index 49fce3da54..fdaf218bac 100644 --- a/launcher/lang/az.json +++ b/launcher/lang/az.json @@ -454,7 +454,9 @@ "runs {command} after": "sonra {command} çalışır", "downloaded": "endirilib", "24/7 online": "24/7 onlayn", - "Updated to {version}. Restart the launcher to use it.": "{version} olaraq yeniləndi. İstifadə etmək üçün başlatma qurğusunu yenidən başladın.", + "A new version is available": "Yeni versiya mövcuddur", + "Download again": "Yenidən endirin", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Başladıcının bu nüsxəsi özünü əvəz edə bilmir. Onu bir dəfə yenidən endirin; bundan sonra özü yenilənəcək.", "Any MCP client": "İstənilən MCP müştəri", "{name}'s cape is kept.": "{name} nin papağı saxlanılır.", "Not reviewed by the Horizon registry": "Horizon reyestr tərəfindən nəzərdən keçirilməyib", @@ -633,7 +635,6 @@ "Copied": "Kopyalandı", "Couldn't load patch notes. {error}": "Yamaq qeydlərini yükləmək mümkün olmadı. {error}", "Couldn't load releases. {error}": "Buraxılışları yükləmək mümkün olmadı. {error}", - "Launcher updated to {version}": "Başlatıcı {version} olaraq yeniləndi", "Launcher {version}": "Başlatıcı {version}", "Launcher {version} {percent}%": "Başlatıcı {version} {percent}%", "Manage versions": "Versiyaları idarə edin", @@ -840,7 +841,6 @@ "Something went wrong.": "Nəsə xəta baş verdi.", "Instances": "Nüsxələr", "Join the Discord": "Discord-a qoşulun", - "Restart to update": "Yeniləmək üçün yenidən başladın", "Duplicate…": "Dublikat...", "Create a desktop shortcut": "İş masası qısayolunu yaradın", "Remove the desktop shortcut": "İş masası qısayolunu çıxarın", diff --git a/launcher/lang/ba.json b/launcher/lang/ba.json index a6cd80180b..c4c43161fd 100644 --- a/launcher/lang/ba.json +++ b/launcher/lang/ba.json @@ -454,7 +454,9 @@ "runs {command} after": "йүгерә {command} һуң", "downloaded": "скачать", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} тиклем яңыртылған. Уны ҡулланыу өсөн стартерҙы яңынан эшләтеп ебәрегеҙ.", + "A new version is available": "Яңы версия бар", + "Download again": "Яңынан йөкләү", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчерҙың был күсермәһе үҙен алмаштыра алмай. Уны бер тапҡыр яңынан йөкләгеҙ; шунан һуң ул үҙе яңыртыла.", "Any MCP client": "Теләһә ниндәй MCP клиенты", "{name}'s cape is kept.": "{name}-ның пласы һаҡлана.", "Not reviewed by the Horizon registry": "Horizon реестры тарафынан тикшерелмәгән", @@ -633,7 +635,6 @@ "Copied": "Күсерелгән", "Couldn't load patch notes. {error}": "Патч иҫкәрмәләрен тейәп булманы. {error}", "Couldn't load releases. {error}": "Релиздарҙы тейәп булманы. {error}", - "Launcher updated to {version}": "Запуск {version} тиклем яңыртылған", "Launcher {version}": "Пуск {version}", "Launcher {version} {percent}%": "Пуск {version} {percent}%", "Manage versions": "Версиялар менән идара итеү", @@ -840,7 +841,6 @@ "Something went wrong.": "Нимәлер дөрөҫ булманы.", "Instances": "Инстанциялар", "Join the Discord": "Discord ҡушылырға", - "Restart to update": "Яңыртыу өсөн яңынан башлау", "Duplicate…": "Дубликаты...", "Create a desktop shortcut": "Өҫтәл ярлығын булдырыу .", "Remove the desktop shortcut": "Өҫтәл ярлығын юйырға", diff --git a/launcher/lang/be.json b/launcher/lang/be.json index df29cfdabd..10245ca009 100644 --- a/launcher/lang/be.json +++ b/launcher/lang/be.json @@ -454,7 +454,9 @@ "runs {command} after": "працуе {command} пасля", "downloaded": "спампавана", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "Абноўлена да {version}. Перазапусціце праграму запуску, каб выкарыстоўваць яе.", + "A new version is available": "Даступная новая версія", + "Download again": "Спампаваць зноў", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Гэтая копія лаўнчара не можа замяніць сябе. Спампуйце яго зноў адзін раз; пасля гэтага ён абнаўляецца сам.", "Any MCP client": "Любы кліент MCP", "{name}'s cape is kept.": "Захоўваецца накідка {name}.", "Not reviewed by the Horizon registry": "Не разглядаецца рэестрам Horizon", @@ -633,7 +635,6 @@ "Copied": "Скапіравана", "Couldn't load patch notes. {error}": "Не ўдалося загрузіць нататкі аб выпраўленні. {error}", "Couldn't load releases. {error}": "Не ўдалося загрузіць выпускі. {error}", - "Launcher updated to {version}": "Праграма запуску абноўлена да {version}", "Launcher {version}": "Пускавая ўстаноўка {version}", "Launcher {version} {percent}%": "Пускавая ўстаноўка {version} {percent}%", "Manage versions": "Кіраванне версіямі", @@ -840,7 +841,6 @@ "Something went wrong.": "Нешта пайшло не так.", "Instances": "Асобнікі", "Join the Discord": "Далучайцеся да Discord", - "Restart to update": "Перазапусціце для абнаўлення", "Duplicate…": "Дублікат…", "Create a desktop shortcut": "Стварыце ярлык на працоўным стале", "Remove the desktop shortcut": "Выдаліць ярлык з працоўнага стала", diff --git a/launcher/lang/bg.json b/launcher/lang/bg.json index da2c610439..9adad91326 100644 --- a/launcher/lang/bg.json +++ b/launcher/lang/bg.json @@ -456,7 +456,9 @@ "runs {command} after": "работи {command} след", "downloaded": "изтеглени", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "Актуализиран до {version}. Рестартирайте стартовия панел, за да го използвате.", + "A new version is available": "Налична е нова версия", + "Download again": "Изтегли отново", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Това копие на лаунчъра не може да замени само себе си. Изтеглете го отново веднъж; след това то се обновява само.", "Any MCP client": "Всеки MCP клиент", "{name}'s cape is kept.": "Пелерината на {name} е запазена.", "Not reviewed by the Horizon registry": "Не е прегледан от регистъра на Horizon", @@ -635,7 +637,6 @@ "Copied": "Копирано", "Couldn't load patch notes. {error}": "Бележките за корекции не можаха да се заредят. {error}", "Couldn't load releases. {error}": "Изданията не можаха да се заредят. {error}", - "Launcher updated to {version}": "Стартовият панел е актуализиран до {version}", "Launcher {version}": "Стартер {version}", "Launcher {version} {percent}%": "Стартер {version} {percent}%", "Manage versions": "Управление на версиите", @@ -842,7 +843,6 @@ "Something went wrong.": "Нещо се обърка.", "Instances": "Инстанции", "Join the Discord": "Присъединете се към Discord", - "Restart to update": "Рестартирайте, за да актуализирате", "Duplicate…": "Дублиране...", "Create a desktop shortcut": "Създайте пряк път на работния плот", "Remove the desktop shortcut": "Премахнете прекия път на работния плот", diff --git a/launcher/lang/br.json b/launcher/lang/br.json index 1821de3f41..9b25103279 100644 --- a/launcher/lang/br.json +++ b/launcher/lang/br.json @@ -454,7 +454,9 @@ "runs {command} after": "redek {command} goude", "downloaded": "pellgarget", "24/7 online": "24/7 enlinenn", - "Updated to {version}. Restart the launcher to use it.": "Hizivaet da {version}. Adloc'hit al lañser evit e arverañ.", + "A new version is available": "Ur stumm nevez a zo", + "Download again": "Pellgargañ en-dro", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "N'hall ket an eilad-mañ eus al loc'her en em erlec'hiañ. Pellgargit anezhañ en-dro ur wech; goude-se en em hiziva e-unan.", "Any MCP client": "Ne vern peseurt kliant MCP", "{name}'s cape is kept.": "{name} a zo miret.", "Not reviewed by the Horizon registry": "N'eo ket bet adwelet gant ar marilh Horizon", @@ -633,7 +635,6 @@ "Copied": "Eilet", "Couldn't load patch notes. {error}": "N'haller ket kargañ notennoù ar patch. {error}", "Couldn't load releases. {error}": "N'haller ket kargañ an embannadurioù. {error}", - "Launcher updated to {version}": "Hizivaet eo bet al lañser da {version}", "Launcher {version}": "Lañser {version}", "Launcher {version} {percent}%": "Lañser {version} {percent}%", "Manage versions": "Merañ ar stummoù", @@ -840,7 +841,6 @@ "Something went wrong.": "Un dra bennak a zo aet fall.", "Instances": "Staliadurioù", "Join the Discord": "Kemer perzh er Discord", - "Restart to update": "Adloc'hañ evit hizivaat", "Duplicate…": "Eilañ...", "Create a desktop shortcut": "Krouiñ ur berradenn evit ar burev", "Remove the desktop shortcut": "Dilemel ar berradenn burev", diff --git a/launcher/lang/bs.json b/launcher/lang/bs.json index 3365211b49..e258e8569b 100644 --- a/launcher/lang/bs.json +++ b/launcher/lang/bs.json @@ -454,7 +454,9 @@ "runs {command} after": "pokreće {command} nakon", "downloaded": "preuzeto", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Ažurirano na {version}. Ponovo pokrenite pokretač da biste ga koristili.", + "A new version is available": "Dostupna je nova verzija", + "Download again": "Preuzmi ponovo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ova kopija pokretača ne može zamijeniti samu sebe. Preuzmite ga ponovo jednom; nakon toga se ažurira sam.", "Any MCP client": "Bilo koji MCP klijent", "{name}'s cape is kept.": "{name} ogrtač je zadržan.", "Not reviewed by the Horizon registry": "Nije pregledan od strane Horizon registra", @@ -633,7 +635,6 @@ "Copied": "Kopirano", "Couldn't load patch notes. {error}": "Nije moguće učitati bilješke o zakrpama. {error}", "Couldn't load releases. {error}": "Učitavanje izdanja nije uspjelo. {error}", - "Launcher updated to {version}": "Pokretač ažuriran na {version}", "Launcher {version}": "Pokretač {version}", "Launcher {version} {percent}%": "Pokretač {version} {percent}%", "Manage versions": "Upravljajte verzijama", @@ -840,7 +841,6 @@ "Something went wrong.": "Nešto je pošlo po zlu.", "Instances": "Instance", "Join the Discord": "Pridružite se Discordu", - "Restart to update": "Ponovo pokrenite za ažuriranje", "Duplicate…": "Dupliciraj…", "Create a desktop shortcut": "Kreirajte prečicu na radnoj površini", "Remove the desktop shortcut": "Uklonite prečicu na radnoj površini", diff --git a/launcher/lang/ca.json b/launcher/lang/ca.json index 8f63b1c463..387a45b729 100644 --- a/launcher/lang/ca.json +++ b/launcher/lang/ca.json @@ -454,7 +454,9 @@ "runs {command} after": "corre {command} després", "downloaded": "descarregat", "24/7 online": "24/7 en línia", - "Updated to {version}. Restart the launcher to use it.": "S'ha actualitzat a {version}. Reinicieu el llançador per utilitzar-lo.", + "A new version is available": "Hi ha una versió nova disponible", + "Download again": "Torna a baixar-lo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Aquesta còpia del llançador no es pot substituir a si mateixa. Torna a baixar-lo una vegada; després s'actualitza sol.", "Any MCP client": "Qualsevol client MCP", "{name}'s cape is kept.": "Es manté la capa de {name}.", "Not reviewed by the Horizon registry": "No revisat pel registre d'Horizon", @@ -633,7 +635,6 @@ "Copied": "Copiat", "Couldn't load patch notes. {error}": "No s'han pogut carregar les notes del pedaç. {error}", "Couldn't load releases. {error}": "No s'han pogut carregar les versions. {error}", - "Launcher updated to {version}": "El llançador s'ha actualitzat a {version}", "Launcher {version}": "Llançador {version}", "Launcher {version} {percent}%": "Llançador {version} {percent}%", "Manage versions": "Gestionar versions", @@ -840,7 +841,6 @@ "Something went wrong.": "Alguna cosa va fallar.", "Instances": "Instàncies", "Join the Discord": "Uneix-te al Discord", - "Restart to update": "Reinicieu per actualitzar", "Duplicate…": "Duplicar…", "Create a desktop shortcut": "Creeu una drecera a l'escriptori", "Remove the desktop shortcut": "Elimina la drecera de l'escriptori", diff --git a/launcher/lang/cs.json b/launcher/lang/cs.json index efba20edc7..47cb93b128 100644 --- a/launcher/lang/cs.json +++ b/launcher/lang/cs.json @@ -456,7 +456,9 @@ "runs {command} after": "běží {command} po", "downloaded": "staženo", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Aktualizováno na {version}. Chcete-li spustit spouštěč, restartujte jej.", + "A new version is available": "Je k dispozici nová verze", + "Download again": "Stáhnout znovu", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Tato kopie spouštěče se nemůže sama nahradit. Stáhněte ji jednou znovu; potom se už aktualizuje sama.", "Any MCP client": "Jakýkoli klient MCP", "{name}'s cape is kept.": "{name} plášť je zachován.", "Not reviewed by the Horizon registry": "Nekontrolováno registrem Horizon", @@ -635,7 +637,6 @@ "Copied": "Zkopírováno", "Couldn't load patch notes. {error}": "Poznámky k opravě se nepodařilo načíst. {error}", "Couldn't load releases. {error}": "Vydání se nepodařilo načíst. {error}", - "Launcher updated to {version}": "Spouštěč aktualizován na {version}", "Launcher {version}": "Spouštěč {version}", "Launcher {version} {percent}%": "Spouštěč {version} {percent}%", "Manage versions": "Spravovat verze", @@ -842,7 +843,6 @@ "Something went wrong.": "Něco se pokazilo.", "Instances": "Instance", "Join the Discord": "Připojte se k Discordu", - "Restart to update": "Pro aktualizaci restartujte", "Duplicate…": "Duplikovat…", "Create a desktop shortcut": "Vytvořte zástupce na ploše", "Remove the desktop shortcut": "Odeberte zástupce na ploše", diff --git a/launcher/lang/cv.json b/launcher/lang/cv.json index fe03b90b7e..250d4a1b17 100644 --- a/launcher/lang/cv.json +++ b/launcher/lang/cv.json @@ -454,7 +454,9 @@ "runs {command} after": "хыҫҫӑн {command} чупать", "downloaded": "скачать тунӑ", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} таран ҫӗнетнӗ. Ӑна усӑ курма лаунчера ҫӗнӗрен пуҫламалла.", + "A new version is available": "Ҫӗнӗ верси пур", + "Download again": "Тепре тиесе ил", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчерӑн ку копийӗ хӑйне хӑй улӑштарма пултараймасть. Ӑна пӗрре тепре тиесе илӗр; кайран вӑл хӑйне хӑй ҫӗнетет.", "Any MCP client": "Кирек мӗнле MCP клиент", "{name}'s cape is kept.": "{name} плащне упраҫҫӗ.", "Not reviewed by the Horizon registry": "Horizon реестрӗнче пӑхса тухман", @@ -633,7 +635,6 @@ "Copied": "Копиленӗ", "Couldn't load patch notes. {error}": "Патч-нотӑсене ҫӗклеймерӗм. {error}", "Couldn't load releases. {error}": "Релизсене загрузка тума май килмерӗ. {error}", - "Launcher updated to {version}": "Пускатель {version} таран ҫӗнетнӗ", "Launcher {version}": "Пускатель {version}", "Launcher {version} {percent}%": "Пускатель {version} {percent}%", "Manage versions": "Версисене ертсе пырӑр", @@ -840,7 +841,6 @@ "Something went wrong.": "Темскер йӑнӑш пулчӗ.", "Instances": "Инстанцисем", "Join the Discord": "Discord ушкӑнне хутшӑнӑр", - "Restart to update": "Ҫӗнетме ҫӗнӗрен пуҫла", "Duplicate…": "Дубликат...", "Create a desktop shortcut": "Ӗҫ сӗтелӗ ҫинчи ярлык тӑвӑр", "Remove the desktop shortcut": "Ӗҫ сӗтелӗ ҫинчи ярлыка кӑларса пӑрахӑр", diff --git a/launcher/lang/cy.json b/launcher/lang/cy.json index adfd9b08d4..f8d3d3765f 100644 --- a/launcher/lang/cy.json +++ b/launcher/lang/cy.json @@ -454,7 +454,9 @@ "runs {command} after": "yn rhedeg {command} ar ôl", "downloaded": "llwytho i lawr", "24/7 online": "24/7 ar-lein", - "Updated to {version}. Restart the launcher to use it.": "Wedi'i ddiweddaru i {version}. Ailgychwynnwch y lansiwr i'w ddefnyddio.", + "A new version is available": "Mae fersiwn newydd ar gael", + "Download again": "Lawrlwytho eto", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ni all y copi hwn o'r lansiwr gymryd ei le ei hun. Lawrlwythwch ef eto unwaith; wedyn mae'n diweddaru ei hun.", "Any MCP client": "Unrhyw gleient MCP", "{name}'s cape is kept.": "Mae clogyn {name} yn cael ei gadw.", "Not reviewed by the Horizon registry": "Heb ei adolygu gan y gofrestrfa Horizon", @@ -633,7 +635,6 @@ "Copied": "Wedi'i gopïo", "Couldn't load patch notes. {error}": "Methu llwytho nodiadau clytiau. {error}", "Couldn't load releases. {error}": "Methu llwytho datganiadau. {error}", - "Launcher updated to {version}": "Lansiwr wedi'i ddiweddaru i {version}", "Launcher {version}": "Lansiwr {version}", "Launcher {version} {percent}%": "Lansiwr {version} {percent}%", "Manage versions": "Rheoli fersiynau", @@ -840,7 +841,6 @@ "Something went wrong.": "Aeth rhywbeth o'i le.", "Instances": "Enghreifftiau", "Join the Discord": "Ymunwch â'r Discord", - "Restart to update": "Ailgychwyn i ddiweddaru", "Duplicate…": "Dyblyg…", "Create a desktop shortcut": "Creu llwybr byr bwrdd gwaith", "Remove the desktop shortcut": "Tynnwch y llwybr byr bwrdd gwaith", diff --git a/launcher/lang/da.json b/launcher/lang/da.json index 9a0d374d04..f317614856 100644 --- a/launcher/lang/da.json +++ b/launcher/lang/da.json @@ -456,7 +456,9 @@ "runs {command} after": "løber {command} efter", "downloaded": "downloadet", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Opdateret til {version}. Genstart launcheren for at bruge den.", + "A new version is available": "En ny version er tilgængelig", + "Download again": "Download igen", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Denne kopi af launcheren kan ikke erstatte sig selv. Download den igen én gang; derefter opdaterer den sig selv.", "Any MCP client": "Enhver MCP-klient", "{name}'s cape is kept.": "{name}s kappe beholdes.", "Not reviewed by the Horizon registry": "Ikke gennemgået af Horizon-registret", @@ -635,7 +637,6 @@ "Copied": "Kopieret", "Couldn't load patch notes. {error}": "Patch-noter kunne ikke indlæses. {error}", "Couldn't load releases. {error}": "Kunne ikke indlæse udgivelser. {error}", - "Launcher updated to {version}": "Launcher opdateret til {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Administrer versioner", @@ -842,7 +843,6 @@ "Something went wrong.": "Noget gik galt.", "Instances": "Forekomster", "Join the Discord": "Deltag i Discord", - "Restart to update": "Genstart for at opdatere", "Duplicate…": "Dupliker...", "Create a desktop shortcut": "Opret en skrivebordsgenvej", "Remove the desktop shortcut": "Fjern skrivebordsgenvejen", diff --git a/launcher/lang/de.json b/launcher/lang/de.json index 359abaebeb..0ba848658b 100644 --- a/launcher/lang/de.json +++ b/launcher/lang/de.json @@ -456,7 +456,9 @@ "runs {command} after": "führt danach {command} aus", "downloaded": "downloaded", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Auf {version} aktualisiert. Starte den Launcher neu, um sie zu verwenden.", + "A new version is available": "Eine neue Version ist verfügbar", + "Download again": "Erneut herunterladen", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Diese Kopie des Launchers kann sich nicht selbst ersetzen. Lade ihn einmal neu herunter; danach aktualisiert er sich selbst.", "Any MCP client": "Any MCP client", "{name}'s cape is kept.": "{name}s Umhang wird beibehalten.", "Not reviewed by the Horizon registry": "Nicht vom Horizon-Verzeichnis geprüft", @@ -635,7 +637,6 @@ "Copied": "Kopiert", "Couldn't load patch notes. {error}": "Couldn't load patch notes. {error}", "Couldn't load releases. {error}": "Couldn't load releases. {error}", - "Launcher updated to {version}": "Launcher updated to {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Versionen verwalten", @@ -842,7 +843,6 @@ "Something went wrong.": "Etwas ist schiefgelaufen.", "Instances": "Instanzen", "Join the Discord": "Dem Discord beitreten", - "Restart to update": "Neu starten zum Aktualisieren", "Duplicate…": "Duplizieren…", "Create a desktop shortcut": "Desktop-Verknüpfung erstellen", "Remove the desktop shortcut": "Desktop-Verknüpfung entfernen", diff --git a/launcher/lang/el.json b/launcher/lang/el.json index 7a641b4a3c..e4c7e5c236 100644 --- a/launcher/lang/el.json +++ b/launcher/lang/el.json @@ -456,7 +456,9 @@ "runs {command} after": "τρέχει {command} μετά", "downloaded": "κατεβάσει", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Ενημερώθηκε σε {version}. Επανεκκινήστε το πρόγραμμα εκκίνησης για να το χρησιμοποιήσετε.", + "A new version is available": "Υπάρχει νέα έκδοση", + "Download again": "Λήψη ξανά", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Αυτό το αντίγραφο του εκκινητή δεν μπορεί να αντικαταστήσει τον εαυτό του. Κατεβάστε το ξανά μία φορά· μετά ενημερώνεται μόνο του.", "Any MCP client": "Οποιοσδήποτε πελάτης MCP", "{name}'s cape is kept.": "Το ακρωτήρι του {name} διατηρείται.", "Not reviewed by the Horizon registry": "Δεν έχει ελεγχθεί από το μητρώο Horizon", @@ -635,7 +637,6 @@ "Copied": "Αντιγράφηκε", "Couldn't load patch notes. {error}": "Δεν ήταν δυνατή η φόρτωση των σημειώσεων ενημέρωσης κώδικα. {error}", "Couldn't load releases. {error}": "Δεν ήταν δυνατή η φόρτωση των κυκλοφοριών. {error}", - "Launcher updated to {version}": "Το πρόγραμμα εκκίνησης ενημερώθηκε σε {version}", "Launcher {version}": "Εκτοξευτής {version}", "Launcher {version} {percent}%": "Εκτοξευτής {version} {percent}%", "Manage versions": "Διαχείριση εκδόσεων", @@ -842,7 +843,6 @@ "Something went wrong.": "Κάτι πήγε στραβά.", "Instances": "Περιπτώσεις", "Join the Discord": "Εγγραφείτε στο Discord", - "Restart to update": "Κάντε επανεκκίνηση για ενημέρωση", "Duplicate…": "Διπλότυπο…", "Create a desktop shortcut": "Δημιουργήστε μια συντόμευση επιφάνειας εργασίας", "Remove the desktop shortcut": "Καταργήστε τη συντόμευση της επιφάνειας εργασίας", diff --git a/launcher/lang/eo.json b/launcher/lang/eo.json index b2844601e8..1ed830189f 100644 --- a/launcher/lang/eo.json +++ b/launcher/lang/eo.json @@ -454,7 +454,9 @@ "runs {command} after": "kuras {command} post", "downloaded": "elŝutita", "24/7 online": "24/7 interrete", - "Updated to {version}. Restart the launcher to use it.": "Ĝisdatigita al {version}. Rekomencu la lanĉilon por uzi ĝin.", + "A new version is available": "Nova versio disponeblas", + "Download again": "Elŝuti denove", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ĉi tiu kopio de la lanĉilo ne povas anstataŭigi sin. Elŝutu ĝin denove unufoje; poste ĝi ĝisdatigas sin mem.", "Any MCP client": "Ajna MCP-kliento", "{name}'s cape is kept.": "La kabo de {name} estas konservita.", "Not reviewed by the Horizon registry": "Ne reviziita de la Horizon registro", @@ -633,7 +635,6 @@ "Copied": "Kopiita", "Couldn't load patch notes. {error}": "Ne eblis ŝargi fliknotojn. {error}", "Couldn't load releases. {error}": "Ne eblis ŝarĝi eldonojn. {error}", - "Launcher updated to {version}": "Lanĉilo ĝisdatigita al {version}", "Launcher {version}": "Lanĉilo {version}", "Launcher {version} {percent}%": "Lanĉilo {version} {percent}%", "Manage versions": "Administri versiojn", @@ -840,7 +841,6 @@ "Something went wrong.": "Io misfunkciis.", "Instances": "Instancoj", "Join the Discord": "Aliĝu al la Discord", - "Restart to update": "Rekomencu por ĝisdatigi", "Duplicate…": "Duobligi...", "Create a desktop shortcut": "Kreu labortablan ŝparvojon", "Remove the desktop shortcut": "Forigu la labortablan ŝparvojon", diff --git a/launcher/lang/es.json b/launcher/lang/es.json index 2aee175167..1ddfe11ad7 100644 --- a/launcher/lang/es.json +++ b/launcher/lang/es.json @@ -456,7 +456,9 @@ "runs {command} after": "ejecuta después {command}", "downloaded": "descargados", "24/7 online": "en línea 24/7", - "Updated to {version}. Restart the launcher to use it.": "Actualizado a {version}. Reinicia el lanzador para usarlo.", + "A new version is available": "Hay una nueva versión disponible", + "Download again": "Descargar de nuevo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Esta copia del launcher no puede reemplazarse a sí misma. Descárgalo de nuevo una vez; después se actualiza solo.", "Any MCP client": "Cualquier cliente MCP", "{name}'s cape is kept.": "Se conserva la capa de {name}.", "Not reviewed by the Horizon registry": "No revisado por el registro de Horizon", @@ -635,7 +637,6 @@ "Copied": "Copiado", "Couldn't load patch notes. {error}": "Couldn't load patch notes. {error}", "Couldn't load releases. {error}": "Couldn't load releases. {error}", - "Launcher updated to {version}": "Launcher updated to {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Administrar versiones", @@ -842,7 +843,6 @@ "Something went wrong.": "Algo salió mal.", "Instances": "Instancias", "Join the Discord": "Únete al Discord", - "Restart to update": "Reiniciar para actualizar", "Duplicate…": "Duplicar…", "Create a desktop shortcut": "Crear un acceso directo en el escritorio", "Remove the desktop shortcut": "Quitar el acceso directo del escritorio", diff --git a/launcher/lang/et.json b/launcher/lang/et.json index 2393f1579a..0bc69de3ad 100644 --- a/launcher/lang/et.json +++ b/launcher/lang/et.json @@ -454,7 +454,9 @@ "runs {command} after": "jookseb {command} pärast", "downloaded": "alla laaditud", "24/7 online": "24/7 võrgus", - "Updated to {version}. Restart the launcher to use it.": "Värskendati {version}. Selle kasutamiseks taaskäivitage käivitaja.", + "A new version is available": "Uus versioon on saadaval", + "Download again": "Laadi uuesti alla", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "See käivitaja koopia ei saa ennast asendada. Laadi see üks kord uuesti alla; pärast seda uueneb see ise.", "Any MCP client": "Iga MCP klient", "{name}'s cape is kept.": "{name} keep on alles.", "Not reviewed by the Horizon registry": "Horizoni register pole üle vaadanud", @@ -633,7 +635,6 @@ "Copied": "Kopeeritud", "Couldn't load patch notes. {error}": "Paigutuste märkmeid ei saanud laadida. {error}", "Couldn't load releases. {error}": "Väljalaseid ei saanud laadida. {error}", - "Launcher updated to {version}": "Käivitaja värskendati versioonile {version}", "Launcher {version}": "Käivitusprogramm {version}", "Launcher {version} {percent}%": "Käivitusprogramm {version} {percent}%", "Manage versions": "Hallake versioone", @@ -840,7 +841,6 @@ "Something went wrong.": "Midagi läks valesti.", "Instances": "Eksemplarid", "Join the Discord": "Liituge Discordiga", - "Restart to update": "Värskendamiseks taaskäivitage", "Duplicate…": "Duplikaat…", "Create a desktop shortcut": "Looge töölaua otsetee", "Remove the desktop shortcut": "Eemaldage töölaua otsetee", diff --git a/launcher/lang/eu.json b/launcher/lang/eu.json index 5f8496c051..535487c6a5 100644 --- a/launcher/lang/eu.json +++ b/launcher/lang/eu.json @@ -454,7 +454,9 @@ "runs {command} after": "korrika {command} ondoren", "downloaded": "deskargatu", "24/7 online": "24/7 sarean", - "Updated to {version}. Restart the launcher to use it.": "{version}-ra eguneratu da. Berrabiarazi abiarazlea hura erabiltzeko.", + "A new version is available": "Bertsio berri bat dago eskuragarri", + "Download again": "Deskargatu berriro", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Abiarazlearen kopia honek ezin du bere burua ordeztu. Deskargatu berriro behin; gero bere kabuz eguneratzen da.", "Any MCP client": "Edozein MCP bezero", "{name}'s cape is kept.": "{name}ren kapa gordetzen da.", "Not reviewed by the Horizon registry": "Horizon erregistroak ez du berrikusi", @@ -633,7 +635,6 @@ "Copied": "Kopiatua", "Couldn't load patch notes. {error}": "Ezin izan dira adabaki-oharrak kargatu. {error}", "Couldn't load releases. {error}": "Ezin izan dira kargatu bertsioak. {error}", - "Launcher updated to {version}": "Abiarazlea {version}-ra eguneratu da", "Launcher {version}": "Abiarazlea {version}", "Launcher {version} {percent}%": "Abiarazlea {version} {percent}%", "Manage versions": "Kudeatu bertsioak", @@ -840,7 +841,6 @@ "Something went wrong.": "Zerbait gaizki joan da.", "Instances": "Instantziak", "Join the Discord": "Batu Discord-ekin", - "Restart to update": "Berrabiarazi eguneratzeko", "Duplicate…": "Bikoiztu…", "Create a desktop shortcut": "Sortu mahaigaineko lasterbide bat", "Remove the desktop shortcut": "Kendu mahaigaineko lasterbidea", diff --git a/launcher/lang/fa.json b/launcher/lang/fa.json index f492b12b11..22c39b318d 100644 --- a/launcher/lang/fa.json +++ b/launcher/lang/fa.json @@ -456,7 +456,9 @@ "runs {command} after": "بعد از {command} اجرا می شود", "downloaded": "دانلود شده است", "24/7 online": "24/7 آنلاین", - "Updated to {version}. Restart the launcher to use it.": "به روز رسانی به {version}. لانچر را مجدداً راه اندازی کنید تا از آن استفاده کنید.", + "A new version is available": "نسخه جدیدی در دسترس است", + "Download again": "دوباره دانلود کنید", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "این نسخه از لانچر نمی‌تواند خودش را جایگزین کند. یک بار دیگر آن را دانلود کنید؛ پس از آن خودش به‌روز می‌شود.", "Any MCP client": "هر مشتری MCP", "{name}'s cape is kept.": "شنل {name} نگهداری می شود.", "Not reviewed by the Horizon registry": "توسط رجیستری Horizon بررسی نشده است", @@ -635,7 +637,6 @@ "Copied": "کپی شده است", "Couldn't load patch notes. {error}": "یادداشت‌های وصله بارگیری نشدند. {error}", "Couldn't load releases. {error}": "انتشارات بارگیری نشد. {error}", - "Launcher updated to {version}": "لانچر به {version} به روز شد", "Launcher {version}": "لانچر {version}", "Launcher {version} {percent}%": "لانچر {version} {percent}%", "Manage versions": "نسخه ها را مدیریت کنید", @@ -842,7 +843,6 @@ "Something went wrong.": "مشکلی پیش آمد.", "Instances": "موارد", "Join the Discord": "به دیسکورد بپیوندید", - "Restart to update": "راه اندازی مجدد برای به روز رسانی", "Duplicate…": "تکراری…", "Create a desktop shortcut": "یک میانبر دسکتاپ ایجاد کنید", "Remove the desktop shortcut": "میانبر دسکتاپ را حذف کنید", diff --git a/launcher/lang/fi.json b/launcher/lang/fi.json index 2acc43bc01..28ff5c1e20 100644 --- a/launcher/lang/fi.json +++ b/launcher/lang/fi.json @@ -456,7 +456,9 @@ "runs {command} after": "toimii {command} jälkeen", "downloaded": "ladattu", "24/7 online": "24/7 verkossa", - "Updated to {version}. Restart the launcher to use it.": "Päivitetty {version}. Käynnistä käynnistysohjelma uudelleen käyttääksesi sitä.", + "A new version is available": "Uusi versio on saatavilla", + "Download again": "Lataa uudelleen", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Tämä käynnistimen kopio ei voi korvata itseään. Lataa se kerran uudelleen; sen jälkeen se päivittää itsensä.", "Any MCP client": "Mikä tahansa MCP-asiakas", "{name}'s cape is kept.": "{name}:n viitta säilytetään.", "Not reviewed by the Horizon registry": "Ei tarkistettu Horizon-rekisterissä", @@ -635,7 +637,6 @@ "Copied": "Kopioitu", "Couldn't load patch notes. {error}": "Korjausmuistiinpanoja ei voitu ladata. {error}", "Couldn't load releases. {error}": "Julkaisuja ei voitu ladata. {error}", - "Launcher updated to {version}": "Käynnistysohjelma päivitetty {version}", "Launcher {version}": "Käynnistysohjelma {version}", "Launcher {version} {percent}%": "Käynnistysohjelma {version} {percent}%", "Manage versions": "Hallitse versioita", @@ -842,7 +843,6 @@ "Something went wrong.": "Jotain meni pieleen.", "Instances": "Esineet", "Join the Discord": "Liity Discordiin", - "Restart to update": "Käynnistä uudelleen päivittääksesi", "Duplicate…": "Kopioi…", "Create a desktop shortcut": "Luo työpöydän pikakuvake", "Remove the desktop shortcut": "Poista työpöydän pikakuvake", diff --git a/launcher/lang/fil.json b/launcher/lang/fil.json index 433ca86d46..fbac3ac939 100644 --- a/launcher/lang/fil.json +++ b/launcher/lang/fil.json @@ -454,7 +454,9 @@ "runs {command} after": "tumatakbo {command} pagkatapos", "downloaded": "na-download", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Na-update sa {version}. I-restart ang launcher para magamit ito.", + "A new version is available": "May bagong bersyon", + "Download again": "I-download ulit", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Hindi kayang palitan ng kopyang ito ng launcher ang sarili nito. I-download ito ulit nang isang beses; pagkatapos noon, kusa na itong mag-a-update.", "Any MCP client": "Anumang MCP client", "{name}'s cape is kept.": "Ang kapa ni {name} ay itinatago.", "Not reviewed by the Horizon registry": "Hindi nasuri ng Horizon registry", @@ -633,7 +635,6 @@ "Copied": "Kinopya", "Couldn't load patch notes. {error}": "Hindi ma-load ang mga patch notes. {error}", "Couldn't load releases. {error}": "Hindi ma-load ang mga release. {error}", - "Launcher updated to {version}": "Na-update ang launcher sa {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Pamahalaan ang mga bersyon", @@ -840,7 +841,6 @@ "Something went wrong.": "Nagkaproblema.", "Instances": "Mga instance", "Join the Discord": "Sumali sa Discord", - "Restart to update": "I-restart upang mag-update", "Duplicate…": "Duplicate…", "Create a desktop shortcut": "Gumawa ng desktop shortcut", "Remove the desktop shortcut": "Alisin ang desktop shortcut", diff --git a/launcher/lang/fo.json b/launcher/lang/fo.json index 4869756207..f5f75c6f9b 100644 --- a/launcher/lang/fo.json +++ b/launcher/lang/fo.json @@ -454,7 +454,9 @@ "runs {command} after": "koyrir {command} eftir", "downloaded": "heintað", "24/7 online": "24/7 á netinum", - "Updated to {version}. Restart the launcher to use it.": "Dagført til {version}. Endurbyrja sjósetaran fyri at brúka hann.", + "A new version is available": "Ein nýggj útgáva er tøk", + "Download again": "Tak niður aftur", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Hetta avritið av byrjaranum kann ikki skifta seg sjálvt út. Tak tað niður aftur eina ferð; eftir tað dagførir tað seg sjálvt.", "Any MCP client": "Ein og hvør MCP kundi", "{name}'s cape is kept.": "{name}'s kápa er hildin.", "Not reviewed by the Horizon registry": "Ikki ummælt av Horizon skrásetingini", @@ -633,7 +635,6 @@ "Copied": "Avritað", "Couldn't load patch notes. {error}": "Kundi ikki heinta plásturseðlar. {error}", "Couldn't load releases. {error}": "Kundi ikki heinta útgávur. {error}", - "Launcher updated to {version}": "Sjósetari dagførdur til {version}", "Launcher {version}": "Sjósetari {version}", "Launcher {version} {percent}%": "Sjósetari {version} {percent}%", "Manage versions": "Umsita útgávur", @@ -840,7 +841,6 @@ "Something went wrong.": "Okkurt gekk galið.", "Instances": "Uppsetingar", "Join the Discord": "Melda teg til Discord", - "Restart to update": "Endurbyrja fyri at dagføra", "Duplicate…": "Tvítøk...", "Create a desktop shortcut": "Stovna ein snarveg á skriviborði", "Remove the desktop shortcut": "Strika snarvegin á skriviborðinum", diff --git a/launcher/lang/fr.json b/launcher/lang/fr.json index 5754963d15..9585e3f283 100644 --- a/launcher/lang/fr.json +++ b/launcher/lang/fr.json @@ -456,7 +456,9 @@ "runs {command} after": "exécute ensuite {command}", "downloaded": "téléchargé", "24/7 online": "en ligne 24h/24", - "Updated to {version}. Restart the launcher to use it.": "Mis à jour vers {version}. Redémarrez le launcher pour l'utiliser.", + "A new version is available": "Une nouvelle version est disponible", + "Download again": "Télécharger à nouveau", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Cette copie du lanceur ne peut pas se remplacer elle-même. Téléchargez-le à nouveau une fois ; ensuite il se met à jour tout seul.", "Any MCP client": "Tout client MCP", "{name}'s cape is kept.": "La cape de {name} est enregistrée.", "Not reviewed by the Horizon registry": "Non vérifié par le registre d'Horizon", @@ -635,7 +637,6 @@ "Copied": "Copié", "Couldn't load patch notes. {error}": "Impossible de charger les notes de mise à jour. {error}", "Couldn't load releases. {error}": "Impossible de charger les versions. {error}", - "Launcher updated to {version}": "Lanceur mis à jour vers {version}", "Launcher {version}": "Lanceur {version}", "Launcher {version} {percent}%": "Lanceur {version} {percent}%", "Manage versions": "Gérer les versions", @@ -842,7 +843,6 @@ "Something went wrong.": "Une erreur s’est produite.", "Instances": "Instances", "Join the Discord": "Rejoindre le Discord", - "Restart to update": "Redémarrer pour mettre à jour", "Duplicate…": "Dupliquer…", "Create a desktop shortcut": "Créer un raccourci sur le bureau", "Remove the desktop shortcut": "Supprimer le raccourci du bureau", diff --git a/launcher/lang/fur.json b/launcher/lang/fur.json index b0b9d6633d..fd380fc903 100644 --- a/launcher/lang/fur.json +++ b/launcher/lang/fur.json @@ -456,7 +456,9 @@ "runs {command} after": "cor {command} dopo", "downloaded": "scaricât", "24/7 online": "24/7 in rêt", - "Updated to {version}. Restart the launcher to use it.": "Aggiornât a {version}. Riavviâ il lançadôr par doprâlu.", + "A new version is available": "E je disponibil une gnove version", + "Download again": "Torne a discjamâ", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Cheste copie dal inviadôr no pues sostituîsi di bessole. Torne a discjamâle une volte; dopo si inzorne di bessole.", "Any MCP client": "Ogni client MCP", "{name}'s cape is kept.": "La cape di {name} e je tignude.", "Not reviewed by the Horizon registry": "No revisionât dal regjistri Horizon", @@ -635,7 +637,6 @@ "Copied": "Copiât", "Couldn't load patch notes. {error}": "No si è rivât a cjargjâ lis notis di corezion. {error}", "Couldn't load releases. {error}": "No si è rivât a cjargjâ lis versions. {error}", - "Launcher updated to {version}": "Il lançadôr al è stât agjiornât a {version}", "Launcher {version}": "Lançadôr {version}", "Launcher {version} {percent}%": "Lançadôr {version} {percent}%", "Manage versions": "Gjestî lis versions", @@ -842,7 +843,6 @@ "Something went wrong.": "Cualchi robe e je lade mâl.", "Instances": "Istancis", "Join the Discord": "Iscriviti al Discord", - "Restart to update": "Riavviâ par agjiornâ", "Duplicate…": "Duplicâ...", "Create a desktop shortcut": "Creâ une scurtissime dal schermi", "Remove the desktop shortcut": "Elimina la scurtissime dal schermi", diff --git a/launcher/lang/fy.json b/launcher/lang/fy.json index dfbea42693..2c2b853e5c 100644 --- a/launcher/lang/fy.json +++ b/launcher/lang/fy.json @@ -454,7 +454,9 @@ "runs {command} after": "rint {command} nei", "downloaded": "ynladen", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Bywurke nei {version}. Start de launcher opnij om it te brûken.", + "A new version is available": "Der is in nije ferzje beskikber", + "Download again": "Opnij downloade", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Dizze kopy fan de launcher kin himsels net ferfange. Download him ien kear opnij; dêrnei wurdt er sels bywurke.", "Any MCP client": "Elke MCP-kliïnt", "{name}'s cape is kept.": "De kaap fan {name} wurdt bewarre.", "Not reviewed by the Horizon registry": "Net hifke troch it register Horizon", @@ -633,7 +635,6 @@ "Copied": "Kopiearre", "Couldn't load patch notes. {error}": "Koe patchnotysjes net lade. {error}", "Couldn't load releases. {error}": "Koe releases net lade. {error}", - "Launcher updated to {version}": "Launcher bywurke nei {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Ferzjes beheare", @@ -840,7 +841,6 @@ "Something went wrong.": "Der gie wat mis.", "Instances": "Instances", "Join the Discord": "Doch mei oan de Discord", - "Restart to update": "Op 'e nij begjinne om te aktualisearjen", "Duplicate…": "Duplikaat…", "Create a desktop shortcut": "Meitsje in buroblêd fluchtoets", "Remove the desktop shortcut": "Fuortsmite de buroblêd fluchtoets", diff --git a/launcher/lang/ga.json b/launcher/lang/ga.json index b644471794..ab6bfdd12c 100644 --- a/launcher/lang/ga.json +++ b/launcher/lang/ga.json @@ -454,7 +454,9 @@ "runs {command} after": "ritheann {command} tar éis", "downloaded": "íoslódáilte", "24/7 online": "24/7 ar líne", - "Updated to {version}. Restart the launcher to use it.": "Nuashonraithe go {version}. Atosaigh an tosaitheoir chun é a úsáid.", + "A new version is available": "Tá leagan nua ar fáil", + "Download again": "Íoslódáil arís", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ní féidir leis an gcóip seo den lainseálaí í féin a athsholáthar. Íoslódáil arís é uair amháin; ina dhiaidh sin nuashonraíonn sé é féin.", "Any MCP client": "Aon chliant MCP", "{name}'s cape is kept.": "Coinnítear caipín {name}.", "Not reviewed by the Horizon registry": "Gan athbhreithniú ag an gclár Horizon", @@ -633,7 +635,6 @@ "Copied": "Cóipeáladh", "Couldn't load patch notes. {error}": "Níorbh fhéidir nótaí paiste a lódáil. {error}", "Couldn't load releases. {error}": "Níorbh fhéidir eisiúintí a lódáil. {error}", - "Launcher updated to {version}": "Nuashonraíodh an tosaitheoir go {version}", "Launcher {version}": "Tosaitheoir {version}", "Launcher {version} {percent}%": "Tosaitheoir {version} {percent}%", "Manage versions": "Bainistigh leaganacha", @@ -840,7 +841,6 @@ "Something went wrong.": "Chuaigh rud éigin mícheart.", "Instances": "Cásanna", "Join the Discord": "Bí ar an Discord", - "Restart to update": "Atosaigh le nuashonrú", "Duplicate…": "Déan dúblach…", "Create a desktop shortcut": "Cruthaigh aicearra deisce", "Remove the desktop shortcut": "Bain an t-aicearra deisce", diff --git a/launcher/lang/gd.json b/launcher/lang/gd.json index 040f5b0e50..7724d38b8c 100644 --- a/launcher/lang/gd.json +++ b/launcher/lang/gd.json @@ -454,7 +454,9 @@ "runs {command} after": "ruith {command} às deidh", "downloaded": "air a luchdachadh sìos", "24/7 online": "24/7 air-loidhne", - "Updated to {version}. Restart the launcher to use it.": "Air ùrachadh gu {version}. Ath-thòisich an lannsair gus a chleachdadh.", + "A new version is available": "Tha tionndadh ùr ri fhaighinn", + "Download again": "Luchdaich a-nuas a-rithist", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Chan urrainn dhan lethbhreac seo dhen lannsair e fhèin a chur na àite. Luchdaich a-nuas a-rithist e aon turas; às dèidh sin ùraichidh e e fhèin.", "Any MCP client": "Neach-dèiligidh MCP sam bith", "{name}'s cape is kept.": "Tha caip {name} air a chumail.", "Not reviewed by the Horizon registry": "Gun ath-sgrùdadh leis a’ chlàr Horizon", @@ -633,7 +635,6 @@ "Copied": "Rinn lethbhreac", "Couldn't load patch notes. {error}": "Cha b' urrainn dhuinn notaichean paiste a luchdachadh. {error}", "Couldn't load releases. {error}": "Cha b' urrainn dhuinn fiosan a luchdachadh. {error}", - "Launcher updated to {version}": "Launcher air ùrachadh gu {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Tosgaire {version} {percent}%", "Manage versions": "Stiùirich tionndaidhean", @@ -840,7 +841,6 @@ "Something went wrong.": "Chaidh rudeigin ceàrr.", "Instances": "Eisimpleirean", "Join the Discord": "Thig còmhla ris an Discord", - "Restart to update": "Ath-thòisich airson ùrachadh", "Duplicate…": "Dèan dùblachadh…", "Create a desktop shortcut": "Cruthaich ath-ghoirid deasg", "Remove the desktop shortcut": "Thoir air falbh ath-ghoirid an deasg", diff --git a/launcher/lang/gl.json b/launcher/lang/gl.json index 80444c3056..15198f4b5c 100644 --- a/launcher/lang/gl.json +++ b/launcher/lang/gl.json @@ -454,7 +454,9 @@ "runs {command} after": "corre {command} despois", "downloaded": "descargado", "24/7 online": "24/7 en liña", - "Updated to {version}. Restart the launcher to use it.": "Actualizado a {version}. Reinicie o iniciador para usalo.", + "A new version is available": "Hai unha nova versión dispoñible", + "Download again": "Descargar de novo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Esta copia do lanzador non se pode substituír a si mesma. Descárgao de novo unha vez; despois actualízase só.", "Any MCP client": "Calquera cliente MCP", "{name}'s cape is kept.": "Gárdase a capa de {name}.", "Not reviewed by the Horizon registry": "Non revisado polo rexistro Horizon", @@ -633,7 +635,6 @@ "Copied": "Copiouse", "Couldn't load patch notes. {error}": "Non se puideron cargar as notas do parche. {error}", "Couldn't load releases. {error}": "Non se puideron cargar as versións. {error}", - "Launcher updated to {version}": "Lanzador actualizado a {version}", "Launcher {version}": "Lanzador {version}", "Launcher {version} {percent}%": "Lanzador {version} {percent}%", "Manage versions": "Xestionar versións", @@ -840,7 +841,6 @@ "Something went wrong.": "Algo saíu mal.", "Instances": "Instancias", "Join the Discord": "Únete ao Discord", - "Restart to update": "Reinicia para actualizar", "Duplicate…": "Duplicar…", "Create a desktop shortcut": "Crea un atallo no escritorio", "Remove the desktop shortcut": "Elimina o atallo do escritorio", diff --git a/launcher/lang/haw.json b/launcher/lang/haw.json index 81e817ea86..61e760fe38 100644 --- a/launcher/lang/haw.json +++ b/launcher/lang/haw.json @@ -454,7 +454,9 @@ "runs {command} after": "holo {command} ma hope", "downloaded": "hoʻoiho ʻia", "24/7 online": "24/7 ma ka pūnaewele", - "Updated to {version}. Restart the launcher to use it.": "Hoʻohou ʻia i {version}. E hoʻomaka hou i ka mea hoʻolaha e hoʻohana.", + "A new version is available": "Loaʻa kekahi mana hou", + "Download again": "Hoʻoiho hou", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "ʻAʻole hiki i kēia kope o ka launcher ke pani iā ia iho. E hoʻoiho hou iā ia hoʻokahi manawa; ma hope o laila, hoʻohou ʻo ia iā ia iho.", "Any MCP client": "ʻO kēlā me kēia mea kūʻai aku MCP", "{name}'s cape is kept.": "Mālama ʻia ka ʻahuʻula o {name}.", "Not reviewed by the Horizon registry": "ʻAʻole nānā ʻia e ka papa inoa Horizon", @@ -633,7 +635,6 @@ "Copied": "Kope ʻia", "Couldn't load patch notes. {error}": "ʻAʻole hiki ke hoʻouka i nā memo paʻi. {error}", "Couldn't load releases. {error}": "ʻAʻole hiki ke hoʻouka i nā hoʻokuʻu. {error}", - "Launcher updated to {version}": "Hoʻouka hou ʻia ka mea hoʻolaha iā {version}", "Launcher {version}": "Mea hoʻolaha {version}", "Launcher {version} {percent}%": "Mea hoʻolaha {version} {percent}%", "Manage versions": "Mālama i nā mana", @@ -840,7 +841,6 @@ "Something went wrong.": "Ua hewa kekahi mea.", "Instances": "Nā laʻana", "Join the Discord": "E hui pū me Discord", - "Restart to update": "Hoʻomaka hou e hoʻohou", "Duplicate…": "Hoʻopālua…", "Create a desktop shortcut": "E hana i kahi pōkole papapihi", "Remove the desktop shortcut": "Wehe i ka pōkole papapihi", diff --git a/launcher/lang/he.json b/launcher/lang/he.json index 4ad0e4ff14..dcd61228a7 100644 --- a/launcher/lang/he.json +++ b/launcher/lang/he.json @@ -456,7 +456,9 @@ "runs {command} after": "רץ {command} אחרי", "downloaded": "הורד", "24/7 online": "24/7 באינטרנט", - "Updated to {version}. Restart the launcher to use it.": "עודכן ל-{version}. הפעל מחדש את המשגר כדי להשתמש בו.", + "A new version is available": "גרסה חדשה זמינה", + "Download again": "הורדה מחדש", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "העותק הזה של המשגר לא יכול להחליף את עצמו. הורידו אותו מחדש פעם אחת; אחרי זה הוא מתעדכן בעצמו.", "Any MCP client": "כל לקוח MCP", "{name}'s cape is kept.": "השכמייה של {name} נשמרת.", "Not reviewed by the Horizon registry": "לא נבדק על ידי הרישום של Horizon", @@ -635,7 +637,6 @@ "Copied": "הועתק", "Couldn't load patch notes. {error}": "לא ניתן היה לטעון הערות תיקון. {error}", "Couldn't load releases. {error}": "לא ניתן היה לטעון גרסאות. {error}", - "Launcher updated to {version}": "המשגר עודכן ל-{version}", "Launcher {version}": "משגר {version}", "Launcher {version} {percent}%": "מפעיל {version} {percent}%", "Manage versions": "נהל גרסאות", @@ -842,7 +843,6 @@ "Something went wrong.": "משהו השתבש.", "Instances": "מקרים", "Join the Discord": "Join the Discord", - "Restart to update": "הפעל מחדש כדי לעדכן", "Duplicate…": "שכפול...", "Create a desktop shortcut": "צור קיצור דרך בשולחן העבודה", "Remove the desktop shortcut": "הסר את קיצור הדרך בשולחן העבודה", diff --git a/launcher/lang/hi.json b/launcher/lang/hi.json index 6ae4fcaddc..992749633e 100644 --- a/launcher/lang/hi.json +++ b/launcher/lang/hi.json @@ -456,7 +456,9 @@ "runs {command} after": "बाद में {command} चलाता है", "downloaded": "डाउनलोड किया गया", "24/7 online": "24/7 ऑनलाइन", - "Updated to {version}. Restart the launcher to use it.": "{version} पर अपडेट किया गया। इसका उपयोग करने के लिए लॉन्चर रीस्टार्ट करें।", + "A new version is available": "एक नया संस्करण उपलब्ध है", + "Download again": "फिर से डाउनलोड करें", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "लॉन्चर की यह कॉपी खुद को बदल नहीं सकती। इसे एक बार फिर से डाउनलोड करें; उसके बाद यह खुद अपडेट होता है।", "Any MCP client": "कोई भी MCP क्लाइंट", "{name}'s cape is kept.": "{name} का केप रखा गया है।", "Not reviewed by the Horizon registry": "Horizon रजिस्ट्री द्वारा समीक्षित नहीं", @@ -635,7 +637,6 @@ "Copied": "कॉपी किया गया", "Couldn't load patch notes. {error}": "पैच नोट्स लोड नहीं हो सके। {error}", "Couldn't load releases. {error}": "रिलीज़ लोड नहीं हो सकीं। {error}", - "Launcher updated to {version}": "ल लॉन्चर {version} पर अपडेट किया गया", "Launcher {version}": "ल लॉन्चर {version}", "Launcher {version} {percent}%": "ल लॉन्चर {version} {percent}%", "Manage versions": "संस्करण प्रबंधित करें", @@ -842,7 +843,6 @@ "Something went wrong.": "कुछ गलत हो गया।", "Instances": "Instances", "Join the Discord": "Join the Discord", - "Restart to update": "Restart to update", "Duplicate…": "Duplicate…", "Create a desktop shortcut": "Create a desktop shortcut", "Remove the desktop shortcut": "Remove the desktop shortcut", diff --git a/launcher/lang/hr.json b/launcher/lang/hr.json index 701972e83b..fd94e95e87 100644 --- a/launcher/lang/hr.json +++ b/launcher/lang/hr.json @@ -456,7 +456,9 @@ "runs {command} after": "pokreće {command} nakon", "downloaded": "preuzeto", "24/7 online": "24/7 na mreži", - "Updated to {version}. Restart the launcher to use it.": "Ažurirano na {version}. Ponovno pokrenite pokretač da biste to koristili.", + "A new version is available": "Dostupna je nova verzija", + "Download again": "Preuzmi ponovno", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ova kopija pokretača ne može zamijeniti samu sebe. Preuzmite ga ponovno jednom; nakon toga se ažurira sam.", "Any MCP client": "Bilo koji MCP klijent", "{name}'s cape is kept.": "{name}ov plašt je zadržan.", "Not reviewed by the Horizon registry": "Nije pregledano od strane Horizonovog registra", @@ -635,7 +637,6 @@ "Copied": "Kopirano", "Couldn't load patch notes. {error}": "Nije moguće učitati bilješke zakrpa. {error}", "Couldn't load releases. {error}": "Nije moguće učitati izdanja. {error}", - "Launcher updated to {version}": "Pokretač je ažuriran na {version}", "Launcher {version}": "Pokretač {version}", "Launcher {version} {percent}%": "Pokretač {version} {percent}%", "Manage versions": "Upravljaj verzijama", @@ -842,7 +843,6 @@ "Something went wrong.": "Nešto je pošlo po zlu.", "Instances": "Instance", "Join the Discord": "Pridružite se Discordu", - "Restart to update": "Ponovno pokreni za ažuriranje", "Duplicate…": "Dupliciraj…", "Create a desktop shortcut": "Stvori prečac na radnoj površini", "Remove the desktop shortcut": "Ukloni prečac na radnoj površini", diff --git a/launcher/lang/hu.json b/launcher/lang/hu.json index dca8b2e278..146e6c36f0 100644 --- a/launcher/lang/hu.json +++ b/launcher/lang/hu.json @@ -456,7 +456,9 @@ "runs {command} after": "után fut {command}", "downloaded": "letöltve", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Frissítve erre: {version}. A használatához indítsa újra az indítót.", + "A new version is available": "Új verzió érhető el", + "Download again": "Letöltés újra", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Az indító ezen példánya nem tudja lecserélni önmagát. Töltsd le újra egyszer; utána már magától frissül.", "Any MCP client": "Bármilyen MCP kliens", "{name}'s cape is kept.": "{name} köpenye megmarad.", "Not reviewed by the Horizon registry": "A Horizon nyilvántartó nem vizsgálta felül", @@ -635,7 +637,6 @@ "Copied": "Másolva", "Couldn't load patch notes. {error}": "Nem sikerült betölteni a javítójegyzeteket. {error}", "Couldn't load releases. {error}": "Nem sikerült betölteni a kiadásokat. {error}", - "Launcher updated to {version}": "Az indító frissítve erre: {version}", "Launcher {version}": "Indító {version}", "Launcher {version} {percent}%": "Indító {version} {percent}%", "Manage versions": "Verziók kezelése", @@ -842,7 +843,6 @@ "Something went wrong.": "Valami elromlott.", "Instances": "Példányok", "Join the Discord": "Csatlakozz a Discordhoz", - "Restart to update": "Indítsa újra a frissítéshez", "Duplicate…": "Másolás…", "Create a desktop shortcut": "Hozzon létre egy asztali parancsikont", "Remove the desktop shortcut": "Távolítsa el az asztali parancsikont", diff --git a/launcher/lang/hy.json b/launcher/lang/hy.json index 7f8e432f3a..da9205c07b 100644 --- a/launcher/lang/hy.json +++ b/launcher/lang/hy.json @@ -454,7 +454,9 @@ "runs {command} after": "վազում է {command} հետո", "downloaded": "ներբեռնված", "24/7 online": "24/7 առցանց", - "Updated to {version}. Restart the launcher to use it.": "Թարմացվել է {version}-ով: Այն օգտագործելու համար վերագործարկեք գործարկիչը:", + "A new version is available": "Հասանելի է նոր տարբերակ", + "Download again": "Կրկին ներբեռնել", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Գործարկիչի այս պատճենը չի կարող փոխարինել ինքն իրեն։ Մեկ անգամ նորից ներբեռնեք այն. դրանից հետո այն ինքն է թարմացվում։", "Any MCP client": "Ցանկացած MCP հաճախորդ", "{name}'s cape is kept.": "{name}-ի թիկնոցը պահվում է։", "Not reviewed by the Horizon registry": "Չի վերանայվել Horizon ռեգիստրի կողմից", @@ -633,7 +635,6 @@ "Copied": "Պատճենվել է", "Couldn't load patch notes. {error}": "Չհաջողվեց բեռնել կարկատան նշումները: {error}", "Couldn't load releases. {error}": "Չհաջողվեց բեռնել թողարկումները: {error}", - "Launcher updated to {version}": "Գործարկիչը թարմացվել է {version}", "Launcher {version}": "Գործարկիչ {version}", "Launcher {version} {percent}%": "Գործարկիչ {version} {percent}%", "Manage versions": "Կառավարեք տարբերակները", @@ -840,7 +841,6 @@ "Something went wrong.": "Սխալ առաջացավ։", "Instances": "Օրինակներ", "Join the Discord": "Միացեք Discord-ին", - "Restart to update": "Վերագործարկեք՝ թարմացնելու համար", "Duplicate…": "Կրկնօրինակել…", "Create a desktop shortcut": "Ստեղծեք աշխատասեղանի դյուրանցում", "Remove the desktop shortcut": "Հեռացրեք աշխատասեղանի դյուրանցումը", diff --git a/launcher/lang/id.json b/launcher/lang/id.json index cac5347bf1..793c43c0a0 100644 --- a/launcher/lang/id.json +++ b/launcher/lang/id.json @@ -456,7 +456,9 @@ "runs {command} after": "menjalankan {command} setelahnya", "downloaded": "diunduh", "24/7 online": "Online 24/7", - "Updated to {version}. Restart the launcher to use it.": "Diperbarui ke {version}. Muat ulang peluncur untuk menggunakannya.", + "A new version is available": "Versi baru tersedia", + "Download again": "Unduh lagi", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Salinan launcher ini tidak bisa mengganti dirinya sendiri. Unduh lagi sekali; setelah itu ia memperbarui dirinya sendiri.", "Any MCP client": "Klien MCP apa pun", "{name}'s cape is kept.": "Jubah {name} dipertahankan.", "Not reviewed by the Horizon registry": "Belum ditinjau oleh registri Horizon", @@ -635,7 +637,6 @@ "Copied": "Disalin", "Couldn't load patch notes. {error}": "Tidak dapat memuat catatan patch. {error}", "Couldn't load releases. {error}": "Tidak dapat memuat rilis. {error}", - "Launcher updated to {version}": "Peluncur diperbarui ke {version}", "Launcher {version}": "Peluncur {version}", "Launcher {version} {percent}%": "Peluncur {version} {percent}%", "Manage versions": "Kelola versi", @@ -842,7 +843,6 @@ "Something went wrong.": "Terjadi kesalahan.", "Instances": "Instances", "Join the Discord": "Join the Discord", - "Restart to update": "Restart to update", "Duplicate…": "Duplicate…", "Create a desktop shortcut": "Create a desktop shortcut", "Remove the desktop shortcut": "Remove the desktop shortcut", diff --git a/launcher/lang/ig.json b/launcher/lang/ig.json index 377d579b46..b9f47ddf45 100644 --- a/launcher/lang/ig.json +++ b/launcher/lang/ig.json @@ -454,7 +454,9 @@ "runs {command} after": "na-agba {command} mgbe", "downloaded": "ebudatara", "24/7 online": "24/7 n'ịntanetị", - "Updated to {version}. Restart the launcher to use it.": "Emelitere ka {version}. Malitegharịa ihe mmalite ka iji ya.", + "A new version is available": "Ụdị ọhụrụ dị", + "Download again": "Budata ọzọ", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Mbipụta a nke launcher enweghị ike ịnọchi onwe ya. Budata ya ọzọ otu ugboro; mgbe nke ahụ gasịrị ọ na-emelite onwe ya.", "Any MCP client": "Onye ahịa MCP ọ bụla", "{name}'s cape is kept.": "A na-echekwa okpu {name}.", "Not reviewed by the Horizon registry": "Ndebanye aha Horizon enyochaghị ya", @@ -633,7 +635,6 @@ "Copied": "Eṅomiri", "Couldn't load patch notes. {error}": "Enweghị ike ibunye ndetu mkpọchi. {error}", "Couldn't load releases. {error}": "Enweghị ike ibunye mwepụta. {error}", - "Launcher updated to {version}": "Emelitere ihe mmalite ka ọ bụrụ {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Jikwaa ụdịdị", @@ -840,7 +841,6 @@ "Something went wrong.": "Ọ nwere ihe adịghị mma.", "Instances": "Ihe atụ", "Join the Discord": "Soro na Discord", - "Restart to update": "Malitegharịa ekwentị ka emelite", "Duplicate…": "Megharịa…", "Create a desktop shortcut": "Mepụta ụzọ mkpirisi desktọpụ", "Remove the desktop shortcut": "Wepu ụzọ mkpirisi desktọpụ", diff --git a/launcher/lang/is.json b/launcher/lang/is.json index d37dd9333f..f3f8d81a4f 100644 --- a/launcher/lang/is.json +++ b/launcher/lang/is.json @@ -454,7 +454,9 @@ "runs {command} after": "hleypur {command} á eftir", "downloaded": "niðurhalað", "24/7 online": "24/7 á netinu", - "Updated to {version}. Restart the launcher to use it.": "Uppfært í {version}. Endurræstu ræsiforritið til að nota það.", + "A new version is available": "Ný útgáfa er í boði", + "Download again": "Sækja aftur", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Þetta eintak ræsisins getur ekki skipt sjálfu sér út. Sæktu það aftur einu sinni; eftir það uppfærir það sig sjálft.", "Any MCP client": "Hvaða MCP viðskiptavinur sem er", "{name}'s cape is kept.": "Kápu {name} er geymd.", "Not reviewed by the Horizon registry": "Ekki skoðað af Horizon skrásetning", @@ -633,7 +635,6 @@ "Copied": "Afritað", "Couldn't load patch notes. {error}": "Gat ekki hlaðið plástranótum. {error}", "Couldn't load releases. {error}": "Ekki tókst að hlaða útgáfum. {error}", - "Launcher updated to {version}": "Sjósetja uppfært í {version}", "Launcher {version}": "Sjósetja {version}", "Launcher {version} {percent}%": "Sjósetja {version} {percent}%", "Manage versions": "Stjórna útgáfum", @@ -840,7 +841,6 @@ "Something went wrong.": "Eitthvað fór úrskeiðis.", "Instances": "Tilvik", "Join the Discord": "Skráðu þig í Discord", - "Restart to update": "Endurræstu til að uppfæra", "Duplicate…": "Afrita…", "Create a desktop shortcut": "Búðu til skjáborðsflýtileið", "Remove the desktop shortcut": "Fjarlægðu flýtileiðina á skjáborðinu", diff --git a/launcher/lang/it.json b/launcher/lang/it.json index 60ab2fa963..c84383949c 100644 --- a/launcher/lang/it.json +++ b/launcher/lang/it.json @@ -456,7 +456,9 @@ "runs {command} after": "corre {command} dopo", "downloaded": "scaricato", "24/7 online": "online 24 ore su 24, 7 giorni su 7", - "Updated to {version}. Restart the launcher to use it.": "Aggiornato a {version}. Riavvia il launcher per usarlo.", + "A new version is available": "È disponibile una nuova versione", + "Download again": "Scarica di nuovo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Questa copia del launcher non può sostituirsi da sola. Scaricalo di nuovo una volta; dopo si aggiorna da solo.", "Any MCP client": "Qualsiasi cliente MCP", "{name}'s cape is kept.": "Il mantello di {name} viene mantenuto.", "Not reviewed by the Horizon registry": "Non revisionato dal registro Horizon", @@ -635,7 +637,6 @@ "Copied": "Copiato", "Couldn't load patch notes. {error}": "Impossibile caricare le note sulla patch. {error}", "Couldn't load releases. {error}": "Impossibile caricare le versioni. {error}", - "Launcher updated to {version}": "Launcher aggiornato a {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Lanciatore {version} {percent}%", "Manage versions": "Gestisci le versioni", @@ -842,7 +843,6 @@ "Something went wrong.": "Qualcosa è andato storto.", "Instances": "Istanze", "Join the Discord": "Unisciti alla Discordia", - "Restart to update": "Riavvia per aggiornare", "Duplicate…": "Duplicato...", "Create a desktop shortcut": "Crea un collegamento sul desktop", "Remove the desktop shortcut": "Rimuovi il collegamento sul desktop", diff --git a/launcher/lang/ja.json b/launcher/lang/ja.json index 0c4d4cf6a9..0b6d8fcd48 100644 --- a/launcher/lang/ja.json +++ b/launcher/lang/ja.json @@ -39,7 +39,9 @@ "up to date": "最新", "Checking…": "確認中…", "downloading {version}, {percent}%": "{version} をダウンロード中 ({percent}%)", - "Updated to {version}. Restart the launcher to use it.": "{version} に更新されました。適用するにはランチャーを再起動してください。", + "A new version is available": "新しいバージョンがあります", + "Download again": "もう一度ダウンロード", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "このランチャーは自分自身を置き換えられません。一度だけダウンロードし直してください。その後は自動で更新されます。", "the update failed: {error}": "アップデートに失敗しました: {error}", "Install": "インストール", "Restart": "再起動", @@ -635,7 +637,6 @@ "{name} moved to the trash.": "{name} moved to the trash.", "Couldn't load patch notes. {error}": "パッチノートを読み込めませんでした。{error}", "Couldn't load releases. {error}": "リリースを読み込めませんでした。{error}", - "Launcher updated to {version}": "ランチャーを {version} に更新しました", "Launcher {version}": "ランチャー {version}", "Launcher {version} {percent}%": "ランチャー {version} {percent}%", "Manage versions": "バージョンを管理", @@ -842,7 +843,6 @@ "Something went wrong.": "Something went wrong.", "Instances": "インスタンス", "Join the Discord": "Discord に参加", - "Restart to update": "再起動して更新", "Duplicate…": "複製…", "Create a desktop shortcut": "デスクトップにショートカットを作成", "Remove the desktop shortcut": "デスクトップのショートカットを削除", diff --git a/launcher/lang/ka.json b/launcher/lang/ka.json index baad1caba2..28000948b6 100644 --- a/launcher/lang/ka.json +++ b/launcher/lang/ka.json @@ -454,7 +454,9 @@ "runs {command} after": "გადის {command} შემდეგ", "downloaded": "გადმოწერილი", "24/7 online": "24/7 ონლაინ", - "Updated to {version}. Restart the launcher to use it.": "განახლებულია {version}-მდე. გადატვირთეთ გამშვები მის გამოსაყენებლად.", + "A new version is available": "ხელმისაწვდომია ახალი ვერსია", + "Download again": "ხელახლა ჩამოტვირთვა", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "გამშვების ეს ასლი ვერ ცვლის საკუთარ თავს. ერთხელ ხელახლა ჩამოტვირთეთ; ამის შემდეგ ის თავად განახლდება.", "Any MCP client": "ნებისმიერი MCP კლიენტი", "{name}'s cape is kept.": "{name}-ის კონცხი ინახება.", "Not reviewed by the Horizon registry": "არ არის განხილული Horizon რეესტრის მიერ", @@ -633,7 +635,6 @@ "Copied": "კოპირებულია", "Couldn't load patch notes. {error}": "პატჩის შენიშვნების ჩატვირთვა ვერ მოხერხდა. {error}", "Couldn't load releases. {error}": "გამოშვებების ჩატვირთვა ვერ მოხერხდა. {error}", - "Launcher updated to {version}": "გამშვები განახლდა {version}-ზე", "Launcher {version}": "გამშვები {version}", "Launcher {version} {percent}%": "გამშვები {version} {percent}%", "Manage versions": "ვერსიების მართვა", @@ -840,7 +841,6 @@ "Something went wrong.": "რაღაც შეფერხდა.", "Instances": "ეგზემპლარები", "Join the Discord": "შეუერთდი Discord-ს", - "Restart to update": "განახლებისთვის გადატვირთეთ", "Duplicate…": "დუბლიკატი…", "Create a desktop shortcut": "შექმენით დესკტოპის მალსახმობი", "Remove the desktop shortcut": "წაშალეთ დესკტოპის მალსახმობი", diff --git a/launcher/lang/kk.json b/launcher/lang/kk.json index ee8c7848a5..20babfb0e7 100644 --- a/launcher/lang/kk.json +++ b/launcher/lang/kk.json @@ -454,7 +454,9 @@ "runs {command} after": "кейін {command} орындалады", "downloaded": "жүктелді", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} дейін жаңартылды. Оны пайдалану үшін іске қосқышты қайта іске қосыңыз.", + "A new version is available": "Жаңа нұсқа бар", + "Download again": "Қайта жүктеп алу", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчердің бұл көшірмесі өзін ауыстыра алмайды. Оны бір рет қайта жүктеп алыңыз; содан кейін ол өзі жаңарады.", "Any MCP client": "Кез келген MCP клиенті", "{name}'s cape is kept.": "{name} шапаны сақталады.", "Not reviewed by the Horizon registry": "Horizon тізілімінде қаралмаған", @@ -633,7 +635,6 @@ "Copied": "Көшірілген", "Couldn't load patch notes. {error}": "Түзету жазбаларын жүктеу мүмкін болмады. {error}", "Couldn't load releases. {error}": "Шығарылымдарды жүктеу мүмкін болмады. {error}", - "Launcher updated to {version}": "Іске қосу құралы {version} болып жаңартылды", "Launcher {version}": "Іске қосу құралы {version}", "Launcher {version} {percent}%": "Іске қосу құралы {version} {percent}%", "Manage versions": "Нұсқаларды басқару", @@ -840,7 +841,6 @@ "Something went wrong.": "Бірдеңе дұрыс болмады.", "Instances": "Даналар", "Join the Discord": "Discord-қа қосылыңыз", - "Restart to update": "Жаңарту үшін қайта іске қосыңыз", "Duplicate…": "Көшірме…", "Create a desktop shortcut": "Жұмыс үстелінің таңбашасын жасаңыз", "Remove the desktop shortcut": "Жұмыс үстеліндегі таңбашаны алып тастаңыз", diff --git a/launcher/lang/kn.json b/launcher/lang/kn.json index 3e22f1b178..6b589e564a 100644 --- a/launcher/lang/kn.json +++ b/launcher/lang/kn.json @@ -454,7 +454,9 @@ "runs {command} after": "ನಂತರ {command} ರನ್ ಆಗುತ್ತದೆ", "downloaded": "ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ", "24/7 online": "24/7 ಆನ್‌ಲೈನ್", - "Updated to {version}. Restart the launcher to use it.": "{version} ಗೆ ನವೀಕರಿಸಲಾಗಿದೆ. ಅದನ್ನು ಬಳಸಲು ಲಾಂಚರ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.", + "A new version is available": "ಹೊಸ ಆವೃತ್ತಿ ಲಭ್ಯವಿದೆ", + "Download again": "ಮತ್ತೆ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "ಲಾಂಚರ್‌ನ ಈ ಪ್ರತಿ ತನ್ನನ್ನು ತಾನೇ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದನ್ನು ಒಮ್ಮೆ ಮತ್ತೆ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ; ಅದರ ನಂತರ ಅದು ತಾನೇ ನವೀಕರಿಸಿಕೊಳ್ಳುತ್ತದೆ.", "Any MCP client": "ಯಾವುದೇ MCP ಕ್ಲೈಂಟ್", "{name}'s cape is kept.": "{name} ನ ಕೇಪ್ ಇರಿಸಲಾಗಿದೆ.", "Not reviewed by the Horizon registry": "Horizon ರಿಜಿಸ್ಟ್ರಿಯಿಂದ ಪರಿಶೀಲಿಸಲಾಗಿಲ್ಲ", @@ -633,7 +635,6 @@ "Copied": "ನಕಲು ಮಾಡಲಾಗಿದೆ", "Couldn't load patch notes. {error}": "ಪ್ಯಾಚ್ ಟಿಪ್ಪಣಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. {error}", "Couldn't load releases. {error}": "ಬಿಡುಗಡೆಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. {error}", - "Launcher updated to {version}": "ಲಾಂಚರ್ ಅನ್ನು {version} ಗೆ ನವೀಕರಿಸಲಾಗಿದೆ", "Launcher {version}": "ಲಾಂಚರ್ {version}", "Launcher {version} {percent}%": "ಲಾಂಚರ್ {version} {percent}%", "Manage versions": "ಆವೃತ್ತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ", @@ -840,7 +841,6 @@ "Something went wrong.": "ಏನೋ ತಪ್ಪಾಗಿದೆ.", "Instances": "ನಿದರ್ಶನಗಳು", "Join the Discord": "Discord ಗೆ ಸೇರಿ", - "Restart to update": "ನವೀಕರಿಸಲು ಮರುಪ್ರಾರಂಭಿಸಿ", "Duplicate…": "ನಕಲು...", "Create a desktop shortcut": "ಡೆಸ್ಕ್‌ಟಾಪ್ ಶಾರ್ಟ್‌ಕಟ್ ರಚಿಸಿ", "Remove the desktop shortcut": "ಡೆಸ್ಕ್‌ಟಾಪ್ ಶಾರ್ಟ್‌ಕಟ್ ತೆಗೆದುಹಾಕಿ", diff --git a/launcher/lang/ko.json b/launcher/lang/ko.json index cc0007216b..bbaf08ee7e 100644 --- a/launcher/lang/ko.json +++ b/launcher/lang/ko.json @@ -456,7 +456,9 @@ "runs {command} after": "완료 후 {command} 실행", "downloaded": "다운로드됨", "24/7 online": "24/7 온라인", - "Updated to {version}. Restart the launcher to use it.": "{version}(으)로 업데이트되었습니다. 사용하려면 런처를 다시 시작하세요.", + "A new version is available": "새 버전이 있습니다", + "Download again": "다시 다운로드", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "이 런처 사본은 스스로를 교체할 수 없습니다. 한 번만 다시 다운로드하세요. 그 후에는 스스로 업데이트됩니다.", "Any MCP client": "모든 MCP 클라이언트", "{name}'s cape is kept.": "{name}의 망토가 유지됩니다.", "Not reviewed by the Horizon registry": "Horizon 레지스트리에서 검토되지 않음", @@ -635,7 +637,6 @@ "Copied": "복사됨", "Couldn't load patch notes. {error}": "패치 노트를 불러올 수 없습니다. {error}", "Couldn't load releases. {error}": "릴리스를 불러올 수 없습니다. {error}", - "Launcher updated to {version}": "런처가 {version}(으)로 업데이트되었습니다.", "Launcher {version}": "런처 {version}", "Launcher {version} {percent}%": "런처 {version} {percent}%", "Manage versions": "버전 관리", @@ -842,7 +843,6 @@ "Something went wrong.": "문제가 발생했습니다.", "Instances": "인스턴스", "Join the Discord": "Discord 참여", - "Restart to update": "업데이트하려면 다시 시작", "Duplicate…": "복제…", "Create a desktop shortcut": "바탕 화면 바로 가기 만들기", "Remove the desktop shortcut": "바탕 화면 바로 가기 제거", diff --git a/launcher/lang/ky.json b/launcher/lang/ky.json index b9f9794115..c92280f16b 100644 --- a/launcher/lang/ky.json +++ b/launcher/lang/ky.json @@ -454,7 +454,9 @@ "runs {command} after": "{command} кийин иштейт", "downloaded": "жүктөлүп алынган", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} чейин жаңыртылды. Аны колдонуу үчүн ишке киргизгичти кайра күйгүзүңүз.", + "A new version is available": "Жаңы версия бар", + "Download again": "Кайра жүктөп алуу", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчердин бул көчүрмөсү өзүн алмаштыра албайт. Аны бир жолу кайра жүктөп алыңыз; андан кийин ал өзү жаңырат.", "Any MCP client": "Ар кандай MCP кардары", "{name}'s cape is kept.": "{name}нын капасы сакталат.", "Not reviewed by the Horizon registry": "Horizon реестри тарабынан каралбаган", @@ -633,7 +635,6 @@ "Copied": "Көчүрүлгөн", "Couldn't load patch notes. {error}": "Түзөтүү эскертүүлөрү жүктөлгөн жок. {error}", "Couldn't load releases. {error}": "Чыгарылгандар жүктөлгөн жок. {error}", - "Launcher updated to {version}": "Ишке киргизгич {version} болуп жаңырды", "Launcher {version}": "Ишке киргизгич {version}", "Launcher {version} {percent}%": "Ишке киргизгич {version} {percent}%", "Manage versions": "Версияларды башкаруу", @@ -840,7 +841,6 @@ "Something went wrong.": "Бир жерден ката кетти.", "Instances": "Инстанциялар", "Join the Discord": "Discordга кошулуңуз", - "Restart to update": "Жаңыртуу үчүн кайра баштаңыз", "Duplicate…": "Дубликат…", "Create a desktop shortcut": "Иш тактасына жарлык түзүңүз", "Remove the desktop shortcut": "Иш тактадагы жарлыкты алып салыңыз", diff --git a/launcher/lang/la.json b/launcher/lang/la.json index 0a5f109b8a..d02ea0267e 100644 --- a/launcher/lang/la.json +++ b/launcher/lang/la.json @@ -454,7 +454,9 @@ "runs {command} after": "fugit{command}post", "downloaded": "downloaded", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Updated to{version}. Launcher sileo ea uti.", + "A new version is available": "Nova versio praesto est", + "Download again": "Iterum depromere", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Hoc exemplar initiatoris se ipsum substituere non potest. Semel iterum deprome; postea se ipsum renovat.", "Any MCP client": "Quis MCP client", "{name}'s cape is kept.": "{name}promunturium.", "Not reviewed by the Horizon registry": "Non recognitaHorizonsubcriptio", @@ -633,7 +635,6 @@ "Copied": "Copied", "Couldn't load patch notes. {error}": "Non poterat load notas lacus.{error}", "Couldn't load releases. {error}": "Non solvo load.{error}", - "Launcher updated to {version}": "Launchere updated to{version}", "Launcher {version}": "Launchere{version}", "Launcher {version} {percent}%": "Launchere{version} {percent}%", "Manage versions": "Curo versiones", @@ -840,7 +841,6 @@ "Something went wrong.": "Aliquid abiit iniuriam.", "Instances": "Instantiae", "Join the Discord": "Iungere theDiscord", - "Restart to update": "Sileo ut update", "Duplicate…": "Duplicare…", "Create a desktop shortcut": "Creare desktop brevis", "Remove the desktop shortcut": "Remove desktop brevis", diff --git a/launcher/lang/lb.json b/launcher/lang/lb.json index 3dab5eca5a..01b4b84a29 100644 --- a/launcher/lang/lb.json +++ b/launcher/lang/lb.json @@ -454,7 +454,9 @@ "runs {command} after": "leeft {command} no", "downloaded": "erofgelueden", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Aktualiséiert op {version}. Restart de Launcher fir se ze benotzen.", + "A new version is available": "Eng nei Versioun ass verfügbar", + "Download again": "Nach eng Kéier eroflueden", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Dës Kopie vum Launcher kann sech net selwer ersetzen. Lued en eng Kéier nei erof; duerno aktualiséiert en sech selwer.", "Any MCP client": "All MCP Client", "{name}'s cape is kept.": "Dem {name} säi Kaape bleift.", "Not reviewed by the Horizon registry": "Net iwwerpréift vum Horizon Registry", @@ -633,7 +635,6 @@ "Copied": "Kopéiert", "Couldn't load patch notes. {error}": "Konnt Patch Notizen net lueden. {error}", "Couldn't load releases. {error}": "Konnt Verëffentlechungen net lueden. {error}", - "Launcher updated to {version}": "Launcher aktualiséiert op {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Verwalte Versiounen", @@ -840,7 +841,6 @@ "Something went wrong.": "Eppes ass falsch gaangen.", "Instances": "Instanzen", "Join the Discord": "Maacht mat bei Discord", - "Restart to update": "Restart fir ze aktualiséieren", "Duplicate…": "Duplizéieren…", "Create a desktop shortcut": "Erstellt eng Desktop Ofkiirzung", "Remove the desktop shortcut": "Ewechzehuelen der Desktop Ofkiirzung", diff --git a/launcher/lang/li.json b/launcher/lang/li.json index 91b21ead60..ef9d2816c8 100644 --- a/launcher/lang/li.json +++ b/launcher/lang/li.json @@ -456,7 +456,9 @@ "runs {command} after": "loop {command} nao", "downloaded": "gedownload", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Bijgewerk tot {version}. Start de launcher opnuuj um ‘m te gebruke.", + "A new version is available": "Dao is 'n nuuj versie besjikbaar", + "Download again": "Opnuuj downloade", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Dees kopie van de launcher kin ziech neet zelf vervange. Download 'm ein kier opnuuj; daonao wörk 'r ziech zelf bij.", "Any MCP client": "Alle MCP-cliënt", "{name}'s cape is kept.": "{name}'s cape is behawwe.", "Not reviewed by the Horizon registry": "Neet beoordeild door ut Horizon-register", @@ -635,7 +637,6 @@ "Copied": "Gekopieerd", "Couldn't load patch notes. {error}": "Kon patchnotes neet lade. {error}", "Couldn't load releases. {error}": "Kon gein releases lade. {error}", - "Launcher updated to {version}": "Launcher is bijgewerk tot {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Versies behere", @@ -842,7 +843,6 @@ "Something went wrong.": "D’r is get fout gegaange.", "Instances": "Instanties", "Join the Discord": "Meld dich aan bij de Discord", - "Restart to update": "Herstart um te update", "Duplicate…": "Duplicate...", "Create a desktop shortcut": "Maak un snelkoppeling veur desktop", "Remove the desktop shortcut": "Verwijder de snelkoppeling veur bureaublad", diff --git a/launcher/lang/lmo.json b/launcher/lang/lmo.json index d220d20d0f..dec88c4787 100644 --- a/launcher/lang/lmo.json +++ b/launcher/lang/lmo.json @@ -456,7 +456,9 @@ "runs {command} after": "corre {command} dopu", "downloaded": "scaricad", "24/7 online": "24/7 in linea", - "Updated to {version}. Restart the launcher to use it.": "Aggiornato a {version}. Riavvia el lanciador per duperal.", + "A new version is available": "L'è disponibil una version növa", + "Download again": "Scarica anmò", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Questa copia del launcher la pò minga sostituìss de per lee. Scarichel anmò una volta; dopo el se agiorna de per lu.", "Any MCP client": "Qual-sa-vöör client MCP", "{name}'s cape is kept.": "El cap de {name} l’è mantegnuu.", "Not reviewed by the Horizon registry": "Minga revist del registro Horizon", @@ -635,7 +637,6 @@ "Copied": "Copià", "Couldn't load patch notes. {error}": "Pudeva minga caricar i nott del patch. {error}", "Couldn't load releases. {error}": "Pudeva minga cargar i version. {error}", - "Launcher updated to {version}": "Lanciador agiornà a {version}", "Launcher {version}": "Lanciador {version}", "Launcher {version} {percent}%": "Lanciador {version} {percent}%", "Manage versions": "Gestisci i versiun", @@ -842,7 +843,6 @@ "Something went wrong.": "Quaicoss l’è ndad mal.", "Instances": "Istanz", "Join the Discord": "Partecipa al Discord", - "Restart to update": "Riavvia per agiornà", "Duplicate…": "Duplicà...", "Create a desktop shortcut": "Crea un scurciavià del desketop", "Remove the desktop shortcut": "Cavar via el scurciavià del desketop", diff --git a/launcher/lang/lo.json b/launcher/lang/lo.json index c9df003ba1..d6b860ea4e 100644 --- a/launcher/lang/lo.json +++ b/launcher/lang/lo.json @@ -454,7 +454,9 @@ "runs {command} after": "ແລ່ນ {command} ຫຼັງຈາກ", "downloaded": "ດາວໂຫຼດແລ້ວ", "24/7 online": "ອອນໄລນ໌ 24/7", - "Updated to {version}. Restart the launcher to use it.": "ອັບເດດເປັນ {version}. ຣີສະຕາດ launcher ເພື່ອໃຊ້ມັນ.", + "A new version is available": "ມີເວີຊັນໃໝ່", + "Download again": "ດາວໂຫຼດອີກຄັ້ງ", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "ສຳເນົາຂອງລັນເຊີນີ້ບໍ່ສາມາດແທນທີ່ຕົວເອງໄດ້. ດາວໂຫຼດມັນອີກຄັ້ງດຽວ; ຫຼັງຈາກນັ້ນມັນຈະອັບເດດຕົວເອງ.", "Any MCP client": "ລູກຄ້າ MCP ໃດ", "{name}'s cape is kept.": "cape ຂອງ {name} ຖືກເກັບຮັກສາໄວ້.", "Not reviewed by the Horizon registry": "ບໍ່ໄດ້ກວດສອບໂດຍ Horizon ທະບຽນ", @@ -633,7 +635,6 @@ "Copied": "ສຳເນົາແລ້ວ", "Couldn't load patch notes. {error}": "ບໍ່ສາມາດໂຫຼດບັນທຶກການແກ້ໄຂໄດ້. {error}", "Couldn't load releases. {error}": "ບໍ່ສາມາດໂຫຼດລຸ້ນໄດ້. {error}", - "Launcher updated to {version}": "Launcher ອັບເດດເປັນ {version}", "Launcher {version}": "ຕົວເປີດໃຊ້ {version}", "Launcher {version} {percent}%": "ຕົວເປີດໃຊ້ {version} {percent}%", "Manage versions": "ຈັດການສະບັບ", @@ -840,7 +841,6 @@ "Something went wrong.": "ມີບາງຢ່າງຜິດພາດ.", "Instances": "ອິນສະແຕນ", "Join the Discord": "ເຂົ້າຮ່ວມ Discord", - "Restart to update": "ຣີສະຕາດເພື່ອອັບເດດ", "Duplicate…": "ຊໍ້າກັນ...", "Create a desktop shortcut": "ສ້າງທາງລັດ desktop", "Remove the desktop shortcut": "ເອົາທາງລັດ desktop ອອກ", diff --git a/launcher/lang/lt.json b/launcher/lang/lt.json index 4f591c4c64..b15c43cd0f 100644 --- a/launcher/lang/lt.json +++ b/launcher/lang/lt.json @@ -456,7 +456,9 @@ "runs {command} after": "veikia {command} po", "downloaded": "atsisiųstas", "24/7 online": "24/7 internete", - "Updated to {version}. Restart the launcher to use it.": "Atnaujinta į {version}. Iš naujo paleiskite paleidimo priemonę, kad ją naudotumėte.", + "A new version is available": "Yra nauja versija", + "Download again": "Atsisiųsti iš naujo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ši paleidyklės kopija negali pati savęs pakeisti. Vieną kartą atsisiųskite ją iš naujo; po to ji atsinaujina pati.", "Any MCP client": "Bet kuris MCP klientas", "{name}'s cape is kept.": "{name} pelerina saugoma.", "Not reviewed by the Horizon registry": "Neperžiūrėjo Horizon registras", @@ -635,7 +637,6 @@ "Copied": "Nukopijuota", "Couldn't load patch notes. {error}": "Nepavyko įkelti pataisų užrašų. {error}", "Couldn't load releases. {error}": "Nepavyko įkelti leidimų. {error}", - "Launcher updated to {version}": "Paleidimo priemonė atnaujinta į {version}", "Launcher {version}": "Paleidimo priemonė {version}", "Launcher {version} {percent}%": "Paleidimo priemonė {version} {percent}%", "Manage versions": "Tvarkyti versijas", @@ -842,7 +843,6 @@ "Something went wrong.": "Kažkas nutiko.", "Instances": "Atvejai", "Join the Discord": "Join the Discord", - "Restart to update": "Paleiskite iš naujo, kad atnaujintumėte", "Duplicate…": "Pasikartoti…", "Create a desktop shortcut": "Sukurkite darbalaukio nuorodą", "Remove the desktop shortcut": "Pašalinkite darbalaukio nuorodą", diff --git a/launcher/lang/lv.json b/launcher/lang/lv.json index 75fe84f489..0846f6f513 100644 --- a/launcher/lang/lv.json +++ b/launcher/lang/lv.json @@ -454,7 +454,9 @@ "runs {command} after": "darbojas {command} pēc", "downloaded": "lejupielādēts", "24/7 online": "24/7 tiešsaistē", - "Updated to {version}. Restart the launcher to use it.": "Atjaunināts uz {version}. Restartējiet palaidēju, lai to izmantotu.", + "A new version is available": "Ir pieejama jauna versija", + "Download again": "Lejupielādēt vēlreiz", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Šī palaidēja kopija nevar aizstāt pati sevi. Vienreiz lejupielādējiet to vēlreiz; pēc tam tas atjauninās pats.", "Any MCP client": "Jebkurš MCP klients", "{name}'s cape is kept.": "{name} apmetnis tiek paturēts.", "Not reviewed by the Horizon registry": "Nav pārskatījis Horizon reģistrs", @@ -633,7 +635,6 @@ "Copied": "Kopēts", "Couldn't load patch notes. {error}": "Nevarēja ielādēt ielāpu piezīmes. {error}", "Couldn't load releases. {error}": "Nevarēja ielādēt laidienus. {error}", - "Launcher updated to {version}": "Palaišanas programma atjaunināta uz {version}", "Launcher {version}": "Palaišanas programma {version}", "Launcher {version} {percent}%": "Palaišanas programma {version} {percent}%", "Manage versions": "Pārvaldīt versijas", @@ -840,7 +841,6 @@ "Something went wrong.": "Kaut kas nogāja greizi.", "Instances": "Instances", "Join the Discord": "Pievienojieties Discord", - "Restart to update": "Restartējiet, lai atjauninātu", "Duplicate…": "Dublēt…", "Create a desktop shortcut": "Izveidojiet darbvirsmas saīsni", "Remove the desktop shortcut": "Noņemiet darbvirsmas saīsni", diff --git a/launcher/lang/mk.json b/launcher/lang/mk.json index 75dc4fe1c9..3451391d7c 100644 --- a/launcher/lang/mk.json +++ b/launcher/lang/mk.json @@ -454,7 +454,9 @@ "runs {command} after": "работи {command} после", "downloaded": "преземени", "24/7 online": "24/7 онлајн", - "Updated to {version}. Restart the launcher to use it.": "Ажурирано на {version}. Рестартирајте го стартерот за да го користите.", + "A new version is available": "Достапна е нова верзија", + "Download again": "Преземи повторно", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Оваа копија од стартерот не може сама да се замени. Преземете го повторно еднаш; потоа се ажурира сам.", "Any MCP client": "Секој MCP клиент", "{name}'s cape is kept.": "Наметката на {name} се чува.", "Not reviewed by the Horizon registry": "Не е прегледано од регистарот Horizon", @@ -633,7 +635,6 @@ "Copied": "Копирано", "Couldn't load patch notes. {error}": "Не може да се вчитаат белешки за закрпи. {error}", "Couldn't load releases. {error}": "Не може да се вчитаат изданијата. {error}", - "Launcher updated to {version}": "Стартерот е ажуриран на {version}", "Launcher {version}": "Стартувач {version}", "Launcher {version} {percent}%": "Стартувач {version} {percent}%", "Manage versions": "Управувајте со верзии", @@ -840,7 +841,6 @@ "Something went wrong.": "Нешто тргна наопаку.", "Instances": "Инстанци", "Join the Discord": "Приклучи се на Discord", - "Restart to update": "Рестартирајте за ажурирање", "Duplicate…": "Дупликат…", "Create a desktop shortcut": "Креирајте кратенка на работната површина", "Remove the desktop shortcut": "Отстранете ја кратенката на работната површина", diff --git a/launcher/lang/mn.json b/launcher/lang/mn.json index 515edaa10a..4704adca04 100644 --- a/launcher/lang/mn.json +++ b/launcher/lang/mn.json @@ -454,7 +454,9 @@ "runs {command} after": "{command} дараа ажиллана", "downloaded": "татаж авсан", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} болж шинэчлэгдсэн. Ашиглахын тулд эхлүүлэгчийг дахин эхлүүлнэ үү.", + "A new version is available": "Шинэ хувилбар гарсан", + "Download again": "Дахин татах", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчерийн энэ хуулбар өөрийгөө солих боломжгүй. Үүнийг нэг удаа дахин татаж аваарай; үүний дараа өөрөө шинэчлэгдэнэ.", "Any MCP client": "Аливаа MCP үйлчлүүлэгч", "{name}'s cape is kept.": "{name} нөмрөг хадгалагдаж байна.", "Not reviewed by the Horizon registry": "Horizon бүртгэлээс хянаагүй", @@ -633,7 +635,6 @@ "Copied": "Хуулсан", "Couldn't load patch notes. {error}": "Засварын тэмдэглэлийг ачаалж чадсангүй. {error}", "Couldn't load releases. {error}": "Хувилбаруудыг ачаалж чадсангүй. {error}", - "Launcher updated to {version}": "Эхлүүлэгчийг {version} болгож шинэчилсэн", "Launcher {version}": "Эхлүүлэгч {version}", "Launcher {version} {percent}%": "Эхлүүлэгч {version} {percent}%", "Manage versions": "Хувилбаруудыг удирдах", @@ -840,7 +841,6 @@ "Something went wrong.": "Ямар нэг алдаа гарлаа.", "Instances": "Инстансууд", "Join the Discord": "Discord-д нэгдээрэй", - "Restart to update": "Шинэчлэхийн тулд дахин эхлүүлнэ үү", "Duplicate…": "Давхардсан…", "Create a desktop shortcut": "Create a desktop shortcut", "Remove the desktop shortcut": "Remove the desktop shortcut", diff --git a/launcher/lang/ms.json b/launcher/lang/ms.json index bc68e34aaf..f1cb5eadb1 100644 --- a/launcher/lang/ms.json +++ b/launcher/lang/ms.json @@ -454,7 +454,9 @@ "runs {command} after": "berjalan {command} selepas", "downloaded": "dimuat turun", "24/7 online": "24/7 dalam talian", - "Updated to {version}. Restart the launcher to use it.": "Dikemas kini kepada {version}. Mulakan semula pelancar untuk menggunakannya.", + "A new version is available": "Versi baharu tersedia", + "Download again": "Muat turun semula", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Salinan pelancar ini tidak dapat menggantikan dirinya sendiri. Muat turun semula sekali; selepas itu ia mengemas kini dirinya sendiri.", "Any MCP client": "Mana-mana pelanggan MCP", "{name}'s cape is kept.": "Jubah {name} disimpan.", "Not reviewed by the Horizon registry": "Tidak disemak oleh pendaftaran Horizon", @@ -633,7 +635,6 @@ "Copied": "disalin", "Couldn't load patch notes. {error}": "Tidak dapat memuatkan nota tampalan. {error}", "Couldn't load releases. {error}": "Tidak dapat memuatkan keluaran. {error}", - "Launcher updated to {version}": "Pelancar dikemas kini kepada {version}", "Launcher {version}": "Pelancar {version}", "Launcher {version} {percent}%": "Pelancar {version} {percent}%", "Manage versions": "Urus versi", @@ -840,7 +841,6 @@ "Something went wrong.": "Sesuatu telah berlaku.", "Instances": "Instans", "Join the Discord": "Sertai Discord", - "Restart to update": "Mulakan semula untuk mengemas kini", "Duplicate…": "Pendua…", "Create a desktop shortcut": "Buat pintasan desktop", "Remove the desktop shortcut": "Alih keluar pintasan desktop", diff --git a/launcher/lang/mt.json b/launcher/lang/mt.json index 60b090d83c..44cf70a17d 100644 --- a/launcher/lang/mt.json +++ b/launcher/lang/mt.json @@ -454,7 +454,9 @@ "runs {command} after": "tmur {command} wara", "downloaded": "jitniżżel", "24/7 online": "24/7 onlajn", - "Updated to {version}. Restart the launcher to use it.": "Aġġornata għal {version}. Ibda mill-ġdid il-lanċjar biex tużah.", + "A new version is available": "Hemm verżjoni ġdida disponibbli", + "Download again": "Erġa' niżżel", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Din il-kopja tal-launcher ma tistax tissostitwixxi lilha nfisha. Erġa' niżżilha darba; wara dan taġġorna lilha nfisha.", "Any MCP client": "Kwalunkwe klijent MCP", "{name}'s cape is kept.": "Il-kappa ta’ {name} tinżamm.", "Not reviewed by the Horizon registry": "Mhux rivedut mir-reġistru Horizon", @@ -633,7 +635,6 @@ "Copied": "Ikkopjati", "Couldn't load patch notes. {error}": "Ma setgħetx tagħbija noti tal-garża. {error}", "Couldn't load releases. {error}": "Ma setgħetx tagħbija rilaxxi. {error}", - "Launcher updated to {version}": "Llanċjar aġġornat għal {version}", "Launcher {version}": "Llanċjar {version}", "Launcher {version} {percent}%": "Llanċjar {version} {percent}%", "Manage versions": "Immaniġġja l-verżjonijiet", @@ -840,7 +841,6 @@ "Something went wrong.": "Xi ħaġa marret ħażin.", "Instances": "Istanzi", "Join the Discord": "Ingħaqad mal-Discord", - "Restart to update": "Erġa' ibda biex taġġorna", "Duplicate…": "Idduplika...", "Create a desktop shortcut": "Oħloq shortcut tad-desktop", "Remove the desktop shortcut": "Neħħi l-shortcut tad-desktop", diff --git a/launcher/lang/nl.json b/launcher/lang/nl.json index c4f564f206..c4e7d123d3 100644 --- a/launcher/lang/nl.json +++ b/launcher/lang/nl.json @@ -456,7 +456,9 @@ "runs {command} after": "loopt {command} na", "downloaded": "gedownload", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Bijgewerkt naar {version}. Start het opstartprogramma opnieuw om het te gebruiken.", + "A new version is available": "Er is een nieuwe versie beschikbaar", + "Download again": "Opnieuw downloaden", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Deze kopie van de launcher kan zichzelf niet vervangen. Download hem één keer opnieuw; daarna werkt hij zichzelf bij.", "Any MCP client": "Elke MCP-client", "{name}'s cape is kept.": "De cape van {name} wordt bewaard.", "Not reviewed by the Horizon registry": "Niet beoordeeld door het Horizon-register", @@ -635,7 +637,6 @@ "Copied": "Gekopieerd", "Couldn't load patch notes. {error}": "Kan patchopmerkingen niet laden. {error}", "Couldn't load releases. {error}": "Kan releases niet laden. {error}", - "Launcher updated to {version}": "Launcher bijgewerkt naar {version}", "Launcher {version}": "Lanceerprogramma {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Beheer versies", @@ -842,7 +843,6 @@ "Something went wrong.": "Er is iets misgegaan.", "Instances": "Instanties", "Join the Discord": "Sluit je aan bij de onenigheid", - "Restart to update": "Start opnieuw op om te updaten", "Duplicate…": "Dupliceren…", "Create a desktop shortcut": "Maak een snelkoppeling op het bureaublad", "Remove the desktop shortcut": "Verwijder de snelkoppeling op het bureaublad", diff --git a/launcher/lang/no.json b/launcher/lang/no.json index 03d8322aee..5d2efcb981 100644 --- a/launcher/lang/no.json +++ b/launcher/lang/no.json @@ -456,7 +456,9 @@ "runs {command} after": "kjører {command} etter", "downloaded": "lastet ned", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Oppdatert til {version}. Start startprogrammet på nytt for å bruke det.", + "A new version is available": "En ny versjon er tilgjengelig", + "Download again": "Last ned på nytt", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Denne kopien av launcheren kan ikke erstatte seg selv. Last den ned på nytt én gang; etter det oppdaterer den seg selv.", "Any MCP client": "Enhver MCP-klient", "{name}'s cape is kept.": "{name}s kappe beholdes.", "Not reviewed by the Horizon registry": "Ikke gjennomgått av Horizon-registeret", @@ -635,7 +637,6 @@ "Copied": "Kopiert", "Couldn't load patch notes. {error}": "Kunne ikke laste inn patch-notater. {error}", "Couldn't load releases. {error}": "Kunne ikke laste inn utgivelser. {error}", - "Launcher updated to {version}": "Launcher oppdatert til {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Administrer versjoner", @@ -842,7 +843,6 @@ "Something went wrong.": "Noe gikk galt.", "Instances": "Forekomster", "Join the Discord": "Bli med i Discord", - "Restart to update": "Start på nytt for å oppdatere", "Duplicate…": "Dupliser...", "Create a desktop shortcut": "Lag en snarvei på skrivebordet", "Remove the desktop shortcut": "Fjern snarveien på skrivebordet", diff --git a/launcher/lang/oc.json b/launcher/lang/oc.json index 6ec9902aa1..4014c03e32 100644 --- a/launcher/lang/oc.json +++ b/launcher/lang/oc.json @@ -456,7 +456,9 @@ "runs {command} after": "corre {command} après", "downloaded": "telecargat", "24/7 online": "24/7 en linha", - "Updated to {version}. Restart the launcher to use it.": "Actualizat a {version}. Tornatz aviar lo lançaire per l'utilizar.", + "A new version is available": "Una version novèla es disponibla", + "Download again": "Telecargar tornarmai", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Aquesta còpia de l'aviador se pòt pas remplaçar ela meteissa. Telecargatz-lo tornarmai un còp; aprèp se met a jorn sol.", "Any MCP client": "Tot client MCP", "{name}'s cape is kept.": "La capa de {name} se guarda.", "Not reviewed by the Horizon registry": "Pas revisat pel registre Horizon", @@ -635,7 +637,6 @@ "Copied": "Copiat", "Couldn't load patch notes. {error}": "Impossible de cargar las nòtas de correccion. {error}", "Couldn't load releases. {error}": "Poguèt pas cargar las versions. {error}", - "Launcher updated to {version}": "Lançaire mes a jorn a {version}", "Launcher {version}": "Lançaire {version}", "Launcher {version} {percent}%": "Lançaire {version} {percent}%", "Manage versions": "Gerir las versions", @@ -842,7 +843,6 @@ "Something went wrong.": "Quicòm s'es marrit.", "Instances": "Instàncias", "Join the Discord": "Inscrivitz-vos al Discord", - "Restart to update": "Tornatz aviar per metre a jorn", "Duplicate…": "Duplicar...", "Create a desktop shortcut": "Crear un acorchi de burèu", "Remove the desktop shortcut": "Suprimir l'acorchi del burèu", diff --git a/launcher/lang/pl.json b/launcher/lang/pl.json index 22dfcca288..2eaf592103 100644 --- a/launcher/lang/pl.json +++ b/launcher/lang/pl.json @@ -456,7 +456,9 @@ "runs {command} after": "potem uruchamia {command}", "downloaded": "downloaded", "24/7 online": "online przez całą dobę", - "Updated to {version}. Restart the launcher to use it.": "Zaktualizowano do {version}. Uruchom ponownie launcher, aby użyć nowej wersji.", + "A new version is available": "Dostępna jest nowa wersja", + "Download again": "Pobierz ponownie", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ta kopia launchera nie może sama się zastąpić. Pobierz ją ponownie jeden raz; potem będzie aktualizować się sama.", "Any MCP client": "Any MCP client", "{name}'s cape is kept.": "Peleryna gracza {name} została zapisana.", "Not reviewed by the Horizon registry": "Niesprawdzone przez rejestr Horizon", @@ -635,7 +637,6 @@ "Copied": "Skopiowano", "Couldn't load patch notes. {error}": "Couldn't load patch notes. {error}", "Couldn't load releases. {error}": "Couldn't load releases. {error}", - "Launcher updated to {version}": "Launcher updated to {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Zarządzaj wersjami", @@ -842,7 +843,6 @@ "Something went wrong.": "Coś poszło nie tak.", "Instances": "Instancje", "Join the Discord": "Dołącz do Discorda", - "Restart to update": "Uruchom ponownie, aby zaktualizować", "Duplicate…": "Duplikuj…", "Create a desktop shortcut": "Utwórz skrót na pulpicie", "Remove the desktop shortcut": "Usuń skrót z pulpitu", diff --git a/launcher/lang/pt-br.json b/launcher/lang/pt-br.json index 91bbb899df..bf7ce60403 100644 --- a/launcher/lang/pt-br.json +++ b/launcher/lang/pt-br.json @@ -39,7 +39,9 @@ "up to date": "atualizado", "Checking…": "Verificando…", "downloading {version}, {percent}%": "baixando {version}, {percent}%", - "Updated to {version}. Restart the launcher to use it.": "Atualizado para {version}. Reinicie o launcher para começar a usar essa versão.", + "A new version is available": "Uma nova versão está disponível", + "Download again": "Baixar de novo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Esta cópia do launcher não consegue se substituir. Baixe-o de novo uma vez; depois disso ele se atualiza sozinho.", "the update failed: {error}": "Falha ao atualizar: {error}", "Install": "Instalar", "Restart": "Reiniciar", @@ -635,7 +637,6 @@ "{name} moved to the trash.": "{name} foi movido para a lixeira.", "Couldn't load patch notes. {error}": "Não foi possível carregar as notas de atualização. {error}", "Couldn't load releases. {error}": "Não foi possível carregar as versões. {error}", - "Launcher updated to {version}": "Launcher atualizado para {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Gerenciar versões", @@ -842,7 +843,6 @@ "Something went wrong.": "Something went wrong.", "Instances": "Instâncias", "Join the Discord": "Entre no Discord", - "Restart to update": "Reiniciar para atualizar", "Duplicate…": "Duplicar…", "Create a desktop shortcut": "Criar um atalho na área de trabalho", "Remove the desktop shortcut": "Remover o atalho da área de trabalho", diff --git a/launcher/lang/pt.json b/launcher/lang/pt.json index ee4df3d66e..f32294914f 100644 --- a/launcher/lang/pt.json +++ b/launcher/lang/pt.json @@ -456,7 +456,9 @@ "runs {command} after": "executa {command} depois", "downloaded": "descarregado", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Atualizado para {version}. Reinicia o launcher para o usar.", + "A new version is available": "Está disponível uma nova versão", + "Download again": "Transferir novamente", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Esta cópia do launcher não se consegue substituir a si própria. Transfira-o novamente uma vez; depois disso atualiza-se sozinho.", "Any MCP client": "Qualquer cliente MCP", "{name}'s cape is kept.": "A capa de {name} é guardada.", "Not reviewed by the Horizon registry": "Não revisto pelo registo do Horizon", @@ -635,7 +637,6 @@ "Copied": "Copiado", "Couldn't load patch notes. {error}": "Não foi possível carregar as notas de atualização. {error}", "Couldn't load releases. {error}": "Não foi possível carregar os lançamentos. {error}", - "Launcher updated to {version}": "Launcher atualizado para {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Gerir versões", @@ -842,7 +843,6 @@ "Something went wrong.": "Algo correu mal.", "Instances": "Instances", "Join the Discord": "Join the Discord", - "Restart to update": "Restart to update", "Duplicate…": "Duplicate…", "Create a desktop shortcut": "Create a desktop shortcut", "Remove the desktop shortcut": "Remove the desktop shortcut", diff --git a/launcher/lang/ro.json b/launcher/lang/ro.json index d28e4e8460..b35d82aba7 100644 --- a/launcher/lang/ro.json +++ b/launcher/lang/ro.json @@ -456,7 +456,9 @@ "runs {command} after": "aleargă {command} după", "downloaded": "descărcat", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Actualizat la {version}. Reporniți lansatorul pentru a-l utiliza.", + "A new version is available": "Este disponibilă o versiune nouă", + "Download again": "Descarcă din nou", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Această copie a lansatorului nu se poate înlocui singură. Descarcă-l din nou o dată; după aceea se actualizează singur.", "Any MCP client": "Orice client MCP", "{name}'s cape is kept.": "Pelerina lui {name} este păstrată.", "Not reviewed by the Horizon registry": "Nu a fost examinat de registrul Horizon", @@ -635,7 +637,6 @@ "Copied": "Copiat", "Couldn't load patch notes. {error}": "Nu s-au putut încărca note de corecție. {error}", "Couldn't load releases. {error}": "Nu s-au putut încărca versiunile. {error}", - "Launcher updated to {version}": "Lansatorul a fost actualizat la {version}", "Launcher {version}": "Lansatorul {version}", "Launcher {version} {percent}%": "Lansatorul {version} {percent}%", "Manage versions": "Gestionați versiunile", @@ -842,7 +843,6 @@ "Something went wrong.": "Ceva a mers prost.", "Instances": "Instanțe", "Join the Discord": "Alăturați-vă Discordului", - "Restart to update": "Reporniți pentru a actualiza", "Duplicate…": "Duplicați...", "Create a desktop shortcut": "Creați o comandă rapidă pe desktop", "Remove the desktop shortcut": "Eliminați comanda rapidă de pe desktop", diff --git a/launcher/lang/ru.json b/launcher/lang/ru.json index a1225497fc..753d9591e1 100644 --- a/launcher/lang/ru.json +++ b/launcher/lang/ru.json @@ -456,7 +456,9 @@ "runs {command} after": "затем выполняет {command}", "downloaded": "downloaded", "24/7 online": "онлайн 24/7", - "Updated to {version}. Restart the launcher to use it.": "Обновлено до {version}. Перезапустите лаунчер, чтобы применить.", + "A new version is available": "Доступна новая версия", + "Download again": "Скачать заново", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Эта копия лаунчера не может заменить сама себя. Скачайте его заново один раз; после этого он обновляется сам.", "Any MCP client": "Any MCP client", "{name}'s cape is kept.": "Плащ {name} сохранён.", "Not reviewed by the Horizon registry": "Не проверено реестром Horizon", @@ -635,7 +637,6 @@ "Copied": "Скопировано", "Couldn't load patch notes. {error}": "Не удалось загрузить список изменений. {error}", "Couldn't load releases. {error}": "Не удалось загрузить сборки. {error}", - "Launcher updated to {version}": "Лаунчер обновлён до {version}", "Launcher {version}": "Лаунчер {version}", "Launcher {version} {percent}%": "Лаунчер {version} {percent}%", "Manage versions": "Управление версиями", @@ -842,7 +843,6 @@ "Something went wrong.": "Что-то пошло не так.", "Instances": "Сборки", "Join the Discord": "Вступить в Discord", - "Restart to update": "Перезапустить для обновления", "Duplicate…": "Дублировать…", "Create a desktop shortcut": "Создать ярлык на рабочем столе", "Remove the desktop shortcut": "Удалить ярлык с рабочего стола", diff --git a/launcher/lang/sah.json b/launcher/lang/sah.json index 06025ea37b..af0a3278cd 100644 --- a/launcher/lang/sah.json +++ b/launcher/lang/sah.json @@ -456,7 +456,9 @@ "runs {command} after": "кэнниттэн {command} сүүрэр", "downloaded": "хачайдаан ылбыт", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} диэри саҥардыллыбыт. Ону туһанарга лаунчеры хаттаан холбоо.", + "A new version is available": "Саҥа барыл баар", + "Download again": "Хат хачайдаа", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчер бу куопуйата бэйэтин солбуйар кыаҕа суох. Биир төгүл хат хачайдааҥ; онтон ыла бэйэтэ саҥардыллар.", "Any MCP client": "Ханнык баҕарар MCP клиенэ", "{name}'s cape is kept.": "{name} плащын тутар.", "Not reviewed by the Horizon registry": "Horizon реестрынан көрүллүбэтэх", @@ -635,7 +637,6 @@ "Copied": "Копированнай", "Couldn't load patch notes. {error}": "Патч бэлиэтээһиннэрин кыайан киллэрбэтэ. {error}", "Couldn't load releases. {error}": "Релизтары кыайан тиэйбэтэ. {error}", - "Launcher updated to {version}": "Лаунчер {version} диэри саҥардыллыбыт", "Launcher {version}": "Лаунчер {version}", "Launcher {version} {percent}%": "Лаунчер {version} {percent}%", "Manage versions": "Версиялары салай", @@ -842,7 +843,6 @@ "Something went wrong.": "Туох эрэ сыыһа барда.", "Instances": "Инстанциялар", "Join the Discord": "Discord кыттыһыҥ", - "Restart to update": "Саҥардыыга хаттаан саҕалаа", "Duplicate…": "Дубликат...", "Create a desktop shortcut": "Үлэ остуолун кылгас суолун оҥор", "Remove the desktop shortcut": "Үлэ остуолун быстах суолун суох оҥор", diff --git a/launcher/lang/se.json b/launcher/lang/se.json index 0a1e3d649c..13e970058d 100644 --- a/launcher/lang/se.json +++ b/launcher/lang/se.json @@ -456,7 +456,9 @@ "runs {command} after": "johtá {command} maŋŋel", "downloaded": "viežžan", "24/7 online": "24/7 neahtas", - "Updated to {version}. Restart the launcher to use it.": "Ođasmahttojuvvon {version} rádjái. Álggat álggaheaddji ođđasit vai beasat dan geavahit.", + "A new version is available": "Ođđa veršuvdna gávdno", + "Download again": "Viečča fas", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Dát álggaheaddji máŋga ii sáhte molsut iežas. Viečča dan fas oktii; dan maŋŋá dat ođasmahttá iežas.", "Any MCP client": "Vaikko makkár MCP-klieanta", "{name}'s cape is kept.": "{name} káppa lea vurkejuvvon.", "Not reviewed by the Horizon registry": "Ii leat dárkkistuvvon Horizon-registaris", @@ -635,7 +637,6 @@ "Copied": "Kopieren", "Couldn't load patch notes. {error}": "Ii sáhttán bidjat sisa patch-mearkkaid. {error}", "Couldn't load releases. {error}": "Ii sáhttán bidjat almmuhusaid. {error}", - "Launcher updated to {version}": "Álggaheaddji ođasmahttojuvvon {version}", "Launcher {version}": "Álggaheaddji {version}", "Launcher {version} {percent}%": "Álggaheaddji {version} {percent}%", "Manage versions": "Hálddaš veršuvnnaid", @@ -842,7 +843,6 @@ "Something went wrong.": "Juoga manai boastut.", "Instances": "Instánssat", "Join the Discord": "Searvva Discord", - "Restart to update": "Álggos ođasmahttit", "Duplicate…": "Duplikat...", "Create a desktop shortcut": "Ráhkat dihtorčujuhusa", "Remove the desktop shortcut": "Váldde eret dihtorčujuhusa", diff --git a/launcher/lang/sk.json b/launcher/lang/sk.json index cbddefbbf5..395da4ab45 100644 --- a/launcher/lang/sk.json +++ b/launcher/lang/sk.json @@ -456,7 +456,9 @@ "runs {command} after": "beží {command} po", "downloaded": "stiahnuté", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Aktualizované na {version}. Ak chcete spustiť spúšťač, reštartujte ho.", + "A new version is available": "Je k dispozícii nová verzia", + "Download again": "Stiahnuť znova", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Táto kópia spúšťača sa nemôže sama nahradiť. Stiahnite ju raz znova; potom sa už aktualizuje sama.", "Any MCP client": "Akýkoľvek klient MCP", "{name}'s cape is kept.": "{name} plášť je zachovaný.", "Not reviewed by the Horizon registry": "Nekontrolované registrom Horizon", @@ -635,7 +637,6 @@ "Copied": "Skopírované", "Couldn't load patch notes. {error}": "Nepodarilo sa načítať poznámky k oprave. {error}", "Couldn't load releases. {error}": "Nepodarilo sa načítať vydania. {error}", - "Launcher updated to {version}": "Spúšťač bol aktualizovaný na {version}", "Launcher {version}": "Spúšťač {version}", "Launcher {version} {percent}%": "Spúšťač {version} {percent}%", "Manage versions": "Spravovať verzie", @@ -842,7 +843,6 @@ "Something went wrong.": "Niečo sa pokazilo.", "Instances": "Inštancie", "Join the Discord": "Pripojte sa k Discordu", - "Restart to update": "Ak chcete aktualizovať, reštartujte", "Duplicate…": "Duplikovať…", "Create a desktop shortcut": "Vytvorte odkaz na pracovnej ploche", "Remove the desktop shortcut": "Odstráňte odkaz na pracovnej ploche", diff --git a/launcher/lang/sl.json b/launcher/lang/sl.json index 08645beb2e..9fdb824496 100644 --- a/launcher/lang/sl.json +++ b/launcher/lang/sl.json @@ -454,7 +454,9 @@ "runs {command} after": "teče {command} zatem", "downloaded": "preneseno", "24/7 online": "24/7 na spletu", - "Updated to {version}. Restart the launcher to use it.": "Posodobljeno na {version}. Znova zaženite zaganjalnik, da ga uporabite.", + "A new version is available": "Na voljo je nova različica", + "Download again": "Prenesi znova", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ta kopija zaganjalnika se ne more sama zamenjati. Enkrat jo prenesite znova; potem se posodablja sama.", "Any MCP client": "Vsak odjemalec MCP", "{name}'s cape is kept.": "Pelerina {name} je ohranjena.", "Not reviewed by the Horizon registry": "Ni pregledan s strani registra Horizon", @@ -633,7 +635,6 @@ "Copied": "Kopirano", "Couldn't load patch notes. {error}": "Opomb popravkov ni bilo mogoče naložiti. {error}", "Couldn't load releases. {error}": "Izdaj ni bilo mogoče naložiti. {error}", - "Launcher updated to {version}": "Zaganjalnik posodobljen na {version}", "Launcher {version}": "Zaganjalnik {version}", "Launcher {version} {percent}%": "Zaganjalnik {version} {percent}%", "Manage versions": "Upravljanje različic", @@ -840,7 +841,6 @@ "Something went wrong.": "Nekaj je šlo narobe.", "Instances": "Primerki", "Join the Discord": "Pridružite se Discordu", - "Restart to update": "Znova zaženite za posodobitev", "Duplicate…": "Podvojeno ...", "Create a desktop shortcut": "Ustvarite bližnjico na namizju", "Remove the desktop shortcut": "Odstranite bližnjico na namizju", diff --git a/launcher/lang/so.json b/launcher/lang/so.json index 99a4839a27..0e3b46d295 100644 --- a/launcher/lang/so.json +++ b/launcher/lang/so.json @@ -454,7 +454,9 @@ "runs {command} after": "soconaya {command} kadib", "downloaded": "la soo degsaday", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "La cusboonaysiiyay ilaa {version}. Dib u billow furaha si aad u isticmaasho.", + "A new version is available": "Nooc cusub ayaa la heli karaa", + "Download again": "Mar kale soo deji", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Nuqulkan launcher-ka ma beddeli karo naftiisa. Mar kale hal mar soo deji; intaas ka dib wuu is cusboonaysiiyaa.", "Any MCP client": "Macmiil kasta oo MCP ah", "{name}'s cape is kept.": "Daboolka {name} waa la hayaa.", "Not reviewed by the Horizon registry": "Dib uma eegin diiwaanka Horizon", @@ -633,7 +635,6 @@ "Copied": "la guuriyay", "Couldn't load patch notes. {error}": "Waa la rari waayay qoraalada balastarrada {error}", "Couldn't load releases. {error}": "Waa la rari kari waayay sii deynta {error}", - "Launcher updated to {version}": "Soo-saare ayaa la cusboonaysiiyay {version}", "Launcher {version}": "Soo saare {version}", "Launcher {version} {percent}%": "Soo saare {version} {percent}%", "Manage versions": "Maamul noocyada", @@ -840,7 +841,6 @@ "Something went wrong.": "Wax baa khaldamay", "Instances": "Nuqullada", "Join the Discord": "Ku biir Discord", - "Restart to update": "Dib u bilow si aad u cusboonaysiiso", "Duplicate…": "nuqul", "Create a desktop shortcut": "Samee qaab gaaban", "Remove the desktop shortcut": "Ka saar miiska gaaban", diff --git a/launcher/lang/sq.json b/launcher/lang/sq.json index 62df29ab84..73c1af9006 100644 --- a/launcher/lang/sq.json +++ b/launcher/lang/sq.json @@ -454,7 +454,9 @@ "runs {command} after": "shkon {command} pas", "downloaded": "të shkarkuara", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Përditësuar në {version}. Rinisni lëshuesin për ta përdorur atë.", + "A new version is available": "Ka një version të ri", + "Download again": "Shkarko përsëri", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Kjo kopje e nisësit nuk mund ta zëvendësojë veten. Shkarkoje përsëri një herë; pas kësaj përditësohet vetë.", "Any MCP client": "Çdo klient MCP", "{name}'s cape is kept.": "Kepi i {name} mbahet.", "Not reviewed by the Horizon registry": "Nuk është shqyrtuar nga regjistri Horizon", @@ -633,7 +635,6 @@ "Copied": "E kopjuar", "Couldn't load patch notes. {error}": "Shënimet e korrigjimit nuk mund të ngarkoheshin. {error}", "Couldn't load releases. {error}": "Publikimet nuk mund të ngarkoheshin. {error}", - "Launcher updated to {version}": "Nisësi u përditësua në {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Lëshuesi {version} {percent}%", "Manage versions": "Menaxho versionet", @@ -840,7 +841,6 @@ "Something went wrong.": "Diçka shkoi keq.", "Instances": "Instancat", "Join the Discord": "Bashkohuni me Discord", - "Restart to update": "Rinisni për të përditësuar", "Duplicate…": "Dublika…", "Create a desktop shortcut": "Krijoni një shkurtore të desktopit", "Remove the desktop shortcut": "Hiqni shkurtoren e desktopit", diff --git a/launcher/lang/sr.json b/launcher/lang/sr.json index 115814f1a4..03fa2c4e8d 100644 --- a/launcher/lang/sr.json +++ b/launcher/lang/sr.json @@ -454,7 +454,9 @@ "runs {command} after": "покреће {command} после", "downloaded": "преузето", "24/7 online": "24/7 онлине", - "Updated to {version}. Restart the launcher to use it.": "Ажурирано на {version}. Поново покрените покретач да бисте га користили.", + "A new version is available": "Доступна је нова верзија", + "Download again": "Преузми поново", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ова копија покретача не може сама себе да замени. Преузмите га поново једном; после тога се ажурира сам.", "Any MCP client": "Било који МЦП клијент", "{name}'s cape is kept.": "{name} огртач се чува.", "Not reviewed by the Horizon registry": "Horizon регистар га није прегледао", @@ -633,7 +635,6 @@ "Copied": "Копирано", "Couldn't load patch notes. {error}": "Није могуће учитати белешке о закрпама. {error}", "Couldn't load releases. {error}": "Учитавање издања није успело. {error}", - "Launcher updated to {version}": "Покретач је ажуриран на {version}", "Launcher {version}": "Покретач {version}", "Launcher {version} {percent}%": "Покретач {version} {percent}%", "Manage versions": "Управљајте верзијама", @@ -840,7 +841,6 @@ "Something went wrong.": "Нешто је пошло по злу.", "Instances": "Инстанце", "Join the Discord": "Придружи се Discord-у", - "Restart to update": "Поново покрените да бисте ажурирали", "Duplicate…": "Дупликат…", "Create a desktop shortcut": "Направите пречицу на радној површини", "Remove the desktop shortcut": "Уклоните пречицу на радној површини", diff --git a/launcher/lang/sv.json b/launcher/lang/sv.json index 0493163c7c..4926d88769 100644 --- a/launcher/lang/sv.json +++ b/launcher/lang/sv.json @@ -456,7 +456,9 @@ "runs {command} after": "kör {command} efter", "downloaded": "nedladdade", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Uppdaterad till {version}. Starta om startprogrammet för att använda det.", + "A new version is available": "En ny version finns", + "Download again": "Ladda ner igen", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Den här kopian av startprogrammet kan inte ersätta sig själv. Ladda ner den igen en gång; sedan uppdaterar den sig själv.", "Any MCP client": "Vilken MCP-klient som helst", "{name}'s cape is kept.": "{name}s udde behålls.", "Not reviewed by the Horizon registry": "Ej granskad av Horizon-registret", @@ -635,7 +637,6 @@ "Copied": "Kopierade", "Couldn't load patch notes. {error}": "Det gick inte att ladda patch-anteckningar. {error}", "Couldn't load releases. {error}": "Det gick inte att läsa in versioner. {error}", - "Launcher updated to {version}": "Launcher uppdaterad till {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Hantera versioner", @@ -842,7 +843,6 @@ "Something went wrong.": "Något gick fel.", "Instances": "Förekomster", "Join the Discord": "Gå med i Discord", - "Restart to update": "Starta om för att uppdatera", "Duplicate…": "Duplicera...", "Create a desktop shortcut": "Skapa en genväg på skrivbordet", "Remove the desktop shortcut": "Ta bort genvägen på skrivbordet", diff --git a/launcher/lang/szl.json b/launcher/lang/szl.json index c1f6ce602e..8e9148b2be 100644 --- a/launcher/lang/szl.json +++ b/launcher/lang/szl.json @@ -456,7 +456,9 @@ "runs {command} after": "biygnie {command} po", "downloaded": "ściōngniynte", "24/7 online": "24/7 w internecie", - "Updated to {version}. Restart the launcher to use it.": "Zaktualizowane do {version}. Restartuj launcher, coby go użyć.", + "A new version is available": "Je dostympno nowo wersyjo", + "Download again": "Ściōng zaś", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ta kopijo launchera niy poradzi sama sie zastōmpić. Ściōng jōm zaś jedyn roz; potym bydzie sie sama aktualizować.", "Any MCP client": "Kożdy kliynt MCP", "{name}'s cape is kept.": "{name}'s pelery je utrzimowany.", "Not reviewed by the Horizon registry": "Niy przejzdrzywane bez registr Horizon", @@ -635,7 +637,6 @@ "Copied": "Skopiowane", "Couldn't load patch notes. {error}": "Niy mōg załadować notatek ô patchach. {error}", "Couldn't load releases. {error}": "Niy mōg załadować wydań. {error}", - "Launcher updated to {version}": "Launcher zaktualizowany do {version}", "Launcher {version}": "Wypalacz {version}", "Launcher {version} {percent}%": "Wypalacz {version} {percent}%", "Manage versions": "Zarzōndzaj wersyjami", @@ -842,7 +843,6 @@ "Something went wrong.": "Coś poszło nie tak.", "Instances": "Instancyje", "Join the Discord": "Prziłōncz sie do Discord", - "Restart to update": "Restart, coby zaktualizować", "Duplicate…": "Duplikat...", "Create a desktop shortcut": "Utworz ôkrōnżynie do pulpitu", "Remove the desktop shortcut": "Usuń ôkrōnżynie ôd pulpitu", diff --git a/launcher/lang/ta.json b/launcher/lang/ta.json index aebb5bd68c..d2242edf11 100644 --- a/launcher/lang/ta.json +++ b/launcher/lang/ta.json @@ -454,7 +454,9 @@ "runs {command} after": "{command} பிறகு ஓடுகிறது", "downloaded": "பதிவிறக்கம் செய்யப்பட்டது", "24/7 online": "24/7 ஆன்லைன்", - "Updated to {version}. Restart the launcher to use it.": "{version} க்கு புதுப்பிக்கப்பட்டது. அதை பயன்படுத்த துவக்கியை மறுதொடக்கம் செய்யவும்.", + "A new version is available": "புதிய பதிப்பு கிடைக்கிறது", + "Download again": "மீண்டும் பதிவிறக்கு", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "லாஞ்சரின் இந்த நகல் தன்னைத் தானே மாற்ற முடியாது. இதை ஒருமுறை மீண்டும் பதிவிறக்கவும்; அதன் பிறகு அது தானாகவே புதுப்பித்துக்கொள்ளும்.", "Any MCP client": "எந்த MCP கிளையண்ட்", "{name}'s cape is kept.": "{name} இன் கேப் வைக்கப்பட்டுள்ளது.", "Not reviewed by the Horizon registry": "Horizon பதிவேட்டால் மதிப்பாய்வு செய்யப்படவில்லை", @@ -633,7 +635,6 @@ "Copied": "நகலெடுக்கப்பட்டது", "Couldn't load patch notes. {error}": "பேட்ச் குறிப்புகளை ஏற்ற முடியவில்லை. {error}", "Couldn't load releases. {error}": "வெளியீடுகளை ஏற்ற முடியவில்லை. {error}", - "Launcher updated to {version}": "துவக்கி {version} க்கு புதுப்பிக்கப்பட்டது", "Launcher {version}": "துவக்கி {version}", "Launcher {version} {percent}%": "துவக்கி {version} {percent}%", "Manage versions": "பதிப்புகளை நிர்வகிக்கவும்", @@ -840,7 +841,6 @@ "Something went wrong.": "ஏதோ தவறாகிவிட்டது.", "Instances": "நிகழ்வுகள்", "Join the Discord": "Discord-இல் சேருங்கள்", - "Restart to update": "புதுப்பிக்க மீண்டும் தொடங்கவும்", "Duplicate…": "நகல்…", "Create a desktop shortcut": "டெஸ்க்டாப் குறுக்குவழியை உருவாக்கவும்", "Remove the desktop shortcut": "டெஸ்க்டாப் குறுக்குவழியை அகற்று", diff --git a/launcher/lang/th.json b/launcher/lang/th.json index b3cf3af61f..a5239f39d0 100644 --- a/launcher/lang/th.json +++ b/launcher/lang/th.json @@ -456,7 +456,9 @@ "runs {command} after": "วิ่ง {command} หลังจากนั้น", "downloaded": "ดาวน์โหลดแล้ว", "24/7 online": "ออนไลน์ตลอด 24 ชั่วโมงทุกวัน", - "Updated to {version}. Restart the launcher to use it.": "อัปเดตเป็น {version} รีสตาร์ทตัวเรียกใช้งานเพื่อใช้งาน", + "A new version is available": "มีเวอร์ชันใหม่", + "Download again": "ดาวน์โหลดอีกครั้ง", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "สำเนาของลันเชอร์นี้แทนที่ตัวเองไม่ได้ ดาวน์โหลดใหม่อีกครั้งเดียว หลังจากนั้นจะอัปเดตตัวเอง", "Any MCP client": "ไคลเอนต์ MCP ใด ๆ", "{name}'s cape is kept.": "ผ้าคลุมของ {name} ถูกเก็บไว้", "Not reviewed by the Horizon registry": "ไม่ได้รับการตรวจสอบโดยสำนักทะเบียน Horizon", @@ -635,7 +637,6 @@ "Copied": "คัดลอกแล้ว", "Couldn't load patch notes. {error}": "ไม่สามารถโหลดบันทึกการแก้ไขได้ {error}", "Couldn't load releases. {error}": "ไม่สามารถโหลดรุ่นต่างๆ {error}", - "Launcher updated to {version}": "ตัวเรียกใช้อัปเดตเป็น {version}", "Launcher {version}": "ตัวเปิด {version}", "Launcher {version} {percent}%": "ตัวเปิด {version} {percent}%", "Manage versions": "จัดการเวอร์ชัน", @@ -842,7 +843,6 @@ "Something went wrong.": "มีบางอย่างผิดพลาด", "Instances": "อินสแตนซ์", "Join the Discord": "เข้าร่วมความไม่ลงรอยกัน", - "Restart to update": "รีสตาร์ทเพื่ออัปเดต", "Duplicate…": "ทำซ้ำ...", "Create a desktop shortcut": "สร้างทางลัดบนเดสก์ท็อป", "Remove the desktop shortcut": "ลบทางลัดบนเดสก์ท็อป", diff --git a/launcher/lang/tr.json b/launcher/lang/tr.json index 8711e8b8ba..7f0e2823a8 100644 --- a/launcher/lang/tr.json +++ b/launcher/lang/tr.json @@ -39,7 +39,9 @@ "up to date": "güncel", "Checking…": "Kontrol ediliyor…", "downloading {version}, {percent}%": "{version} indiriliyor, %{percent}", - "Updated to {version}. Restart the launcher to use it.": "{version} sürümüne güncellendi. Kullanmak için başlatıcıyı yeniden başlatın.", + "A new version is available": "Yeni bir sürüm var", + "Download again": "Yeniden indir", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Başlatıcının bu kopyası kendini değiştiremiyor. Onu bir kez yeniden indir; sonrasında kendini kendisi günceller.", "the update failed: {error}": "güncelleme başarısız oldu: {error}", "Install": "Yükle", "Restart": "Yeniden Başlat", @@ -635,7 +637,6 @@ "{name} moved to the trash.": "{name} moved to the trash.", "Couldn't load patch notes. {error}": "Couldn't load patch notes. {error}", "Couldn't load releases. {error}": "Couldn't load releases. {error}", - "Launcher updated to {version}": "Launcher updated to {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Sürümleri yönet", @@ -842,7 +843,6 @@ "Something went wrong.": "Something went wrong.", "Instances": "Örnekler", "Join the Discord": "Discord'a katıl", - "Restart to update": "Güncellemek için yeniden başlat", "Duplicate…": "Çoğalt…", "Create a desktop shortcut": "Masaüstü kısayolu oluştur", "Remove the desktop shortcut": "Masaüstü kısayolunu kaldır", diff --git a/launcher/lang/tt.json b/launcher/lang/tt.json index e20530128e..5be1c88902 100644 --- a/launcher/lang/tt.json +++ b/launcher/lang/tt.json @@ -454,7 +454,9 @@ "runs {command} after": "{command} эшли", "downloaded": "йөкләнде", "24/7 online": "24/7 онлайн", - "Updated to {version}. Restart the launcher to use it.": "{version} яңартылды. Аны куллану өчен эшләтеп җибәрүне яңадан эшләтеп җибәрегез.", + "A new version is available": "Яңа версия бар", + "Download again": "Яңадан йөкләү", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Лаунчерның бу күчермәсе үзен алыштыра алмый. Аны бер тапкыр яңадан йөкләгез; аннары ул үзе яңара.", "Any MCP client": "Теләсә нинди MCP клиенты", "{name}'s cape is kept.": "{name} баш киеме саклана.", "Not reviewed by the Horizon registry": "Horizon реестрында каралмаган", @@ -633,7 +635,6 @@ "Copied": "Күчерелгән", "Couldn't load patch notes. {error}": "Пач язмаларын йөкләп булмады. {error}", "Couldn't load releases. {error}": "Релизларны йөкләп булмады. {error}", - "Launcher updated to {version}": "Эшләткеч {version} яңартылды", "Launcher {version}": "Эшләткеч {version}", "Launcher {version} {percent}%": "Эшләткеч {version} {percent}%", "Manage versions": "Вариантлар белән идарә итү", @@ -840,7 +841,6 @@ "Something went wrong.": "Нәрсәдер дөрес булмаган.", "Instances": "Инстанцияләр", "Join the Discord": "Discord кушылыгыз", - "Restart to update": "Яңарту өчен яңадан башлап җибәрегез", "Duplicate…": "Күчереп алу ...", "Create a desktop shortcut": "Эш өстәле кыска юлын ясагыз", "Remove the desktop shortcut": "Эш өстәле кыска юлын бетерегез", diff --git a/launcher/lang/uk.json b/launcher/lang/uk.json index 14add88903..a62921c8f5 100644 --- a/launcher/lang/uk.json +++ b/launcher/lang/uk.json @@ -456,7 +456,9 @@ "runs {command} after": "потім виконує {command}", "downloaded": "downloaded", "24/7 online": "онлайн 24/7", - "Updated to {version}. Restart the launcher to use it.": "Оновлено до {version}. Перезапустіть лаунчер, щоб її використати.", + "A new version is available": "Доступна нова версія", + "Download again": "Завантажити знову", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ця копія лаунчера не може замінити сама себе. Завантажте його знову один раз; після цього він оновлюється сам.", "Any MCP client": "Any MCP client", "{name}'s cape is kept.": "Плащ {name} збережено.", "Not reviewed by the Horizon registry": "Не перевірено реєстром Horizon", @@ -635,7 +637,6 @@ "Copied": "Скопійовано", "Couldn't load patch notes. {error}": "Couldn't load patch notes. {error}", "Couldn't load releases. {error}": "Couldn't load releases. {error}", - "Launcher updated to {version}": "Launcher updated to {version}", "Launcher {version}": "Launcher {version}", "Launcher {version} {percent}%": "Launcher {version} {percent}%", "Manage versions": "Керування версіями", @@ -842,7 +843,6 @@ "Something went wrong.": "Щось пішло не так.", "Instances": "Екземпляри", "Join the Discord": "Приєднатися до Discord", - "Restart to update": "Перезапустити для оновлення", "Duplicate…": "Дублювати…", "Create a desktop shortcut": "Створити ярлик на робочому столі", "Remove the desktop shortcut": "Прибрати ярлик з робочого столу", diff --git a/launcher/lang/ur.json b/launcher/lang/ur.json index 0418dd71e5..fd2391975a 100644 --- a/launcher/lang/ur.json +++ b/launcher/lang/ur.json @@ -456,7 +456,9 @@ "runs {command} after": "{command} کے بعد چلتا ہے۔", "downloaded": "ڈاؤن لوڈ", "24/7 online": "24/7 آن لائن", - "Updated to {version}. Restart the launcher to use it.": "{version} میں اپ ڈیٹ کیا گیا۔ لانچر کو استعمال کرنے کے لیے اسے دوبارہ شروع کریں۔", + "A new version is available": "ایک نیا ورژن دستیاب ہے", + "Download again": "دوبارہ ڈاؤن لوڈ کریں", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "لانچر کی یہ کاپی خود کو تبدیل نہیں کر سکتی۔ اسے ایک بار دوبارہ ڈاؤن لوڈ کریں؛ اس کے بعد یہ خود اپ ڈیٹ ہوتا ہے۔", "Any MCP client": "کوئی بھی MCP کلائنٹ", "{name}'s cape is kept.": "{name} کی کیپ رکھی گئی ہے۔", "Not reviewed by the Horizon registry": "Horizon رجسٹری کے ذریعہ جائزہ نہیں لیا گیا۔", @@ -635,7 +637,6 @@ "Copied": "کاپی", "Couldn't load patch notes. {error}": "پیچ نوٹس لوڈ نہیں ہو سکے۔ {error}", "Couldn't load releases. {error}": "ریلیزز کو لوڈ نہیں کیا جا سکا۔ {error}", - "Launcher updated to {version}": "لانچر کو {version} پر اپ ڈیٹ کیا گیا", "Launcher {version}": "لانچر {version}", "Launcher {version} {percent}%": "لانچر {version} {percent}%", "Manage versions": "ورژن کا نظم کریں۔", @@ -842,7 +843,6 @@ "Something went wrong.": "کچھ غلط ہو گیا۔", "Instances": "مثالیں", "Join the Discord": "ڈسکارڈ میں شامل ہوں۔", - "Restart to update": "اپ ڈیٹ کرنے کے لیے دوبارہ شروع کریں۔", "Duplicate…": "ڈپلیکیٹ…", "Create a desktop shortcut": "ایک ڈیسک ٹاپ شارٹ کٹ بنائیں", "Remove the desktop shortcut": "ڈیسک ٹاپ شارٹ کٹ کو ہٹا دیں۔", diff --git a/launcher/lang/uz.json b/launcher/lang/uz.json index aa13369fc9..6e140a831d 100644 --- a/launcher/lang/uz.json +++ b/launcher/lang/uz.json @@ -454,7 +454,9 @@ "runs {command} after": "{command} dan keyin ishlaydi", "downloaded": "yuklab olingan", "24/7 online": "24/7 onlayn", - "Updated to {version}. Restart the launcher to use it.": "{version}ga yangilandi. Uni ishlatish uchun ishga tushirgichni qayta ishga tushiring.", + "A new version is available": "Yangi versiya mavjud", + "Download again": "Qayta yuklab olish", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Launcherning bu nusxasi o'zini almashtira olmaydi. Uni bir marta qayta yuklab oling; shundan keyin u o'zi yangilanadi.", "Any MCP client": "Har qanday MCP mijozi", "{name}'s cape is kept.": "{name} peshonasi saqlanadi.", "Not reviewed by the Horizon registry": "Horizon reestri tomonidan ko'rib chiqilmagan", @@ -633,7 +635,6 @@ "Copied": "Ko‘chirildi", "Couldn't load patch notes. {error}": "Yamoq qaydlarini yuklab bo‘lmadi. {error}", "Couldn't load releases. {error}": "Relizlar yuklanmadi. {error}", - "Launcher updated to {version}": "Launcher {version} ga yangilandi", "Launcher {version}": "Ishga tushirgich {version}", "Launcher {version} {percent}%": "Ishga tushirgich {version} {percent}%", "Manage versions": "Versiyalarni boshqarish", @@ -840,7 +841,6 @@ "Something went wrong.": "Nimadir xato ketdi.", "Instances": "Nusxalar", "Join the Discord": "Discordga qo'shiling", - "Restart to update": "Yangilash uchun qayta ishga tushiring", "Duplicate…": "Takroriy…", "Create a desktop shortcut": "Ish stoli yorlig'ini yarating", "Remove the desktop shortcut": "Ish stolidagi yorliqni olib tashlang", diff --git a/launcher/lang/vec.json b/launcher/lang/vec.json index c743b7243d..f9ff7536d0 100644 --- a/launcher/lang/vec.json +++ b/launcher/lang/vec.json @@ -456,7 +456,9 @@ "runs {command} after": "core {command} dopo", "downloaded": "scaricà", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Ajornà a {version}. Riavia el lansador pa dopararlo.", + "A new version is available": "Ze disponibiłe na version nova", + "Download again": "Descarga da novo", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Sta copia del launcher no ła pol sostituirse da soła. Descarghelo da novo na volta; dopo el se ajorna da soło.", "Any MCP client": "Ogni cliente MCP", "{name}'s cape is kept.": "Se mantiene el capa de {name}.", "Not reviewed by the Horizon registry": "Non rivisto dal registro Horizon .", @@ -635,7 +637,6 @@ "Copied": "Copià", "Couldn't load patch notes. {error}": "No se pol caricare łe note deła patch. {error}", "Couldn't load releases. {error}": "No se pol caricare i rilasci. {error}", - "Launcher updated to {version}": "Launcher ajornà a {version}", "Launcher {version}": "Lansador {version}", "Launcher {version} {percent}%": "Lansador {version} {percent}%", "Manage versions": "Gestise łe version", @@ -842,7 +843,6 @@ "Something went wrong.": "Qualcosa xe ndà storto.", "Instances": "Istanse", "Join the Discord": "Entra al Discord", - "Restart to update": "Riavia pa l’ajornamento", "Duplicate…": "Dopià…", "Create a desktop shortcut": "Crea un scorciatoia pa desktop", "Remove the desktop shortcut": "Cava ła scorciatoia del desktop", diff --git a/launcher/lang/vi.json b/launcher/lang/vi.json index 8d617b4739..225d560e63 100644 --- a/launcher/lang/vi.json +++ b/launcher/lang/vi.json @@ -456,7 +456,9 @@ "runs {command} after": "chạy {command} sau", "downloaded": "đã tải xuống", "24/7 online": "trực tuyến 24/7", - "Updated to {version}. Restart the launcher to use it.": "Đã cập nhật thành {version}. Khởi động lại launcher để sử dụng nó.", + "A new version is available": "Đã có phiên bản mới", + "Download again": "Tải lại", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Bản trình khởi chạy này không thể tự thay thế chính nó. Hãy tải lại một lần; sau đó nó sẽ tự cập nhật.", "Any MCP client": "Bất kỳ khách hàng MCP nào", "{name}'s cape is kept.": "Áo choàng của {name} được giữ lại.", "Not reviewed by the Horizon registry": "Chưa được cơ quan đăng ký Horizon xem xét", @@ -635,7 +637,6 @@ "Copied": "Đã sao chép", "Couldn't load patch notes. {error}": "Không thể tải ghi chú vá. {error}", "Couldn't load releases. {error}": "Không thể tải bản phát hành. {error}", - "Launcher updated to {version}": "Trình khởi chạy được cập nhật thành {version}", "Launcher {version}": "Trình khởi chạy {version}", "Launcher {version} {percent}%": "Trình khởi chạy {version} {percent}%", "Manage versions": "Quản lý phiên bản", @@ -842,7 +843,6 @@ "Something went wrong.": "Đã xảy ra lỗi.", "Instances": "trường hợp", "Join the Discord": "Tham gia vào sự bất hòa", - "Restart to update": "Khởi động lại để cập nhật", "Duplicate…": "Nhân bản…", "Create a desktop shortcut": "Tạo lối tắt trên màn hình", "Remove the desktop shortcut": "Xóa lối tắt trên màn hình", diff --git a/launcher/lang/yi.json b/launcher/lang/yi.json index b491cdf2c4..5384597f72 100644 --- a/launcher/lang/yi.json +++ b/launcher/lang/yi.json @@ -454,7 +454,9 @@ "runs {command} after": "לויפט {command} נאָך", "downloaded": "דאַונלאָודיד", "24/7 online": "24/7 אָנליין", - "Updated to {version}. Restart the launcher to use it.": "דערהייַנטיקט צו {version}. ריסטאַרט די לאָנטשער צו נוצן עס.", + "A new version is available": "א נײַע ווערסיע איז בנימצא", + "Download again": "אראָפּלאָדן נאָכאַמאָל", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "די קאָפּיע פֿון דעם לאַנטשער קען זיך נישט אליין פֿאַרבייטן. לאָדט עס אַראָפּ נאָכאַמאָל איין מאָל; דערנאָך דערהייַנטיקט עס זיך אליין.", "Any MCP client": "קיין MCP קליענט", "{name}'s cape is kept.": "{name} ס קאַפּע איז געהאלטן.", "Not reviewed by the Horizon registry": "ניט ריוויוד דורך די Horizon רעגיסטרי", @@ -633,7 +635,6 @@ "Copied": "קאַפּיד", "Couldn't load patch notes. {error}": "קען נישט לאָדן פּאַטש הערות. {error}", "Couldn't load releases. {error}": "קען נישט לאָדן ריליסיז. {error}", - "Launcher updated to {version}": "לאַונטשער דערהייַנטיקט צו {version}", "Launcher {version}": "לאַונטשער {version}", "Launcher {version} {percent}%": "לאַונטשער {version} {percent}%", "Manage versions": "פירן ווערסיעס", @@ -840,7 +841,6 @@ "Something went wrong.": "עפּעס איז פאַלש.", "Instances": "אינסטאַנצן", "Join the Discord": "פאַרבינדן די Discord", - "Restart to update": "ריסטאַרט צו דערהייַנטיקן", "Duplicate…": "דופּליקאַט…", "Create a desktop shortcut": "שאַפֿן אַ דעסקטאַפּ דורכוועג", "Remove the desktop shortcut": "אַראָפּנעמען די דעסקטאַפּ דורכוועג", diff --git a/launcher/lang/yo.json b/launcher/lang/yo.json index c88748bc8c..6b7e559dfa 100644 --- a/launcher/lang/yo.json +++ b/launcher/lang/yo.json @@ -454,7 +454,9 @@ "runs {command} after": "nṣiṣẹ {command} lẹhin", "downloaded": "gbaa lati ayelujara", "24/7 online": "24/7 online", - "Updated to {version}. Restart the launcher to use it.": "Ṣe imudojuiwọn si {version}. Tun ifilọlẹ bẹrẹ lati lo.", + "A new version is available": "Ẹ̀dà tuntun wà", + "Download again": "Ṣe igbasilẹ lẹ́ẹ̀kan sí i", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Ẹ̀dà launcher yìí kò lè rọ́pò ara rẹ̀. Ṣe igbasilẹ rẹ̀ lẹ́ẹ̀kan sí i; lẹ́yìn náà yóò máa ṣe imudojuiwọn ara rẹ̀.", "Any MCP client": "Eyikeyi MCP onibara", "{name}'s cape is kept.": "Kapu {name} ti wa ni ipamọ.", "Not reviewed by the Horizon registry": "Ko ṣe atunyẹwo nipasẹ iforukọsilẹ Horizon", @@ -633,7 +635,6 @@ "Copied": "Ti daakọ", "Couldn't load patch notes. {error}": "Ko le gbe awọn akọsilẹ patch silẹ. {error}", "Couldn't load releases. {error}": "Ko le gbe awọn idasilẹ. {error}", - "Launcher updated to {version}": "Ifilọlẹ ti ni imudojuiwọn si {version}", "Launcher {version}": "Ifilọlẹ {version}", "Launcher {version} {percent}%": "Olupilẹṣẹ {version} {percent}%", "Manage versions": "Ṣakoso awọn ẹya", @@ -840,7 +841,6 @@ "Something went wrong.": "Nkankan ti ko tọ.", "Instances": "Awọn apẹẹrẹ", "Join the Discord": "Darapọ mọ Discord", - "Restart to update": "Tun bẹrẹ lati ṣe imudojuiwọn", "Duplicate…": "Ṣe pidánpidán…", "Create a desktop shortcut": "Ṣẹda ọna abuja tabili kan", "Remove the desktop shortcut": "Yọ ọna abuja tabili kuro", diff --git a/launcher/lang/zh.json b/launcher/lang/zh.json index a3d4647b49..8f733e1c57 100644 --- a/launcher/lang/zh.json +++ b/launcher/lang/zh.json @@ -456,7 +456,9 @@ "runs {command} after": "退出后运行 {command}", "downloaded": "已下载", "24/7 online": "全天候在线", - "Updated to {version}. Restart the launcher to use it.": "已更新到 {version}。重启启动器即可使用。", + "A new version is available": "有新版本可用", + "Download again": "重新下载", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "此启动器副本无法替换自身。请重新下载一次;之后它会自行更新。", "Any MCP client": "任意 MCP 客户端", "{name}'s cape is kept.": "{name} 的披风已保存。", "Not reviewed by the Horizon registry": "未经 Horizon 注册表审核", @@ -635,7 +637,6 @@ "Copied": "已复制", "Couldn't load patch notes. {error}": "无法加载更新说明。{error}", "Couldn't load releases. {error}": "无法加载版本列表。{error}", - "Launcher updated to {version}": "启动器已更新至 {version}", "Launcher {version}": "启动器 {version}", "Launcher {version} {percent}%": "启动器 {version} {percent}%", "Manage versions": "管理版本", @@ -842,7 +843,6 @@ "Something went wrong.": "出了点问题。", "Instances": "实例", "Join the Discord": "加入 Discord", - "Restart to update": "重启以更新", "Duplicate…": "复制…", "Create a desktop shortcut": "创建桌面快捷方式", "Remove the desktop shortcut": "移除桌面快捷方式", diff --git a/launcher/lang/zu.json b/launcher/lang/zu.json index fcbec79882..6188d93f52 100644 --- a/launcher/lang/zu.json +++ b/launcher/lang/zu.json @@ -454,7 +454,9 @@ "runs {command} after": "igijima {command} ngemva", "downloaded": "ukulandwa", "24/7 online": "24/7 ku-inthanethi", - "Updated to {version}. Restart the launcher to use it.": "Kubuyekezwe ku-{version}. Qala kabusha isiqalisi ukuze usisebenzise.", + "A new version is available": "Kukhona inguqulo entsha", + "Download again": "Landa futhi", + "This copy of the launcher can't replace itself. Download it again once; it updates itself after that.": "Lekhophi le-launcher alikwazi ukuzishintsha. Liphinde ulilande kanye; ngemva kwalokho lizibuyekeza ngokwalo.", "Any MCP client": "Noma yiliphi iklayenti le-MCP", "{name}'s cape is kept.": "{name}'s cap igcinwa.", "Not reviewed by the Horizon registry": "Akubuyekezwe ukubhaliswa Horizon", @@ -633,7 +635,6 @@ "Copied": "Kukopishiwe", "Couldn't load patch notes. {error}": "Ayikwazanga ukulayisha amanothi epeshi. {error}", "Couldn't load releases. {error}": "Ayikwazanga ukulayisha ukukhishwa. {error}", - "Launcher updated to {version}": "Isiqalisi sibuyekezelwe ku-{version}", "Launcher {version}": "Isiqalisi {version}", "Launcher {version} {percent}%": "Isiqalisi {version} {percent}%", "Manage versions": "Phatha izinguqulo", @@ -840,7 +841,6 @@ "Something went wrong.": "Kukhona okungahambanga kahle.", "Instances": "Ama-instance", "Join the Discord": "Joyina i-Discord", - "Restart to update": "Qala kabusha ukuze ubuyekeze", "Duplicate…": "Impinda...", "Create a desktop shortcut": "Dala isinqamuleli sedeskithophu", "Remove the desktop shortcut": "Susa isinqamuleli sedeskithophu", diff --git a/launcher/src/backend.rs b/launcher/src/backend.rs index 8827c17f81..cfae9c1d1e 100644 --- a/launcher/src/backend.rs +++ b/launcher/src/backend.rs @@ -2943,10 +2943,35 @@ fn replace_bundle(_new: &Path, _app: &Path) -> Result<(), String> { Err("App bundles are a macOS thing.".into()) } +/// A launcher release downloaded and checked against its signed SHA256SUMS, waiting to take this +/// launcher's place: the new AppImage, `.app` bundle or binary, inside [`update_work_dir`]. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Staged { + pub tag: String, + pub payload: PathBuf, +} + +/// Where a launcher update is downloaded and unpacked before it takes this one's place. +pub fn update_work_dir() -> PathBuf { + data_dir().join(".launcher-update") +} + /// Downloads a launcher release and puts it in place of this one. The running process keeps /// working; `restart` starts the new one. When the file there already is that release or /// a newer one (updated from the command line or another window), there is nothing to do. pub fn self_update(release: &Release, progress: impl Fn(f32)) -> Result<(), String> { + if let Some(staged) = stage_update(release, &progress)? { + place_staged(&staged)?; + let _ = fs::remove_dir_all(update_work_dir()); + } + progress(1.0); + Ok(()) +} + +/// Downloads and unpacks a launcher release next to this one without putting it in place yet +/// ([`place_staged`] does, in this process or in the installer `update_handoff` starts). None +/// when the file there already is that release or a newer one. +pub fn stage_update(release: &Release, progress: impl Fn(f32)) -> Result, String> { let (url, size) = release .asset .clone() @@ -2955,64 +2980,116 @@ pub fn self_update(release: &Release, progress: impl Fn(f32)) -> Result<(), Stri if installed_launcher_version(&update_target()) .is_some_and(|v| v != VERSION && compare_versions(&v, target).is_ge()) { - progress(1.0); - return Ok(()); + return Ok(None); } let sha256 = signed_digest(&release.tag, launcher_asset().unwrap_or_default())?; - let work = data_dir().join(".launcher-update"); + let work = update_work_dir(); let _ = fs::remove_dir_all(&work); fs::create_dir_all(&work).map_err(|e| e.to_string())?; let archive = work.join("download"); download(&url, size, &sha256, &archive, &progress)?; + let staged = |payload| { + Ok(Some(Staged { + tag: release.tag.clone(), + payload, + })) + }; // An AppImage is the whole program: the new one takes the place of the file `$APPIMAGE` names // (the running mount keeps its copy until `restart` starts it). Its archive is not a `.tar.gz` // to unpack, so this comes before the unpacking below. - if let Some(appimage) = appimage_path() { + if appimage_path().is_some() { if !url.ends_with(".AppImage") { return Err(format!( "{} is not an AppImage, and this launcher runs from one. Install it from its release page instead.", release.tag )); } - replace_binary(&archive, &appimage).map_err(|e| { - format!( - "Could not replace the AppImage at {}: {e}", - appimage.display() - ) - })?; - let _ = fs::remove_dir_all(&work); - progress(1.0); - return Ok(()); + return staged(archive); } let unpacked = work.join("unpacked"); unpack(&archive, &url, &unpacked)?; // A launcher inside Horizon.app replaces the whole bundle (its Info.plist, icon and // signature belong with the binary); a bare binary, as older launchers are, only the binary, // which the macOS archive also holds (Horizon.app/Contents/MacOS/horizon-launcher). - if let Some(app) = app_bundle(exe_path()) { + if app_bundle(exe_path()).is_some() { if let Some(new) = find_app(&unpacked) { - replace_bundle(&new, app)?; - let _ = fs::remove_dir_all(&work); - progress(1.0); - return Ok(()); + return staged(new); } } let binary = find_file(&unpacked, LAUNCHER_BINARY).ok_or("The download has no launcher binary.")?; - replace_binary(&binary, exe_path()).map_err(|e| { - format!( - "Could not replace the launcher at {}: {e}", - exe_path().display() - ) - })?; + staged(binary) +} + +/// Puts a [`stage_update`]d launcher where this one runs from: the AppImage, the `.app` bundle +/// or the binary. +pub fn place_staged(staged: &Staged) -> Result<(), String> { + let new = &staged.payload; + if let Some(appimage) = appimage_path() { + replace_binary(new, &appimage).map_err(|e| { + format!( + "Could not replace the AppImage at {}: {e}", + appimage.display() + ) + })?; + return Ok(()); + } + match app_bundle(exe_path()) { + Some(app) if new.extension().is_some_and(|e| e == "app") => replace_bundle(new, app)?, + _ => replace_binary(new, exe_path()).map_err(|e| { + format!( + "Could not replace the launcher at {}: {e}", + exe_path().display() + ) + })?, + } // An installed launcher's Uninstall entry names the new version (installer.rs). #[cfg(windows)] - crate::installer::after_update(launcher_version(&release.tag).unwrap_or(VERSION)); - let _ = fs::remove_dir_all(&work); - progress(1.0); + crate::installer::after_update(launcher_version(&staged.tag).unwrap_or(VERSION)); Ok(()) } +/// The website's install page, where a launcher that can't update itself sends the player. +pub fn download_page(website: &str) -> String { + format!("{}/docs/install", website.trim_end_matches('/')) +} + +/// Whether this copy of the launcher can't put a new one in its place: its folder is read-only (a +/// disk image, or the read-only copy macOS runs a downloaded app from until it is moved, its "App +/// Translocation"), or it is the temporary copy Windows' Explorer runs from a `.zip` it was opened +/// in (and deletes later). Such a copy is told to download the launcher again (#9287). +pub fn cannot_replace_itself() -> bool { + let target = update_target(); + let place = app_bundle(&target).unwrap_or(&target); + place + .parent() + .is_none_or(|dir| !writable(dir) || zip_preview(dir, &std::env::temp_dir())) +} + +fn writable(dir: &Path) -> bool { + let probe = dir.join(format!(".horizon-write-check-{}", std::process::id())); + let made = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&probe) + .is_ok(); + let _ = fs::remove_file(&probe); + made +} + +/// `dir` is under the temporary folder, in one named like Explorer's `Temp1_.zip`. +fn zip_preview(dir: &Path, temp: &Path) -> bool { + dir.strip_prefix(temp).is_ok_and(|inside| { + inside.components().any(|c| { + let name = c.as_os_str().to_string_lossy().to_ascii_lowercase(); + name.strip_prefix("temp").is_some_and(|rest| { + let digits = rest.bytes().take_while(u8::is_ascii_digit).count(); + digits > 0 && rest[digits..].starts_with('_') && name.ends_with(".zip") + }) + }) + }) +} + fn find_file(dir: &Path, name: &str) -> Option { for entry in fs::read_dir(dir).ok()?.flatten() { let path = entry.path(); @@ -3140,7 +3217,7 @@ pub enum Msg { /// Boxed: two releases, the largest message by far. Updates(Result, String>), LauncherProgress(f32), - LauncherUpdated(Result<(), String>), + LauncherUpdated(Result, String>), /// `reuse_prepared_everywhere` prepared these versions. Reused(Vec<(String, String)>), /// None when secrets are kept in the OS keychain, else what to say: they last only until @@ -4302,6 +4379,47 @@ pub fn {f}(" ); } + /// Explorer runs a program opened inside a `.zip` from `%TEMP%\Temp_.zip\` and + /// deletes that copy later: an update written there is lost, so such a copy is told to + /// download the launcher again (#9287). A folder of the same look elsewhere is a real install. + #[test] + fn a_launcher_run_from_inside_a_zip_is_a_temporary_copy() { + let temp = Path::new("/tmp/t"); + let preview = |dir: &str| zip_preview(Path::new(dir), temp); + assert!(preview("/tmp/t/Temp1_horizon-launcher-windows-x64.zip")); + assert!(preview( + "/tmp/t/Temp12_horizon-launcher-windows-x64.zip/inner" + )); + assert!(preview("/tmp/t/TEMP3_HORIZON.ZIP")); + assert!(!preview("/tmp/t/horizon-launcher")); + assert!(!preview("/tmp/t/Templates.zip")); + assert!(!preview("/tmp/t/Temp_horizon.zip")); + assert!(!zip_preview(Path::new("/home/me/Temp1_horizon.zip"), temp)); + } + + /// A launcher whose folder takes no new file (a disk image, macOS's translocated copy of an + /// app it was not moved from) can't put the new one in place. + #[cfg(unix)] + #[test] + fn a_read_only_folder_takes_no_update() { + use std::os::unix::fs::PermissionsExt; + let dir = std::env::temp_dir().join(format!("horizon-read-only-{}", std::process::id())); + fs::create_dir_all(&dir).unwrap(); + assert!(writable(&dir)); + fs::set_permissions(&dir, fs::Permissions::from_mode(0o555)).unwrap(); + // root writes anywhere. + if unsafe { libc::geteuid() } != 0 { + assert!(!writable(&dir)); + } + fs::set_permissions(&dir, fs::Permissions::from_mode(0o755)).unwrap(); + assert_eq!( + fs::read_dir(&dir).unwrap().count(), + 0, + "the probe is removed" + ); + fs::remove_dir_all(&dir).unwrap(); + } + /// `$APPIMAGE` names the file the runtime mounted; a path that is not there (moved or deleted /// since the launcher started) is no AppImage, and the launcher updates its own binary again. /// Nor is one inherited from another AppImage's program: the binary has to run from `$APPDIR`. diff --git a/launcher/src/frame.rs b/launcher/src/frame.rs index 9d0bff6e5d..63f0e14194 100644 --- a/launcher/src/frame.rs +++ b/launcher/src/frame.rs @@ -386,17 +386,42 @@ impl Launcher { } SelfUpdate::Ready(version) => { foot = foot.child( - card(trf("Launcher {version}", &[("version", version)]), None).child( - ui::solid("restart", tr("Restart to update"), 32., 13., &t) + card( + tr("A new version is available").to_string(), + Some(version.clone()), + ) + .child( + ui::solid("update-launcher", tr("Update"), 32., 13., &t) .mt(px(12.)) .w_full() .on_click(cx.listener(|this, _: &ClickEvent, _, cx| { - this.self_update = SelfUpdate::Failed(backend::restart()); + this.apply_launcher_update(cx); cx.notify(); })), ), ); } + SelfUpdate::Stuck(error) => { + let why = match error { + Some(e) => trf("the update failed: {error}", &[("error", e)]), + None => tr("This copy of the launcher can't replace itself. Download it again once; it updates itself after that.").to_string(), + }; + let url = backend::download_page(&self.links.website); + foot = foot.child( + card(tr("A new version is available").to_string(), None) + .child( + ui::text(13., FontWeight::NORMAL, ink::NOTE) + .mt(px(6.)) + .child(why), + ) + .child( + ui::solid("download-launcher", tr("Download again"), 32., 13., &t) + .mt(px(12.)) + .w_full() + .on_click(move |_, _, cx| cx.open_url(&url)), + ), + ); + } _ => {} } diff --git a/launcher/src/lib.rs b/launcher/src/lib.rs index 4ad7fcd5de..f72498ea8a 100644 --- a/launcher/src/lib.rs +++ b/launcher/src/lib.rs @@ -48,5 +48,6 @@ pub mod tailscale; pub mod telemetry; pub mod themes; pub mod uninstall_aside; +pub mod update_handoff; pub mod wardrobe; pub mod worlds; diff --git a/launcher/src/main.rs b/launcher/src/main.rs index bb5ce5669b..3d084724ab 100644 --- a/launcher/src/main.rs +++ b/launcher/src/main.rs @@ -162,7 +162,13 @@ impl Page { enum SelfUpdate { Idle, Downloading(String, f32), + /// Downloaded and checked: "A new version is available" and Update, which hands it to the + /// installer (`update_handoff`). Closing the window hands it over too. Ready(String), + /// A newer launcher can't go in here: this copy can't replace itself + /// (`backend::cannot_replace_itself`), or the installer said why (the error). The player + /// downloads the launcher again once. + Stuck(Option), Failed(String), } @@ -570,7 +576,9 @@ impl Launcher { updates: Updates::default(), checked: None, update_error: None, - self_update: SelfUpdate::Idle, + // The installer the last Update started could not put the new launcher in place. + self_update: horizon_launcher::update_handoff::take_failure() + .map_or(SelfUpdate::Idle, |e| SelfUpdate::Stuck(Some(e))), update_install: None, instance_install: None, install_next: None, @@ -867,11 +875,15 @@ impl Launcher { if !backend::self_update_allowed() || matches!( self.self_update, - SelfUpdate::Downloading(..) | SelfUpdate::Ready(_) + SelfUpdate::Downloading(..) | SelfUpdate::Ready(_) | SelfUpdate::Stuck(_) ) { return; } + if backend::cannot_replace_itself() { + self.self_update = SelfUpdate::Stuck(None); + return; + } let version = backend::launcher_version(&release.tag) .unwrap_or_default() .to_string(); @@ -881,12 +893,22 @@ impl Launcher { let progress = |p| { let _ = tx.send(Msg::LauncherProgress(p)); }; - let _ = tx.send(Msg::LauncherUpdated(backend::self_update( + let _ = tx.send(Msg::LauncherUpdated(backend::stage_update( &release, progress, ))); }); } + /// Update: the window closes, the installer puts the new launcher in place and starts it. + /// When another launcher already put it there, this one only restarts. + fn apply_launcher_update(&mut self, cx: &mut App) { + match horizon_launcher::update_handoff::start_now() { + Ok(true) => shut_down(cx), + Ok(false) => self.self_update = SelfUpdate::Failed(backend::restart()), + Err(e) => self.self_update = SelfUpdate::Failed(e), + } + } + /// Installs the Horizon version the last check found, keeping the player's choice of /// version unless they were on the newest one. fn install_update(&mut self) { @@ -1327,7 +1349,10 @@ impl Launcher { _ => String::new(), }; self.self_update = match result { - Ok(()) => SelfUpdate::Ready(version), + Ok(staged) => { + horizon_launcher::update_handoff::set_pending(staged); + SelfUpdate::Ready(version) + } Err(e) => SelfUpdate::Failed(e), }; } @@ -2874,18 +2899,41 @@ impl Launcher { } SelfUpdate::Ready(version) => { foot = foot.child( - update(trf( - "Launcher updated to {version}", - &[("version", version)], - )) - .child(div().relative().flex().child( - button("restart", "Restart", Kind::Primary, &t).on_click(cx.listener( - |this, _: &ClickEvent, _, cx| { - this.self_update = SelfUpdate::Failed(backend::restart()); - cx.notify(); - }, + update(tr("A new version is available").to_string()) + .child( + shell::text(theme::night::UI, shell::c(n.ink_soft)) + .relative() + .child(trf("Launcher {version}", &[("version", version)])), + ) + .child(div().relative().flex().child( + button("update-launcher", "Update", Kind::Primary, &t).on_click( + cx.listener(|this, _: &ClickEvent, _, cx| { + this.apply_launcher_update(cx); + cx.notify(); + }), + ), )), - )), + ) + } + SelfUpdate::Stuck(error) => { + let why = match error { + Some(e) => trf("the update failed: {error}", &[("error", e)]), + None => tr("This copy of the launcher can't replace itself. Download it again once; it updates itself after that.").to_string(), + }; + let url = backend::download_page(&self.links.website); + foot = foot.child( + update(tr("A new version is available").to_string()) + .child( + shell::text(theme::night::UI, shell::c(n.ink_soft)) + .relative() + .child(why), + ) + .child( + div().relative().flex().child( + button("download-launcher", "Download again", Kind::Primary, &t) + .on_click(move |_, _, cx| cx.open_url(&url)), + ), + ), ) } _ => {} @@ -3647,9 +3695,20 @@ impl Launcher { ); format!("{} · {said}", backend::VERSION) } - SelfUpdate::Ready(v) => trf( - "Updated to {version}. Restart the launcher to use it.", - &[("version", v)], + SelfUpdate::Ready(v) => format!( + "{} · {}", + backend::VERSION, + trf("{version} available", &[("version", v)]) + ), + SelfUpdate::Stuck(Some(e)) => format!( + "{} · {}", + backend::VERSION, + trf("the update failed: {error}", &[("error", e)]) + ), + SelfUpdate::Stuck(None) => format!( + "{} · {}", + backend::VERSION, + tr("This copy of the launcher can't replace itself. Download it again once; it updates itself after that.") ), SelfUpdate::Failed(e) => format!( "{} · {}", @@ -3676,13 +3735,21 @@ impl Launcher { }; let launcher_action = match &self.self_update { SelfUpdate::Ready(_) => Some( - button("restart-settings", "Restart", Kind::Secondary, &t) + button("update-settings", "Update", Kind::Secondary, &t) .on_click(cx.listener(|this, _: &ClickEvent, _, cx| { - this.self_update = SelfUpdate::Failed(backend::restart()); + this.apply_launcher_update(cx); cx.notify(); })) .into_any_element(), ), + SelfUpdate::Stuck(_) => { + let url = backend::download_page(&self.links.website); + Some( + button("download-settings", "Download again", Kind::Secondary, &t) + .on_click(move |_, _, cx| cx.open_url(&url)) + .into_any_element(), + ) + } SelfUpdate::Downloading(..) => None, _ => Some( // The glass look's About tile has the mockup's filled button. @@ -5391,6 +5458,8 @@ actions!(horizon_launcher, [Quit, CloseWindow]); fn shut_down(cx: &mut App) { servers_page::stop_on_quit(); telemetry::send_before_exit(); + // A staged launcher update goes in once this process has exited. + horizon_launcher::update_handoff::on_quit(); cx.quit() } @@ -5437,6 +5506,10 @@ fn main() { } perf::process_started(); backend::exe_path(); + // The launcher's own installer (`update_handoff`): no window, no CLI parser. + if let Some(code) = horizon_launcher::update_handoff::run() { + std::process::exit(code); + } #[cfg(windows)] backend::remove_replaced_binaries(); backend::cleanup_launcher_updates(); diff --git a/launcher/src/update_handoff.rs b/launcher/src/update_handoff.rs new file mode 100644 index 0000000000..820351258a --- /dev/null +++ b/launcher/src/update_handoff.rs @@ -0,0 +1,255 @@ +//! The launcher's own update from its window (#9287). The window downloads and checks the new +//! launcher in the background ([`backend::stage_update`]) and says "A new version is available". +//! Update starts this launcher's file again as the installer and quits: +//! `horizon-launcher apply-update [--restart [-- ]]`. +//! The installer waits until the window's process has exited (its stdin is a pipe only that +//! process holds, which closes with it), puts the new launcher in place ([`backend::place_staged`], +//! the same code `horizon-launcher update` uses) and starts it. When that fails it starts the old +//! one again, which says why ([`take_failure`]). A window closed with an update staged hands it +//! over the same way without the restart ([`on_quit`]), so a launcher nobody updates by hand still +//! updates itself. +//! +//! `main` handles the command before the CLI parser, so MCP and the completions never list it. +//! Every launcher keeps it: the installer is whatever launcher file is in place when Update is +//! pressed. +use crate::backend::{self, Staged}; +use std::ffi::OsString; +use std::fs; +use std::path::PathBuf; +use std::process::Stdio; +use std::sync::Mutex; +use std::time::Duration; + +pub const COMMAND: &str = "apply-update"; +const RESTART: &str = "--restart"; + +/// How long the installer waits for the window to exit before it goes on: the replacement works +/// under a running launcher too (the old file is moved aside, not overwritten). +const WAIT: Duration = Duration::from_secs(60); + +/// The update a closing window hands over ([`on_quit`]). +static PENDING: Mutex> = Mutex::new(None); + +pub fn set_pending(staged: Option) { + *PENDING.lock().unwrap_or_else(|e| e.into_inner()) = staged; +} + +/// The window is closing: a staged update goes in once it has exited, and the next start is the +/// new launcher. +pub fn on_quit() { + let staged = PENDING.lock().unwrap_or_else(|e| e.into_inner()).take(); + if let Some(staged) = staged { + let _ = hand_over(&staged, false); + } +} + +/// Update was pressed: starts the installer for the staged update with a restart (true; the +/// caller quits right after), or reports that none is staged (false: the file in place already is +/// the new launcher, another window or `horizon-launcher update` put it there). +pub fn start_now() -> Result { + let staged = PENDING.lock().unwrap_or_else(|e| e.into_inner()).take(); + match staged { + Some(staged) => hand_over(&staged, true).map(|()| true), + None => Ok(false), + } +} + +/// Starts the installer for `staged`; the caller quits right after. With `restart` the installer +/// starts the new launcher with this one's arguments. +pub fn hand_over(staged: &Staged, restart: bool) -> Result<(), String> { + let installer = backend::update_target(); + let mut cmd = crate::process::command(&installer); + cmd.args(installer_args(staged, restart, std::env::args_os().skip(1))) + .stdin(Stdio::piped()) + .stdout(Stdio::null()) + .stderr(Stdio::null()); + // Not in the terminal's process group: closing the window's terminal doesn't stop it. + #[cfg(unix)] + { + use std::os::unix::process::CommandExt; + cmd.process_group(0); + } + let mut child = cmd + .spawn() + .map_err(|e| format!("Could not start {}: {e}", installer.display()))?; + // The pipe's other end stays open until this process exits: the installer's sign to go on. + std::mem::forget(child.stdin.take()); + Ok(()) +} + +fn installer_args( + staged: &Staged, + restart: bool, + window_args: impl IntoIterator, +) -> Vec { + let mut args: Vec = vec![ + COMMAND.into(), + staged.tag.clone().into(), + staged.payload.clone().into(), + ]; + if restart { + args.push(RESTART.into()); + args.push("--".into()); + args.extend(window_args); + } + args +} + +/// What the installer was asked: the update, and the arguments to start the new launcher with. +#[derive(Debug, PartialEq)] +struct Request { + staged: Staged, + restart: Option>, +} + +/// `args` after the program's name; None unless they are an installer's whole command line. +fn parse(args: impl IntoIterator) -> Option { + let mut args = args.into_iter(); + if args.next()? != COMMAND { + return None; + } + let tag = args.next()?.into_string().ok()?; + let payload = PathBuf::from(args.next()?); + let restart = match args.next() { + None => None, + Some(flag) if flag == RESTART => match args.next() { + None => Some(Vec::new()), + Some(dashes) if dashes == "--" => Some(args.collect()), + Some(_) => return None, + }, + Some(_) => return None, + }; + Some(Request { + staged: Staged { tag, payload }, + restart, + }) +} + +/// The installer, when this process was started as one (Some(exit code)); None otherwise. +pub fn run() -> Option { + let args: Vec = std::env::args_os().skip(1).collect(); + if args.first()? != COMMAND { + return None; + } + let Some(request) = parse(args) else { + eprintln!( + "usage: horizon-launcher {COMMAND} [{RESTART} [-- ]]" + ); + return Some(2); + }; + wait_for_window(WAIT); + let result = install(&request.staged); + if let Err(e) = &result { + record_failure(e); + } + if let Some(args) = request.restart { + let mut cmd = crate::process::command(backend::update_target()); + cmd.args(args).stdin(Stdio::null()); + if let Err(e) = cmd.spawn() { + record_failure(&format!("{e}")); + } + } + Some(i32::from(result.is_err())) +} + +fn wait_for_window(limit: Duration) { + let (tx, rx) = std::sync::mpsc::channel(); + std::thread::spawn(move || { + let _ = std::io::copy(&mut std::io::stdin(), &mut std::io::sink()); + let _ = tx.send(()); + }); + let _ = rx.recv_timeout(limit); +} + +fn install(staged: &Staged) -> Result<(), String> { + // Only what a launcher downloaded and checked goes in, never a file from elsewhere. + let work = backend::update_work_dir(); + if !staged.payload.starts_with(&work) || !staged.payload.exists() { + return Err(format!( + "{} is not a launcher update this launcher downloaded.", + staged.payload.display() + )); + } + backend::place_staged(staged)?; + let _ = fs::remove_dir_all(&work); + Ok(()) +} + +fn failure_file() -> PathBuf { + backend::data_dir().join(".launcher-update-failed") +} + +fn record_failure(error: &str) { + let _ = fs::create_dir_all(backend::data_dir()); + let _ = fs::write(failure_file(), error); +} + +/// Why the last update from the window didn't go in, once: the file is removed as it is read. +pub fn take_failure() -> Option { + let error = fs::read_to_string(failure_file()).ok()?; + let _ = fs::remove_file(failure_file()); + Some(error.trim().to_owned()).filter(|e| !e.is_empty()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn staged() -> Staged { + Staged { + tag: "launcher@0.2.41".into(), + payload: PathBuf::from("/data/.launcher-update/unpacked/Horizon.app"), + } + } + + fn os(args: &[&str]) -> Vec { + args.iter().map(OsString::from).collect() + } + + /// What the window starts is what the installer reads back, the window's own arguments + /// included (even one that looks like the installer's flags). + #[test] + fn the_installer_reads_the_command_line_the_window_gives_it() { + let window = os(&["--restart", "play"]); + let args = installer_args(&staged(), true, window.clone()); + assert_eq!( + parse(args), + Some(Request { + staged: staged(), + restart: Some(window), + }) + ); + // Closing the window: no restart. + let args = installer_args(&staged(), false, os(&["play"])); + assert_eq!( + parse(args), + Some(Request { + staged: staged(), + restart: None, + }) + ); + } + + #[test] + fn other_command_lines_are_not_the_installer() { + assert_eq!(parse(os(&["update"])), None); + assert_eq!(parse(os(&[COMMAND, "launcher@0.2.41"])), None); + assert_eq!(parse(os(&[COMMAND, "t", "/p", "--force"])), None); + assert_eq!(parse(os(&[COMMAND, "t", "/p", RESTART, "x"])), None); + } + + /// The installer puts in only what a launcher staged in its own update folder: a command line + /// naming any other file changes nothing. + #[test] + fn the_installer_takes_only_a_staged_update() { + let elsewhere = std::env::temp_dir().join("horizon-launcher-not-staged"); + fs::write(&elsewhere, b"not a launcher").unwrap(); + let result = install(&Staged { + tag: "launcher@9.9.9".into(), + payload: elsewhere.clone(), + }); + assert!(result.is_err_and(|e| e.contains("not a launcher update"))); + assert!(elsewhere.exists()); + let _ = fs::remove_file(elsewhere); + } +}