Files
asciinevrdie/lib/data/game_text_l10n.dart
JiWoong Sul 7cd8be88df feat(game): 포션 시스템 및 UI 패널 추가
- 포션 시스템 구현 (PotionService, Potion 모델)
- 포션 인벤토리 패널 위젯
- 활성 버프 패널 위젯
- 장비 스탯 패널 위젯
- 스킬 시스템 확장
- 일본어 번역 추가
- 전투 이벤트/상태 모델 개선
2025-12-21 23:53:27 +09:00

691 lines
24 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 게임 텍스트 로컬라이제이션 (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<String> 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;
}