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,473 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Korean (`ko`).
class AppLocalizationsKo extends AppLocalizations {
AppLocalizationsKo([String locale = 'ko']) : super(locale);
@override
String get appTitle => '임포스터';
@override
String get subtitle => '사회적 추리 게임';
@override
String get loadingWords => '단어 불러오는 중...';
@override
String get playersRange => '3-20명 • 인터넷 불필요';
@override
String get createGame => '게임 만들기';
@override
String get joinGame => '게임 참가';
@override
String get howToPlay => '게임 방법';
@override
String get settings => '설정';
@override
String get gameMode => '게임 모드';
@override
String get singleDevice => '기기 하나로';
@override
String get multiDevice => '여러 기기로';
@override
String get category => '카테고리';
@override
String get categoryAll => '전체';
@override
String get categoryAnimals => '동물';
@override
String get categoryFood => '음식';
@override
String get categoryCountries => '나라';
@override
String get categorySports => '스포츠';
@override
String get categoryProfessions => '직업';
@override
String get categoryObjects => '사물';
@override
String get categoryPlaces => '장소';
@override
String get categoryMovies => '영화';
@override
String get categoryMusic => '음악';
@override
String get categoryTechnology => '기술';
@override
String playersCount(int count) {
return '플레이어 ($count)';
}
@override
String get playersRangeHint => '3-20';
@override
String get playerNameHint => '플레이어 이름';
@override
String get playerAlreadyExists => '같은 이름의 플레이어가 이미 있습니다';
@override
String get maxPlayersReached => '최대 20명까지 가능합니다';
@override
String get minPlayersRequired => '최소 3명이 필요합니다';
@override
String get configuration => '설정';
@override
String get impostors => '🎭 임포스터';
@override
String get impostorClue => '🔍 임포스터 힌트';
@override
String get impostorClueDescription => '임포스터가 카테고리를 알 수 있습니다';
@override
String get debateTime => '⏱️ 토론 시간';
@override
String get noLimit => '제한 없음';
@override
String get oneMin => '1분';
@override
String get twoMin => '2분';
@override
String get threeMin => '3분';
@override
String get fiveMin => '5분';
@override
String get startGame => '게임 시작';
@override
String get seeYourWord => '내 단어 보기';
@override
String get eachPlayerMustSee => '각 플레이어는 비밀리에 자신의 단어를 확인하세요';
@override
String roundNumber(int round) {
return '라운드 $round';
}
@override
String get alreadySeen => '단어를 이미 확인함';
@override
String get tapToSee => '탭하여 확인';
@override
String get allSeenStartDebate => '모두 확인 완료 → 토론 시작';
@override
String playersRemaining(int count) {
return '나머지 $count명';
}
@override
String get youAreImpostor => '당신은 임포스터입니다!';
@override
String get yourWordIs => '당신의 단어:';
@override
String clueCategory(String category) {
return '힌트: $category';
}
@override
String get holdToSeeWord => '길게 눌러 단어를 확인하세요';
@override
String get makeSureNoOneLooks => '아무도 보지 않는지 확인하세요';
@override
String get showingWord => '👁️ 표시 중...';
@override
String get holdToSee => '👆 길게 눌러 확인';
@override
String get seenMyWord => '내 단어를 확인했습니다';
@override
String debateRound(int round) {
return '토론 - 라운드 $round';
}
@override
String get timeUp => '⏰ 시간 종료!';
@override
String get timeRemaining => '⏱️ 남은 시간';
@override
String get playersInDebate => '토론 중인 플레이어';
@override
String activePlayersInfo(int active, int impostors) {
return '$active명 참여 중 • $impostors명의 임포스터 잠복 중';
}
@override
String get eliminated => '탈락';
@override
String get notes => '메모';
@override
String get goToVoting => '투표하러 가기';
@override
String get voting => '🗳️ 투표';
@override
String get turnToVote => '투표할 차례:';
@override
String votesProgress(int current, int total) {
return '투표: $current/$total';
}
@override
String get whoIsImpostor => '누가 임포스터라고 생각하나요?';
@override
String get confirmVote => '투표 확인';
@override
String get votingComplete => '🗳️ 투표 완료';
@override
String get allVoted => '모두 투표했습니다!';
@override
String get tapToReveal => '탭하여 결과 확인';
@override
String get revealResult => '결과 공개';
@override
String get result => '결과';
@override
String get revealing => '공개 중...';
@override
String get wasImpostor => '임포스터였습니다! 🎉';
@override
String get wasInnocent => '일반 시민이었습니다 😱';
@override
String get votesThisRound => '이번 라운드 투표';
@override
String get seeEndResult => '최종 결과 보기';
@override
String get impostorGuessWord => '임포스터가 단어를 맞출까요?';
@override
String get nextRound => '다음 라운드';
@override
String get impostorGuessTitle => '🎯 임포스터의 추측';
@override
String get impostorCanGuess => '탈락한 임포스터가\n단어를 맞출 수 있습니다';
@override
String get ifCorrectImpostorsWin => '정답이면 임포스터의 승리!';
@override
String get guessWordHint => '단어가 무엇이라고 생각하나요?';
@override
String get dontGuess => '시도 안 함';
@override
String get guess => '맞추기';
@override
String get correctGuess => '정답입니다!';
@override
String theWordWas(String word) {
return '단어는: $word';
}
@override
String get impostorsWin => '임포스터 승리!';
@override
String get wrongGuess => '오답입니다!';
@override
String get gameContinues => '게임이 계속됩니다...';
@override
String get gameOver => '게임 종료';
@override
String get playersWin => '플레이어 승리!';
@override
String get theSecretWordWas => '🔍 단어는:';
@override
String categoryLabel(String category) {
return '카테고리: $category';
}
@override
String get theImpostorWas => '🎭 임포스터는:';
@override
String get theImpostorsWere => '🎭 임포스터들은:';
@override
String get votingHistory => '📊 투표 기록';
@override
String roundElimination(int round, String name) {
return '라운드 $round: $name';
}
@override
String get rematch => '재대결';
@override
String get mainMenu => '메인 메뉴';
@override
String get notesTitle => '📝 메모';
@override
String get notesSaved => '메모가 저장되었습니다';
@override
String get whoAreYou => '당신은 누구인가요?';
@override
String get selectYourName => '이름을 선택하여 개인 메모를 확인하세요';
@override
String notesOf(String name) {
return '$name의 메모';
}
@override
String get notesAboutPlayers => '각 플레이어에 대한 메모';
@override
String get playerNoteHint => '뭐라고 했나? 수상한가?';
@override
String get freeNote => '자유 메모';
@override
String get freeNoteHint => '개인 메모...';
@override
String get rulesTitle => '📖 게임 방법';
@override
String get rulesWhatIsTitle => '🎭 임포스터란?';
@override
String get rulesWhatIsBody =>
'3~20명이 즐기는 사회적 추리 게임입니다. 모두가 비밀 단어를 받지만... 임포스터만 받지 못합니다! 당신의 임무: 누가 아는 척하는지 찾아내세요.';
@override
String get rulesHowToPlayTitle => '🔍 어떻게 하나요?';
@override
String get rulesHowToPlayBody =>
'1. 역할 배분: 모든 플레이어가 같은 단어를 받지만, 임포스터는 받지 못합니다.\n\n2. 토론: 차례대로 각 플레이어가 단어를 직접 말하지 않고 설명합니다. 임포스터는 아는 척해야 합니다.\n\n3. 투표: 토론이 끝나면 모두가 임포스터라고 생각하는 사람에게 투표합니다.\n\n4. 탈락: 가장 많은 표를 받은 사람이 탈락하고, 임포스터였는지 밝혀집니다.\n\n5. 임포스터였다면 단어를 맞출 기회가 있습니다. 맞추면 임포스터 승리!';
@override
String get rulesWhoWinsTitle => '🏆 누가 이기나요?';
@override
String get rulesWhoWinsBody =>
'• 플레이어: 모든 임포스터를 탈락시키면 승리.\n• 임포스터: 발각되지 않고 일반 플레이어 수가 임포스터 수 이하가 될 때까지 버티면 승리. 또는 탈락 시 단어를 맞추면 승리.';
@override
String get rulesTipsPlayersTitle => '💡 플레이어를 위한 팁';
@override
String get rulesTipsPlayersBody =>
'• 단어를 알고 있다는 것을 증명하는 미묘한 힌트를 주되, 임포스터가 이용할 수 있을 만큼 뻔하게 하지 마세요.\n• 모호하거나 일반적인 답변을 하는 사람을 주시하세요.\n• 메모를 활용하여 각자 한 말을 기록하세요.\n• 단어를 직접 말하지 마세요. 임포스터를 돕는 셈이 됩니다!';
@override
String get rulesTipsImpostorTitle => '🎭 임포스터를 위한 팁';
@override
String get rulesTipsImpostorBody =>
'• 다른 플레이어의 힌트를 주의 깊게 들으세요.\n• 단어를 추리하여 그럴듯한 힌트를 주세요.\n• 확신이 없으면 먼저 말하지 마세요.\n• 카테고리가 힌트로 주어졌다면 적극 활용하세요.\n• 다른 사람을 의심하여 주의를 돌리세요.';
@override
String get rulesModesTitle => '📱 게임 모드';
@override
String get rulesModesBody =>
'• 기기 하나로: 모두가 한 기기를 공유합니다. 각 플레이어가 버튼을 길게 눌러 자신의 단어를 확인합니다.\n\n• 여러 기기로: 각 플레이어가 자신의 기기를 사용합니다. Bluetooth/WiFi Direct로 연결하며 인터넷이 필요 없습니다.';
@override
String get rulesExampleTitle => '✏️ 게임 예시';
@override
String get rulesExampleBody =>
'비밀 단어: \"피자\"\n\n• 수진: \"뜨거울 때 먹어요\"\n• 민수: \"상자에 들어 있어요\"\n• 지은 (임포스터): \"아주 인기 있어요\" 🤔\n• 현우: \"치즈가 올려져 있어요\"\n\n지은이 너무 일반적인 답변을 했네요... 수상해요!';
@override
String get joinGameTitle => '게임 참가';
@override
String get multiDeviceMode => '여러 기기 모드';
@override
String get scanQrDescription =>
'호스트가 보여주는 QR 코드를 스캔하여 Bluetooth/WiFi Direct로 게임에 접속하세요.';
@override
String get comingSoon => '곧 출시';
@override
String get nearbyNotAvailable =>
'여러 기기 연결을 위한 Nearby Connections는 실제 Android 기기가 필요합니다.\n\n현재는 \"기기 하나로\" 모드를 사용하여 하나의 기기에서 플레이하세요.';
@override
String get back => '뒤로';
@override
String get yes => '';
@override
String get no => '아니오';
@override
String get cancel => '취소';
@override
String get accept => '확인';
@override
String get next => '다음';
@override
String get settingsTitle => '설정';
@override
String get language => '언어';
@override
String get soundVolume => '효과음 볼륨';
@override
String get vibration => '진동';
@override
String get about => '앱 정보';
@override
String get version => '버전';
@override
String get developer => '개발자';
@override
String get licenses => '라이선스';
}