Files
romm/frontend/src/locales/pt_BR/play.json
T
Georges-Antoine AssiandClaude Opus 5.5 6f2a361481 Play RPG Maker 2000/2003 games in the browser with EasyRPG (#5077)
* feat(player): play RPG Maker 2000/2003 games in the browser with EasyRPG

Embed the EasyRPG web player for extracted game folders on the rpg-maker
platform. The backend generates the player's index.json from the scanned
files and merges in the free EasyRPG RTP under every name the official
and fan RTPs give its assets, so games that lean on the RTP find them.
In-game saves sync with the user's RomM saves through the player's
IndexedDB storage.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* refactor(easyrpg): read the free RTP from a fixed path instead of an env var

The full image always keeps the RTP at /var/www/html/assets/easyrpg/rtp,
so the path is a constant beside the web path nginx serves it under. The
dev container links its copy there at startup.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* fix(easyrpg): code-review fixes for the save sync and asset endpoint

- Wait for an in-flight push before the quit push, so the newest save uploads
- Keep Play disabled until the fresh rom (and its saves) is fetched
- Stop onPlay and the rom fetch from acting after the view unmounts
- Leave through usePlayerExit like the other players
- Handle a rejected IDB commit when the run itself fails
- Track uploads by the browser's file name
- Load only visibility and files per asset request, not the full rom
- Serve DEV_MODE files as octet-stream, matching nginx
- Make the traversal test actually reach the endpoint

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* refactor(easyrpg): simplify pass over the player and asset endpoint

- Load only file paths per asset request, and look up RTP folders in O(1)
- Reuse RomFile.file_name_for_download and usePlayerFullscreen
- Share one dev/prod serve helper for game and RTP files
- Derive the save sync's game key from the rom
- Have the RTP table tool reuse normalize_name
- Make save-module internals private and tidy the prepare/read loops

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* feat(easyrpg): flag RPG Maker game folders on the rom schemas

Gallery lists carry no files, so the frontend guessed that every multi-file
rom on the rpg-maker platform was playable, including RPG Maker XP/VX/MV
folders. Rom now has a deferred `is_easyrpg_game` subquery (an RPG_RT.ldb at
the folder root), loaded with the other gallery file stats and derived from
loaded files on the with_files path, and the frontend reads it.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* refactor(easyrpg): drop server save sync, keep saves per user in the browser

Server sync moves to a follow-up that puts the web players on device sync.
Saves now stay in the player's IndexedDB, as js-dos does, with the same note
on the start page. The player is launched as `<rom id>-<user id>` so each
RomM account sharing a browser profile keeps its own saves; nginx and Vite
drop the user id when routing to the backend.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* fix(easyrpg): address Greptile review

- Start timing the play session once the player page loads
- Use object-form props in the view test's button mock
- Keep the RTP table tool's docstring to one sentence

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* refactor(easyrpg): keep the RTP table in a fixtures folder

Matches handler/metadata/fixtures, where the other bundled data files live.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-03 17:51:38 -04:00

261 lines
16 KiB
JSON

{
"all-discs": "Todos os discos",
"all-saves": "Todos os saves",
"all-states": "Todos os states",
"any-core": "Qualquer core",
"back-to-gallery": "Voltar à galeria",
"back-to-game-details": "Voltar aos detalhes do jogo",
"background-color": "Cor de fundo",
"boot-from-save": "Iniciar a partir do save",
"boot-from-state": "Iniciar a partir do state",
"cache-manager": "Gerenciador de cache",
"cancel-launch": "Cancelar inicialização",
"change-save": "Alterar save",
"change-state": "Alterar estado",
"cheats": "Trapaças",
"clear-cache": "Limpar cache do EmulatorJS",
"clear-cache-description": "Não afetará nenhum save ou estado armazenado no servidor.",
"clear-cache-title": "Tem certeza de que deseja limpar o cache do EmulatorJS?",
"clear-cache-warning": "Isso removerá todos os saves e estados armazenados no navegador.",
"compatible-of-total": "{compatible} de {total} compatíveis",
"context-menu": "Menu de contexto",
"control-settings": "Configurações de controle",
"core-blocked": "{core} tem problemas conhecidos nesta plataforma e só roda porque os cores experimentais estão ativados. Saves e estados podem não funcionar.",
"core-not-loadable": "Não carregável pelo core selecionado",
"core-untested": "{core} ainda não foi testado nesta plataforma. Saves e estados podem não funcionar como esperado. Conte para nós como ele roda.",
"create-memory-card": "Novo cartão de memória",
"delete-memory-card": "Excluir cartão de memória",
"delete-memory-card-body": "Isso exclui permanentemente \"{name}\" e todas as suas versões salvas. Esta ação não pode ser desfeita.",
"deselect-save": "Desmarcar save",
"deselect-state": "Desmarcar estado",
"desktop-back": "Back to administration",
"desktop-error-no-container": "That streaming container is not configured.",
"desktop-error-occupied": "This container is already in use. End the session holding it first.",
"desktop-error-occupied-by": "{rom} está em execução neste contêiner. Encerre essa sessão primeiro.",
"desktop-error-release": "The desktop session could not be released. The container may still be in use.",
"desktop-error-server": "The desktop session could not be opened.",
"desktop-exit": "End desktop session",
"desktop-exit-body": "The container will be released and anything still open on the desktop will be closed. Emulator settings you saved are kept.",
"desktop-exit-confirm": "End session",
"desktop-exit-title": "End this desktop session?",
"desktop-frame-title": "Container desktop",
"desktop-subtitle": "Desktop session",
"desktop-title": "Container desktop",
"discs": "Discos",
"download-memory-card": "Baixar cartão",
"easyrpg-browser-save-warning": "Os saves do EasyRPG são armazenados apenas neste navegador e não são sincronizados com o RomM.",
"easyrpg-screen": "Tela de jogo do EasyRPG",
"edit-memory-card": "Editar cartão de memória",
"emulator": "Emulador",
"error-hint-auth": "Talvez você não tenha permissão para transmitir ou sua sessão expirou. Tente entrar novamente.",
"error-hint-broker": "O contêiner {label} recusou-se a iniciar o jogo. Verifique os logs do contêiner para mais detalhes.",
"error-hint-network": "Não foi possível contatar o RomM. Verifique sua conexão de rede e se o servidor está em execução.",
"error-hint-not-configured": "Adicione um contêiner para esta plataforma à configuração de streaming do RomM.",
"error-hint-server": "O RomM encontrou um erro inesperado ao iniciar a sessão. Verifique os logs do servidor do RomM.",
"error-hint-unreachable": "Não foi possível contatar o contêiner {label}. Verifique se o contêiner está em execução e se o broker dele está escutando.",
"exit-chord-hint": "Durante o jogo, segure Select + Start por um momento para abrir o menu de saída.",
"exit-dialog-text": "O jogo ainda está em execução. O que você quer fazer?",
"exit-dialog-text-loading": "O jogo ainda está iniciando. Cancelar a inicialização?",
"exit-dialog-title": "Sair do jogo?",
"exit-full-screen": "Sair da tela cheia",
"exit-without-saving": "Sair sem salvar",
"full-screen": "Tela cheia",
"hide-older-versions": "Ocultar versões anteriores",
"https-required": "Deve ser executado via HTTPS. Entre em contato com o proprietário do site.",
"import-refusals-truncated": "{count} problema a mais não exibido | {count} problemas a mais não exibidos",
"join-closed": "Essa sessão não está mais aberta a outros jogadores.",
"join-ended": "Essa sessão foi encerrada.",
"jsdos-browser-save-warning": "Os saves do js-dos são armazenados apenas neste navegador e não são sincronizados com o RomM.",
"jsdos-quit-without-saving": "Sair sem salvar o progresso recente?",
"keep-playing": "Continuar jogando",
"last-save-synced": "Último save de {game} sincronizado.",
"last-state-synced": "Último state de {game} sincronizado.",
"latest-version": "Mais recente",
"launch-extracting-archive": "Extraindo o arquivo",
"launch-extracting-pkg": "Instalando os arquivos do jogo",
"launch-starting": "Iniciando o jogo",
"leave-dialog-text": "O anfitrião continua jogando. Você vai sair da sessão.",
"leave-dialog-title": "Sair da sessão?",
"leave-session": "Sair da sessão",
"load-autosave": "Carregar salvamento automático",
"load-latest-state": "Carregar último estado",
"load-save": "Carregar save",
"load-save-confirm-body": "O jogo reinicia a partir deste save e tudo o que você não salvou é perdido.",
"load-save-confirm-title": "Carregar este save?",
"load-save-failed": "Não foi possível carregar o save selecionado.",
"load-state": "Carregar estado",
"load-state-confirm-body": "O jogo volta ao momento em que este estado foi salvo e tudo o que você não salvou é perdido.",
"load-state-confirm-title": "Carregar este estado?",
"manage-memory-cards": "Gerenciar cartões de memória",
"manual-disc-swap-hint": "Este emulador troca de disco pelo próprio menu, não por aqui.",
"memory-card": "Cartão de memória",
"memory-card-count": "{count} cartões",
"memory-card-create-failed": "Não foi possível criar o cartão de memória",
"memory-card-created": "Cartão de memória criado",
"memory-card-delete-failed": "Não foi possível excluir o cartão de memória",
"memory-card-deleted": "Cartão de memória excluído",
"memory-card-download-failed": "Não foi possível baixar o cartão de memória",
"memory-card-edit-failed": "Não foi possível atualizar o cartão de memória",
"memory-card-edited": "Cartão de memória atualizado",
"memory-card-erase-keyword": "ERASE",
"memory-card-hint": "O cartão mais recente é carregado por padrão. O progresso é sincronizado ao sair.",
"memory-card-import-adopt": "Importar este cartão",
"memory-card-import-body": "Este contêiner já tem um cartão de memória com {count} arquivo(s) de salvamento. Deseja importá-lo para a sua biblioteca ou começar com um cartão novo?",
"memory-card-import-discard": "Começar do zero",
"memory-card-import-discard-body": "O cartão de memória deste contêiner será apagado. Nada do que estiver salvo nele poderá ser recuperado.",
"memory-card-import-discard-confirm": "Apagar e começar do zero",
"memory-card-import-discard-title": "Apagar o cartão existente?",
"memory-card-import-games": "Jogos neste cartão: {games}",
"memory-card-import-size": "{size} no total",
"memory-card-import-title": "Cartão de memória encontrado",
"memory-card-no-data": "Este cartão ainda não tem dados salvos",
"memory-card-no-versions": "Nenhuma versão salva ainda",
"memory-card-unreadable-body": "O RomM não conseguiu ler o cartão de memória deste contêiner, então não é possível saber se ele contém saves. Tente novamente mais tarde ou comece do zero e apague o que estiver nele.",
"memory-card-unreadable-override": "Começar do zero mesmo assim",
"memory-card-unreadable-reason": "Motivo: {reason}",
"memory-card-unreadable-title": "Não foi possível ler o cartão de memória",
"memory-card-unreadable-warning": "O cartão existente será apagado e não poderá ser recuperado.",
"memory-card-updated": "Atualizado {when}",
"memory-card-upload-failed": "Não foi possível enviar o cartão de memória",
"memory-card-uploaded": "Cartão de memória enviado",
"memory-card-versions": "Histórico de versões",
"memory-cards": "Cartões de memória",
"memory-cards-empty": "Você ainda não tem nenhum cartão de memória para este emulador.",
"multiplayer": "Modo multijogador",
"multiplayer-hint": "Mostra um botão Entrar na página deste jogo e mantém o chat e a webcam visíveis.",
"mute": "Silenciar",
"native-applies": "Isto também se aplica ao emulador deste dispositivo: {controls}.",
"native-browser-only": "Isto se aplica apenas ao player do navegador: {controls}.",
"native-cancel": "Cancelar inicialização",
"native-cancel-failed": "Não foi possível cancelar a inicialização",
"native-canceled": "Inicialização cancelada",
"native-downloading": "Baixando {percent}%",
"native-error-download": "Não foi possível baixar {name}",
"native-error-no-emulator": "Nenhum emulador está configurado para esta plataforma",
"native-error-running": "{name} já está em execução",
"native-error-session-expired": "Sessão do RomM encerrada. Entre novamente para jogar {name}",
"native-fetching-firmware": "Obtendo {firmware}",
"native-installing-core": "Instalando {core}",
"native-launch-failed": "Não foi possível iniciar {name}",
"native-preparing": "Preparando {emulator}",
"native-running": "{name} está em execução",
"native-save-archived": "O save de {name} foi guardado à parte, o RomM tem um mais recente",
"native-save-deleted": "Save de {name} removido, ele foi excluído no RomM",
"native-save-downloaded": "Save de {name} carregado do RomM",
"native-save-failed": "Não foi possível sincronizar o save de {name}",
"native-save-uploaded": "Save de {name} enviado ao RomM",
"native-starting": "Iniciando…",
"native-syncing-save": "Sincronizando o save…",
"native-syncing-states": "Sincronizando os states…",
"netplay": "Jogo em rede",
"new-memory-card": "Novo cartão",
"new-slot": "+ Novo slot",
"newer-save-warning": "Um save de {time} é mais recente que sua escolha. Retomá-la pode desfazer seu progresso.",
"newer-state-warning": "Um state de {time} é mais recente que sua escolha. Retomá-la pode desfazer seu progresso.",
"no-memory-cards": "Nenhum cartão de memória ainda",
"no-save-selected": "Nenhum save selecionado",
"no-saves-available": "Nenhum save disponível",
"no-screenshot-available": "Nenhuma captura de tela disponível",
"no-state-selected": "Nenhum estado selecionado",
"no-states-available": "Nenhum estado disponível",
"page-title": "Jogar {name}",
"pause": "Pausar",
"pico8-controls": "Controles do PICO-8",
"pico8-down": "Baixo",
"pico8-left": "Esquerda",
"pico8-right": "Direita",
"pico8-screen": "Tela de jogo do PICO-8",
"pico8-up": "Cima",
"play": "Jogar",
"play-in-browser": "Jogar no navegador",
"play-native": "Jogar neste dispositivo",
"play-native-in": "Jogar no {emulator}",
"play-on": "Transmitir em {label}",
"powered-by": "Desenvolvido com",
"quick-state-loaded": "State rápido carregado",
"quit": "Sair",
"restart": "Reiniciar",
"resume": "Retomar",
"resume-failed": "Não foi possível carregar o estado selecionado. O jogo começou do zero.",
"resume-from-save": "Retomar a partir do save",
"resume-from-state": "Retomar a partir do state",
"save-and-quit": "Salvar e sair",
"save-data": "Dados de save",
"save-data-none": "Ainda não há dados de save",
"save-data-none-hint": "{platform} guarda o progresso no save do próprio jogo",
"save-data-none-note": "Jogue e salve dentro do jogo. A sincronização acontece ao encerrar a sessão.",
"save-data-note": "Restaurado no console antes de iniciar. Carregue pelo menu do próprio jogo.",
"save-data-synced": "Sincronizado",
"save-kept-apart": "O save guardado de {game} foi salvo à parte: o slot já tem um progresso mais recente de outro dispositivo",
"save-kept-for-later": "Save guardado neste navegador, será sincronizado depois",
"save-loaded": "Save carregado do servidor",
"save-not-kept": "Não foi possível sincronizar o save, e este navegador não pode guardá-lo para depois",
"save-not-synced": "Seu último save ainda não chegou ao servidor. Ele fica guardado neste navegador e o RomM continua tentando em segundo plano.",
"save-progress-to": "Salvar progresso em",
"save-slot": "Slot de salvamento",
"save-state": "Salvar estado",
"save-sync-refused": "O servidor recusou o save que estava guardado de {game}: {reason}. Ele não fica mais neste navegador.",
"save-synced": "Save sincronizado com o servidor",
"select-background-color": "Selecionar cor de fundo",
"select-save": "Selecionar save",
"select-state": "Selecionar estado",
"session-ended": "Your streaming session has ended.",
"session-ended-by": "An administrator ({user}) ended your streaming session.",
"session-ended-reason-label": "Reason given",
"session-ended-title": "Session ended",
"show-bezel": "Mostrar moldura",
"show-older-versions": "Mostrar {count} versão anterior | Mostrar {count} versões anteriores",
"slot": "Slot",
"slot-name": "Nome do slot",
"slot-none": "Sem slot",
"slot-tooltip": "O progresso é salvo como novas versões neste slot, de onde outros dispositivos o recebem.",
"slot-versions": "{count} versão | {count} versões",
"start-fresh-hint": "Escolha um abaixo para retomar, ou clique em Jogar para começar do zero.",
"state-incompatible-core": "Salvo com {emulator}, que o core selecionado não consegue carregar.",
"state-kept-for-later": "State guardado neste navegador, será sincronizado depois",
"state-loaded": "State carregado do servidor",
"state-not-kept": "Não foi possível sincronizar o state, e este navegador não pode guardá-lo para depois",
"state-not-synced": "Seu último state ainda não chegou ao servidor. Ele fica guardado neste navegador e o RomM continua tentando em segundo plano.",
"state-sync-refused": "O servidor recusou o state que estava guardado de {game}: {reason}. Ele não fica mais neste navegador.",
"state-synced": "State sincronizado com o servidor",
"states-view": "State view",
"states-view-grid": "Grid",
"states-view-list": "List",
"states-view-strip": "Row",
"stream-error-generic": "Ocorreu um erro inesperado.",
"stream-error-import-refused": "Não foi possível usar o save ou state selecionado.",
"stream-error-load-rom": "Não foi possível carregar os detalhes da ROM.",
"stream-error-not-configured": "Nenhum contêiner de streaming está configurado para {platform}.",
"stream-error-rom-not-found": "Esta ROM não foi encontrada. Ela pode ter sido removida.",
"stream-exit-fullscreen": "Sair da tela cheia",
"stream-frame-title": "Transmissão do jogo",
"stream-fullscreen": "Tela cheia",
"stream-load-state": "Carregar estado",
"stream-load-state-failed": "The state could not be loaded.",
"stream-mute": "Silenciar",
"stream-occupied-body": "{rom} está sendo jogado desde {time}.",
"stream-occupied-draining": "A sessão anterior ainda está sendo encerrada. Tente novamente em instantes.",
"stream-occupied-fallback": "Outra pessoa está jogando no momento. Tente novamente mais tarde.",
"stream-occupied-title": "Sessão em uso",
"stream-release-failed": "The session could not be released. The container may still be in use.",
"stream-save-and-exit": "Salvar e sair",
"stream-save-state": "Salvar estado",
"stream-save-state-failed": "The state could not be saved.",
"stream-save-unconfirmed": "O emulador não confirmou o salvamento. O progresso recente pode ser perdido.",
"stream-stop": "Parar",
"stream-subtitle": "Transmissão",
"stream-swap-disc": "Trocar disco",
"stream-try-again": "Tentar novamente",
"stream-unknown-game": "Jogo desconhecido",
"stream-unmute": "Ativar som",
"stream-volume": "Volume",
"streaming-description": "O jogo é executado em um contêiner {label} dedicado e transmitido diretamente para o seu navegador.",
"swap-disc-confirm": "Trocar",
"swap-disc-failed": "A troca de disco falhou. O console pode ainda estar no meio da troca, tente novamente.",
"swap-disc-text": "Escolha o disco que deseja carregar. O jogo continua rodando, então salve seu progresso dentro do jogo primeiro.",
"swap-disc-title": "Trocar disco",
"sync-save": "Sincronizar save",
"unmute": "Ativar som",
"upload-memory-card": "Enviar cartão"
}