// 게임 텍스트 로컬라이제이션 (BuildContext 없이 사용) // progress_service.dart, pq_logic.dart 등에서 사용 // 지원 언어: 한국어(ko), 영어(en), 일본어(ja) import 'package:asciineverdie/data/game_translations_ko.dart'; import 'package:asciineverdie/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'; /// 각 단어 첫 글자를 대문자로 변환 (Title Case) /// /// 예: "syntax error" → "Syntax Error" String _toTitleCase(String text) { return text.split(' ').map((word) { if (word.isEmpty) return word; return word[0].toUpperCase() + word.substring(1).toLowerCase(); }).join(' '); } // ============================================================================ // 프롤로그 텍스트 // ============================================================================ 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 taskFinalBoss(String bossName) { if (isKoreanLocale) return '최종 보스와 대결: $bossName'; if (isJapaneseLocale) return '最終ボスと対決: $bossName'; return 'Final Battle: $bossName'; } String taskSelling(String itemDescription) { if (isKoreanLocale) return '$itemDescription 판매 중'; if (isJapaneseLocale) return '$itemDescription を販売中'; return 'Selling $itemDescription'; } // ============================================================================ // 부활 시퀀스 메시지 // ============================================================================ /// 부활 애니메이션 중 표시 메시지 String get animationResurrecting { if (isKoreanLocale) return '부활 중...'; if (isJapaneseLocale) return '復活中...'; return 'Resurrecting...'; } String get taskReturningToTown { if (isKoreanLocale) return '마을로 귀환 중...'; if (isJapaneseLocale) return '町に戻っている...'; return 'Returning to town...'; } String get taskRestockingAtShop { if (isKoreanLocale) return '상점에서 장비 정비 중...'; if (isJapaneseLocale) return 'ショップで装備を整備中...'; return 'Restocking at shop...'; } String get taskHeadingToHuntingGrounds { if (isKoreanLocale) return '사냥터로 이동 중...'; if (isJapaneseLocale) return '狩り場へ向かっている...'; return 'Heading to hunting grounds...'; } // ============================================================================ // 사망 화면 메시지 // ============================================================================ String get deathYouDied { if (isKoreanLocale) return '사망'; if (isJapaneseLocale) return '死亡'; return 'YOU DIED'; } String get deathSacrificedToResurrect { if (isKoreanLocale) return '부활 대가로 희생됨'; if (isJapaneseLocale) return '復活のために犠牲'; return 'Sacrificed to Resurrect'; } String get deathEquipment { if (isKoreanLocale) return '장비'; if (isJapaneseLocale) return '装備'; return 'Equipment'; } String get deathNoSacrificeNeeded { if (isKoreanLocale) return '희생 없이 부활'; if (isJapaneseLocale) return '犠牲なしで復活'; return 'No sacrifice needed'; } String get deathCoinRemaining { if (isKoreanLocale) return '남은 코인'; if (isJapaneseLocale) return '残りコイン'; return 'Coin Remaining'; } String get deathResurrect { if (isKoreanLocale) return '부활'; if (isJapaneseLocale) return '復活'; return 'Resurrect'; } String get deathCombatLog { if (isKoreanLocale) return '전투 기록'; if (isJapaneseLocale) return '戦闘ログ'; return 'Combat Log'; } String deathKilledBy(String killerName) { if (isKoreanLocale) return '$killerName에게 사망'; if (isJapaneseLocale) return '$killerNameに倒された'; return 'Killed by $killerName'; } String get deathEnvironmentalHazard { if (isKoreanLocale) return '환경 피해로 사망'; if (isJapaneseLocale) return '環境ダメージで死亡'; return 'Environmental hazard'; } // ============================================================================ // UI 일반 메시지 // ============================================================================ String get uiNoPotions { if (isKoreanLocale) return '포션 없음'; if (isJapaneseLocale) return 'ポーションなし'; return 'No potions'; } String get uiTapToContinue { if (isKoreanLocale) return '탭하여 계속'; if (isJapaneseLocale) return 'タップして続行'; return 'Tap to continue'; } String get uiNoSkills { if (isKoreanLocale) return '습득한 스킬이 없습니다'; if (isJapaneseLocale) return 'スキルなし'; return 'No skills'; } String get uiNoBonusStats { if (isKoreanLocale) return '추가 스탯 없음'; if (isJapaneseLocale) return 'ボーナスステータスなし'; return 'No bonus stats'; } String get uiNoActiveBuffs { if (isKoreanLocale) return '활성 버프 없음'; if (isJapaneseLocale) return 'アクティブバフなし'; return 'No active buffs'; } String get uiReady { if (isKoreanLocale) return '준비'; if (isJapaneseLocale) return '準備完了'; return 'Ready'; } String get uiPotions { if (isKoreanLocale) return '포션'; if (isJapaneseLocale) return 'ポーション'; return 'Potions'; } String get uiBuffs { if (isKoreanLocale) return '버프'; if (isJapaneseLocale) return 'バフ'; return 'Buffs'; } // ============================================================================ // 스탯 약어 // ============================================================================ String get statStr { if (isKoreanLocale) return '힘'; if (isJapaneseLocale) return '筋力'; return 'STR'; } String get statCon { if (isKoreanLocale) return '체력'; if (isJapaneseLocale) return '耐久'; return 'CON'; } String get statDex { if (isKoreanLocale) return '민첩'; if (isJapaneseLocale) return '敏捷'; return 'DEX'; } String get statInt { if (isKoreanLocale) return '지능'; if (isJapaneseLocale) return '知力'; return 'INT'; } String get statWis { if (isKoreanLocale) return '지혜'; if (isJapaneseLocale) return '精神'; return 'WIS'; } String get statCha { if (isKoreanLocale) return '매력'; if (isJapaneseLocale) return '魅力'; return 'CHA'; } // ============================================================================ // 패시브 능력 설명 // ============================================================================ String passiveHpBonus(int percent) { if (isKoreanLocale) return 'HP +$percent%'; if (isJapaneseLocale) return 'HP +$percent%'; return 'HP +$percent%'; } String passiveMpBonus(int percent) { if (isKoreanLocale) return 'MP +$percent%'; if (isJapaneseLocale) return 'MP +$percent%'; return 'MP +$percent%'; } String passivePhysicalBonus(int percent) { if (isKoreanLocale) return '물리 공격 +$percent%'; if (isJapaneseLocale) return '物理攻撃 +$percent%'; return 'Physical +$percent%'; } String passiveDefenseBonus(int percent) { if (isKoreanLocale) return '방어력 +$percent%'; if (isJapaneseLocale) return '防御力 +$percent%'; return 'Defense +$percent%'; } String passiveMagicBonus(int percent) { if (isKoreanLocale) return '마법 공격 +$percent%'; if (isJapaneseLocale) return '魔法攻撃 +$percent%'; return 'Magic +$percent%'; } String passiveEvasionBonus(int percent) { if (isKoreanLocale) return '회피율 +$percent%'; if (isJapaneseLocale) return '回避率 +$percent%'; return 'Evasion +$percent%'; } String passiveCritBonus(int percent) { if (isKoreanLocale) return '크리티컬 +$percent%'; if (isJapaneseLocale) return 'クリティカル +$percent%'; return 'Critical +$percent%'; } String passiveHpRegen(int percent) { if (isKoreanLocale) return '전투 후 HP $percent% 회복'; if (isJapaneseLocale) return '戦闘後HP $percent%回復'; return 'Recover $percent% HP after combat'; } String passiveMpRegen(int percent) { if (isKoreanLocale) return '전투 후 MP $percent% 회복'; if (isJapaneseLocale) return '戦闘後MP $percent%回復'; return 'Recover $percent% MP after combat'; } // ============================================================================ // 전투 로그 메시지 // ============================================================================ String combatYouHit(String targetName, int damage) { if (isKoreanLocale) return '$targetName에게 $damage 데미지'; if (isJapaneseLocale) return '$targetNameに$damageダメージ'; return 'You hit $targetName for $damage damage'; } String combatYouEvaded(String targetName) { if (isKoreanLocale) return '$targetName의 공격 회피!'; if (isJapaneseLocale) return '$targetNameの攻撃を回避!'; return 'You evaded $targetName\'s attack!'; } String combatEvadedAttackFrom(String targetName) { if (isKoreanLocale) return '$targetName의 공격 회피'; if (isJapaneseLocale) return '$targetNameの攻撃を回避'; return 'Evaded attack from $targetName'; } String combatHealedFor(int amount) { if (isKoreanLocale) return 'HP $amount 회복'; if (isJapaneseLocale) return 'HP $amount回復'; return 'Healed for $amount HP'; } String combatCritical(int damage, String targetName) { if (isKoreanLocale) return '크리티컬! $targetName에게 $damage 데미지!'; if (isJapaneseLocale) return 'クリティカル! $targetNameに$damageダメージ!'; return 'CRITICAL! $damage damage to $targetName!'; } String combatMonsterHitsYou(String monsterName, int damage) { if (isKoreanLocale) return '$monsterName이(가) $damage 데미지'; if (isJapaneseLocale) return '$monsterNameが$damageダメージを与えた'; return '$monsterName hits you for $damage damage'; } String combatMonsterEvaded(String monsterName) { if (isKoreanLocale) return '$monsterName이(가) 공격 회피!'; if (isJapaneseLocale) return '$monsterNameが攻撃を回避!'; return '$monsterName evaded your attack!'; } String combatBlocked(int damage) { if (isKoreanLocale) return '방어! $damage 데미지로 감소'; if (isJapaneseLocale) return 'ブロック! $damageダメージに軽減'; return 'Blocked! Reduced to $damage damage'; } String combatParried(int damage) { if (isKoreanLocale) return '패리! $damage 데미지로 감소'; if (isJapaneseLocale) return 'パリィ! $damageダメージに軽減'; return 'Parried! Reduced to $damage damage'; } // 스킬 관련 전투 메시지 String combatSkillCritical(String skillName, int damage) { if (isKoreanLocale) return '크리티컬 $skillName! $damage 데미지!'; if (isJapaneseLocale) return 'クリティカル$skillName! $damageダメージ!'; return 'CRITICAL $skillName! $damage damage!'; } String combatSkillDamage(String skillName, int damage) { if (isKoreanLocale) return '$skillName: $damage 데미지'; if (isJapaneseLocale) return '$skillName: $damageダメージ'; return '$skillName: $damage damage'; } String combatSkillHeal(String skillName, int amount) { if (isKoreanLocale) return '$skillName: +$amount HP'; if (isJapaneseLocale) return '$skillName: +$amount HP'; return '$skillName: +$amount HP'; } String get uiHeal { if (isKoreanLocale) return '힐'; if (isJapaneseLocale) return 'ヒール'; return 'Heal'; } String combatBuffActivated(String skillName) { if (isKoreanLocale) return '$skillName 발동!'; if (isJapaneseLocale) return '$skillName 発動!'; return '$skillName activated!'; } String combatDebuffApplied(String skillName, String targetName) { if (isKoreanLocale) return '$skillName → $targetName에 적용!'; if (isJapaneseLocale) return '$skillName → $targetNameに適用!'; return '$skillName applied to $targetName!'; } String combatDotTick(String skillName, int damage) { if (isKoreanLocale) return '$skillName: $damage 지속 데미지'; if (isJapaneseLocale) return '$skillName: $damage 継続ダメージ'; return '$skillName ticks for $damage damage'; } String combatPotionUsed(String potionName, int amount, String statName) { if (isKoreanLocale) return '$potionName: +$amount $statName'; if (isJapaneseLocale) return '$potionName: +$amount $statName'; return '$potionName: +$amount $statName'; } String combatPotionDrop(String potionName) { if (isKoreanLocale) return '획득: $potionName'; if (isJapaneseLocale) return '獲得: $potionName'; return 'Dropped: $potionName'; } // 사망 화면 전투 로그 (death overlay) String combatBlockedAttack(String monsterName, int reducedDamage) { if (isKoreanLocale) return '$monsterName의 공격 방어 ($reducedDamage 감소)'; if (isJapaneseLocale) return '$monsterNameの攻撃を防御 ($reducedDamage軽減)'; return 'Blocked $monsterName\'s attack ($reducedDamage reduced)'; } String combatParriedAttack(String monsterName, int reducedDamage) { if (isKoreanLocale) return '$monsterName의 공격 패리 ($reducedDamage 감소)'; if (isJapaneseLocale) return '$monsterNameの攻撃をパリィ ($reducedDamage軽減)'; return 'Parried $monsterName\'s attack ($reducedDamage reduced)'; } String get deathSelfInflicted { if (isKoreanLocale) return '자해 데미지로 사망'; if (isJapaneseLocale) return '自傷ダメージで死亡'; return 'Self-inflicted damage'; } // ============================================================================ // 퀘스트 캡션 // ============================================================================ 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) // ============================================================================ /// 몬스터 이름 번역 (기본 + 고급 몬스터 포함) /// /// 대소문자 무시 검색: "syntax error" → "Syntax Error"로 변환 후 검색 String translateMonster(String englishName) { // 대소문자 무시를 위해 Title Case로 변환 final titleCaseName = _toTitleCase(englishName); if (isKoreanLocale) { return monsterTranslationsKo[titleCaseName] ?? advancedMonsterTranslationsKo[titleCaseName] ?? monsterTranslationsKo[englishName] ?? advancedMonsterTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return monsterTranslationsJa[titleCaseName] ?? advancedMonsterTranslationsJa[titleCaseName] ?? 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'; } /// 아이템 이름 문자열 전체 번역 (판매, 로그 등에 사용) /// 예: "Golden Iterator of Compilation" → "컴파일의 황금 이터레이터" /// 예: "Syntax Error fragment" → "구문 오류 조각" String translateItemNameL10n(String itemString) { if (!isKoreanLocale && !isJapaneseLocale) return itemString; if (itemString.isEmpty) return itemString; // 1. specialItem 형식: "Attrib Special of ItemOf" final ofMatch = RegExp(r'^(.+)\s+of\s+(.+)$').firstMatch(itemString); if (ofMatch != null) { final beforeOf = ofMatch.group(1)!; final afterOf = ofMatch.group(2)!; // afterOf가 itemOfs 목록에 있는지 확인 final itemOfKo = itemOfsTranslationsKo[afterOf] ?? additionalItemOfsTranslationsKo[afterOf]; final itemOfJa = itemOfsTranslationsJa[afterOf] ?? additionalItemOfsTranslationsJa[afterOf]; if (itemOfKo != null || itemOfJa != null) { // beforeOf를 interestingItem으로 분리 (attrib + special) final beforeWords = beforeOf.split(' '); if (beforeWords.length >= 2) { final attrib = beforeWords[0]; final special = beforeWords.sublist(1).join(' '); final translatedBefore = translateInterestingItem(attrib, special); if (isKoreanLocale) { return '$itemOfKo의 $translatedBefore'; } else if (isJapaneseLocale) { return '$itemOfJaの$translatedBefore'; } } } } // 2. 몬스터 드롭 형식: "{monster} {drop}" (예: "syntax error fragment") final words = itemString.split(' '); if (words.length >= 2) { // 2-1. 마지막 2단어가 드롭 아이템인지 먼저 확인 (예: "outdated syntax") // boringItemTranslations도 확인 (2단어 boringItem: "null pointer" 등) if (words.length >= 3) { final lastTwoWords = '${words[words.length - 2]} ${words.last}' .toLowerCase(); final dropKo2 = dropItemTranslationsKo[lastTwoWords] ?? additionalDropTranslationsKo[lastTwoWords] ?? boringItemTranslationsKo[lastTwoWords]; final dropJa2 = dropItemTranslationsJa[lastTwoWords] ?? additionalDropTranslationsJa[lastTwoWords] ?? boringItemTranslationsJa[lastTwoWords]; if (dropKo2 != null || dropJa2 != null) { final monsterPart = words.sublist(0, words.length - 2).join(' '); final translatedMonster = translateMonster(monsterPart); if (isKoreanLocale && dropKo2 != null) { return '$translatedMonster $dropKo2'; } else if (isJapaneseLocale && dropJa2 != null) { return '$translatedMonsterの$dropJa2'; } } } // 2-2. 마지막 단어가 드롭 아이템인지 확인 // boringItemTranslations도 확인 (monsterPart로 사용되는 경우) final lastWord = words.last.toLowerCase(); final dropKo = dropItemTranslationsKo[lastWord] ?? additionalDropTranslationsKo[lastWord] ?? boringItemTranslationsKo[lastWord]; final dropJa = dropItemTranslationsJa[lastWord] ?? additionalDropTranslationsJa[lastWord] ?? boringItemTranslationsJa[lastWord]; if (dropKo != null || dropJa != null) { // 앞 부분은 몬스터 이름 final monsterPart = words.sublist(0, words.length - 1).join(' '); final translatedMonster = translateMonster(monsterPart); if (isKoreanLocale && dropKo != null) { return '$translatedMonster $dropKo'; } else if (isJapaneseLocale && dropJa != null) { return '$translatedMonsterの$dropJa'; } } // 3. interestingItem 형식: "Attrib Special" (2단어) if (words.length == 2) { return translateInterestingItem(words[0], words[1]); } } // 4. 단일 단어 - boringItem 번역 시도 return translateBoringItem(itemString); } // ============================================================================ // 스토리/시네마틱 번역 함수 (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; } /// 스킬/주문 이름 번역 (전투 로그용) String translateSpell(String englishName) { if (isKoreanLocale) { return spellTranslationsKo[englishName] ?? englishName; } if (isJapaneseLocale) { return spellTranslationsJa[englishName] ?? englishName; } return englishName; } // ============================================================================ // 프론트 화면 텍스트 // ============================================================================ String get uiHallOfFame { if (isKoreanLocale) return '명예의 전당'; if (isJapaneseLocale) return '栄誉の殿堂'; return 'Hall of Fame'; } String get uiLocalArena { if (isKoreanLocale) return '로컬 아레나'; if (isJapaneseLocale) return 'ローカルアリーナ'; return 'Local Arena'; } String get frontDescription { if (isKoreanLocale) return '레트로 감성의 오프라인 싱글플레이어 RPG'; if (isJapaneseLocale) return 'レトロ感のあるオフラインシングルプレイヤーRPG'; return 'A retro-style offline single-player RPG'; } String get frontTodayFocus { if (isKoreanLocale) return '오늘의 중점'; if (isJapaneseLocale) return '今日のフォーカス'; return "Today's focus"; } // ============================================================================ // 명예의 전당 화면 텍스트 // ============================================================================ String get hofNoHeroes { if (isKoreanLocale) return '영웅이 아직 없습니다'; if (isJapaneseLocale) return 'まだ英雄がいません'; return 'No heroes yet'; } String get hofDefeatGlitchGod { if (isKoreanLocale) return '글리치 신을 처치하여 전설을 남기세요!'; if (isJapaneseLocale) return 'グリッチゴッドを倒して伝説を刻もう!'; return 'Defeat the Glitch God to enshrine your legend!'; } String get hofVictory { if (isKoreanLocale) return '승리!'; if (isJapaneseLocale) return '勝利!'; return 'VICTORY!'; } String get hofDefeatedGlitchGod { if (isKoreanLocale) return '글리치 신을 처치했습니다!'; if (isJapaneseLocale) return 'グリッチゴッドを倒しました!'; return 'You have defeated the Glitch God!'; } String get hofLegendEnshrined { if (isKoreanLocale) return '당신의 전설이 명예의 전당에 기록되었습니다!'; if (isJapaneseLocale) return 'あなたの伝説が栄誉の殿堂に刻まれました!'; return 'Your legend has been enshrined in the Hall of Fame!'; } String get hofViewHallOfFame { if (isKoreanLocale) return '명예의 전당 보기'; if (isJapaneseLocale) return '栄誉の殿堂を見る'; return 'View Hall of Fame'; } String get hofNewGame { if (isKoreanLocale) return '새 게임'; if (isJapaneseLocale) return '新しいゲーム'; return 'New Game'; } String get hofLevel { if (isKoreanLocale) return '레벨'; if (isJapaneseLocale) return 'レベル'; return 'Level'; } String get hofTime { if (isKoreanLocale) return '시간'; if (isJapaneseLocale) return '時間'; return 'Time'; } String get hofDeaths { if (isKoreanLocale) return '사망'; if (isJapaneseLocale) return '死亡'; return 'Deaths'; } String get hofQuests { if (isKoreanLocale) return '퀘스트'; if (isJapaneseLocale) return 'クエスト'; return 'Quests'; } String get hofStats { if (isKoreanLocale) return '통계'; if (isJapaneseLocale) return '統計'; return 'Statistics'; } String get hofMonsters { if (isKoreanLocale) return '몬스터'; if (isJapaneseLocale) return 'モンスター'; return 'Monsters'; } String get hofCleared { if (isKoreanLocale) return '클리어'; if (isJapaneseLocale) return 'クリア'; return 'Cleared'; } String get hofSpells { if (isKoreanLocale) return '스펠'; if (isJapaneseLocale) return 'スペル'; return 'Spells'; } String get hofCombatStats { if (isKoreanLocale) return '전투 스탯'; if (isJapaneseLocale) return '戦闘ステータス'; return 'Combat Stats'; } String get hofCharacterPreview { if (isKoreanLocale) return '캐릭터 미리보기'; if (isJapaneseLocale) return 'キャラクタープレビュー'; return 'Character Preview'; } String get buttonClose { if (isKoreanLocale) return '닫기'; if (isJapaneseLocale) return '閉じる'; return 'Close'; } String uiLevel(int level) { if (isKoreanLocale) return 'Lv.$level'; if (isJapaneseLocale) return 'Lv.$level'; return 'Lv.$level'; } // ============================================================================ // 시네마틱 뷰 텍스트 // ============================================================================ String get uiSkip { if (isKoreanLocale) return '건너뛰기'; if (isJapaneseLocale) return 'スキップ'; return 'SKIP'; } // ============================================================================ // 게임 플레이 화면 텍스트 // ============================================================================ String get uiLevelUp { if (isKoreanLocale) return '레벨 업!'; if (isJapaneseLocale) return 'レベルアップ!'; return 'Level Up!'; } String uiQuestComplete(String questName) { if (isKoreanLocale) return '퀘스트 완료: $questName'; if (isJapaneseLocale) return 'クエスト完了: $questName'; return 'Quest Complete: $questName'; } // ============================================================================ // 장비 패널 텍스트 // ============================================================================ String get uiEquipmentScore { if (isKoreanLocale) return '장비 점수'; if (isJapaneseLocale) return '装備スコア'; return 'Equipment Score'; } String get uiEmpty { if (isKoreanLocale) return '(비어있음)'; if (isJapaneseLocale) return '(空)'; return '(empty)'; } String uiWeight(int weight) { if (isKoreanLocale) return '무게 $weight'; if (isJapaneseLocale) return '重量 $weight'; return 'Wt.$weight'; } /// 남은 시간 표시 String uiTimeRemaining(String time) { if (isKoreanLocale) return '$time 남음'; if (isJapaneseLocale) return '残り$time'; return '$time remaining'; } // 장비 슬롯 이름 String get slotWeapon { if (isKoreanLocale) return '무기'; if (isJapaneseLocale) return '武器'; return 'Weapon'; } String get slotShield { if (isKoreanLocale) return '방패'; if (isJapaneseLocale) return '盾'; return 'Shield'; } String get slotHelm { if (isKoreanLocale) return '투구'; if (isJapaneseLocale) return '兜'; return 'Helm'; } String get slotHauberk { if (isKoreanLocale) return '갑옷'; if (isJapaneseLocale) return '鎧'; return 'Hauberk'; } String get slotBrassairts { if (isKoreanLocale) return '상완갑'; if (isJapaneseLocale) return '上腕甲'; return 'Brassairts'; } String get slotVambraces { if (isKoreanLocale) return '전완갑'; if (isJapaneseLocale) return '前腕甲'; return 'Vambraces'; } String get slotGauntlets { if (isKoreanLocale) return '건틀릿'; if (isJapaneseLocale) return 'ガントレット'; return 'Gauntlets'; } String get slotGambeson { if (isKoreanLocale) return '패딩'; if (isJapaneseLocale) return 'パッデッドアーマー'; return 'Gambeson'; } String get slotCuisses { if (isKoreanLocale) return '허벅지갑'; if (isJapaneseLocale) return '腿当て'; return 'Cuisses'; } String get slotGreaves { if (isKoreanLocale) return '정강이갑'; if (isJapaneseLocale) return '脛当て'; return 'Greaves'; } String get slotSollerets { if (isKoreanLocale) return '철제부츠'; if (isJapaneseLocale) return '鉄靴'; return 'Sollerets'; } // 스탯 약어 (장비용) String get statAtk { if (isKoreanLocale) return '공격'; if (isJapaneseLocale) return '攻撃'; return 'ATK'; } String get statMAtk { if (isKoreanLocale) return '마공'; if (isJapaneseLocale) return '魔攻'; return 'MATK'; } String get statCri { if (isKoreanLocale) return '치명'; if (isJapaneseLocale) return 'クリ'; return 'CRI'; } String get statParry { if (isKoreanLocale) return '패리'; if (isJapaneseLocale) return 'パリィ'; return 'PARRY'; } String get statDef { if (isKoreanLocale) return '방어'; if (isJapaneseLocale) return '防御'; return 'DEF'; } String get statMDef { if (isKoreanLocale) return '마방'; if (isJapaneseLocale) return '魔防'; return 'MDEF'; } String get statBlock { if (isKoreanLocale) return '블록'; if (isJapaneseLocale) return 'ブロック'; return 'BLOCK'; } String get statEva { if (isKoreanLocale) return '회피'; if (isJapaneseLocale) return '回避'; return 'EVA'; } String get statHp { if (isKoreanLocale) return 'HP'; if (isJapaneseLocale) return 'HP'; return 'HP'; } String get statMp { if (isKoreanLocale) return 'MP'; if (isJapaneseLocale) return 'MP'; return 'MP'; } String get statSpeed { if (isKoreanLocale) return '속도'; if (isJapaneseLocale) return '速度'; return 'SPEED'; } // ============================================================================ // 스킬 패널 텍스트 // ============================================================================ String get uiDot { if (isKoreanLocale) return '지속'; if (isJapaneseLocale) return 'DOT'; return 'DOT'; } // ============================================================================ // 아이템 희귀도 // ============================================================================ String get rarityCommon { if (isKoreanLocale) return '일반'; if (isJapaneseLocale) return 'コモン'; return 'COMMON'; } String get rarityUncommon { if (isKoreanLocale) return '고급'; if (isJapaneseLocale) return 'アンコモン'; return 'UNCOMMON'; } String get rarityRare { if (isKoreanLocale) return '희귀'; if (isJapaneseLocale) return 'レア'; return 'RARE'; } String get rarityEpic { if (isKoreanLocale) return '영웅'; if (isJapaneseLocale) return 'エピック'; return 'EPIC'; } String get rarityLegendary { if (isKoreanLocale) return '전설'; if (isJapaneseLocale) return 'レジェンダリー'; return 'LEGENDARY'; } // ============================================================================ // 캐릭터 생성 화면 텍스트 // ============================================================================ String uiRollHistory(int count) { if (isKoreanLocale) return '리롤 기록: $count회'; if (isJapaneseLocale) return 'リロール履歴: $count回'; return '$count roll(s) in history'; } String get uiEnterName { if (isKoreanLocale) return '이름을 입력해주세요.'; if (isJapaneseLocale) return '名前を入力してください。'; return 'Please enter a name.'; } String get uiTestMode { if (isKoreanLocale) return '테스트 모드'; if (isJapaneseLocale) return 'テストモード'; return 'Test Mode'; } String get uiTestModeDesc { if (isKoreanLocale) return '웹에서 모바일 레이아웃 사용'; if (isJapaneseLocale) return 'Webでモバイルレイアウトを使用'; return 'Use mobile layout on web'; } // ============================================================================ // 캐로셀 네비게이션 텍스트 // ============================================================================ String get navSkills { if (isKoreanLocale) return '스킬'; if (isJapaneseLocale) return 'スキル'; return 'Skills'; } String get navInventory { if (isKoreanLocale) return '인벤토리'; if (isJapaneseLocale) return '所持品'; return 'Inventory'; } String get navEquipment { if (isKoreanLocale) return '장비'; if (isJapaneseLocale) return '装備'; return 'Equip'; } String get navCharacter { if (isKoreanLocale) return '캐릭터'; if (isJapaneseLocale) return 'キャラ'; return 'Character'; } String get navCombatLog { if (isKoreanLocale) return '전투로그'; if (isJapaneseLocale) return '戦闘ログ'; return 'Combat'; } String get navStory { if (isKoreanLocale) return '스토리'; if (isJapaneseLocale) return 'ストーリー'; return 'Story'; } String get navQuest { if (isKoreanLocale) return '퀘스트'; if (isJapaneseLocale) return 'クエスト'; return 'Quest'; } // ============================================================================ // 옵션 메뉴 텍스트 // ============================================================================ String get menuOptions { if (isKoreanLocale) return '옵션'; if (isJapaneseLocale) return 'オプション'; return 'Options'; } String get menuPause { if (isKoreanLocale) return '일시정지'; if (isJapaneseLocale) return '一時停止'; return 'Pause'; } String get menuResume { if (isKoreanLocale) return '재개'; if (isJapaneseLocale) return '再開'; return 'Resume'; } String get menuSpeed { if (isKoreanLocale) return '속도'; if (isJapaneseLocale) return '速度'; return 'Speed'; } String get menuSave { if (isKoreanLocale) return '저장'; if (isJapaneseLocale) return 'セーブ'; return 'Save'; } String get menuSaved { if (isKoreanLocale) return '저장되었습니다'; if (isJapaneseLocale) return '保存しました'; return 'Game saved'; } String get menuLanguage { if (isKoreanLocale) return '언어'; if (isJapaneseLocale) return '言語'; return 'Language'; } String get languageEnglish { if (isKoreanLocale) return '영어'; if (isJapaneseLocale) return '英語'; return 'English'; } String get languageKorean { if (isKoreanLocale) return '한국어'; if (isJapaneseLocale) return '韓国語'; return 'Korean'; } String get languageJapanese { if (isKoreanLocale) return '일본어'; if (isJapaneseLocale) return '日本語'; return 'Japanese'; } String get menuDeleteSave { if (isKoreanLocale) return '세이브 삭제'; if (isJapaneseLocale) return 'セーブ削除'; return 'Delete Save'; } String get menuNewGame { if (isKoreanLocale) return '새로하기'; if (isJapaneseLocale) return '新規ゲーム'; return 'New Game'; } String get confirmDeleteTitle { if (isKoreanLocale) return '세이브 삭제'; if (isJapaneseLocale) return 'セーブ削除'; return 'Delete Save'; } String get confirmDeleteMessage { if (isKoreanLocale) return '정말 삭제하시겠습니까?\n모든 진행 상황이 사라집니다.'; if (isJapaneseLocale) return '本当に削除しますか?\nすべての進行状況が失われます。'; return 'Are you sure?\nAll progress will be lost.'; } String get buttonConfirm { if (isKoreanLocale) return '확인'; if (isJapaneseLocale) return '確認'; return 'Confirm'; } String get buttonCancel { if (isKoreanLocale) return '취소'; if (isJapaneseLocale) return 'キャンセル'; return 'Cancel'; } // ============================================================================ // 프론트 화면 경고/푸터 텍스트 // ============================================================================ String get uiWarning { if (isKoreanLocale) return '경고'; if (isJapaneseLocale) return '警告'; return 'Warning'; } String get warningDeleteSave { if (isKoreanLocale) return '기존 저장 파일이 삭제됩니다. 계속하시겠습니까?'; if (isJapaneseLocale) return '既存のセーブファイルが削除されます。続行しますか?'; return 'Existing save file will be deleted. Continue?'; } String get copyrightText { // 카피라이트 텍스트는 언어에 따라 변하지 않음 return '© 2025 naturebridgeai & cclabs all rights reserved'; } // ============================================================================ // 테마 설정 텍스트 // ============================================================================ String get menuTheme { if (isKoreanLocale) return '테마'; if (isJapaneseLocale) return 'テーマ'; return 'Theme'; } String get themeLight { if (isKoreanLocale) return '라이트'; if (isJapaneseLocale) return 'ライト'; return 'Light'; } String get themeDark { if (isKoreanLocale) return '다크'; if (isJapaneseLocale) return 'ダーク'; return 'Dark'; } String get themeSystem { if (isKoreanLocale) return '시스템'; if (isJapaneseLocale) return 'システム'; return 'System'; } // ============================================================================ // 로딩 텍스트 // ============================================================================ String get uiLoading { if (isKoreanLocale) return '불러오는 중...'; if (isJapaneseLocale) return '読み込み中...'; return 'Loading...'; } // ============================================================================ // 설정 화면 텍스트 // ============================================================================ String get uiSettings { if (isKoreanLocale) return '설정'; if (isJapaneseLocale) return '設定'; return 'Settings'; } String get uiStatistics { if (isKoreanLocale) return '통계'; if (isJapaneseLocale) return '統計'; return 'Statistics'; } String get uiHelp { if (isKoreanLocale) return '도움말'; if (isJapaneseLocale) return 'ヘルプ'; return 'Help'; } String get uiTheme { if (isKoreanLocale) return '테마'; if (isJapaneseLocale) return 'テーマ'; return 'Theme'; } String get uiThemeLight { if (isKoreanLocale) return '라이트'; if (isJapaneseLocale) return 'ライト'; return 'Light'; } String get uiThemeDark { if (isKoreanLocale) return '다크'; if (isJapaneseLocale) return 'ダーク'; return 'Dark'; } String get uiThemeSystem { if (isKoreanLocale) return '시스템'; if (isJapaneseLocale) return 'システム'; return 'System'; } String get uiLanguage { if (isKoreanLocale) return '언어'; if (isJapaneseLocale) return '言語'; return 'Language'; } String get uiSound { if (isKoreanLocale) return '사운드'; if (isJapaneseLocale) return 'サウンド'; return 'Sound'; } String get uiBgmVolume { if (isKoreanLocale) return 'BGM 볼륨'; if (isJapaneseLocale) return 'BGM音量'; return 'BGM Volume'; } String get uiSfxVolume { if (isKoreanLocale) return '효과음 볼륨'; if (isJapaneseLocale) return '効果音音量'; return 'SFX Volume'; } String get uiSoundOff { if (isKoreanLocale) return '음소거'; if (isJapaneseLocale) return 'ミュート'; return 'Muted'; } String get uiAnimationSpeed { if (isKoreanLocale) return '애니메이션 속도'; if (isJapaneseLocale) return 'アニメーション速度'; return 'Animation Speed'; } String get uiSpeedSlow { if (isKoreanLocale) return '느림'; if (isJapaneseLocale) return '遅い'; return 'Slow'; } String get uiSpeedNormal { if (isKoreanLocale) return '보통'; if (isJapaneseLocale) return '普通'; return 'Normal'; } String get uiSpeedFast { if (isKoreanLocale) return '빠름'; if (isJapaneseLocale) return '速い'; return 'Fast'; } String get uiAbout { if (isKoreanLocale) return '정보'; if (isJapaneseLocale) return '情報'; return 'About'; } String get uiAboutDescription { if (isKoreanLocale) return 'ASCII 아트와 레트로 감성의 오프라인 싱글플레이어 RPG입니다.'; if (isJapaneseLocale) return 'ASCIIアートとレトロ感のあるオフラインシングルプレイヤーRPGです。'; return 'An offline single-player RPG with ASCII art and retro vibes.'; }