Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

Device configuration changes. For Pi details, see [archive/NOMADPI-DETAILS.md](archive/NOMADPI-DETAILS.md). For mini PC setup, see [MINIPC-SETUP.md](MINIPC-SETUP.md).

## 2026-11-06 - Singer page: pipeline translations for the five strings added on 2026-11-05 (v0.149.2)

The strings added mid-show (`identity.switchShort`, `identity.switchConfirm`, `mySongs.phoneCode`,
`saveSongs.signOutEmail`, `make.socialStall`) had been hand-translated, because `translate.py` needed a gcloud
login. They were re-run through the Gemini pipeline (`scripts/gcp-admin python scripts/translate.py ... --target all`,
5 strings x 32 locales, after removing them from the locale files). Review fixes on top:

- `switchShort` stays "🔄 " + each locale's existing `switchSinger`, so the two labels always match. The pipeline had
re-worded it, e.g. ja シンガー where the page uses 歌手.
- `signOutEmail`: de "Per E-Mail abmelden" and nl "Uitloggen met e-mail" meant "sign out *by* email" →
"Von E-Mail abmelden" / "Uitloggen bij e-mail". hi switched to the formal करें used by the existing "Log out".

## 2026-11-06 - Google sign-in tap detected via Google's own click_listener (v0.149.1)

A test against production after v0.149.0 found the window-blur check misses some Google taps. The Google button now
Expand Down
2 changes: 1 addition & 1 deletion kj-controller/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "kj-controller"
version = "0.149.1"
version = "0.149.2"
description = "Web-based karaoke show management with mpv + VLC playback"
requires-python = ">=3.11"

