// 게임 텍스트 로컬라이제이션 (BuildContext 없이 사용) // progress_service.dart, pq_logic.dart 등에서 사용 // 지원 언어: 한국어(ko), 영어(en), 일본어(ja) import 'package:askiineverdie/data/game_translations_ko.dart'; import 'package:askiineverdie/data/game_translations_ja.dart'; /// 현재 게임 로케일 설정 (전역) String _currentLocale = 'en'; /// 현재 로케일 가져오기 String get currentGameLocale => _currentLocale; /// 로케일 설정 (앱 시작 시 호출) void setGameLocale(String locale) { _currentLocale = locale; } /// 한국어 여부 확인 bool get isKoreanLocale => _currentLocale == 'ko'; /// 일본어 여부 확인 bool get isJapaneseLocale => _currentLocale == 'ja'; // ============================================================================ // 프롤로그 텍스트 // ============================================================================ const _prologueTextsEn = [ 'Receiving an ominous vision from the Code God', 'The old Compiler Sage reveals a prophecy: "The Glitch God has awakened"', 'A sudden Buffer Overflow resets your village, leaving you as the sole survivor', 'With unexpected resolve, you embark on a perilous journey to the Null Kingdom', ]; const _prologueTextsKo = [ '코드의 신으로부터 불길한 환영을 받다', '늙은 컴파일러 현자가 예언을 밝히다: "글리치 신이 깨어났다"', '갑작스러운 버퍼 오버플로우가 마을을 초기화하고, 당신만이 유일한 생존자로 남다', '예상치 못한 결의로 널(Null) 왕국을 향한 위험한 여정을 시작하다', ]; const _prologueTextsJa = [ 'コードの神から不吉な幻影を受ける', '老いたコンパイラー賢者が予言を明かす:「グリッチゴッドが目覚めた」', '突然のバッファオーバーフローが村をリセットし、あなただけが唯一の生存者となる', '予想外の決意で、ヌル(Null)王国への危険な旅に出発する', ]; List get prologueTexts { if (isKoreanLocale) return _prologueTextsKo; if (isJapaneseLocale) return _prologueTextsJa; return _prologueTextsEn; } // ============================================================================ // 태스크 캡션 // ============================================================================ String get taskCompiling { if (isKoreanLocale) return '컴파일 중'; if (isJapaneseLocale) return 'コンパイル中'; return 'Compiling'; } String get taskPrologue { if (isKoreanLocale) return '프롤로그'; if (isJapaneseLocale) return 'プロローグ'; return 'Prologue'; } String taskHeadingToMarket() { if (isKoreanLocale) return '전리품을 팔기 위해 데이터 마켓으로 이동 중'; if (isJapaneseLocale) return '戦利品を売るためデータマーケットへ移動中'; return 'Heading to the Data Market to trade loot'; } String taskUpgradingHardware() { if (isKoreanLocale) return '테크 샵에서 하드웨어 업그레이드 중'; if (isJapaneseLocale) return 'テックショップでハードウェアをアップグレード中'; return 'Upgrading hardware at the Tech Shop'; } String taskEnteringDebugZone() { if (isKoreanLocale) return '디버그 존 진입 중'; if (isJapaneseLocale) return 'デバッグゾーンに進入中'; return 'Entering the Debug Zone'; } String taskDebugging(String monsterName) { if (isKoreanLocale) return '$monsterName 디버깅 중'; if (isJapaneseLocale) return '$monsterName をデバッグ中'; return 'Debugging $monsterName'; } String taskSelling(String itemDescription) { if (isKoreanLocale) return '$itemDescription 판매 중'; if (isJapaneseLocale) return '$itemDescription を販売中'; return 'Selling $itemDescription'; } // ============================================================================ // 퀘스트 캡션 // ============================================================================ String questPatch(String name) { if (isKoreanLocale) return '$name 패치하기'; if (isJapaneseLocale) return '$name をパッチする'; return 'Patch $name'; } String questLocate(String item) { if (isKoreanLocale) return '$item 찾기'; if (isJapaneseLocale) return '$item を探す'; return 'Locate $item'; } String questTransfer(String item) { if (isKoreanLocale) return '이 $item 전송하기'; if (isJapaneseLocale) return 'この$item を転送する'; return 'Transfer this $item'; } String questDownload(String item) { if (isKoreanLocale) return '$item 다운로드하기'; if (isJapaneseLocale) return '$item をダウンロードする'; return 'Download $item'; } String questStabilize(String name) { if (isKoreanLocale) return '$name 안정화하기'; if (isJapaneseLocale) return '$name を安定化する'; return 'Stabilize $name'; } // ============================================================================ // Act 제목 // ============================================================================ String actTitle(String romanNumeral) { if (isKoreanLocale) return '$romanNumeral막'; if (isJapaneseLocale) return '第$romanNumeral幕'; return 'Act $romanNumeral'; } // ============================================================================ // 시네마틱 텍스트 - 시나리오 1: 캐시 존 // ============================================================================ String cinematicCacheZone1() { if (isKoreanLocale) return '지쳐서 손상된 네트워크의 안전한 캐시 존에 도착하다'; if (isJapaneseLocale) return '疲れ果てて、破損したネットワークの安全なキャッシュゾーンに到着する'; return 'Exhausted, you reach a safe Cache Zone in the corrupted network'; } String cinematicCacheZone2() { if (isKoreanLocale) return '옛 동맹들과 재연결하고 새로운 동료들을 포크하다'; if (isJapaneseLocale) return '古い同盟者と再接続し、新しい仲間をフォークする'; return 'You reconnect with old allies and fork new ones'; } String cinematicCacheZone3() { if (isKoreanLocale) return '디버거 기사단 회의에 참석하다'; if (isJapaneseLocale) return 'デバッガー騎士団の会議に参加する'; return 'You attend a council of the Debugger Knights'; } String cinematicCacheZone4() { if (isKoreanLocale) return '많은 버그들이 기다린다. 당신이 패치하도록 선택되었다!'; if (isJapaneseLocale) return '多くのバグが待っている。あなたがパッチを当てるよう選ばれた!'; return 'Many bugs await. You are chosen to patch them!'; } // ============================================================================ // 시네마틱 텍스트 - 시나리오 2: 전투 // ============================================================================ String cinematicCombat1() { if (isKoreanLocale) return '목표가 눈앞에 있지만, 치명적인 버그가 길을 막는다!'; if (isJapaneseLocale) return 'ターゲットは目の前だが、致命的なバグが道を塞ぐ!'; return 'Your target is in sight, but a critical bug blocks your path!'; } String cinematicCombat2(String nemesis) { if (isKoreanLocale) return '$nemesis와의 필사적인 디버깅 세션이 시작되다'; if (isJapaneseLocale) return '$nemesisとの必死のデバッグセッションが始まる'; return 'A desperate debugging session begins with $nemesis'; } String cinematicCombatLocked(String nemesis) { if (isKoreanLocale) return '$nemesis와 치열한 디버깅 중'; if (isJapaneseLocale) return '$nemesisと激しいデバッグ中'; return 'Locked in intense debugging with $nemesis'; } String cinematicCombatCorrupts(String nemesis) { if (isKoreanLocale) return '$nemesis가 당신의 스택 트레이스를 손상시키다'; if (isJapaneseLocale) return '$nemesisがあなたのスタックトレースを破損させる'; return '$nemesis corrupts your stack trace'; } String cinematicCombatWorking(String nemesis) { if (isKoreanLocale) return '당신의 패치가 $nemesis에게 효과를 보이는 것 같다'; if (isJapaneseLocale) return 'あなたのパッチが$nemesisに効いているようだ'; return 'Your patch seems to be working against $nemesis'; } String cinematicCombatVictory(String nemesis) { if (isKoreanLocale) return '승리! $nemesis가 패치되었다! 복구를 위해 시스템이 재부팅된다'; if (isJapaneseLocale) return '勝利!$nemesisはパッチされた!復旧のためシステムが再起動する'; return 'Victory! $nemesis is patched! System reboots for recovery'; } String cinematicCombatWakeUp() { if (isKoreanLocale) return '안전 모드에서 깨어나지만, 커널이 기다린다'; if (isJapaneseLocale) return 'セーフモードで目覚めるが、カーネルが待ち構えている'; return 'You wake up in a Safe Mode, but the kernel awaits'; } // ============================================================================ // 시네마틱 텍스트 - 시나리오 3: 배신 // ============================================================================ String cinematicBetrayal1(String guy) { if (isKoreanLocale) return '안도감! $guy의 보안 서버에 도착하다'; if (isJapaneseLocale) return '安堵!$guyのセキュアサーバーに到着する'; return 'What relief! You reach the secure server of $guy'; } String cinematicBetrayal2(String guy) { if (isKoreanLocale) return '축하가 이어지고, $guy와 수상한 비밀 핸드셰이크를 나누다'; if (isJapaneseLocale) return '祝賀が続き、$guyと怪しい秘密のハンドシェイクを交わす'; return 'There is celebration, and a suspicious private handshake with $guy'; } String cinematicBetrayal3(String item) { if (isKoreanLocale) return '$item을 잊고 다시 가져오러 돌아가다'; if (isJapaneseLocale) return '$itemを忘れて取りに戻る'; return 'You forget your $item and go back to retrieve it'; } String cinematicBetrayal4() { if (isKoreanLocale) return '이게 뭐지!? 손상된 패킷을 가로채다!'; if (isJapaneseLocale) return 'これは何だ!?破損したパケットを傍受する!'; return 'What is this!? You intercept a corrupted packet!'; } String cinematicBetrayal5(String guy) { if (isKoreanLocale) return '$guy가 글리치 신의 백도어일 수 있을까?'; if (isJapaneseLocale) return '$guyはグリッチゴッドのバックドアなのか?'; return 'Could $guy be a backdoor for the Glitch God?'; } String cinematicBetrayal6() { if (isKoreanLocale) return '이 정보를 누구에게 맡길 수 있을까!? -- 바이너리 신전이다'; if (isJapaneseLocale) return 'この情報を誰に託せるか!? -- バイナリ神殿だ'; return 'Who can be trusted with this intel!? -- The Binary Temple, of course'; } // ============================================================================ // 몬스터 수식어 // ============================================================================ String modifierDead(String s) { if (isKoreanLocale) return '쓰러진 $s'; if (isJapaneseLocale) return '倒れた$s'; return 'fallen $s'; } String modifierComatose(String s) { if (isKoreanLocale) return '잠복하는 $s'; if (isJapaneseLocale) return '潜む$s'; return 'lurking $s'; } String modifierCrippled(String s) { if (isKoreanLocale) return '흉측한 $s'; if (isJapaneseLocale) return '歪んだ$s'; return 'twisted $s'; } String modifierSick(String s) { if (isKoreanLocale) return '오염된 $s'; if (isJapaneseLocale) return '汚染された$s'; return 'tainted $s'; } String modifierUndernourished(String s) { if (isKoreanLocale) return '굶주린 $s'; if (isJapaneseLocale) return '飢えた$s'; return 'ravenous $s'; } String modifierFoetal(String s) { if (isKoreanLocale) return '태동기 $s'; if (isJapaneseLocale) return '胎動期$s'; return 'nascent $s'; } String modifierBaby(String s) { if (isKoreanLocale) return '초기형 $s'; if (isJapaneseLocale) return '初期型$s'; return 'fledgling $s'; } String modifierPreadolescent(String s) { if (isKoreanLocale) return '진화 중인 $s'; if (isJapaneseLocale) return '進化中の$s'; return 'evolving $s'; } String modifierTeenage(String s) { if (isKoreanLocale) return '하급 $s'; if (isJapaneseLocale) return '下級$s'; return 'lesser $s'; } String modifierUnderage(String s) { if (isKoreanLocale) return '불완전한 $s'; if (isJapaneseLocale) return '不完全な$s'; return 'incomplete $s'; } String modifierGreater(String s) { if (isKoreanLocale) return '상위 $s'; if (isJapaneseLocale) return '上位$s'; return 'greater $s'; } String modifierMassive(String s) { if (isKoreanLocale) return '거대한 $s'; if (isJapaneseLocale) return '巨大な$s'; return 'massive $s'; } String modifierEnormous(String s) { if (isKoreanLocale) return '초거대 $s'; if (isJapaneseLocale) return '超巨大$s'; return 'enormous $s'; } String modifierGiant(String s) { if (isKoreanLocale) return '자이언트 $s'; if (isJapaneseLocale) return 'ジャイアント$s'; return 'giant $s'; } String modifierTitanic(String s) { if (isKoreanLocale) return '타이타닉 $s'; if (isJapaneseLocale) return 'タイタニック$s'; return 'titanic $s'; } String modifierVeteran(String s) { if (isKoreanLocale) return '베테랑 $s'; if (isJapaneseLocale) return 'ベテラン$s'; return 'veteran $s'; } String modifierBattle(String s) { if (isKoreanLocale) return '전투-$s'; if (isJapaneseLocale) return '戦闘-$s'; return 'Battle-$s'; } String modifierCursed(String s) { if (isKoreanLocale) return '저주받은 $s'; if (isJapaneseLocale) return '呪われた$s'; return 'cursed $s'; } String modifierWarrior(String s) { if (isKoreanLocale) return '전사 $s'; if (isJapaneseLocale) return '戦士$s'; return 'warrior $s'; } String modifierWere(String s) { if (isKoreanLocale) return '늑대인간-$s'; if (isJapaneseLocale) return '狼男-$s'; return 'Were-$s'; } String modifierUndead(String s) { if (isKoreanLocale) return '언데드 $s'; if (isJapaneseLocale) return 'アンデッド$s'; return 'undead $s'; } String modifierDemon(String s) { if (isKoreanLocale) return '데몬 $s'; if (isJapaneseLocale) return 'デーモン$s'; return 'demon $s'; } String modifierMessianic(String s) { if (isKoreanLocale) return '메시아닉 $s'; if (isJapaneseLocale) return 'メシアニック$s'; return 'messianic $s'; } String modifierImaginary(String s) { if (isKoreanLocale) return '상상의 $s'; if (isJapaneseLocale) return '想像上の$s'; return 'imaginary $s'; } String modifierPassing(String s) { if (isKoreanLocale) return '지나가는 $s'; if (isJapaneseLocale) return '通りすがりの$s'; return 'passing $s'; } // ============================================================================ // 시간 표시 // ============================================================================ String roughTimeSeconds(int seconds) { if (isKoreanLocale) return '$seconds초'; if (isJapaneseLocale) return '$seconds秒'; return '$seconds seconds'; } String roughTimeMinutes(int minutes) { if (isKoreanLocale) return '$minutes분'; if (isJapaneseLocale) return '$minutes分'; return '$minutes minutes'; } String roughTimeHours(int hours) { if (isKoreanLocale) return '$hours시간'; if (isJapaneseLocale) return '$hours時間'; return '$hours hours'; } String roughTimeDays(int days) { if (isKoreanLocale) return '$days일'; if (isJapaneseLocale) return '$days日'; return '$days days'; } // ============================================================================ // 영어 문법 함수 (한국어/일본어에서는 단순화) // ============================================================================ /// 관사 + 명사 (한국어/일본어: 수량만 표시) String indefiniteL10n(String s, int qty) { if (isKoreanLocale) { return qty == 1 ? s : '$qty $s'; } if (isJapaneseLocale) { return qty == 1 ? s : '$qty $s'; } // 영어 로직 if (qty == 1) { const vowels = 'AEIOUÜaeiouü'; final first = s.isNotEmpty ? s[0] : 'a'; final article = vowels.contains(first) ? 'an' : 'a'; return '$article $s'; } return '$qty ${_pluralize(s)}'; } /// the + 명사 (한국어/일본어: 그냥 명사) String definiteL10n(String s, int qty) { if (isKoreanLocale || isJapaneseLocale) { return s; } // 영어 로직 if (qty > 1) { s = _pluralize(s); } return 'the $s'; } /// 복수형 (영어만 해당) String _pluralize(String s) { if (s.endsWith('y')) return '${s.substring(0, s.length - 1)}ies'; if (s.endsWith('us')) return '${s.substring(0, s.length - 2)}i'; if (s.endsWith('ch') || s.endsWith('x') || s.endsWith('s')) return '${s}es'; if (s.endsWith('f')) return '${s.substring(0, s.length - 1)}ves'; if (s.endsWith('man') || s.endsWith('Man')) { return '${s.substring(0, s.length - 2)}en'; } return '${s}s'; // ignore: unnecessary_brace_in_string_interp } // ============================================================================ // impressiveGuy 관련 // ============================================================================ String impressiveGuyPattern1(String title, String race) { if (isKoreanLocale) { // ignore: unnecessary_brace_in_string_interps return '${race}들의 $title'; // 한국어 조사 연결을 위해 중괄호 필요 } if (isJapaneseLocale) { // ignore: unnecessary_brace_in_string_interps return '${race}たちの$title'; // 일본어 연결을 위해 중괄호 필요 } return 'the $title of the ${_pluralize(race)}'; } String impressiveGuyPattern2(String title, String name1, String name2) { if (isKoreanLocale) return '$name2의 $title $name1'; if (isJapaneseLocale) return '$name2の$title $name1'; return '$title $name1 of $name2'; } // ============================================================================ // namedMonster 관련 // ============================================================================ String namedMonsterFormat(String generatedName, String monsterType) { if (isKoreanLocale) return '$monsterType $generatedName'; if (isJapaneseLocale) return '$monsterType $generatedName'; return '$generatedName the $monsterType'; } // ============================================================================ // 게임 데이터 번역 함수 (BuildContext 없이 사용) // 지원 언어: 한국어(ko), 영어(en), 일본어(ja) // ============================================================================ /// 몬스터 이름 번역 (기본 + 고급 몬스터 포함) String translateMonster(String englishName) { if (isKoreanLocale) { return monsterTranslationsKo[englishName] ?? advancedMonsterTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return monsterTranslationsJa[englishName] ?? advancedMonsterTranslationsJa[englishName] ?? englishName; } return englishName; } /// 종족 이름 번역 String translateRace(String englishName) { if (isKoreanLocale) return raceTranslationsKo[englishName] ?? englishName; if (isJapaneseLocale) return raceTranslationsJa[englishName] ?? englishName; return englishName; } /// 직업 이름 번역 String translateKlass(String englishName) { if (isKoreanLocale) return klassTranslationsKo[englishName] ?? englishName; if (isJapaneseLocale) return klassTranslationsJa[englishName] ?? englishName; return englishName; } /// 칭호 이름 번역 String translateTitle(String englishName) { if (isKoreanLocale) return titleTranslationsKo[englishName] ?? englishName; if (isJapaneseLocale) return titleTranslationsJa[englishName] ?? englishName; return englishName; } /// 인상적인 칭호 번역 (impressiveTitles용) String translateImpressiveTitle(String englishName) { if (isKoreanLocale) { return impressiveTitleTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return impressiveTitleTranslationsJa[englishName] ?? englishName; } return englishName; } /// 특수 아이템 이름 번역 String translateSpecial(String englishName) { if (isKoreanLocale) return specialTranslationsKo[englishName] ?? englishName; if (isJapaneseLocale) return specialTranslationsJa[englishName] ?? englishName; return englishName; } /// 아이템 속성 이름 번역 (기본 + 추가 속성 포함) String translateItemAttrib(String englishName) { if (isKoreanLocale) { return itemAttribTranslationsKo[englishName] ?? additionalItemAttribTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return itemAttribTranslationsJa[englishName] ?? additionalItemAttribTranslationsJa[englishName] ?? englishName; } return englishName; } /// 아이템 "~의" 접미사 번역 (기본 + 추가 포함) String translateItemOf(String englishName) { if (isKoreanLocale) { return itemOfsTranslationsKo[englishName] ?? additionalItemOfsTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return itemOfsTranslationsJa[englishName] ?? additionalItemOfsTranslationsJa[englishName] ?? englishName; } return englishName; } /// 단순 아이템 번역 (기본 + 추가 드롭 포함) String translateBoringItem(String englishName) { if (isKoreanLocale) { return boringItemTranslationsKo[englishName] ?? dropItemTranslationsKo[englishName] ?? additionalDropTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return boringItemTranslationsJa[englishName] ?? dropItemTranslationsJa[englishName] ?? additionalDropTranslationsJa[englishName] ?? englishName; } return englishName; } /// interestingItem 번역 (attrib + special 조합) /// 예: "Golden Iterator" → "황금 이터레이터" / "黄金のイテレーター" String translateInterestingItem(String attrib, String special) { if (isKoreanLocale) { final translatedAttrib = itemAttribTranslationsKo[attrib] ?? additionalItemAttribTranslationsKo[attrib] ?? attrib; final translatedSpecial = specialTranslationsKo[special] ?? special; return '$translatedAttrib $translatedSpecial'; } if (isJapaneseLocale) { final translatedAttrib = itemAttribTranslationsJa[attrib] ?? additionalItemAttribTranslationsJa[attrib] ?? attrib; final translatedSpecial = specialTranslationsJa[special] ?? special; return '$translatedAttrib$translatedSpecial'; } return '$attrib $special'; } // ============================================================================ // 스토리/시네마틱 번역 함수 (Story/Cinematic Translation Functions) // ============================================================================ /// Act 제목 번역 String translateActTitle(String englishTitle) { if (isKoreanLocale) return actTitleTranslationsKo[englishTitle] ?? englishTitle; if (isJapaneseLocale) return actTitleTranslationsJa[englishTitle] ?? englishTitle; return englishTitle; } /// Act 보스 이름 번역 String translateActBoss(String englishBoss) { if (isKoreanLocale) return actBossTranslationsKo[englishBoss] ?? englishBoss; if (isJapaneseLocale) return actBossTranslationsJa[englishBoss] ?? englishBoss; return englishBoss; } /// Act 퀘스트 번역 String translateActQuest(String englishQuest) { if (isKoreanLocale) return actQuestTranslationsKo[englishQuest] ?? englishQuest; if (isJapaneseLocale) return actQuestTranslationsJa[englishQuest] ?? englishQuest; return englishQuest; } /// 시네마틱 텍스트 번역 String translateCinematic(String englishText) { if (isKoreanLocale) return cinematicTranslationsKo[englishText] ?? englishText; if (isJapaneseLocale) return cinematicTranslationsJa[englishText] ?? englishText; return englishText; } /// 지역 이름 번역 String translateLocation(String englishLocation) { if (isKoreanLocale) return locationTranslationsKo[englishLocation] ?? englishLocation; if (isJapaneseLocale) return locationTranslationsJa[englishLocation] ?? englishLocation; return englishLocation; } /// 세력/조직 이름 번역 String translateFaction(String englishFaction) { if (isKoreanLocale) return factionTranslationsKo[englishFaction] ?? englishFaction; if (isJapaneseLocale) return factionTranslationsJa[englishFaction] ?? englishFaction; return englishFaction; }