v0.2.0: i18n 18 idiomas + pantalla ajustes + bancos multiidioma

Internacionalización completa:
- 18 ficheros .arb: es, en, fr, pt, de, it, ru, ja, ko, zh, zh_TW, ar, hi, tr, pl, nl, ca, eu
- Todos los strings extraídos de todas las pantallas
- Detección automática de idioma del sistema
- Selector manual en pantalla de ajustes

Pantalla de ajustes nueva:
- Selector de idioma con banderas emoji
- Vibración ON/OFF
- Acerca de (versión, desarrollador)

Bancos de palabras multiidioma:
- palabras.json (castellano, 1000 palabras)
- palabras_en.json (inglés, 1000 palabras)
- palabras_fr.json (francés, 1000 palabras)
- Fallback a castellano si no hay banco del idioma

13138 líneas Dart, 39 ficheros, 0 issues en flutter analyze
This commit is contained in:
ShanaiaBot
2026-04-04 01:18:09 +02:00
parent de2c8ffa18
commit 1bca50af1d
56 changed files with 14389 additions and 201 deletions

224
lib/l10n/app_pt.arb Normal file
View File

@@ -0,0 +1,224 @@
{
"@@locale": "pt",
"appTitle": "O Impostor",
"subtitle": "Jogo de dedução social",
"loadingWords": "Carregando palavras...",
"playersRange": "3-20 jogadores • Sem internet",
"createGame": "Criar partida",
"joinGame": "Entrar na partida",
"howToPlay": "Como jogar",
"settings": "Configurações",
"gameMode": "Modo de jogo",
"singleDevice": "Um só celular",
"multiDevice": "Multicelular",
"category": "Categoria",
"categoryAll": "Todas",
"categoryAnimals": "Animais",
"categoryFood": "Comida",
"categoryCountries": "Países",
"categorySports": "Esportes",
"categoryProfessions": "Profissões",
"categoryObjects": "Objetos",
"categoryPlaces": "Lugares",
"categoryMovies": "Filmes",
"categoryMusic": "Música",
"categoryTechnology": "Tecnologia",
"playersCount": "Jogadores ({count})",
"@playersCount": {
"placeholders": {
"count": {"type": "int"}
}
},
"playersRangeHint": "3-20",
"playerNameHint": "Nome do jogador",
"playerAlreadyExists": "Já existe um jogador com esse nome",
"maxPlayersReached": "Máximo de 20 jogadores",
"minPlayersRequired": "São necessários pelo menos 3 jogadores",
"configuration": "Configuração",
"impostors": "🎭 Impostores",
"impostorClue": "🔍 Dica para o impostor",
"impostorClueDescription": "O impostor conhece a categoria",
"debateTime": "⏱️ Tempo de debate",
"noLimit": "Sem limite",
"oneMin": "1 min",
"twoMin": "2 min",
"threeMin": "3 min",
"fiveMin": "5 min",
"startGame": "Iniciar partida",
"seeYourWord": "Ver sua palavra",
"eachPlayerMustSee": "Cada jogador deve ver sua palavra em segredo",
"roundNumber": "Rodada {round}",
"@roundNumber": {
"placeholders": {
"round": {"type": "int"}
}
},
"alreadySeen": "Já viu sua palavra",
"tapToSee": "Toque para ver",
"allSeenStartDebate": "Todos viram → Iniciar debate",
"playersRemaining": "Faltam {count} jogadores",
"@playersRemaining": {
"placeholders": {
"count": {"type": "int"}
}
},
"youAreImpostor": "Você é o impostor!",
"yourWordIs": "Sua palavra é:",
"clueCategory": "Dica: {category}",
"@clueCategory": {
"placeholders": {
"category": {"type": "String"}
}
},
"holdToSeeWord": "Mantenha pressionado para ver sua palavra",
"makeSureNoOneLooks": "Certifique-se de que ninguém mais está olhando",
"showingWord": "👁️ Mostrando...",
"holdToSee": "👆 Mantenha pressionado para ver",
"seenMyWord": "Já vi minha palavra",
"debateRound": "Debate - Rodada {round}",
"@debateRound": {
"placeholders": {
"round": {"type": "int"}
}
},
"timeUp": "⏰ Tempo esgotado!",
"timeRemaining": "⏱️ Tempo restante",
"playersInDebate": "Jogadores no debate",
"activePlayersInfo": "{active} ativos • {impostors} impostor(es) ocultos",
"@activePlayersInfo": {
"placeholders": {
"active": {"type": "int"},
"impostors": {"type": "int"}
}
},
"eliminated": "Eliminado",
"notes": "Notas",
"goToVoting": "Ir para votação",
"voting": "🗳️ Votação",
"turnToVote": "Vez de votar:",
"votesProgress": "Votos: {current}/{total}",
"@votesProgress": {
"placeholders": {
"current": {"type": "int"},
"total": {"type": "int"}
}
},
"whoIsImpostor": "Quem você acha que é o impostor?",
"confirmVote": "Confirmar voto",
"votingComplete": "🗳️ Votação completa",
"allVoted": "Todos votaram!",
"tapToReveal": "Toque para revelar o resultado",
"revealResult": "Revelar resultado",
"result": "Resultado",
"revealing": "Revelando...",
"wasImpostor": "Era IMPOSTOR! 🎉",
"wasInnocent": "Era INOCENTE 😱",
"votesThisRound": "Votos desta rodada",
"seeEndResult": "Ver resultado final",
"impostorGuessWord": "O impostor adivinha a palavra?",
"nextRound": "Próxima rodada",
"impostorGuessTitle": "🎯 Palpite do impostor",
"impostorCanGuess": "O impostor eliminado pode\ntentar adivinhar a palavra",
"ifCorrectImpostorsWin": "Se acertar, os impostores vencem!",
"guessWordHint": "Qual você acha que é a palavra?",
"dontGuess": "Não tentar",
"guess": "Adivinhar",
"correctGuess": "Acertou!",
"theWordWas": "A palavra era: {word}",
"@theWordWas": {
"placeholders": {
"word": {"type": "String"}
}
},
"impostorsWin": "Os impostores vencem!",
"wrongGuess": "Não acertou!",
"gameContinues": "A partida continua...",
"gameOver": "Fim de partida",
"playersWin": "Os jogadores vencem!",
"theSecretWordWas": "🔍 A palavra era:",
"categoryLabel": "Categoria: {category}",
"@categoryLabel": {
"placeholders": {
"category": {"type": "String"}
}
},
"theImpostorWas": "🎭 O impostor era:",
"theImpostorsWere": "🎭 Os impostores eram:",
"votingHistory": "📊 Histórico de votações",
"roundElimination": "Rodada {round}: {name}",
"@roundElimination": {
"placeholders": {
"round": {"type": "int"},
"name": {"type": "String"}
}
},
"rematch": "Revanche",
"mainMenu": "Menu principal",
"notesTitle": "📝 Notas",
"notesSaved": "Notas salvas",
"whoAreYou": "Quem é você?",
"selectYourName": "Selecione seu nome para ver suas notas privadas",
"notesOf": "Notas de {name}",
"@notesOf": {
"placeholders": {
"name": {"type": "String"}
}
},
"notesAboutPlayers": "Anotações sobre cada jogador",
"playerNoteHint": "O que disse? Suspeito?",
"freeNote": "Nota livre",
"freeNoteHint": "Anotações pessoais...",
"rulesTitle": "📖 Como jogar",
"rulesWhatIsTitle": "🎭 O que é O Impostor?",
"rulesWhatIsBody": "Um jogo de dedução social para 3-20 jogadores. Todos recebem uma palavra secreta... exceto o impostor! Sua missão: descobrir quem está fingindo.",
"rulesHowToPlayTitle": "🔍 Como se joga?",
"rulesHowToPlayBody": "1. Os papéis são distribuídos: todos recebem a mesma palavra, exceto o(s) impostor(es).\n\n2. Debate: por turnos, cada jogador descreve a palavra SEM dizê-la diretamente. O impostor deve fingir que a conhece.\n\n3. Votação: ao terminar o debate, todos votam em quem acham que é o impostor.\n\n4. Eliminação: o mais votado é eliminado e revela-se se era impostor ou não.\n\n5. Se era impostor, pode tentar adivinhar a palavra. Se acertar, os impostores vencem!",
"rulesWhoWinsTitle": "🏆 Quem ganha?",
"rulesWhoWinsBody": "• Jogadores: vencem se eliminarem TODOS os impostores.\n• Impostores: vencem se não forem descobertos até que restem igual ou menos jogadores normais que impostores, ou se adivinharem a palavra ao serem eliminados.",
"rulesTipsPlayersTitle": "💡 Dicas para jogadores",
"rulesTipsPlayersBody": "• Dê dicas sutis que provem que você conhece a palavra, mas não tão óbvias que o impostor as use.\n• Observe quem dá respostas vagas ou genéricas.\n• Use as notas para anotar o que cada um diz.\n• Não diga a palavra diretamente, isso ajuda o impostor!",
"rulesTipsImpostorTitle": "🎭 Dicas para o impostor",
"rulesTipsImpostorBody": "• Ouça atentamente as dicas dos outros.\n• Tente deduzir a palavra para dar dicas convincentes.\n• Não seja o primeiro a falar se não tiver certeza.\n• Se receberem a categoria como dica, use a seu favor.\n• Acuse outros para desviar a atenção.",
"rulesModesTitle": "📱 Modos de jogo",
"rulesModesBody": "• Um só celular: todos compartilham o dispositivo. Cada jogador vê sua palavra pressionando e segurando um botão.\n\n• Multicelular: cada jogador usa seu próprio dispositivo. Conectam-se por Bluetooth/WiFi Direct sem necessidade de internet.",
"rulesExampleTitle": "✏️ Exemplo de partida",
"rulesExampleBody": "Palavra secreta: \"Pizza\"\n\n• João: \"Se come quente\" ✓\n• Maria: \"Vem numa caixa\" ✓\n• Pedro (impostor): \"É muito popular\" 🤔\n• Ana: \"Tem queijo\" ✓\n\nPedro deu uma resposta muito genérica... Suspeito!",
"joinGameTitle": "Entrar na partida",
"multiDeviceMode": "Modo multicelular",
"scanQrDescription": "Escaneie o código QR exibido pelo anfitrião para se conectar à partida via Bluetooth/WiFi Direct.",
"comingSoon": "Em breve",
"nearbyNotAvailable": "A conexão multicelular com Nearby Connections requer dispositivos Android físicos.\n\nPor enquanto, use o modo \"Um só celular\" para jogar em um dispositivo compartilhado.",
"back": "Voltar",
"yes": "Sim",
"no": "Não",
"cancel": "Cancelar",
"accept": "Aceitar",
"next": "Próximo",
"settingsTitle": "Configurações",
"language": "Idioma",
"soundVolume": "Volume dos efeitos",
"vibration": "Vibração",
"about": "Sobre",
"version": "Versão",
"developer": "Desenvolvedor",
"licenses": "Licenças"
}