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

View File

@@ -0,0 +1,474 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'The Impostor';
@override
String get subtitle => 'Social deduction game';
@override
String get loadingWords => 'Loading words...';
@override
String get playersRange => '3-20 players • No internet needed';
@override
String get createGame => 'Create game';
@override
String get joinGame => 'Join game';
@override
String get howToPlay => 'How to play';
@override
String get settings => 'Settings';
@override
String get gameMode => 'Game mode';
@override
String get singleDevice => 'Single device';
@override
String get multiDevice => 'Multi-device';
@override
String get category => 'Category';
@override
String get categoryAll => 'All';
@override
String get categoryAnimals => 'Animals';
@override
String get categoryFood => 'Food';
@override
String get categoryCountries => 'Countries';
@override
String get categorySports => 'Sports';
@override
String get categoryProfessions => 'Professions';
@override
String get categoryObjects => 'Objects';
@override
String get categoryPlaces => 'Places';
@override
String get categoryMovies => 'Movies';
@override
String get categoryMusic => 'Music';
@override
String get categoryTechnology => 'Technology';
@override
String playersCount(int count) {
return 'Players ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => 'Player name';
@override
String get playerAlreadyExists => 'A player with that name already exists';
@override
String get maxPlayersReached => 'Maximum 20 players';
@override
String get minPlayersRequired => 'At least 3 players are needed';
@override
String get configuration => 'Configuration';
@override
String get impostors => '🎭 Impostors';
@override
String get impostorClue => '🔍 Clue for impostor';
@override
String get impostorClueDescription => 'The impostor knows the category';
@override
String get debateTime => '⏱️ Discussion time';
@override
String get noLimit => 'No limit';
@override
String get oneMin => '1 min';
@override
String get twoMin => '2 min';
@override
String get threeMin => '3 min';
@override
String get fiveMin => '5 min';
@override
String get startGame => 'Start game';
@override
String get seeYourWord => 'See your word';
@override
String get eachPlayerMustSee => 'Each player must see their word in secret';
@override
String roundNumber(int round) {
return 'Round $round';
}
@override
String get alreadySeen => 'Already seen their word';
@override
String get tapToSee => 'Tap to see';
@override
String get allSeenStartDebate => 'Everyone has seen → Start discussion';
@override
String playersRemaining(int count) {
return '$count players remaining';
}
@override
String get youAreImpostor => 'You are the impostor!';
@override
String get yourWordIs => 'Your word is:';
@override
String clueCategory(String category) {
return 'Clue: $category';
}
@override
String get holdToSeeWord => 'Hold to see your word';
@override
String get makeSureNoOneLooks => 'Make sure no one else is looking';
@override
String get showingWord => '👁️ Showing...';
@override
String get holdToSee => '👆 Hold to see';
@override
String get seenMyWord => 'I\'ve seen my word';
@override
String debateRound(int round) {
return 'Discussion - Round $round';
}
@override
String get timeUp => '⏰ Time\'s up!';
@override
String get timeRemaining => '⏱️ Time remaining';
@override
String get playersInDebate => 'Players in discussion';
@override
String activePlayersInfo(int active, int impostors) {
return '$active active • $impostors hidden impostor(s)';
}
@override
String get eliminated => 'Eliminated';
@override
String get notes => 'Notes';
@override
String get goToVoting => 'Go to voting';
@override
String get voting => '🗳️ Voting';
@override
String get turnToVote => 'Your turn to vote:';
@override
String votesProgress(int current, int total) {
return 'Votes: $current/$total';
}
@override
String get whoIsImpostor => 'Who do you think is the impostor?';
@override
String get confirmVote => 'Confirm vote';
@override
String get votingComplete => '🗳️ Voting complete';
@override
String get allVoted => 'Everyone has voted!';
@override
String get tapToReveal => 'Tap to reveal the result';
@override
String get revealResult => 'Reveal result';
@override
String get result => 'Result';
@override
String get revealing => 'Revealing...';
@override
String get wasImpostor => 'Was the IMPOSTOR! 🎉';
@override
String get wasInnocent => 'Was INNOCENT 😱';
@override
String get votesThisRound => 'Votes this round';
@override
String get seeEndResult => 'See final result';
@override
String get impostorGuessWord => 'Can the impostor guess the word?';
@override
String get nextRound => 'Next round';
@override
String get impostorGuessTitle => '🎯 Impostor\'s guess';
@override
String get impostorCanGuess =>
'The eliminated impostor can\ntry to guess the word';
@override
String get ifCorrectImpostorsWin => 'If correct, the impostors win!';
@override
String get guessWordHint => 'What do you think the word is?';
@override
String get dontGuess => 'Don\'t guess';
@override
String get guess => 'Guess';
@override
String get correctGuess => 'Correct guess!';
@override
String theWordWas(String word) {
return 'The word was: $word';
}
@override
String get impostorsWin => 'The impostors win!';
@override
String get wrongGuess => 'Wrong guess!';
@override
String get gameContinues => 'The game continues...';
@override
String get gameOver => 'Game over';
@override
String get playersWin => 'The players win!';
@override
String get theSecretWordWas => '🔍 The word was:';
@override
String categoryLabel(String category) {
return 'Category: $category';
}
@override
String get theImpostorWas => '🎭 The impostor was:';
@override
String get theImpostorsWere => '🎭 The impostors were:';
@override
String get votingHistory => '📊 Voting history';
@override
String roundElimination(int round, String name) {
return 'Round $round: $name';
}
@override
String get rematch => 'Rematch';
@override
String get mainMenu => 'Main menu';
@override
String get notesTitle => '📝 Notes';
@override
String get notesSaved => 'Notes saved';
@override
String get whoAreYou => 'Who are you?';
@override
String get selectYourName => 'Select your name to view your private notes';
@override
String notesOf(String name) {
return '$name\'s notes';
}
@override
String get notesAboutPlayers => 'Notes about each player';
@override
String get playerNoteHint => 'What did they say? Suspicious?';
@override
String get freeNote => 'Free note';
@override
String get freeNoteHint => 'Personal notes...';
@override
String get rulesTitle => '📖 How to play';
@override
String get rulesWhatIsTitle => '🎭 What is The Impostor?';
@override
String get rulesWhatIsBody =>
'A social deduction game for 3-20 players. Everyone receives a secret word... except the impostor! Your mission: figure out who\'s faking it.';
@override
String get rulesHowToPlayTitle => '🔍 How do you play?';
@override
String get rulesHowToPlayBody =>
'1. Roles are dealt: everyone receives the same word, except the impostor(s).\n\n2. Discussion: taking turns, each player describes the word WITHOUT saying it directly. The impostor must pretend they know it.\n\n3. Voting: once the discussion ends, everyone votes on who they think the impostor is.\n\n4. Elimination: the player with the most votes is eliminated and it is revealed whether they were the impostor or not.\n\n5. If they were the impostor, they can try to guess the word. If they get it right, the impostors win!';
@override
String get rulesWhoWinsTitle => '🏆 Who wins?';
@override
String get rulesWhoWinsBody =>
'• Players: win by eliminating ALL impostors.\n• Impostors: win if they remain undiscovered until there are equal or fewer regular players than impostors, or if they guess the word when eliminated.';
@override
String get rulesTipsPlayersTitle => '💡 Tips for players';
@override
String get rulesTipsPlayersBody =>
'• Give subtle clues that prove you know the word, but not so obvious that the impostor can use them.\n• Watch for vague or generic answers.\n• Use the notes to jot down what everyone says.\n• Don\'t say the word directly — that helps the impostor!';
@override
String get rulesTipsImpostorTitle => '🎭 Tips for the impostor';
@override
String get rulesTipsImpostorBody =>
'• Listen carefully to the others\' clues.\n• Try to deduce the word so you can give believable clues.\n• Don\'t be the first to speak if you\'re unsure.\n• If you\'re given the category as a clue, use it to your advantage.\n• Accuse others to divert attention.';
@override
String get rulesModesTitle => '📱 Game modes';
@override
String get rulesModesBody =>
'• Single device: everyone shares the device. Each player sees their word by pressing and holding a button.\n\n• Multi-device: each player uses their own device. They connect via Bluetooth/WiFi Direct with no internet needed.';
@override
String get rulesExampleTitle => '✏️ Example round';
@override
String get rulesExampleBody =>
'Secret word: \"Pizza\"\n\n• Anna: \"You eat it hot\"\n• Charles: \"It comes in a box\"\n• Eve (impostor): \"It\'s very popular\" 🤔\n• David: \"It has cheese\"\n\nEve gave a very generic answer... Suspicious!';
@override
String get joinGameTitle => 'Join game';
@override
String get multiDeviceMode => 'Multi-device mode';
@override
String get scanQrDescription =>
'Scan the QR code shown by the host to connect to the game via Bluetooth/WiFi Direct.';
@override
String get comingSoon => 'Coming soon';
@override
String get nearbyNotAvailable =>
'Multi-device connection with Nearby Connections requires physical Android devices.\n\nFor now, use the \"Single device\" mode to play on a shared device.';
@override
String get back => 'Back';
@override
String get yes => 'Yes';
@override
String get no => 'No';
@override
String get cancel => 'Cancel';
@override
String get accept => 'Accept';
@override
String get next => 'Next';
@override
String get settingsTitle => 'Settings';
@override
String get language => 'Language';
@override
String get soundVolume => 'Sound effects volume';
@override
String get vibration => 'Vibration';
@override
String get about => 'About';
@override
String get version => 'Version';
@override
String get developer => 'Developer';
@override
String get licenses => 'Licenses';
}