Pin moves to v0.5.3, package version to 0.5.3:0.
The health check no longer just probes a port. It fetches the server's own
/api/health and reports what it says — "Multiplayer server is ready — 3
games in progress", with ", 1 waiting to start" appended only when a lobby
exists and "no games in progress" on an idle server. A server that doesn't
answer is reported as STARTING, never failed: the server replays its saved
games before binding its port, so a boot legitimately looks like nothing is
listening, and calling that a failure makes an ordinary restart look like a
crash.
Two new actions, both only-running. Games in Progress is read-only and
lists every game and lobby with players, Day/Stage/phase, who it waits on,
when it started and when it last moved. Manage Game picks one from a
dropdown built live from the server and either exports it or ends it —
ending being the only way a game finishes other than being played out,
since an abandoned game otherwise stays active and is resumed on every
restart forever. Ending always returns the deleted game's save, so nothing
is destroyed without being handed back first.
They are only-running because none of it is readable from disk: a save is a
seed plus a list of moves, so whose-turn-it-is exists only after a replay
through the engine, which lives in the game repo rather than here. The
running server has already done that work and is asked for the answer.
startos/serverApi.ts is the single place that asks.
store.json gained adminSecret (32 chars) beside joinSecret, seeded on
install and backfilled on update for a volume written before the field
existed. It is deliberately NOT the join secret: every player holds that
one, so gating a delete with it would let anyone at the table destroy
anyone else's game. init/generateJoinSecret.ts is renamed generateSecrets.ts
now that it mints both.
Also brought getJoinSecret's result strings under i18n(). They shipped as
plain strings two commits ago, which actions.md is explicit about — every
user-facing string including result titles, messages and thrown errors.
The new actions follow it, so the old one shouldn't be the odd one out.
Verified on phoenix.local, installed as an UPDATE from 0.5.2:0 rather than
a fresh install, which exercised three things at once: the boot log line
("Resuming 1 saved game(s)…"), the engine-version refusal firing for real
on a game recorded under 0.5.2, and the adminSecret backfill (store.json
came out with both secrets, 24 and 32 chars). Then, from inside the
container: the package-generated admin secret authenticating against
/api/games (200) while a wrong one is refused (403), health counts tracking
0 -> lobby 1 -> active 1 through a create/bot/start, and every field the
actions render present and correct on the listing.
NOT verified: the actions' own forms and result rendering. `start-cli
package action run` fails with a client-side deserialization error on every
action on this box — including the already-shipped get-join-secret and
actual-budget's equivalent — so it is a start-cli problem, not this
package's. The data path underneath them is verified above; the SDK
form/result rendering needs the web UI.
A test game (TRESTLE-3221, Alice + a bot) is left running on the box so
there is something for Games in Progress to show.
241 lines
13 KiB
TypeScript
241 lines
13 KiB
TypeScript
import { LangDict } from './default'
|
|
|
|
export default {
|
|
es_ES: {
|
|
0: '¡Iniciando Station Master!',
|
|
1: 'Servidor multijugador',
|
|
2: 'El servidor multijugador está listo',
|
|
3: 'El servidor multijugador no está listo',
|
|
4: 'Mesa multijugador',
|
|
5: 'Crea o únete a una partida, y juega en el navegador',
|
|
6: 'Obtener el secreto de acceso',
|
|
7: 'Recuperar o rotar el secreto que los jugadores necesitan para crear o unirse a una partida',
|
|
8: 'Obtén el secreto de acceso para compartirlo con los jugadores',
|
|
9: 'El servidor multijugador está listo',
|
|
10: 'ninguna partida en curso',
|
|
11: '1 partida en curso',
|
|
12: 'partidas en curso',
|
|
13: '1 esperando para empezar',
|
|
14: 'esperando para empezar',
|
|
15: 'Partidas en curso',
|
|
16: 'Lista todas las partidas y salas de este servidor, y en qu\u00e9 punto est\u00e1 cada una',
|
|
17: 'No hay partidas en este servidor.',
|
|
18: 'partida(s) en este servidor. Usa Gestionar partida para guardar una o finalizarla.',
|
|
19: 'Esperando para empezar: nadie ha jugado un turno todav\u00eda.',
|
|
20: 'Asientos',
|
|
21: 'Creada',
|
|
22: 'Finalizada: esta partida ha terminado y no espera a nadie.',
|
|
23: 'Esperando a',
|
|
24: 'asiento',
|
|
25: 'nadie: la Fase de V\u00eda Principal se ejecuta sola',
|
|
26: 'Jugadores',
|
|
27: 'D\u00eda',
|
|
28: 'Etapa',
|
|
29: 'Comenzada',
|
|
30: '\u00daltimo movimiento',
|
|
31: 'desconocido',
|
|
32: 'Gestionar partida',
|
|
33: 'Guarda una partida para m\u00e1s tarde, o finaliza una que nunca acabar\u00e1',
|
|
34: 'Finalizar una partida no se puede deshacer. Se devuelve su guardado, as\u00ed que a\u00fan se puede reproducir.',
|
|
35: 'asientos',
|
|
36: 'jugadores',
|
|
37: 'esperando a',
|
|
38: 'No hay partidas en este servidor',
|
|
39: 'Partida',
|
|
40: 'Sobre qu\u00e9 partida actuar',
|
|
41: 'Qu\u00e9 hacer',
|
|
42: 'Exportar no cambia nada. Finalizar borra la partida del servidor.',
|
|
43: 'Exportar: guarda una copia y deja la partida en marcha',
|
|
44: 'Finalizar la partida: borrarla del servidor',
|
|
45: 'Partida guardada',
|
|
46: 'Esto es la partida entera: su semilla y todos los movimientos. Gu\u00e1rdalo como archivo .json y \u00e1brelo en el visor de repeticiones para verla. La partida en s\u00ed sigue intacta y en marcha.',
|
|
47: 'Guardado',
|
|
48: 'Partida finalizada',
|
|
49: 'La partida',
|
|
50: 'borrada del servidor, y quien siguiera conectado ha sido desconectado. Su guardado est\u00e1 abajo: cons\u00e9rvalo si quieres ver la partida, porque es la \u00fanica copia que queda.',
|
|
51: 'No hay un secreto de administraci\u00f3n guardado para este servicio, as\u00ed que no se pueden gestionar sus partidas.',
|
|
52: 'No se pudo contactar con el servidor de la partida',
|
|
53: 'esa partida ya no existe',
|
|
54: 'el servidor respondi\u00f3',
|
|
55: 'Secreto de acceso',
|
|
56: 'Comp\u00e1rtelo con quien quieras que pueda crear una partida o unirse a una en este servidor. No identifica a una persona ni un asiento, solo a qui\u00e9n se le permite entrar. Ejecutar esta acci\u00f3n de nuevo genera otro y reinicia el servidor con \u00e9l; quien ya est\u00e9 sentado en una partida sigue jugando, pero el secreto antiguo deja de servir para nuevas partidas y uniones.',
|
|
},
|
|
de_DE: {
|
|
0: 'Starte Station Master!',
|
|
1: 'Mehrspieler-Server',
|
|
2: 'Der Mehrspieler-Server ist bereit',
|
|
3: 'Der Mehrspieler-Server ist nicht bereit',
|
|
4: 'Mehrspielertisch',
|
|
5: 'Spiel erstellen oder beitreten und im Browser spielen',
|
|
6: 'Beitrittsgeheimnis abrufen',
|
|
7: 'Das Geheimnis abrufen oder erneuern, das Spieler zum Erstellen oder Beitreten einer Partie benötigen',
|
|
8: 'Hole das Beitrittsgeheimnis, um es mit Spielern zu teilen',
|
|
9: 'Mehrspieler-Server ist bereit',
|
|
10: 'keine Spiele laufen',
|
|
11: '1 laufendes Spiel',
|
|
12: 'laufende Spiele',
|
|
13: '1 wartet auf den Start',
|
|
14: 'warten auf den Start',
|
|
15: 'Laufende Spiele',
|
|
16: 'Listet jedes Spiel und jede Lobby auf diesem Server auf, samt Spielstand',
|
|
17: 'Auf diesem Server gibt es keine Spiele.',
|
|
18: 'Spiel(e) auf diesem Server. Mit "Spiel verwalten" eines sichern oder beenden.',
|
|
19: 'Wartet auf den Start \u2014 noch hat niemand einen Zug gemacht.',
|
|
20: 'Pl\u00e4tze',
|
|
21: 'Erstellt',
|
|
22: 'Beendet \u2014 dieses Spiel ist vorbei und wartet auf niemanden.',
|
|
23: 'Wartet auf',
|
|
24: 'Platz',
|
|
25: 'niemanden \u2014 die Hauptstrecken-Phase l\u00e4uft von selbst',
|
|
26: 'Spieler',
|
|
27: 'Tag',
|
|
28: 'Abschnitt',
|
|
29: 'Begonnen',
|
|
30: 'Letzter Zug',
|
|
31: 'unbekannt',
|
|
32: 'Spiel verwalten',
|
|
33: 'Ein Spiel f\u00fcr sp\u00e4ter sichern oder eines beenden, das nie fertig wird',
|
|
34: 'Ein Spiel zu beenden l\u00e4sst sich nicht r\u00fcckg\u00e4ngig machen. Sein Spielstand wird zur\u00fcckgegeben und bleibt abspielbar.',
|
|
35: 'Pl\u00e4tze',
|
|
36: 'Spieler',
|
|
37: 'wartet auf',
|
|
38: 'Keine Spiele auf diesem Server',
|
|
39: 'Spiel',
|
|
40: 'Auf welches Spiel sich das bezieht',
|
|
41: 'Was zu tun ist',
|
|
42: 'Exportieren \u00e4ndert nichts. Beenden l\u00f6scht das Spiel vom Server.',
|
|
43: 'Exportieren \u2014 eine Kopie sichern, das Spiel weiterlaufen lassen',
|
|
44: 'Spiel beenden \u2014 vom Server l\u00f6schen',
|
|
45: 'Spiel gesichert',
|
|
46: 'Das ist das ganze Spiel \u2014 sein Seed und jeder darin gemachte Zug. Als .json-Datei sichern und im Replay-Viewer \u00f6ffnen, um es anzusehen. Das Spiel selbst bleibt unber\u00fchrt und l\u00e4uft weiter.',
|
|
47: 'Spielstand',
|
|
48: 'Spiel beendet',
|
|
49: 'Das Spiel',
|
|
50: 'vom Server gel\u00f6scht, und wer noch verbunden war, wurde getrennt. Der Spielstand steht unten: aufheben, wenn das Spiel noch angesehen werden soll \u2014 es ist die einzige verbliebene Kopie.',
|
|
51: 'F\u00fcr diesen Dienst ist kein Admin-Geheimnis gespeichert, seine Spiele lassen sich daher nicht verwalten.',
|
|
52: 'Der Spielserver war nicht erreichbar',
|
|
53: 'dieses Spiel gibt es nicht mehr',
|
|
54: 'der Server antwortete mit',
|
|
55: 'Beitrittsgeheimnis',
|
|
56: 'Weitergeben an alle, die auf diesem Server ein Spiel erstellen oder einem beitreten sollen. Es benennt weder eine Person noch einen Platz, nur wer an der T\u00fcr eingelassen wird. Diese Aktion erneut auszuf\u00fchren erzeugt ein neues und startet den Server damit neu; wer bereits an einem Spiel sitzt, spielt weiter, doch das alte Geheimnis funktioniert f\u00fcr neue Spiele und Beitritte nicht mehr.',
|
|
},
|
|
pl_PL: {
|
|
0: 'Uruchamianie Station Master!',
|
|
1: 'Serwer wieloosobowy',
|
|
2: 'Serwer wieloosobowy jest gotowy',
|
|
3: 'Serwer wieloosobowy nie jest gotowy',
|
|
4: 'Stół wieloosobowy',
|
|
5: 'Utwórz lub dołącz do gry i graj w przeglądarce',
|
|
6: 'Pobierz sekret dołączania',
|
|
7: 'Pobierz lub wymień sekret potrzebny graczom do tworzenia gier i dołączania do nich',
|
|
8: 'Pobierz sekret dołączania, aby udostępnić go graczom',
|
|
9: 'Serwer wieloosobowy jest gotowy',
|
|
10: 'brak gier w toku',
|
|
11: '1 gra w toku',
|
|
12: 'gry w toku',
|
|
13: '1 czeka na rozpoczęcie',
|
|
14: 'czekają na rozpoczęcie',
|
|
15: 'Gry w toku',
|
|
16: 'Wy\u015bwietla wszystkie gry i poczekalnie na tym serwerze oraz ich stan',
|
|
17: 'Na tym serwerze nie ma \u017cadnych gier.',
|
|
18: 'gra/gry na tym serwerze. U\u017cyj \u201eZarz\u0105dzaj gr\u0105\u201d, aby zapisa\u0107 lub zako\u0144czy\u0107 gr\u0119.',
|
|
19: 'Czeka na rozpocz\u0119cie \u2014 nikt jeszcze nie wykona\u0142 ruchu.',
|
|
20: 'Miejsca',
|
|
21: 'Utworzono',
|
|
22: 'Zako\u0144czona \u2014 ta gra dobieg\u0142a ko\u0144ca i na nikogo nie czeka.',
|
|
23: 'Czeka na',
|
|
24: 'miejsce',
|
|
25: 'nikogo \u2014 Faza Magistrali wykonuje si\u0119 sama',
|
|
26: 'Gracze',
|
|
27: 'Dzie\u0144',
|
|
28: 'Etap',
|
|
29: 'Rozpocz\u0119to',
|
|
30: 'Ostatni ruch',
|
|
31: 'nieznany',
|
|
32: 'Zarz\u0105dzaj gr\u0105',
|
|
33: 'Zapisz gr\u0119 na p\u00f3\u017aniej albo zako\u0144cz tak\u0105, kt\u00f3ra nigdy si\u0119 nie sko\u0144czy',
|
|
34: 'Zako\u0144czenia gry nie mo\u017cna cofn\u0105\u0107. Jej zapis zostaje zwr\u00f3cony, wi\u0119c nadal mo\u017cna j\u0105 odtworzy\u0107.',
|
|
35: 'miejsc',
|
|
36: 'graczy',
|
|
37: 'czeka na',
|
|
38: 'Brak gier na tym serwerze',
|
|
39: 'Gra',
|
|
40: 'Kt\u00f3rej gry dotyczy dzia\u0142anie',
|
|
41: 'Co zrobi\u0107',
|
|
42: 'Eksport niczego nie zmienia. Zako\u0144czenie usuwa gr\u0119 z serwera.',
|
|
43: 'Eksportuj \u2014 zapisz kopi\u0119, zostaw gr\u0119 w toku',
|
|
44: 'Zako\u0144cz gr\u0119 \u2014 usu\u0144 j\u0105 z serwera',
|
|
45: 'Gra zapisana',
|
|
46: 'To ca\u0142a gra \u2014 jej ziarno i ka\u017cdy wykonany ruch. Zapisz jako plik .json i otw\u00f3rz w przegl\u0105darce powt\u00f3rek, aby j\u0105 obejrze\u0107. Sama gra pozostaje nietkni\u0119ta i nadal trwa.',
|
|
47: 'Zapis',
|
|
48: 'Gra zako\u0144czona',
|
|
49: 'Gra',
|
|
50: 'usuni\u0119ta z serwera, a wszyscy nadal po\u0142\u0105czeni zostali roz\u0142\u0105czeni. Zapis znajduje si\u0119 poni\u017cej: zachowaj go, je\u015bli chcesz obejrze\u0107 gr\u0119, bo to jedyna pozosta\u0142a kopia.',
|
|
51: 'Dla tej us\u0142ugi nie zapisano sekretu administratora, wi\u0119c nie mo\u017cna zarz\u0105dza\u0107 jej grami.',
|
|
52: 'Nie uda\u0142o si\u0119 po\u0142\u0105czy\u0107 z serwerem gry',
|
|
53: 'ta gra ju\u017c nie istnieje',
|
|
54: 'serwer odpowiedzia\u0142',
|
|
55: 'Sekret do\u0142\u0105czania',
|
|
56: 'Udost\u0119pnij je ka\u017cdemu, kto ma m\u00f3c utworzy\u0107 gr\u0119 na tym serwerze lub do niej do\u0142\u0105czy\u0107. Nie wskazuje osoby ani miejsca \u2014 tylko to, kogo wpuszcza si\u0119 do poczekalni. Ponowne uruchomienie tej akcji tworzy nowy sekret i restartuje z nim serwer; kto ju\u017c siedzi przy grze, gra dalej, ale stary sekret przestaje dzia\u0142a\u0107 przy nowych grach i do\u0142\u0105czeniach.',
|
|
},
|
|
fr_FR: {
|
|
0: 'Démarrage de Station Master !',
|
|
1: 'Serveur multijoueur',
|
|
2: 'Le serveur multijoueur est prêt',
|
|
3: "Le serveur multijoueur n'est pas prêt",
|
|
4: 'Table multijoueur',
|
|
5: 'Créez ou rejoignez une partie, et jouez dans le navigateur',
|
|
6: 'Obtenir le secret de connexion',
|
|
7: 'Récupérer ou renouveler le secret dont les joueurs ont besoin pour créer une partie ou la rejoindre',
|
|
8: 'Obtenez le secret de connexion à partager avec les joueurs',
|
|
9: 'Le serveur multijoueur est prêt',
|
|
10: 'aucune partie en cours',
|
|
11: '1 partie en cours',
|
|
12: 'parties en cours',
|
|
13: '1 en attente de démarrage',
|
|
14: 'en attente de démarrage',
|
|
15: 'Parties en cours',
|
|
16: 'Liste toutes les parties et salons de ce serveur, et o\u00f9 en est chacun',
|
|
17: "Il n'y a aucune partie sur ce serveur.",
|
|
18: 'partie(s) sur ce serveur. Utilisez G\u00e9rer la partie pour en sauvegarder une ou y mettre fin.',
|
|
19: "En attente de d\u00e9marrage \u2014 personne n'a encore jou\u00e9.",
|
|
20: 'Places',
|
|
21: 'Cr\u00e9\u00e9e',
|
|
22: "Termin\u00e9e \u2014 cette partie est finie et n'attend personne.",
|
|
23: 'En attente de',
|
|
24: 'place',
|
|
25: 'personne \u2014 la phase de ligne principale se d\u00e9roule seule',
|
|
26: 'Joueurs',
|
|
27: 'Jour',
|
|
28: '\u00c9tape',
|
|
29: 'Commenc\u00e9e',
|
|
30: 'Dernier coup',
|
|
31: 'inconnu',
|
|
32: 'G\u00e9rer la partie',
|
|
33: 'Sauvegarder une partie pour plus tard, ou mettre fin \u00e0 une partie qui ne finira jamais',
|
|
34: 'Mettre fin \u00e0 une partie est irr\u00e9versible. Sa sauvegarde est renvoy\u00e9e et reste rejouable.',
|
|
35: 'places',
|
|
36: 'joueurs',
|
|
37: 'en attente de',
|
|
38: 'Aucune partie sur ce serveur',
|
|
39: 'Partie',
|
|
40: 'Sur quelle partie agir',
|
|
41: 'Que faire',
|
|
42: "L'export ne change rien. Mettre fin supprime la partie du serveur.",
|
|
43: 'Exporter \u2014 sauvegarder une copie, laisser la partie en cours',
|
|
44: 'Mettre fin \u00e0 la partie \u2014 la supprimer du serveur',
|
|
45: 'Partie sauvegard\u00e9e',
|
|
46: 'Ceci est la partie enti\u00e8re \u2014 sa graine et chaque coup jou\u00e9. Enregistrez-la en .json et ouvrez-la dans le lecteur de rejeu pour la revoir. La partie elle-m\u00eame est intacte et continue.',
|
|
47: 'Sauvegarde',
|
|
48: 'Partie termin\u00e9e',
|
|
49: 'La partie',
|
|
50: "supprim\u00e9e du serveur, et toute personne encore connect\u00e9e a \u00e9t\u00e9 d\u00e9connect\u00e9e. Sa sauvegarde est ci-dessous : conservez-la pour revoir la partie, car c'est la seule copie restante.",
|
|
51: "Aucun secret d'administration n'est enregistr\u00e9 pour ce service ; ses parties ne peuvent donc pas \u00eatre g\u00e9r\u00e9es.",
|
|
52: 'Impossible de joindre le serveur de jeu',
|
|
53: "cette partie n'existe plus",
|
|
54: 'le serveur a r\u00e9pondu',
|
|
55: 'Secret de connexion',
|
|
56: "Partagez-le avec toute personne qui doit pouvoir cr\u00e9er une partie sur ce serveur ou en rejoindre une. Il n'identifie ni une personne ni une place, seulement qui est admis \u00e0 la porte. Relancer cette action en g\u00e9n\u00e8re un nouveau et red\u00e9marre le serveur avec ; qui est d\u00e9j\u00e0 assis \u00e0 une partie continue de jouer, mais l'ancien secret cesse de fonctionner pour les nouvelles parties et les arriv\u00e9es.",
|
|
},
|
|
} satisfies Record<string, LangDict>
|