Compare commits

..
Author SHA1 Message Date
Ludovic Marie 1fe21fb861 Merge pull request #11885 from horizon-rust/feature/ms-account-picker
🤖 Agent: opens the code page in the default browser's private window (flag per browser, pure-function tests); no Azure change, Safari/unknown get Copy link + hint
2026-11-07 17:45:36 +01:00
Horizon agentandClaude Opus 5.5 68b03b5184 docs: how the launcher adds another Microsoft account (#3786)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 17:43:47 +01:00
Horizon agentandClaude Opus 5.5 00d1e1a46e Launcher: clippy, and the Linux program table only where Linux reads it
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 17:35:45 +01:00
Horizon agentandClaude Opus 5.5 1ee069b6ba Launcher: private-window strings in every language, rustfmt
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 17:18:12 +01:00
Horizon agentandClaude Opus 5.5 c30dfd55e5 Launcher: add another Microsoft account from a private browser window (#3786)
The device code page goes ahead with the account the browser is signed in to.
Open it in the default browser's private window (Windows ProgId, macOS
LaunchServices, Linux xdg-settings), or give the link to copy, or sign the
browser out of Microsoft first. No Azure app change.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 17:15:21 +01:00
93 changed files with 919 additions and 88 deletions

No files matched your search

+7
View File
@@ -47,6 +47,13 @@ All requests use HTTPS and JSON except the two OAuth calls (form-encoded):
1. **Device code**: `POST https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode`
(`client_id`, `scope=XboxLive.signin offline_access`). The launcher shows the `user_code` and
`verification_uri` (https://www.microsoft.com/link) with a copy button and opens the browser.
The device code page takes whatever Microsoft account the browser is signed in to, and the flow has
no option for an account picker (no `prompt`, no `login_hint`). To add a different account without any
change to the Azure app (#3786), the sign-in panel offers **Open in private window**: the default
browser's private window (`launcher/src/private_window.rs`: the `https` ProgId on Windows, LaunchServices
on macOS, `xdg-settings` on Linux; `--incognito`, `--inprivate`, `--private`, `--private-window`) has no
Microsoft session. Safari and unknown browsers get **Copy link** and a hint instead. **Use a different
Microsoft account** opens `login.live.com/logout.srf` and then the code page.
2. **Poll** `POST …/consumers/oauth2/v2.0/token` (`grant_type=urn:ietf:params:oauth:grant-type:device_code`)
every `interval` seconds; `authorization_pending` waits, `slow_down` adds 5 s, `authorization_declined`,
`expired_token` and `bad_verification_code` end the sign-in with a message. Result: the Microsoft
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Maak oop in privaat venster",
"Open this link in a private window to pick another account.": "Maak hierdie skakel in 'n privaat venster oop om 'n ander rekening te kies.",
"Use a different Microsoft account": "Gebruik 'n ander Microsoft-rekening"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "فتح في نافذة خاصة",
"Open this link in a private window to pick another account.": "افتح هذا الرابط في نافذة خاصة لاختيار حساب آخر.",
"Use a different Microsoft account": "استخدام حساب Microsoft مختلف"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Gizli pəncərədə açın",
"Open this link in a private window to pick another account.": "Başqa hesab seçmək üçün bu linki gizli pəncərədə açın.",
"Use a different Microsoft account": "Başqa Microsoft hesabından istifadə edin"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Шәхси тәҙрәлә асыу",
"Open this link in a private window to pick another account.": "Башҡа иҫәп яҙмаһын һайлау өсөн был һылтанманы шәхси тәҙрәлә асығыҙ.",
"Use a different Microsoft account": "Башҡа Microsoft иҫәп яҙмаһын ҡулланыу"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Адкрыць у прыватным акне",
"Open this link in a private window to pick another account.": "Адкрыйце гэту спасылку ў прыватным акне, каб выбраць іншы ўліковы запіс.",
"Use a different Microsoft account": "Выкарыстаць іншы ўліковы запіс Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Отваряне в поверителен прозорец",
"Open this link in a private window to pick another account.": "Отворете тази връзка в поверителен прозорец, за да изберете друг акаунт.",
"Use a different Microsoft account": "Използвайте друг акаунт в Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Digeriñ en ur prenestr prevez",
"Open this link in a private window to pick another account.": "Digorit al liamm-mañ en ur prenestr prevez evit dibab ur gont all.",
"Use a different Microsoft account": "Implijout ur gont Microsoft all"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Otvori u privatnom prozoru",
"Open this link in a private window to pick another account.": "Otvori ovaj link u privatnom prozoru da odabereš drugi nalog.",
"Use a different Microsoft account": "Koristi drugi Microsoft nalog"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Obre en una finestra privada",
"Open this link in a private window to pick another account.": "Obriu aquest enllaç en una finestra privada per triar un altre compte.",
"Use a different Microsoft account": "Utilitza un altre compte de Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Otevřít v anonymním okně",
"Open this link in a private window to pick another account.": "Otevřete tento odkaz v anonymním okně a vyberte jiný účet.",
"Use a different Microsoft account": "Použít jiný účet Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Вӑрттӑн чӳречере уҫӑр",
"Open this link in a private window to pick another account.": "Урӑх аккаунт суйлама ку ссылкӑна вӑрттӑн чӳречере уҫӑр.",
"Use a different Microsoft account": "Урӑх Microsoft аккаунтне усӑ курӑр"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Agor mewn ffenestr breifat",
"Open this link in a private window to pick another account.": "Agorwch y ddolen hon mewn ffenestr breifat i ddewis cyfrif arall.",
"Use a different Microsoft account": "Defnyddio cyfrif Microsoft gwahanol"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Åbn i privat vindue",
"Open this link in a private window to pick another account.": "Åbn dette link i et privat vindue for at vælge en anden konto.",
"Use a different Microsoft account": "Brug en anden Microsoft-konto"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "In privatem Fenster öffnen",
"Open this link in a private window to pick another account.": "Öffne diesen Link in einem privaten Fenster, um ein anderes Konto auszuwählen.",
"Use a different Microsoft account": "Anderes Microsoft-Konto verwenden"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Άνοιγμα σε ιδιωτικό παράθυρο",
"Open this link in a private window to pick another account.": "Ανοίξτε αυτόν τον σύνδεσμο σε ιδιωτικό παράθυρο για να επιλέξετε άλλον λογαριασμό.",
"Use a different Microsoft account": "Χρήση διαφορετικού λογαριασμού Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Malfermi en privata fenestro",
"Open this link in a private window to pick another account.": "Malfermu ĉi tiun ligilon en privata fenestro por elekti alian konton.",
"Use a different Microsoft account": "Uzi alian Microsoft-konton"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Abrir en ventana privada",
"Open this link in a private window to pick another account.": "Abre este enlace en una ventana privada para elegir otra cuenta.",
"Use a different Microsoft account": "Usar otra cuenta de Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Ava privaatses aknas",
"Open this link in a private window to pick another account.": "Ava see link privaatses aknas, et valida teine konto.",
"Use a different Microsoft account": "Kasuta teist Microsofti kontot"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Ireki leiho pribatuan",
"Open this link in a private window to pick another account.": "Ireki esteka hau leiho pribatu batean beste kontu bat aukeratzeko.",
"Use a different Microsoft account": "Erabili beste Microsoft kontu bat"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "باز کردن در پنجره ناشناس",
"Open this link in a private window to pick another account.": "برای انتخاب حساب دیگر، این پیوند را در یک پنجره ناشناس باز کنید.",
"Use a different Microsoft account": "استفاده از حساب مایکروسافت دیگر"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Avaa yksityisessä ikkunassa",
"Open this link in a private window to pick another account.": "Avaa tämä linkki yksityisessä ikkunassa valitaksesi toisen tilin.",
"Use a different Microsoft account": "Käytä toista Microsoft-tiliä"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Buksan sa private window",
"Open this link in a private window to pick another account.": "Buksan ang link na ito sa private window para pumili ng ibang account.",
"Use a different Microsoft account": "Gumamit ng ibang Microsoft account"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Opna í privatum glugga",
"Open this link in a private window to pick another account.": "Opna hesa leinkju í privatum glugga fyri at velja eina aðra kontu.",
"Use a different Microsoft account": "Brúka eina aðra Microsoft kontu"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Ouvrir dans une fenêtre de navigation privée",
"Open this link in a private window to pick another account.": "Ouvrez ce lien dans une fenêtre de navigation privée pour choisir un autre compte.",
"Use a different Microsoft account": "Utiliser un autre compte Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Vierç intun barcon privât",
"Open this link in a private window to pick another account.": "Vierç chest leam intun barcon privât par sielzi un altri conto.",
"Use a different Microsoft account": "Dopre un altri conto Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Iepenje yn in priveefinster",
"Open this link in a private window to pick another account.": "Iepenje dizze keppeling yn in priveefinster om in oar akkount te kiezen.",
"Use a different Microsoft account": "Brûk in oar Microsoft akkount"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Oscail i bhfuinneog phríobháideach",
"Open this link in a private window to pick another account.": "Oscail an nasc seo i bhfuinneog phríobháideach chun cuntas eile a roghnú.",
"Use a different Microsoft account": "Úsáid cuntas Microsoft eile"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Fosgail ann an uinneag phrìobhaideach",
"Open this link in a private window to pick another account.": "Fosgail an ceangal seo ann an uinneag phrìobhaideach gus cunntas eile a thaghadh.",
"Use a different Microsoft account": "Cleachd cunntas Microsoft eile"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Abrir nunha xanela privada",
"Open this link in a private window to pick another account.": "Abre esta ligazón nunha xanela privada para escoller outra conta.",
"Use a different Microsoft account": "Usar outra conta de Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "E wehe i loko o ka puka makani pilikino",
"Open this link in a private window to pick another account.": "E wehe i kēia loulou ma kahi puka makani pilikino e koho ai i kekahi moʻokāki ʻē aʻe.",
"Use a different Microsoft account": "E hoʻohana i kahi moʻokāki Microsoft ʻē aʻe"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "פתח בחלון פרטי",
"Open this link in a private window to pick another account.": "פתח את הקישור הזה בחלון פרטי כדי לבחור חשבון אחר.",
"Use a different Microsoft account": "השתמש בחשבון Microsoft אחר"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "निजी विंडो में खोलें",
"Open this link in a private window to pick another account.": "दूसरा खाता चुनने के लिए इस लिंक को निजी विंडो में खोलें।",
"Use a different Microsoft account": "दूसरे Microsoft खाते का उपयोग करें"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Otvori u privatnom prozoru",
"Open this link in a private window to pick another account.": "Otvorite ovu poveznicu u privatnom prozoru da biste odabrali drugi račun.",
"Use a different Microsoft account": "Koristi drugi Microsoft račun"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Megnyitás privát ablakban",
"Open this link in a private window to pick another account.": "Nyisd meg ezt a linket privát ablakban, hogy másik fiókot válassz.",
"Use a different Microsoft account": "Másik Microsoft-fiók használata"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Բացել մասնավոր պատուհանում",
"Open this link in a private window to pick another account.": "Բացեք այս հղումը մասնավոր պատուհանում՝ մեկ այլ հաշիվ ընտրելու համար:",
"Use a different Microsoft account": "Օգտագործել այլ Microsoft-ի հաշիվ"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Buka di jendela pribadi",
"Open this link in a private window to pick another account.": "Buka tautan ini di jendela pribadi untuk memilih akun lain.",
"Use a different Microsoft account": "Gunakan akun Microsoft lain"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Mepee na windo nzuzo",
"Open this link in a private window to pick another account.": "Mepee njikọ a na windo nzuzo ka ịhọrọ akaụntụ ọzọ.",
"Use a different Microsoft account": "Jiri akaụntụ Microsoft ọzọ"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Opna í huliðsglugga",
"Open this link in a private window to pick another account.": "Opnaðu þennan tengil í huliðsglugga til að velja annan reikning.",
"Use a different Microsoft account": "Nota annan Microsoft reikning"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Apri in una finestra anonima",
"Open this link in a private window to pick another account.": "Apri questo collegamento in una finestra anonima per scegliere un altro account.",
"Use a different Microsoft account": "Usa un altro account Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "プライベートウィンドウで開く",
"Open this link in a private window to pick another account.": "別のアカウントを選ぶには、このリンクをプライベートウィンドウで開いてください。",
"Use a different Microsoft account": "別の Microsoft アカウントを使用"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "გახსნა პირად ფანჯარაში",
"Open this link in a private window to pick another account.": "სხვა ანგარიშის ასარჩევად გახსენით ეს ბმული პირად ფანჯარაში.",
"Use a different Microsoft account": "გამოიყენეთ სხვა Microsoft-ის ანგარიში"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Жеке терезеде ашу",
"Open this link in a private window to pick another account.": "Басқа тіркелгіні таңдау үшін бұл сілтемені жеке терезеде ашыңыз.",
"Use a different Microsoft account": "Басқа Microsoft тіркелгісін пайдалану"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "ಖಾಸಗಿ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ",
"Open this link in a private window to pick another account.": "ಬೇರೆ ಖಾತೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಈ ಲಿಂಕ್ ಅನ್ನು ಖಾಸಗಿ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ.",
"Use a different Microsoft account": "ಬೇರೆ Microsoft ಖಾತೆಯನ್ನು ಬಳಸಿ"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "시크릿 창에서 열기",
"Open this link in a private window to pick another account.": "다른 계정을 선택하려면 이 링크를 시크릿 창에서 여세요.",
"Use a different Microsoft account": "다른 Microsoft 계정 사용"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Купуя терезеде ачуу",
"Open this link in a private window to pick another account.": "Башка эсепти тандоо үчүн бул шилтемени купуя терезеде ачыңыз.",
"Use a different Microsoft account": "Башка Microsoft эсебин колдонуу"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Aperi in fenestra privata",
"Open this link in a private window to pick another account.": "Aperi hoc link in fenestra privata ut aliam rationem eligas.",
"Use a different Microsoft account": "Aliam Microsoft rationem adhibe"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "An engem privaten Fënster opmaachen",
"Open this link in a private window to pick another account.": "Maach dëse Link an engem privaten Fënster op, fir en anere Kont ze wielen.",
"Use a different Microsoft account": "Aneren Microsoft Kont notzen"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Open in e privévinster",
"Open this link in a private window to pick another account.": "Open dees link in e privévinster om un angere account te kieze.",
"Use a different Microsoft account": "Gebruuk un angere Microsoft account"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Vèrt in d'una finestra privada",
"Open this link in a private window to pick another account.": "Vèrt chèsto link in d'una finestra privada per sceglier un alter cunt.",
"Use a different Microsoft account": "Dopera un alter cunt Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "ເປີດໃນໜ້າຕ່າງສ່ວນຕົວ",
"Open this link in a private window to pick another account.": "ເປີດລິ້ງນີ້ໃນໜ້າຕ່າງສ່ວນຕົວເພື່ອເລືອກບັນຊີອື່ນ.",
"Use a different Microsoft account": "ໃຊ້ບັນຊີ Microsoft ອື່ນ"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Atidaryti privačiame lange",
"Open this link in a private window to pick another account.": "Atidarykite šią nuorodą privačiame lange, kad pasirinktumėte kitą paskyrą.",
"Use a different Microsoft account": "Naudoti kitą „Microsoft“ paskyrą"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Atvērt privātajā logā",
"Open this link in a private window to pick another account.": "Atveriet šo saiti privātajā logā, lai izvēlētos citu kontu.",
"Use a different Microsoft account": "Izmantot citu Microsoft kontu"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Отвори во приватен прозорец",
"Open this link in a private window to pick another account.": "Отворете ја оваа врска во приватен прозорец за да изберете друга сметка.",
"Use a different Microsoft account": "Користи друга сметка на Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Хувийн цонхонд нээх",
"Open this link in a private window to pick another account.": "Өөр данс сонгохын тулд энэ холбоосыг хувийн цонхонд нээнэ үү.",
"Use a different Microsoft account": "Өөр Microsoft данс ашиглах"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Buka dalam tetingkap peribadi",
"Open this link in a private window to pick another account.": "Buka pautan ini dalam tetingkap peribadi untuk memilih akaun lain.",
"Use a different Microsoft account": "Gunakan akaun Microsoft lain"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Iftaħ f'tieqa privata",
"Open this link in a private window to pick another account.": "Iftaħ dan il-link f'tieqa privata biex tagħżel kont ieħor.",
"Use a different Microsoft account": "Uża kont Microsoft differenti"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Openen in privévenster",
"Open this link in a private window to pick another account.": "Open deze link in een privévenster om een ander account te kiezen.",
"Use a different Microsoft account": "Een ander Microsoft-account gebruiken"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Åpne i et privat vindu",
"Open this link in a private window to pick another account.": "Åpne denne lenken i et privat vindu for å velge en annen konto.",
"Use a different Microsoft account": "Bruk en annen Microsoft-konto"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Dobrir dins una fenèstra privada",
"Open this link in a private window to pick another account.": "Dobrissètz aqueste ligam dins una fenèstra privada per causir un autre compte.",
"Use a different Microsoft account": "Utilizar un autre compte Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Otwórz w oknie prywatnym",
"Open this link in a private window to pick another account.": "Otwórz ten link w oknie prywatnym, aby wybrać inne konto.",
"Use a different Microsoft account": "Użyj innego konta Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Abrir em janela anônima",
"Open this link in a private window to pick another account.": "Abra este link em uma janela anônima para escolher outra conta.",
"Use a different Microsoft account": "Usar outra conta Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Abrir numa janela anónima",
"Open this link in a private window to pick another account.": "Abra esta ligação numa janela anónima para escolher outra conta.",
"Use a different Microsoft account": "Usar outra conta Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Deschide într-o fereastră privată",
"Open this link in a private window to pick another account.": "Deschideți acest link într-o fereastră privată pentru a alege alt cont.",
"Use a different Microsoft account": "Folosiți alt cont Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Открыть в приватном окне",
"Open this link in a private window to pick another account.": "Откройте эту ссылку в приватном окне, чтобы выбрать другой аккаунт.",
"Use a different Microsoft account": "Использовать другой аккаунт Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Кистэлэҥ түннүкка арыйыы",
"Open this link in a private window to pick another account.": "Атын учуоту талар туһуттан бу ссылканы кистэлэҥ түннүккэ арыйыҥ.",
"Use a different Microsoft account": "Атын Microsoft учуоту туттуу"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Raba priváhta láseš",
"Open this link in a private window to pick another account.": "Raba dán liŋkka priváhta láseš válljen dihte eará konto.",
"Use a different Microsoft account": "Geavat eará Microsoft konto"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Otvoriť v súkromnom okne",
"Open this link in a private window to pick another account.": "Otvorte tento odkaz v súkromnom okne a vyberte iné konto.",
"Use a different Microsoft account": "Použiť iné konto Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Odpri v zasebnem oknu",
"Open this link in a private window to pick another account.": "Odprite to povezavo v zasebnem oknu, da izberete drug račun.",
"Use a different Microsoft account": "Uporabi drug Microsoftov račun"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Ku fur daaqad gaar ah",
"Open this link in a private window to pick another account.": "Ku fur isku xirkan daaqad gaar ah si aad u doorato xisaab kale.",
"Use a different Microsoft account": "Isticmaal xisaab Microsoft oo kale"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Hape në dritare private",
"Open this link in a private window to pick another account.": "Hape këtë lidhje në një dritare private për të zgjedhur një llogari tjetër.",
"Use a different Microsoft account": "Përdor një llogari tjetër të Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Отвори у приватном прозору",
"Open this link in a private window to pick another account.": "Отворите ову везу у приватном прозору да бисте изабрали други налог.",
"Use a different Microsoft account": "Користи други Microsoft налог"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Öppna i privat fönster",
"Open this link in a private window to pick another account.": "Öppna den här länken i ett privat fönster för att välja ett annat konto.",
"Use a different Microsoft account": "Använd ett annat Microsoft-konto"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Ôtworz w prywatnym ôknie",
"Open this link in a private window to pick another account.": "Ôtworz ten link w prywatnym ôknie, żeby wybrać inksze kōnto.",
"Use a different Microsoft account": "Użyj inkszego kōnta Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "தனிப்பட்ட சாளரத்தில் திற",
"Open this link in a private window to pick another account.": "வேறொரு கணக்கைத் தேர்ந்தெடுக்க, இந்த இணைப்பைத் தனிப்பட்ட சாளரத்தில் திறக்கவும்.",
"Use a different Microsoft account": "வேறு Microsoft கணக்கைப் பயன்படுத்தவும்"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "เปิดในหน้าต่างส่วนตัว",
"Open this link in a private window to pick another account.": "เปิดลิงก์นี้ในหน้าต่างส่วนตัวเพื่อเลือกบัญชีอื่น",
"Use a different Microsoft account": "ใช้บัญชี Microsoft อื่น"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Gizli pencerede aç",
"Open this link in a private window to pick another account.": "Başka bir hesap seçmek için bu bağlantıyı gizli pencerede açın.",
"Use a different Microsoft account": "Farklı bir Microsoft hesabı kullan"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Шәхси тәрәзәдә ачу",
"Open this link in a private window to pick another account.": "Икенче счет сайлау өчен бу сылтаманы шәхси тәрәзәдә ачыгыз.",
"Use a different Microsoft account": "Башка Microsoft счетын куллану"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Відкрити в анонімному вікні",
"Open this link in a private window to pick another account.": "Відкрийте це посилання в анонімному вікні, щоб вибрати інший обліковий запис.",
"Use a different Microsoft account": "Використати інший обліковий запис Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "نجی ونڈو میں کھولیں۔",
"Open this link in a private window to pick another account.": "دوسرا اکاؤنٹ منتخب کرنے کے لیے اس لنک کو نجی ونڈو میں کھولیں۔",
"Use a different Microsoft account": "دوسرا Microsoft اکاؤنٹ استعمال کریں۔"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Maxfiy oynada ochish",
"Open this link in a private window to pick another account.": "Boshqa hisobni tanlash uchun bu havolani maxfiy oynada oching.",
"Use a different Microsoft account": "Boshqa Microsoft hisob qaydnomasidan foydalanish"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Vèrxi in na finestra privada",
"Open this link in a private window to pick another account.": "Vèrxi sto link in na finestra privada par scoeger on altro conto.",
"Use a different Microsoft account": "Dòpara on altro conto Microsoft"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Mở trong cửa sổ ẩn danh",
"Open this link in a private window to pick another account.": "Mở liên kết này trong cửa sổ ẩn danh để chọn tài khoản khác.",
"Use a different Microsoft account": "Dùng tài khoản Microsoft khác"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "עפענען אין אַ פּריוואַטן פֿענצטער",
"Open this link in a private window to pick another account.": "עפֿן דעם לינק אין אַ פּריוואַטן פֿענצטער צו קלייַבן אַן אַנדער חשבון.",
"Use a different Microsoft account": "נוצן אַן אַנדער Microsoft חשבון"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Ṣii ninu ferese aladani",
"Open this link in a private window to pick another account.": "Ṣii ọna asopọ yii ninu ferese aladani lati yan akọọlẹ miiran.",
"Use a different Microsoft account": "Lo akọọlẹ Microsoft miiran"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "在无痕窗口中打开",
"Open this link in a private window to pick another account.": "在无痕窗口中打开此链接,即可选择其他账户。",
"Use a different Microsoft account": "使用其他 Microsoft 账户"
}
+4 -1
View File
@@ -1253,5 +1253,8 @@
"{host} has no horizon-server. Install it there first, as the hosting guide says.": "{host} has no horizon-server. Install it there first, as the hosting guide says.",
"Couldn't connect to {host}: {reason}": "Couldn't connect to {host}: {reason}",
"Couldn't connect to {host}.": "Couldn't connect to {host}.",
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}."
"horizon-server on {host} failed in {dir}.": "horizon-server on {host} failed in {dir}.",
"Open in private window": "Vula efasiteleni eliyimfihlo",
"Open this link in a private window to pick another account.": "Vula lesi sixhumanisi efasiteleni eliyimfihlo ukuze ukhethe elinye i-akhawunti.",
"Use a different Microsoft account": "Sebenzisa enye i-akhawunti ye-Microsoft"
}
+1 -1
View File
@@ -141,7 +141,7 @@ pub struct Found {
/// installed, on any system (for tests and screenshots).
pub const TOOLS_ENV: &str = "HORIZON_LAUNCHER_LINUX_TOOLS";
fn on_path(program: &str) -> bool {
pub(crate) fn on_path(program: &str) -> bool {
std::env::var_os("PATH").is_some_and(|path| {
std::env::split_paths(&path).any(|dir| {
let file = dir.join(program);
+1
View File
@@ -38,6 +38,7 @@ pub mod nightly;
pub mod other_launchers;
pub mod packs;
pub mod pictures;
pub mod private_window;
pub mod process;
pub mod proxy;
pub mod relocation;
+38 -1
View File
@@ -2008,6 +2008,10 @@ impl Launcher {
fn begin_sign_in(&mut self, target: Option<account::Account>) {
self.cancel_sign_in();
// The code page offers a private window: find the default browser meanwhile.
std::thread::spawn(|| {
horizon_launcher::private_window::detected();
});
self.sign_in = Some(match &target {
Some(account) => SignIn::start_for(account.clone()),
None => SignIn::start(),
@@ -4561,7 +4565,22 @@ impl Launcher {
.font_family(theme::MONO)
.text_color(t.ink)
.child(code.user_code.clone()),
),
)
.when(!microsoft::has_private_window(), |col| {
col.child(tr("Open this link in a private window to pick another account."))
})
.child({
let uri = code.verification_uri.clone();
div().flex().child(
button(
"sign-in-other",
"Use a different Microsoft account",
Kind::Ghost,
&t,
)
.on_click(move |_, _, cx| microsoft::use_different_account(&uri, cx)),
)
}),
Some(SignInState::Done(Ok(a))) => {
div().child(trf("Signed in as {name}.", &[("name", &a.name)]))
}
@@ -4597,6 +4616,23 @@ impl Launcher {
None
} else if let Some(SignInState::Code(code)) = &self.sign_in_state {
let (uri, user_code) = (code.verification_uri.clone(), code.user_code.clone());
let (private_uri, link_uri) = (uri.clone(), uri.clone());
// A private window picks the account; without one the link is for the player to carry over.
let private = if microsoft::has_private_window() {
button(
"sign-in-private",
"Open in private window",
Kind::Secondary,
&t,
)
.on_click(move |_, _, cx| microsoft::open_private(&private_uri, cx))
} else {
button("sign-in-copy-link", "Copy link", Kind::Secondary, &t).on_click(
move |_, _, cx| {
copy_to_clipboard(cx, gpui::ClipboardItem::new_string(link_uri.clone()))
},
)
};
Some(
div()
.flex()
@@ -4611,6 +4647,7 @@ impl Launcher {
},
),
)
.child(private)
.child(
button("sign-in-open", "Open link", Kind::Secondary, &t)
.on_click(move |_, _, cx| cx.open_url(&uri)),
+29
View File
@@ -79,3 +79,32 @@ pub(super) fn sign_in_button(id: &'static str, t: &Theme) -> Stateful<Div> {
.child(tr("Sign in with Microsoft").to_string()),
)
}
/// How long the logout page gets before the code page opens after it.
const LOGOUT_WAIT: Duration = Duration::from_millis(2500);
/// Whether the player's default browser has a private window to open the code page in. The
/// first call asks the system (`begin_sign_in` warms it).
pub(super) fn has_private_window() -> bool {
horizon_launcher::private_window::detected().is_some()
}
/// Opens the code page in the default browser's private window, where no Microsoft account is
/// signed in; in the normal window if the browser can't be started.
pub(super) fn open_private(uri: &str, cx: &mut App) {
if horizon_launcher::private_window::open(uri).is_err() {
cx.open_url(uri);
}
}
/// "Use a different Microsoft account": Microsoft's logout page first, then the code page, in
/// the player's normal browser.
pub(super) fn use_different_account(uri: &str, cx: &mut App) {
cx.open_url(horizon_launcher::private_window::LOGOUT_URL);
let uri = uri.to_owned();
cx.spawn(async move |cx| {
cx.background_executor().timer(LOGOUT_WAIT).await;
cx.update(|cx| cx.open_url(&uri));
})
.detach();
}
+98
View File
@@ -101,6 +101,8 @@ impl Launcher {
body = match state {
Shown::Code(uri, user_code) => {
let copy = user_code.to_string();
let (private_uri, link_uri, other_uri) =
(uri.to_string(), uri.to_string(), uri.to_string());
body.child(
raised()
.flex()
@@ -144,6 +146,49 @@ impl Launcher {
}),
),
)
.child(
div()
.mt(px(8.))
.flex()
.flex_col()
.items_start()
.gap(px(4.))
.when(!microsoft::has_private_window(), |col| {
col.child(shell::text(theme::night::CAPTION, shell::c(n.muted)).child(
tr("Open this link in a private window to pick another account."),
))
})
.child(
div()
.flex()
.gap(px(8.))
.child(if microsoft::has_private_window() {
shell::action("owner-private", shell::Action::Quiet, &t)
.child(shell::label(tr("Open in private window")))
.on_click(move |_, _, cx| {
microsoft::open_private(&private_uri, cx)
})
} else {
shell::action("owner-copy-link", shell::Action::Quiet, &t)
.child(shell::label(tr("Copy link")))
.on_click(move |_, _, cx| {
copy_to_clipboard(
cx,
gpui::ClipboardItem::new_string(link_uri.clone()),
)
})
})
.child(
shell::action("owner-other", shell::Action::Quiet, &t)
.child(shell::label(tr(
"Use a different Microsoft account",
)))
.on_click(move |_, _, cx| {
microsoft::use_different_account(&other_uri, cx)
}),
),
),
)
}
Shown::Starting(what) => body.child(raised().child(
shell::text(theme::night::UI, shell::c(n.ink_soft)).child(tr(what).to_string()),
@@ -288,6 +333,8 @@ impl Launcher {
card = match state {
Shown::Code(uri, user_code) => {
let copy = user_code.to_string();
let (private_uri, link_uri, other_uri) =
(uri.to_string(), uri.to_string(), uri.to_string());
card.child(
panel()
.flex()
@@ -321,6 +368,57 @@ impl Launcher {
},
)),
)
.child(
div()
.mt(px(8.))
.flex()
.flex_col()
.items_start()
.gap(px(4.))
.when(!microsoft::has_private_window(), |col| {
col.child(ui::text(13., FontWeight::NORMAL, ink::QUIET).child(tr(
"Open this link in a private window to pick another account.",
)))
})
.child(
div()
.flex()
.gap(px(8.))
.child(if microsoft::has_private_window() {
ui::quiet(
"owner-private",
tr("Open in private window"),
32.,
&t,
)
.on_click(
move |_, _, cx| microsoft::open_private(&private_uri, cx),
)
} else {
ui::quiet("owner-copy-link", tr("Copy link"), 32., &t).on_click(
move |_, _, cx| {
copy_to_clipboard(
cx,
gpui::ClipboardItem::new_string(link_uri.clone()),
)
},
)
})
.child(
ui::quiet(
"owner-other",
tr("Use a different Microsoft account"),
32.,
&t,
)
.on_click(
move |_, _, cx| {
microsoft::use_different_account(&other_uri, cx)
},
),
),
),
)
}
Shown::Starting(what) => card
.child(panel().child(ui::text(14., FontWeight::NORMAL, ink::BODY).child(tr(what)))),
+401
View File
@@ -0,0 +1,401 @@
//! Add another Microsoft account: the device code page (microsoft.com/link) goes ahead with the
//! account the browser is signed in to, and the device code flow has no way to ask for a picker.
//! A private window has no Microsoft session, so the player signs in with the account they choose.
//! This finds the player's default browser and opens a URL in its private window. No Azure app
//! change is involved (#3786).
//!
//! Windows reads the `https` ProgId, macOS LaunchServices' handler for `https`, Linux
//! `xdg-settings`. Safari has no private-window flag, so it counts as unsupported, like any
//! browser not listed in [`Browser`]: the caller shows the link to copy instead.
use std::io;
use std::path::PathBuf;
use std::process::{Command, Stdio};
use std::sync::OnceLock;
/// Signs the player out of Microsoft in their normal browser, for "Use a different Microsoft account".
pub const LOGOUT_URL: &str = "https://login.live.com/logout.srf";
/// A browser that has a private-window flag.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Browser {
Chrome,
Chromium,
Edge,
Brave,
Vivaldi,
Opera,
Firefox,
}
impl Browser {
/// Which browser a system's name for it is: a Windows ProgId (`MSEdgeHTM`), a macOS bundle
/// id (`com.google.chrome`) or a Linux desktop file (`firefox.desktop`). `None` for Safari and
/// anything unknown.
pub fn from_id(id: &str) -> Option<Browser> {
let id = id.to_ascii_lowercase();
// Order matters: Edge's and Opera's ids are not Chrome's, but Chromium's contains it.
[
("edge", Browser::Edge),
("brave", Browser::Brave),
("vivaldi", Browser::Vivaldi),
("opera", Browser::Opera),
("firefox", Browser::Firefox),
("chromium", Browser::Chromium),
("chrome", Browser::Chrome),
]
.into_iter()
.find(|(name, _)| id.contains(name))
.map(|(_, browser)| browser)
}
/// The flag that opens the page in a private window.
pub fn private_flag(self) -> &'static str {
match self {
Browser::Edge => "--inprivate",
Browser::Firefox => "--private-window",
Browser::Opera => "--private",
Browser::Chrome | Browser::Chromium | Browser::Brave | Browser::Vivaldi => {
"--incognito"
}
}
}
/// The programs a Linux install puts on the PATH, most common first.
#[cfg(all(unix, not(target_os = "macos")))]
fn linux_programs(self) -> &'static [&'static str] {
match self {
Browser::Chrome => &["google-chrome-stable", "google-chrome"],
Browser::Chromium => &["chromium", "chromium-browser"],
Browser::Edge => &["microsoft-edge-stable", "microsoft-edge"],
Browser::Brave => &["brave-browser", "brave", "brave-browser-stable"],
Browser::Vivaldi => &["vivaldi-stable", "vivaldi"],
Browser::Opera => &["opera"],
Browser::Firefox => &["firefox", "firefox-esr"],
}
}
}
/// How to start the browser.
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Target {
/// An executable (a path, or a name on the PATH).
Program(String),
/// A macOS application, by bundle id.
Bundle(String),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Detected {
pub browser: Browser,
pub target: Target,
}
/// A program and its arguments.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Launch {
pub program: String,
pub args: Vec<String>,
}
/// The command that opens `url` in `browser`'s private window.
pub fn launch(detected: &Detected, url: &str) -> Launch {
let flag = detected.browser.private_flag().to_owned();
match &detected.target {
Target::Program(program) => Launch {
program: program.clone(),
args: vec![flag, url.to_owned()],
},
// `open --args` only reaches a browser that starts: Chromium-based ones need a new
// instance (-n) to take the flag while running; Firefox forwards it to the running one.
Target::Bundle(id) => {
let mut args = vec!["-b".to_owned(), id.clone()];
if detected.browser != Browser::Firefox {
args.insert(0, "-n".to_owned());
}
args.extend(["--args".to_owned(), flag, url.to_owned()]);
Launch {
program: "open".to_owned(),
args,
}
}
}
}
/// The program in a Windows `shell\open\command` value:
/// `"C:\Program Files\Mozilla Firefox\firefox.exe" -osint -url "%1"` → the path.
pub fn windows_program(command: &str) -> Option<String> {
let command = command.trim();
let program = match command.strip_prefix('"') {
Some(rest) => rest.split('"').next()?,
None => {
let end = command.to_ascii_lowercase().find(".exe")? + ".exe".len();
&command[..end]
}
};
(!program.is_empty()).then(|| program.to_owned())
}
/// The bundle id LaunchServices (the `com.apple.launchservices.secure` preferences, as JSON) has
/// for the `https` scheme. `None` when the player never chose one: that is Safari.
pub fn macos_https_handler(preferences: &serde_json::Value) -> Option<String> {
let handlers = preferences.get("LSHandlers")?.as_array()?;
["https", "http"].into_iter().find_map(|scheme| {
handlers.iter().find_map(|handler| {
let said = handler.get("LSHandlerURLScheme")?.as_str()?;
if !said.eq_ignore_ascii_case(scheme) {
return None;
}
["LSHandlerRoleAll", "LSHandlerRoleViewer"]
.into_iter()
.find_map(|role| handler.get(role)?.as_str())
.map(str::to_owned)
})
})
}
#[cfg(windows)]
fn detect() -> Option<Detected> {
use winreg::enums::HKEY_CLASSES_ROOT;
use winreg::enums::HKEY_CURRENT_USER;
use winreg::RegKey;
let choice = RegKey::predef(HKEY_CURRENT_USER)
.open_subkey(
r"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice",
)
.ok()?;
let prog_id: String = choice.get_value("ProgId").ok()?;
let browser = Browser::from_id(&prog_id)?;
let command: String = RegKey::predef(HKEY_CLASSES_ROOT)
.open_subkey(format!(r"{prog_id}\shell\open\command"))
.ok()?
.get_value("")
.ok()?;
Some(Detected {
browser,
target: Target::Program(windows_program(&command)?),
})
}
#[cfg(target_os = "macos")]
fn detect() -> Option<Detected> {
let plist = dirs::home_dir()?
.join("Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist");
let json = Command::new("plutil")
.args(["-convert", "json", "-o", "-"])
.arg(plist)
.stderr(Stdio::null())
.output()
.ok()?;
let id = macos_https_handler(&serde_json::from_slice(&json.stdout).ok()?)?;
Some(Detected {
browser: Browser::from_id(&id)?,
target: Target::Bundle(id),
})
}
#[cfg(all(unix, not(target_os = "macos")))]
fn detect() -> Option<Detected> {
let said = Command::new("xdg-settings")
.args(["get", "default-web-browser"])
.stderr(Stdio::null())
.output()
.ok()?;
let browser = Browser::from_id(String::from_utf8_lossy(&said.stdout).trim())?;
let program = browser
.linux_programs()
.iter()
.find(|program| crate::launch::on_path(program))?;
Some(Detected {
browser,
target: Target::Program((*program).to_owned()),
})
}
#[cfg(not(any(windows, unix)))]
fn detect() -> Option<Detected> {
None
}
/// The default browser, if it has a private window; asked once.
pub fn detected() -> Option<&'static Detected> {
static DETECTED: OnceLock<Option<Detected>> = OnceLock::new();
DETECTED.get_or_init(detect).as_ref()
}
/// Opens `url` (https only) in the default browser's private window.
pub fn open(url: &str) -> io::Result<()> {
if !url.starts_with("https://") {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"not an https link",
));
}
let detected =
detected().ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "no browser"))?;
let launch = launch(detected, url);
let mut child = Command::new(PathBuf::from(&launch.program))
.args(&launch.args)
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()?;
// Some browsers stay as this process for as long as they run: reap it without waiting here.
std::thread::spawn(move || {
let _ = child.wait();
});
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn systems_name_the_same_browsers_differently() {
for (id, browser) in [
("ChromeHTML", Browser::Chrome),
("com.google.chrome", Browser::Chrome),
("google-chrome.desktop", Browser::Chrome),
("com.google.Chrome.desktop", Browser::Chrome),
("chromium.desktop", Browser::Chromium),
("chromium-browser.desktop", Browser::Chromium),
("org.chromium.Chromium", Browser::Chromium),
("MSEdgeHTM", Browser::Edge),
("com.microsoft.edgemac", Browser::Edge),
("microsoft-edge.desktop", Browser::Edge),
("BraveHTML", Browser::Brave),
("com.brave.Browser", Browser::Brave),
("brave-browser.desktop", Browser::Brave),
("VivaldiHTM.Q1W2E3", Browser::Vivaldi),
("vivaldi-stable.desktop", Browser::Vivaldi),
("OperaStable", Browser::Opera),
("com.operasoftware.Opera", Browser::Opera),
("FirefoxURL-308046B0AF4A39CB", Browser::Firefox),
("org.mozilla.firefox", Browser::Firefox),
("firefox-esr.desktop", Browser::Firefox),
] {
assert_eq!(Browser::from_id(id), Some(browser), "{id}");
}
for id in [
"",
"AppX4hxtad77fbk3jkkeerkrm0ze94wjf3s9",
"com.apple.safari",
"epiphany.desktop",
] {
assert_eq!(Browser::from_id(id), None, "{id}");
}
}
#[test]
fn each_family_gets_its_own_private_flag() {
assert_eq!(Browser::Edge.private_flag(), "--inprivate");
assert_eq!(Browser::Firefox.private_flag(), "--private-window");
for browser in [
Browser::Chrome,
Browser::Chromium,
Browser::Brave,
Browser::Vivaldi,
] {
assert_eq!(browser.private_flag(), "--incognito");
}
}
fn found(browser: Browser, target: Target) -> Detected {
Detected { browser, target }
}
#[test]
fn a_program_gets_the_flag_then_the_page() {
let url = "https://www.microsoft.com/link";
let edge = found(Browser::Edge, Target::Program("msedge.exe".into()));
assert_eq!(
launch(&edge, url),
Launch {
program: "msedge.exe".into(),
args: vec!["--inprivate".into(), url.into()],
}
);
}
#[test]
fn a_mac_app_starts_through_open_by_bundle_id() {
let url = "https://www.microsoft.com/link";
let chrome = found(Browser::Chrome, Target::Bundle("com.google.chrome".into()));
let words = |l: Launch| l.args.join(" ");
let l = launch(&chrome, url);
assert_eq!(l.program, "open");
// A new instance, so a running Chrome takes the flag.
assert_eq!(
words(l),
"-n -b com.google.chrome --args --incognito https://www.microsoft.com/link"
);
let firefox = found(
Browser::Firefox,
Target::Bundle("org.mozilla.firefox".into()),
);
assert_eq!(
words(launch(&firefox, url)),
"-b org.mozilla.firefox --args --private-window https://www.microsoft.com/link"
);
}
#[test]
fn windows_commands_give_their_program() {
assert_eq!(
windows_program(r#""C:\Program Files\Mozilla Firefox\firefox.exe" -osint -url "%1""#),
Some(r"C:\Program Files\Mozilla Firefox\firefox.exe".into())
);
assert_eq!(
windows_program(
r#" "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --single-argument %1"#
),
Some(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe".into())
);
assert_eq!(
windows_program(r"C:\Chrome\chrome.EXE --single-argument %1"),
Some(r"C:\Chrome\chrome.EXE".into())
);
assert_eq!(windows_program(""), None);
assert_eq!(windows_program(r#""""#), None);
assert_eq!(windows_program("rundll32 something"), None);
}
#[test]
fn launchservices_names_the_https_handler() {
let prefs = json!({ "LSHandlers": [
{ "LSHandlerContentType": "public.html", "LSHandlerRoleAll": "com.apple.safari" },
{ "LSHandlerURLScheme": "mailto", "LSHandlerRoleAll": "com.apple.mail" },
{ "LSHandlerURLScheme": "http", "LSHandlerRoleAll": "com.brave.browser" },
{ "LSHandlerURLScheme": "https", "LSHandlerRoleAll": "com.google.chrome" },
]});
assert_eq!(
macos_https_handler(&prefs).as_deref(),
Some("com.google.chrome")
);
// http alone is enough when https was never set.
let http_only = json!({ "LSHandlers": [
{ "LSHandlerURLScheme": "HTTP", "LSHandlerRoleViewer": "org.mozilla.firefox" },
]});
assert_eq!(
macos_https_handler(&http_only).as_deref(),
Some("org.mozilla.firefox")
);
// Never chosen: the system default.
assert_eq!(macos_https_handler(&json!({ "LSHandlers": [] })), None);
assert_eq!(macos_https_handler(&json!({})), None);
}
#[test]
fn only_https_pages_are_opened() {
for url in [
"http://example.com",
"file:///etc/passwd",
"javascript:alert(1)",
"",
] {
let err = open(url).unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::InvalidInput, "{url}");
}
}
}