Expand Down
13 changes: 9 additions & 4 deletions kj-controller/static-sing/messages/.en-snapshot.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@
"renameConfirmTitle": "Rename yourself to {name}?",
"renameConfirmBody": "Your songs tonight will be listed under {name} instead of {old}. If {name} is a friend, request a song for them instead.",
"renameConfirmFriend": "🎤 {name} is a friend: request a song for them",
"renameConfirmYes": "Yes, I'm {name}: rename me"
"renameConfirmYes": "Yes, I'm {name}: rename me",
"switchShort": "🔄 Switch singer",
"switchConfirm": "Switch to a different singer on this phone? {name}'s songs stay on tonight's list, but this phone will stop showing them."
},
"search": {
"title": "Pick your song",
Expand Down Expand Up @@ -379,7 +381,8 @@
"needSignIn": "Sign in above to continue",
"findingAudio": "Finding the audio…",
"needAudio": "Pick a recording above",
"socialFailed": "That sign-in didn't work. Try again, or use your email."
"socialFailed": "That sign-in didn't work. Try again, or use your email.",
"socialStall": "Nothing happening? Use your email below instead."
},
"confirm": {
"partnersTitle": "Singing with anyone else? (optional)",
Expand Down Expand Up @@ -501,7 +504,8 @@
"makeDetails": "Video progress",
"stepSent": "Sent",
"stepMaking": "Being made",
"stepReady": "Ready to sing"
"stepReady": "Ready to sing",
"phoneCode": "Phone code: {code} · Songs missing? Show this code to the host and they'll link this phone to you."
},
"notify": {
"heading": "🔔 When you're up",
Expand Down Expand Up @@ -658,6 +662,7 @@
"explainer": "We'll save the songs you sing tonight to your Nomad Karaoke account, so the app can show your history and recommend songs.",
"saving": "Saving tonight's songs to {email}",
"stop": "Stop saving",
"failed": "We couldn't save your songs just now. Please try again."
"failed": "We couldn't save your songs just now. Please try again.",
"signOutEmail": "Sign out of email"
}
}
4 changes: 2 additions & 2 deletions kj-controller/static-sing/messages/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} صديق: اطلب أغنية له",
"renameConfirmYes": "نعم، أنا {name}: غيّر اسمي",
"switchShort": "🔄 تبديل المغني",
"switchConfirm": "هل تريد التبديل إلى مغنٍّ آخر على هذا الهاتف؟ تبقى أغاني {name} في قائمة الليلة، لكن هذا الهاتف لن يعرضها بعد الآن."
"switchConfirm": "هل تريد التبديل إلى مغنٍ آخر على هذا الهاتف؟ ستبقى أغاني {name} في قائمة الليلة، لكن هذا الهاتف سيتوقف عن عرضها."
},
"search": {
"title": "اختر أغنيتك",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "تم الإرسال",
"stepMaking": "قيد التحضير",
"stepReady": "جاهز للغناء",
"phoneCode": "رمز الهاتف: {code} · أغانيك مفقودة؟ أرِ هذا الرمز للمضيف وسيربط هذا الهاتف بك."
"phoneCode": "رمز الهاتف: {code} · لا تجد أغانيك؟ أظهر هذا الرمز للمضيف وسيقوم بربط هذا الهاتف بك."
},
"notify": {
"heading": "🔔 عندما يحين دورك",
Expand Down
8 changes: 4 additions & 4 deletions kj-controller/static-sing/messages/ca.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} és un amic/amiga: demana una cançó per a ell/ella",
"renameConfirmYes": "Sí, soc {name}: canvia'm el nom",
"switchShort": "🔄 Canvia de cantant",
"switchConfirm": "Vols canviar a un altre cantant en aquest telèfon? Les cançons de {name} es queden a la llista d'aquesta nit, però aquest telèfon deixarà de mostrar-les."
"switchConfirm": "Vols canviar a un altre cantant en aquest telèfon? Les cançons de {name} es quedaran a la llista d'avui, però aquest telèfon deixarà de mostrar-les."
},
"search": {
"title": "Tria la teva cançó",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Buscant l'àudio…",
"needAudio": "Tria un enregistrament de dalt",
"socialFailed": "No s'ha pogut iniciar sessió. Torna-ho a provar o fes servir el teu correu electrònic.",
"socialStall": "No passa res? Fes servir el teu correu a sota."
"socialStall": "No passa res? Fes servir el teu correu electrònic aquí sota."
},
"confirm": {
"partnersTitle": "Cantes amb algú més? (opcional)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Enviat",
"stepMaking": "S'està creant",
"stepReady": "A punt per cantar",
"phoneCode": "Codi del telèfon: {code} · Falten cançons? Mostra aquest codi a l'amfitrió i vincularà aquest telèfon a tu."
"phoneCode": "Codi del telèfon: {code} · Et falten cançons? Ensenya aquest codi a l'amfitrió i t'enllaçarà aquest telèfon."
},
"notify": {
"heading": "🔔 Quan et toqui",
Expand Down Expand Up @@ -663,6 +663,6 @@
"saving": "Desant les cançons d'aquesta nit a {email}",
"stop": "Deixa de desar",
"failed": "No hem pogut desar les teves cançons ara mateix. Torna-ho a provar.",
"signOutEmail": "Tanca la sessió del correu"
"signOutEmail": "Tanca la sessió del correu electrònic"
}
}
6 changes: 3 additions & 3 deletions kj-controller/static-sing/messages/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} je kamarád: vybrat písničku pro něj",
"renameConfirmYes": "Ano, já jsem {name}: přejmenovat mě",
"switchShort": "🔄 Změnit zpěváka",
"switchConfirm": "Přepnout na jiného zpěváka na tomto telefonu? Písně {name} zůstanou v dnešním seznamu, ale tento telefon je přestane zobrazovat."
"switchConfirm": "Přepnout na tomto telefonu na jiného zpěváka? Písničky zpěváka {name} na dnešním seznamu zůstanou, ale na tomto telefonu se přestanou zobrazovat."
},
"search": {
"title": "Vyber si píseň",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Hledáme zvuk…",
"needAudio": "Vyber nahrávku výše",
"socialFailed": "Přihlášení se nepovedlo. Zkus to znovu, nebo použij e-mail.",
"socialStall": "Nic se neděje? Použijte raději svůj e-mail níže."
"socialStall": "Nic se neděje? Použij místo toho svůj e-mail níže."
},
"confirm": {
"partnersTitle": "Zpíváš ještě s někým? (volitelné)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Odesláno",
"stepMaking": "Vytváří se",
"stepReady": "Připraveno ke zpěvu",
"phoneCode": "Kód telefonu: {code} · Chybí vám písně? Ukažte tento kód hostiteli a ten tento telefon propojí s vámi."
"phoneCode": "Kód telefonu: {code} · Chybí ti písničky? Ukaž tento kód obsluze a ta ti tento telefon přiřadí."
},
"notify": {
"heading": "🔔 Až na tebe přijde řada",
Expand Down
6 changes: 3 additions & 3 deletions kj-controller/static-sing/messages/da.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} er en ven: ønsk en sang for dem",
"renameConfirmYes": "Ja, jeg er {name}: ændr mit navn",
"switchShort": "🔄 Skift sanger",
"switchConfirm": "Skift til en anden sanger på denne telefon? {name}s sange bliver på aftenens liste, men denne telefon holder op med at vise dem."
"switchConfirm": "Vil du skifte til en anden sanger på denne telefon? {name}s sange bliver på aftenens liste, men de vises ikke længere på denne telefon."
},
"search": {
"title": "Vælg din sang",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Finder lyden…",
"needAudio": "Vælg en optagelse ovenfor",
"socialFailed": "Login mislykkedes. Prøv igen, eller brug din e-mail.",
"socialStall": "Sker der ikke noget? Brug din e-mail herunder i stedet."
"socialStall": "Sker der ingenting? Brug din e-mail nedenfor i stedet."
},
"confirm": {
"partnersTitle": "Synger du med andre? (valgfrit)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Sendt",
"stepMaking": "Bliver lavet",
"stepReady": "Klar til at blive sunget",
"phoneCode": "Telefonkode: {code} · Mangler dine sange? Vis koden til værten, så kobler de denne telefon til dig."
"phoneCode": "Telefonkode: {code} · Mangler der sange? Vis denne kode til værten, så knytter de denne telefon til dig."
},
"notify": {
"heading": "🔔 Når det er din tur",
Expand Down
6 changes: 3 additions & 3 deletions kj-controller/static-sing/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} ist ein/e Freund/in: Song für sie/ihn wünschen",
"renameConfirmYes": "Ja, ich bin {name}: Namen ändern",
"switchShort": "🔄 Sänger wechseln",
"switchConfirm": "Auf diesem Handy zu einem anderen Sänger wechseln? Die Songs von {name} bleiben auf der Liste für heute Abend, aber dieses Handy zeigt sie nicht mehr an."
"switchConfirm": "Auf diesem Handy zu einer anderen Person wechseln? Die Songs von {name} bleiben auf der Liste für heute Abend, werden aber auf diesem Handy nicht mehr angezeigt."
},
"search": {
"title": "Wähle deinen Song",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Audio wird gesucht…",
"needAudio": "Wähle oben eine Aufnahme aus",
"socialFailed": "Die Anmeldung hat leider nicht geklappt. Versuch es nochmal oder nutze deine E-Mail-Adresse.",
"socialStall": "Passiert nichts? Nutze stattdessen unten deine E-Mail."
"socialStall": "Es tut sich nichts? Nutze stattdessen unten deine E-Mail-Adresse."
},
"confirm": {
"partnersTitle": "Singst du noch mit jemandem? (optional)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Gesendet",
"stepMaking": "Wird erstellt",
"stepReady": "Bereit zum Singen",
"phoneCode": "Handy-Code: {code} · Songs fehlen? Zeig diesen Code dem Host, dann verknüpft er dieses Handy mit dir."
"phoneCode": "Handy-Code: {code} · Fehlen Songs? Zeige diesen Code dem Host, damit dein Handy mit dir verknüpft wird."
},
"notify": {
"heading": "🔔 Wenn du dran bist",
Expand Down
6 changes: 3 additions & 3 deletions kj-controller/static-sing/messages/el.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 Το άτομο {name} είναι φίλος: ζήτησε τραγούδι για εκείνον",
"renameConfirmYes": "Ναι, είμαι {name}: άλλαξε το όνομά μου",
"switchShort": "🔄 Αλλαγή τραγουδιστή",
"switchConfirm": "Αλλαγή σε άλλον τραγουδιστή σε αυτό το τηλέφωνο; Τα τραγούδια του/της {name} μένουν στη λίστα της βραδιάς, αλλά αυτό το τηλέφωνο δεν θα τα εμφανίζει πια."
"switchConfirm": "Θέλεις να αλλάξεις τραγουδιστή σε αυτό το τηλέφωνο; Τα τραγούδια του/της {name} θα παραμείνουν στην αποψινή λίστα, αλλά αυτό το τηλέφωνο δεν θα τα εμφανίζει πλέον."
},
"search": {
"title": "Διάλεξε το τραγούδι σου",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Αναζήτηση ήχου…",
"needAudio": "Διάλεξε μια ηχογράφηση παραπάνω",
"socialFailed": "Η σύνδεση δεν πέτυχε. Δοκίμασε ξανά ή χρησιμοποίησε το email σου.",
"socialStall": "Δεν συμβαίνει τίποτα; Χρησιμοποίησε το email σου παρακάτω."
"socialStall": "Δεν γίνεται τίποτα; Χρησιμοποίησε το email σου παρακάτω."
},
"confirm": {
"partnersTitle": "Τραγουδάς με κάποιον άλλο; (προαιρετικό)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Στάλθηκε",
"stepMaking": "Δημιουργείται",
"stepReady": "Έτοιμο να το πεις",
"phoneCode": "Κωδικός τηλεφώνου: {code} · Λείπουν τραγούδια; Δείξε αυτόν τον κωδικό στον οικοδεσπότη και θα συνδέσει αυτό το τηλέφωνο με εσένα."
"phoneCode": "Κωδικός τηλεφώνου: {code} · Λείπουν τραγούδια; Δείξε αυτόν τον κωδικό στον host και θα συνδέσει αυτό το τηλέφωνο μαζί σου."
},
"notify": {
"heading": "🔔 Όταν έρθει η σειρά σου",
Expand Down
8 changes: 4 additions & 4 deletions kj-controller/static-sing/messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} es un amigo/a: pedir una canción para él/ella",
"renameConfirmYes": "Sí, soy {name}: cambiar mi nombre",
"switchShort": "🔄 Cambiar cantante",
"switchConfirm": "¿Cambiar a otro cantante en este teléfono? Las canciones de {name} siguen en la lista de esta noche, pero este teléfono dejará de mostrarlas."
"switchConfirm": "¿Cambiar a otro cantante en este teléfono? Las canciones de {name} se quedarán en la lista de hoy, pero ya no se mostrarán en este teléfono."
},
"search": {
"title": "Elige tu canción",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Buscando el audio…",
"needAudio": "Elige una grabación arriba",
"socialFailed": "No se pudo iniciar sesión. Inténtalo de nuevo o usa tu correo electrónico.",
"socialStall": "¿No pasa nada? Usa tu correo aquí abajo."
"socialStall": "¿No pasa nada? Prueba abajo con tu correo electrónico."
},
"confirm": {
"partnersTitle": "¿Cantas con alguien más? (opcional)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Enviada",
"stepMaking": "Creándose",
"stepReady": "Lista para cantar",
"phoneCode": "Código del teléfono: {code} · ¿Faltan canciones? Muéstrale este código al anfitrión y vinculará este teléfono contigo."
"phoneCode": "Código de teléfono: {code} · ¿Faltan canciones? Muéstrale este código al presentador para que vincule este teléfono contigo."
},
"notify": {
"heading": "🔔 Cuando sea tu turno",
Expand Down Expand Up @@ -663,6 +663,6 @@
"saving": "Guardando las canciones de esta noche en {email}",
"stop": "Dejar de guardar",
"failed": "No hemos podido guardar tus canciones ahora mismo. Inténtalo de nuevo, por favor.",
"signOutEmail": "Cerrar sesión del correo"
"signOutEmail": "Cerrar sesión de correo electrónico"
}
}
6 changes: 3 additions & 3 deletions kj-controller/static-sing/messages/fi.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} on kaveri: toivo kappale hänelle",
"renameConfirmYes": "Kyllä, olen {name}: vaihda nimeni",
"switchShort": "🔄 Vaihda laulajaa",
"switchConfirm": "Vaihdetaanko tässä puhelimessa toiseen laulajaan? Laulajan {name} kappaleet pysyvät illan listalla, mutta tämä puhelin ei enää näytä niitä."
"switchConfirm": "Haluatko vaihtaa toiseen laulajaan tällä puhelimella? Laulajan {name} kappaleet pysyvät tämän illan listalla, mutta ne eivät enää näy tällä puhelimella."
},
"search": {
"title": "Valitse laulusi",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Etsitään ääniraitaa…",
"needAudio": "Valitse versio yltä",
"socialFailed": "Kirjautuminen ei onnistunut. Yritä uudelleen tai käytä sähköpostia.",
"socialStall": "Eikö mitään tapahdu? Käytä sen sijaan sähköpostiasi alla."
"socialStall": "Eikö mitään tapahdu? Käytä sen sijaan alla olevaa sähköpostikirjautumista."
},
"confirm": {
"partnersTitle": "Laulatko jonkun muun kanssa? (valinnainen)",
Expand Down Expand Up @@ -663,6 +663,6 @@
"saving": "Tallennetaan tämän illan kappaleita tilille {email}",
"stop": "Lopeta tallentaminen",
"failed": "Kappaleiden tallentaminen ei juuri nyt onnistunut. Yritä uudelleen.",
"signOutEmail": "Kirjaudu ulos sähköpostista"
"signOutEmail": "Kirjaudu ulos sähköpostitililtä"
}
}
8 changes: 4 additions & 4 deletions kj-controller/static-sing/messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"renameConfirmFriend": "🎤 {name} est un·e ami·e : choisir un morceau pour cette personne",
"renameConfirmYes": "Oui, je suis {name} : changer mon nom",
"switchShort": "🔄 Changer de chanteur",
"switchConfirm": "Passer à un autre chanteur sur ce téléphone ? Les chansons de {name} restent sur la liste de ce soir, mais ce téléphone ne les affichera plus."
"switchConfirm": "Changer de chanteur sur ce téléphone ? Les morceaux de {name} restent sur la liste de ce soir, mais ce téléphone ne les affichera plus."
},
"search": {
"title": "Choisis ta chanson",
Expand Down Expand Up @@ -382,7 +382,7 @@
"findingAudio": "Recherche de l'audio…",
"needAudio": "Choisis un enregistrement ci-dessus",
"socialFailed": "La connexion n'a pas fonctionné. Réessaie ou utilise ton e-mail.",
"socialStall": "Rien ne se passe ? Utilisez plutôt votre e-mail ci-dessous."
"socialStall": "Rien ne se passe ? Utilise plutôt ton e-mail ci-dessous."
},
"confirm": {
"partnersTitle": "Tu chantes avec quelqu'un d'autre ? (facultatif)",
Expand Down Expand Up @@ -505,7 +505,7 @@
"stepSent": "Envoyée",
"stepMaking": "En cours de création",
"stepReady": "Prête à chanter",
"phoneCode": "Code du téléphone : {code} · Des chansons manquent ? Montrez ce code à l'animateur et il reliera ce téléphone à vous."
"phoneCode": "Code téléphone : {code} · Morceaux manquants ? Montre ce code à l'animateur et il associera ce téléphone à tes morceaux."
},
"notify": {
"heading": "🔔 Quand c'est ton tour",
Expand Down Expand Up @@ -663,6 +663,6 @@
"saving": "Enregistrement des morceaux de ce soir sur {email}",
"stop": "Ne plus enregistrer",
"failed": "Impossible d'enregistrer tes morceaux pour le moment. Merci de réessayer.",
"signOutEmail": "Se déconnecter de l'e-mail"
"signOutEmail": "Déconnexion de l'e-mail"
}
}
Loading
Loading