Files
asciinevrdie/lib/l10n/app_localizations.dart
JiWoong Sul 99f5b74802 feat(game): 게임 시스템 전면 개편 및 다국어 지원 확장
## 스킬 시스템 개선
- skill_data.dart: 스킬 데이터 구조 전면 개편 (+1176 라인)
- skill_service.dart: 스킬 발동 로직 확장 및 버프 시스템 연동
- skill.dart: 스킬 모델 개선, 쿨다운/효과 타입 추가

## Canvas 애니메이션 리팩토링
- battle_composer.dart 삭제 (레거시 위젯 기반 렌더러)
- monster_colors.dart 삭제 (AsciiCell 색상 시스템으로 통합)
- canvas_battle_composer.dart: z-index 정렬 (몬스터 z=1, 캐릭터 z=2, 이펙트 z=3)
- ascii_cell.dart, ascii_layer.dart: 코드 정리

## UI/UX 개선
- hp_mp_bar.dart: l10n 적용, 몬스터 HP 바 컴팩트화
- death_overlay.dart: 사망 화면 개선
- equipment_stats_panel.dart: 장비 스탯 표시 확장
- active_buff_panel.dart: 버프 패널 개선
- notification_overlay.dart: 알림 시스템 개선

## 다국어 지원 확장
- game_text_l10n.dart: 게임 텍스트 통합 (+758 라인)
- 한국어/일본어/영어/중국어 번역 업데이트
- ARB 파일 동기화

## 게임 로직 개선
- progress_service.dart: 진행 로직 리팩토링
- combat_calculator.dart: 전투 계산 로직 개선
- stat_calculator.dart: 스탯 계산 시스템 개선
- story_service.dart: 스토리 진행 로직 개선

## 기타
- theme_preferences.dart 삭제 (미사용)
- 테스트 파일 업데이트
- class_data.dart: 클래스 데이터 정리
2025-12-22 19:00:58 +09:00

