- HelpDialog 추가 - 게임 화면에 통계/도움말 버튼 추가 - CombatLog에 디버프 이벤트 표시 - AudioService mp3 확장자 지원 - 설정 텍스트 l10n 추가
1913 lines
59 KiB
Dart
1913 lines
59 KiB
Dart
// 게임 텍스트 로컬라이제이션 (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';
|
||
|
||
/// 각 단어 첫 글자를 대문자로 변환 (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<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 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 frontDescription {
|
||
if (isKoreanLocale) return 'Flutter로 재구축된 오프라인 Progress Quest (PQ 6.4)';
|
||
if (isJapaneseLocale) return 'Flutterで再構築されたオフラインProgress Quest (PQ 6.4)';
|
||
return 'Offline Progress Quest (PQ 6.4) rebuilt with Flutter.';
|
||
}
|
||
|
||
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 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 'Progress Quest 6.4를 Flutter로 재구현한 오프라인 싱글플레이어 RPG입니다.';
|
||
if (isJapaneseLocale) return 'Progress Quest 6.4をFlutterで再実装したオフラインシングルプレイヤーRPGです。';
|
||
return 'An offline single-player RPG reimplementation of Progress Quest 6.4 in Flutter.';
|
||
}
|