585 lines
14 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.
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;
import 'app_localizations_en.dart';
import 'app_localizations_ja.dart';
import 'app_localizations_ko.dart';
import 'app_localizations_zh.dart';
// ignore_for_file: type=lint
/// Callers can lookup localized strings with an instance of L10n
/// returned by `L10n.of(context)`.
///
/// Applications need to include `L10n.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
/// localizationsDelegates: L10n.localizationsDelegates,
/// supportedLocales: L10n.supportedLocales,
/// home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
/// # Internationalization support.
/// flutter_localizations:
/// sdk: flutter
/// intl: any # Use the pinned version from flutter_localizations
///
/// # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, youll need to edit this
/// file.
///
/// First, open your projects ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// projects Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the L10n.supportedLocales
/// property.
abstract class L10n {
L10n(String locale)
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
final String localeName;
static L10n of(BuildContext context) {
return Localizations.of<L10n>(context, L10n)!;
}
static const LocalizationsDelegate<L10n> delegate = _L10nDelegate();
/// A list of this localizations delegate along with the default localizations
/// delegates.
///
/// Returns a list of localizations delegates containing this delegate along with
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
/// and GlobalWidgetsLocalizations.delegate.
///
/// Additional delegates can be added by appending to this list in
/// MaterialApp. This list does not have to be used at all if a custom list
/// of delegates is preferred or required.
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
<LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
/// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[
Locale('en'),
Locale('ja'),
Locale('ko'),
Locale('zh'),
];
/// Application title
///
/// In en, this message translates to:
/// **'ASCII NEVER DIE'**
String get appTitle;
/// Tag indicating offline mode
///
/// In en, this message translates to:
/// **'No network'**
String get tagNoNetwork;
/// Tag indicating idle RPG gameplay
///
/// In en, this message translates to:
/// **'Idle RPG loop'**
String get tagIdleRpg;
/// Tag indicating local save support
///
/// In en, this message translates to:
/// **'Local saves'**
String get tagLocalSaves;
/// New character button
///
/// In en, this message translates to:
/// **'New character'**
String get newCharacter;
/// Load save button
///
/// In en, this message translates to:
/// **'Load save'**
String get loadSave;
/// Load game dialog title
///
/// In en, this message translates to:
/// **'Load Game'**
String get loadGame;
/// View build plan button
///
/// In en, this message translates to:
/// **'View build plan'**
String get viewBuildPlan;
/// Build roadmap section title
///
/// In en, this message translates to:
/// **'Build roadmap'**
String get buildRoadmap;
/// Tech stack section title
///
/// In en, this message translates to:
/// **'Tech stack'**
String get techStack;
/// Cancel button
///
/// In en, this message translates to:
/// **'Cancel'**
String get cancel;
/// Exit game dialog title
///
/// In en, this message translates to:
/// **'Exit Game'**
String get exitGame;
/// Save progress confirmation message
///
/// In en, this message translates to:
/// **'Save your progress before leaving?'**
String get saveProgressQuestion;
/// Exit without saving button
///
/// In en, this message translates to:
/// **'Exit without saving'**
String get exitWithoutSaving;
/// Save and exit button
///
/// In en, this message translates to:
/// **'Save and Exit'**
String get saveAndExit;
/// Game screen title with character name
///
/// In en, this message translates to:
/// **'ASCII NEVER DIE - {name}'**
String progressQuestTitle(String name);
/// Level up tooltip
///
/// In en, this message translates to:
/// **'Level Up'**
String get levelUp;
/// Complete quest tooltip
///
/// In en, this message translates to:
/// **'Complete Quest'**
String get completeQuest;
/// Complete plot tooltip
///
/// In en, this message translates to:
/// **'Complete Plot'**
String get completePlot;
/// Character sheet panel title
///
/// In en, this message translates to:
/// **'Character Sheet'**
String get characterSheet;
/// Traits section title
///
/// In en, this message translates to:
/// **'Traits'**
String get traits;
/// Stats section title
///
/// In en, this message translates to:
/// **'Stats'**
String get stats;
/// Experience section title
///
/// In en, this message translates to:
/// **'Experience'**
String get experience;
/// XP needed tooltip
///
/// In en, this message translates to:
/// **'XP needed for next level'**
String get xpNeededForNextLevel;
/// Skills section title (unified spellbook + skills)
///
/// In en, this message translates to:
/// **'Skills'**
String get spellBook;
/// Empty skills message
///
/// In en, this message translates to:
/// **'No skills yet'**
String get noSpellsYet;
/// Equipment panel title
///
/// In en, this message translates to:
/// **'Equipment'**
String get equipment;
/// Inventory panel title
///
/// In en, this message translates to:
/// **'Inventory'**
String get inventory;
/// Encumbrance section title
///
/// In en, this message translates to:
/// **'Encumbrance'**
String get encumbrance;
/// Combat log panel title
///
/// In en, this message translates to:
/// **'Combat Log'**
String get combatLog;
/// Plot development panel title
///
/// In en, this message translates to:
/// **'Plot Development'**
String get plotDevelopment;
/// Quests panel title
///
/// In en, this message translates to:
/// **'Quests'**
String get quests;
/// Name trait label
///
/// In en, this message translates to:
/// **'Name'**
String get traitName;
/// Race trait label
///
/// In en, this message translates to:
/// **'Race'**
String get traitRace;
/// Class trait label
///
/// In en, this message translates to:
/// **'Class'**
String get traitClass;
/// Level trait label
///
/// In en, this message translates to:
/// **'Level'**
String get traitLevel;
/// Strength stat
///
/// In en, this message translates to:
/// **'STR'**
String get statStr;
/// Constitution stat
///
/// In en, this message translates to:
/// **'CON'**
String get statCon;
/// Dexterity stat
///
/// In en, this message translates to:
/// **'DEX'**
String get statDex;
/// Intelligence stat
///
/// In en, this message translates to:
/// **'INT'**
String get statInt;
/// Wisdom stat
///
/// In en, this message translates to:
/// **'WIS'**
String get statWis;
/// Charisma stat
///
/// In en, this message translates to:
/// **'CHA'**
String get statCha;
/// Max HP stat
///
/// In en, this message translates to:
/// **'HP Max'**
String get statHpMax;
/// Max MP stat
///
/// In en, this message translates to:
/// **'MP Max'**
String get statMpMax;
/// Weapon equipment slot
///
/// In en, this message translates to:
/// **'Weapon'**
String get equipWeapon;
/// Shield equipment slot
///
/// In en, this message translates to:
/// **'Shield'**
String get equipShield;
/// Helm equipment slot
///
/// In en, this message translates to:
/// **'Helm'**
String get equipHelm;
/// Hauberk equipment slot
///
/// In en, this message translates to:
/// **'Hauberk'**
String get equipHauberk;
/// Brassairts equipment slot
///
/// In en, this message translates to:
/// **'Brassairts'**
String get equipBrassairts;
/// Vambraces equipment slot
///
/// In en, this message translates to:
/// **'Vambraces'**
String get equipVambraces;
/// Gauntlets equipment slot
///
/// In en, this message translates to:
/// **'Gauntlets'**
String get equipGauntlets;
/// Gambeson equipment slot
///
/// In en, this message translates to:
/// **'Gambeson'**
String get equipGambeson;
/// Cuisses equipment slot
///
/// In en, this message translates to:
/// **'Cuisses'**
String get equipCuisses;
/// Greaves equipment slot
///
/// In en, this message translates to:
/// **'Greaves'**
String get equipGreaves;
/// Sollerets equipment slot
///
/// In en, this message translates to:
/// **'Sollerets'**
String get equipSollerets;
/// Gold label
///
/// In en, this message translates to:
/// **'Gold'**
String get gold;
/// Gold with amount
///
/// In en, this message translates to:
/// **'Gold: {amount}'**
String goldAmount(int amount);
/// Prologue plot stage
///
/// In en, this message translates to:
/// **'Prologue'**
String get prologue;
/// Act with roman numeral
///
/// In en, this message translates to:
/// **'Act {number}'**
String actNumber(String number);
/// Empty quests message
///
/// In en, this message translates to:
/// **'No active quests'**
String get noActiveQuests;
/// Quest with number
///
/// In en, this message translates to:
/// **'Quest #{number}'**
String questNumber(int number);
/// Welcome message in task progress panel
///
/// In en, this message translates to:
/// **'Welcome to ASCII NEVER DIE!'**
String get welcomeMessage;
/// No saved games message
///
/// In en, this message translates to:
/// **'No saved games found.'**
String get noSavedGames;
/// Load error message
///
/// In en, this message translates to:
/// **'Failed to load save file: {error}'**
String loadError(String error);
/// Name label in character creation
///
/// In en, this message translates to:
/// **'Name'**
String get name;
/// Generate name tooltip
///
/// In en, this message translates to:
/// **'Generate Name'**
String get generateName;
/// Total label for stats
///
/// In en, this message translates to:
/// **'Total'**
String get total;
/// Unroll button
///
/// In en, this message translates to:
/// **'Unroll'**
String get unroll;
/// Roll button
///
/// In en, this message translates to:
/// **'Roll'**
String get roll;
/// Race selection title
///
/// In en, this message translates to:
/// **'Race'**
String get race;
/// Class selection title
///
/// In en, this message translates to:
/// **'Class'**
String get classTitle;
/// Percentage complete
///
/// In en, this message translates to:
/// **'{percent}% complete'**
String percentComplete(int percent);
/// New character screen title
///
/// In en, this message translates to:
/// **'ASCII NEVER DIE - New Character'**
String get newCharacterTitle;
/// Confirm character creation button
///
/// In en, this message translates to:
/// **'Sold!'**
String get soldButton;
}
class _L10nDelegate extends LocalizationsDelegate<L10n> {
const _L10nDelegate();
@override
Future<L10n> load(Locale locale) {
return SynchronousFuture<L10n>(lookupL10n(locale));
}
@override
bool isSupported(Locale locale) =>
<String>['en', 'ja', 'ko', 'zh'].contains(locale.languageCode);
@override
bool shouldReload(_L10nDelegate old) => false;
}
L10n lookupL10n(Locale locale) {
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
case 'en':
return L10nEn();
case 'ja':
return L10nJa();
case 'ko':
return L10nKo();
case 'zh':
return L10nZh();
}
throw FlutterError(
'L10n.delegate failed to load unsupported locale "$locale". This is likely '
'an issue with the localizations generation tool. Please file an issue '
'on GitHub with a reproducible sample app and the gen-l10n configuration '
'that was used.',
);
}