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';

// 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, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s 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'),
  ];

  /// 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;

  /// Coin label
  ///
  /// In en, this message translates to:
  /// **'Coin'**
  String get gold;

  /// Coin with amount
  ///
  /// In en, this message translates to:
  /// **'Coin: {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;

  /// Undo button for stat reroll
  ///
  /// In en, this message translates to:
  /// **'Undo'**
  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;

  /// Victory overlay congratulations
  ///
  /// In en, this message translates to:
  /// **'★ CONGRATULATIONS ★'**
  String get endingCongratulations;

  /// Game completion message
  ///
  /// In en, this message translates to:
  /// **'You have completed the game!'**
  String get endingGameComplete;

  /// Hero section title
  ///
  /// In en, this message translates to:
  /// **'THE HERO'**
  String get endingTheHero;

  /// Level display format
  ///
  /// In en, this message translates to:
  /// **'Level {level}'**
  String endingLevelFormat(int level);

  /// Journey statistics section title
  ///
  /// In en, this message translates to:
  /// **'JOURNEY STATISTICS'**
  String get endingJourneyStats;

  /// Monsters killed stat label
  ///
  /// In en, this message translates to:
  /// **'Monsters Slain'**
  String get endingMonstersSlain;

  /// Quests completed stat label
  ///
  /// In en, this message translates to:
  /// **'Quests Completed'**
  String get endingQuestsCompleted;

  /// Play time stat label
  ///
  /// In en, this message translates to:
  /// **'Play Time'**
  String get endingPlayTime;

  /// Final stats section title
  ///
  /// In en, this message translates to:
  /// **'FINAL STATS'**
  String get endingFinalStats;

  /// Credits section title
  ///
  /// In en, this message translates to:
  /// **'CREDITS'**
  String get endingCredits;

  /// Thank you message
  ///
  /// In en, this message translates to:
  /// **'Thank you for playing!'**
  String get endingThankYou;

  /// Legend message
  ///
  /// In en, this message translates to:
  /// **'Your legend lives on...'**
  String get endingLegendLivesOn;

  /// Hall of fame message line 1
  ///
  /// In en, this message translates to:
  /// **'Your heroic deeds will be'**
  String get endingHallOfFameLine1;

  /// Hall of fame message line 2
  ///
  /// In en, this message translates to:
  /// **'remembered in the Hall of Fame'**
  String get endingHallOfFameLine2;

  /// Hall of fame button
  ///
  /// In en, this message translates to:
  /// **'HALL OF FAME'**
  String get endingHallOfFameButton;

  /// Skip button
  ///
  /// In en, this message translates to:
  /// **'SKIP'**
  String get endingSkip;

  /// Tap to skip hint
  ///
  /// In en, this message translates to:
  /// **'TAP TO SKIP'**
  String get endingTapToSkip;

  /// Hold to speed up scrolling hint
  ///
  /// In en, this message translates to:
  /// **'HOLD TO SPEED UP'**
  String get endingHoldToSpeedUp;

  /// Menu panel title
  ///
  /// In en, this message translates to:
  /// **'MENU'**
  String get menuTitle;

  /// Options menu title
  ///
  /// In en, this message translates to:
  /// **'OPTIONS'**
  String get optionsTitle;

  /// Sound dialog title
  ///
  /// In en, this message translates to:
  /// **'SOUND'**
  String get soundTitle;

  /// Control section title
  ///
  /// In en, this message translates to:
  /// **'CONTROL'**
  String get controlSection;

  /// Info section title
  ///
  /// In en, this message translates to:
  /// **'INFO'**
  String get infoSection;

  /// Settings section title
  ///
  /// In en, this message translates to:
  /// **'SETTINGS'**
  String get settingsSection;

  /// Save/Exit section title
  ///
  /// In en, this message translates to:
  /// **'SAVE / EXIT'**
  String get saveExitSection;

  /// OK button
  ///
  /// In en, this message translates to:
  /// **'OK'**
  String get ok;

  /// Recharge button
  ///
  /// In en, this message translates to:
  /// **'RECHARGE'**
  String get rechargeButton;

  /// Create button
  ///
  /// In en, this message translates to:
  /// **'CREATE'**
  String get createButton;

  /// Preview panel title
  ///
  /// In en, this message translates to:
  /// **'PREVIEW'**
  String get previewTitle;

  /// Name panel title
  ///
  /// In en, this message translates to:
  /// **'NAME'**
  String get nameTitle;

  /// Stats panel title
  ///
  /// In en, this message translates to:
  /// **'STATS'**
  String get statsTitle;

  /// Race panel title
  ///
  /// In en, this message translates to:
  /// **'RACE'**
  String get raceTitle;

  /// Class panel title
  ///
  /// In en, this message translates to:
  /// **'CLASS'**
  String get classSection;

  /// BGM volume label
  ///
  /// In en, this message translates to:
  /// **'BGM'**
  String get bgmLabel;

  /// SFX volume label
  ///
  /// In en, this message translates to:
  /// **'SFX'**
  String get sfxLabel;

  /// HP bar label
  ///
  /// In en, this message translates to:
  /// **'HP'**
  String get hpLabel;

  /// MP bar label
  ///
  /// In en, this message translates to:
  /// **'MP'**
  String get mpLabel;

  /// EXP bar label
  ///
  /// In en, this message translates to:
  /// **'EXP'**
  String get expLabel;

  /// Level up notification title
  ///
  /// In en, this message translates to:
  /// **'LEVEL UP!'**
  String get notifyLevelUp;

  /// Level notification subtitle
  ///
  /// In en, this message translates to:
  /// **'Level {level}'**
  String notifyLevel(int level);

  /// Quest complete notification title
  ///
  /// In en, this message translates to:
  /// **'QUEST COMPLETE!'**
  String get notifyQuestComplete;

  /// Prologue complete notification title
  ///
  /// In en, this message translates to:
  /// **'PROLOGUE COMPLETE!'**
  String get notifyPrologueComplete;

  /// Act complete notification title
  ///
  /// In en, this message translates to:
  /// **'ACT {number} COMPLETE!'**
  String notifyActComplete(int number);

  /// New spell notification title
  ///
  /// In en, this message translates to:
  /// **'NEW SPELL!'**
  String get notifyNewSpell;

  /// New equipment notification title
  ///
  /// In en, this message translates to:
  /// **'NEW EQUIPMENT!'**
  String get notifyNewEquipment;

  /// Boss defeated notification title
  ///
  /// In en, this message translates to:
  /// **'BOSS DEFEATED!'**
  String get notifyBossDefeated;

  /// Recharge rolls dialog title
  ///
  /// In en, this message translates to:
  /// **'RECHARGE ROLLS'**
  String get rechargeRollsTitle;

  /// Recharge rolls free user message
  ///
  /// In en, this message translates to:
  /// **'Recharge 5 rolls for free?'**
  String get rechargeRollsFree;

  /// Recharge rolls ad message
  ///
  /// In en, this message translates to:
  /// **'Watch an ad to recharge 5 rolls?'**
  String get rechargeRollsAd;

  /// Debug section title
  ///
  /// In en, this message translates to:
  /// **'DEBUG'**
  String get debugTitle;

  /// Debug cheats section title
  ///
  /// In en, this message translates to:
  /// **'DEBUG CHEATS'**
  String get debugCheatsTitle;

  /// Debug tools section title
  ///
  /// In en, this message translates to:
  /// **'DEBUG TOOLS'**
  String get debugToolsTitle;

  /// Developer tools header
  ///
  /// In en, this message translates to:
  /// **'DEVELOPER TOOLS'**
  String get debugDeveloperTools;

  /// Skip task cheat label
  ///
  /// In en, this message translates to:
  /// **'SKIP TASK (L+1)'**
  String get debugSkipTask;

  /// Skip task cheat description
  ///
  /// In en, this message translates to:
  /// **'Complete task instantly'**
  String get debugSkipTaskDesc;

  /// Skip quest cheat label
  ///
  /// In en, this message translates to:
  /// **'SKIP QUEST (Q!)'**
  String get debugSkipQuest;

  /// Skip quest cheat description
  ///
  /// In en, this message translates to:
  /// **'Complete quest instantly'**
  String get debugSkipQuestDesc;

  /// Skip act cheat label
  ///
  /// In en, this message translates to:
  /// **'SKIP ACT (P!)'**
  String get debugSkipAct;

  /// Skip act cheat description
  ///
  /// In en, this message translates to:
  /// **'Complete act instantly'**
  String get debugSkipActDesc;

  /// Create test character button
  ///
  /// In en, this message translates to:
  /// **'CREATE TEST CHARACTER'**
  String get debugCreateTestCharacter;

  /// Create test character description
  ///
  /// In en, this message translates to:
  /// **'Register Level 100 character to Hall of Fame'**
  String get debugCreateTestCharacterDesc;

  /// Create test character dialog title
  ///
  /// In en, this message translates to:
  /// **'CREATE TEST CHARACTER?'**
  String get debugCreateTestCharacterTitle;

  /// Create test character confirmation message
  ///
  /// In en, this message translates to:
  /// **'Current character will be converted to Level 100\nand registered to the Hall of Fame.\n\n⚠️ Current save file will be deleted.\nThis action cannot be undone.'**
  String get debugCreateTestCharacterMessage;

  /// Debug turbo mode label
  ///
  /// In en, this message translates to:
  /// **'DEBUG: TURBO (20x)'**
  String get debugTurbo;

  /// IAP purchased debug toggle
  ///
  /// In en, this message translates to:
  /// **'IAP PURCHASED'**
  String get debugIapPurchased;

  /// IAP purchased debug description
  ///
  /// In en, this message translates to:
  /// **'ON: Behave as paid user (ads removed)'**
  String get debugIapPurchasedDesc;

  /// Offline hours debug label
  ///
  /// In en, this message translates to:
  /// **'OFFLINE HOURS'**
  String get debugOfflineHours;

  /// Offline hours debug description
  ///
  /// In en, this message translates to:
  /// **'Test return rewards (applies on restart)'**
  String get debugOfflineHoursDesc;

  /// Test character creation description
  ///
  /// In en, this message translates to:
  /// **'Modify current character to Level 100\nand register to the Hall of Fame.'**
  String get debugTestCharacterDesc;

  /// Arena main screen title
  ///
  /// In en, this message translates to:
  /// **'LOCAL ARENA'**
  String get arenaTitle;

  /// Arena character selection subtitle
  ///
  /// In en, this message translates to:
  /// **'SELECT YOUR FIGHTER'**
  String get arenaSelectFighter;

  /// Arena empty state title
  ///
  /// In en, this message translates to:
  /// **'Not enough heroes'**
  String get arenaEmptyTitle;

  /// Arena empty state hint
  ///
  /// In en, this message translates to:
  /// **'Clear the game with 2+ characters'**
  String get arenaEmptyHint;

  /// Arena setup screen title
  ///
  /// In en, this message translates to:
  /// **'ARENA SETUP'**
  String get arenaSetupTitle;

  /// Start battle button
  ///
  /// In en, this message translates to:
  /// **'START BATTLE'**
  String get arenaStartBattle;

  /// Arena battle screen title
  ///
  /// In en, this message translates to:
  /// **'ARENA BATTLE'**
  String get arenaBattleTitle;

  /// My equipment header
  ///
  /// In en, this message translates to:
  /// **'MY EQUIPMENT'**
  String get arenaMyEquipment;

  /// Enemy equipment header
  ///
  /// In en, this message translates to:
  /// **'ENEMY EQUIPMENT'**
  String get arenaEnemyEquipment;

  /// Selected slot label
  ///
  /// In en, this message translates to:
  /// **'SELECTED'**
  String get arenaSelected;

  /// Recommended slot label
  ///
  /// In en, this message translates to:
  /// **'BEST'**
  String get arenaRecommended;

  /// Weapon slot locked label
  ///
  /// In en, this message translates to:
  /// **'LOCKED'**
  String get arenaWeaponLocked;

  /// Arena victory title
  ///
  /// In en, this message translates to:
  /// **'VICTORY!'**
  String get arenaVictory;

  /// Arena defeat title
  ///
  /// In en, this message translates to:
  /// **'DEFEAT...'**
  String get arenaDefeat;

  /// Equipment exchange section title
  ///
  /// In en, this message translates to:
  /// **'EQUIPMENT EXCHANGE'**
  String get arenaEquipmentExchange;

  /// Turns label
  ///
  /// In en, this message translates to:
  /// **'TURNS'**
  String get arenaTurns;

  /// Winner label
  ///
  /// In en, this message translates to:
  /// **'WINNER'**
  String get arenaWinner;

  /// Loser label
  ///
  /// In en, this message translates to:
  /// **'LOSER'**
  String get arenaLoser;

  /// Battle summary text
  ///
  /// In en, this message translates to:
  /// **'{winner} defeated {loser} in {turns} TURNS'**
  String arenaDefeatedIn(String winner, String loser, int turns);

  /// Score gain prediction
  ///
  /// In en, this message translates to:
  /// **'You will GAIN +{score}'**
  String arenaScoreGain(int score);

  /// Score loss prediction
  ///
  /// In en, this message translates to:
  /// **'You will LOSE {score}'**
  String arenaScoreLose(int score);

  /// Even trade label
  ///
  /// In en, this message translates to:
  /// **'Even trade'**
  String get arenaEvenTrade;

  /// Score label
  ///
  /// In en, this message translates to:
  /// **'SCORE'**
  String get arenaScore;

  /// Statistics dialog title
  ///
  /// In en, this message translates to:
  /// **'Statistics'**
  String get statsStatistics;

  /// Session tab label
  ///
  /// In en, this message translates to:
  /// **'Session'**
  String get statsSession;

  /// Accumulated tab label
  ///
  /// In en, this message translates to:
  /// **'Total'**
  String get statsAccumulated;

  /// Combat section title
  ///
  /// In en, this message translates to:
  /// **'Combat'**
  String get statsCombat;

  /// Play time label
  ///
  /// In en, this message translates to:
  /// **'Play Time'**
  String get statsPlayTime;

  /// Monsters killed label
  ///
  /// In en, this message translates to:
  /// **'Monsters Killed'**
  String get statsMonstersKilled;

  /// Bosses defeated label
  ///
  /// In en, this message translates to:
  /// **'Bosses Defeated'**
  String get statsBossesDefeated;

  /// Deaths label
  ///
  /// In en, this message translates to:
  /// **'Deaths'**
  String get statsDeaths;

  /// Damage section title
  ///
  /// In en, this message translates to:
  /// **'Damage'**
  String get statsDamage;

  /// Damage dealt label
  ///
  /// In en, this message translates to:
  /// **'Damage Dealt'**
  String get statsDamageDealt;

  /// Damage taken label
  ///
  /// In en, this message translates to:
  /// **'Damage Taken'**
  String get statsDamageTaken;

  /// Average DPS label
  ///
  /// In en, this message translates to:
  /// **'Average DPS'**
  String get statsAverageDps;

  /// Skills section title
  ///
  /// In en, this message translates to:
  /// **'Skills'**
  String get statsSkills;

  /// Skills used label
  ///
  /// In en, this message translates to:
  /// **'Skills Used'**
  String get statsSkillsUsed;

  /// Critical hits label
  ///
  /// In en, this message translates to:
  /// **'Critical Hits'**
  String get statsCriticalHits;

  /// Max critical streak label
  ///
  /// In en, this message translates to:
  /// **'Max Critical Streak'**
  String get statsMaxCriticalStreak;

  /// Critical rate label
  ///
  /// In en, this message translates to:
  /// **'Critical Rate'**
  String get statsCriticalRate;

  /// Economy section title
  ///
  /// In en, this message translates to:
  /// **'Economy'**
  String get statsEconomy;

  /// Gold earned label
  ///
  /// In en, this message translates to:
  /// **'Gold Earned'**
  String get statsGoldEarned;

  /// Gold spent label
  ///
  /// In en, this message translates to:
  /// **'Gold Spent'**
  String get statsGoldSpent;

  /// Items sold label
  ///
  /// In en, this message translates to:
  /// **'Items Sold'**
  String get statsItemsSold;

  /// Potions used label
  ///
  /// In en, this message translates to:
  /// **'Potions Used'**
  String get statsPotionsUsed;

  /// Progress section title
  ///
  /// In en, this message translates to:
  /// **'Progress'**
  String get statsProgress;

  /// Level ups label
  ///
  /// In en, this message translates to:
  /// **'Level Ups'**
  String get statsLevelUps;

  /// Quests completed label
  ///
  /// In en, this message translates to:
  /// **'Quests Completed'**
  String get statsQuestsCompleted;

  /// Records section title
  ///
  /// In en, this message translates to:
  /// **'Records'**
  String get statsRecords;

  /// Highest level label
  ///
  /// In en, this message translates to:
  /// **'Highest Level'**
  String get statsHighestLevel;

  /// Highest gold held label
  ///
  /// In en, this message translates to:
  /// **'Highest Gold Held'**
  String get statsHighestGoldHeld;

  /// Best critical streak label
  ///
  /// In en, this message translates to:
  /// **'Best Critical Streak'**
  String get statsBestCriticalStreak;

  /// Total play section title
  ///
  /// In en, this message translates to:
  /// **'Total Play'**
  String get statsTotalPlay;

  /// Total play time label
  ///
  /// In en, this message translates to:
  /// **'Total Play Time'**
  String get statsTotalPlayTime;

  /// Games started label
  ///
  /// In en, this message translates to:
  /// **'Games Started'**
  String get statsGamesStarted;

  /// Games completed label
  ///
  /// In en, this message translates to:
  /// **'Games Completed'**
  String get statsGamesCompleted;

  /// Completion rate label
  ///
  /// In en, this message translates to:
  /// **'Completion Rate'**
  String get statsCompletionRate;

  /// Total combat section title
  ///
  /// In en, this message translates to:
  /// **'Total Combat'**
  String get statsTotalCombat;

  /// Total deaths label
  ///
  /// In en, this message translates to:
  /// **'Total Deaths'**
  String get statsTotalDeaths;

  /// Total level ups label
  ///
  /// In en, this message translates to:
  /// **'Total Level Ups'**
  String get statsTotalLevelUps;

  /// Total damage section title
  ///
  /// In en, this message translates to:
  /// **'Total Damage'**
  String get statsTotalDamage;

  /// Total skills section title
  ///
  /// In en, this message translates to:
  /// **'Total Skills'**
  String get statsTotalSkills;

  /// Total economy section title
  ///
  /// In en, this message translates to:
  /// **'Total Economy'**
  String get statsTotalEconomy;

  /// Level up notification type label
  ///
  /// In en, this message translates to:
  /// **'LEVEL UP'**
  String get notifyLevelUpLabel;

  /// Quest done notification type label
  ///
  /// In en, this message translates to:
  /// **'QUEST DONE'**
  String get notifyQuestDoneLabel;

  /// Act clear notification type label
  ///
  /// In en, this message translates to:
  /// **'ACT CLEAR'**
  String get notifyActClearLabel;

  /// New spell notification type label
  ///
  /// In en, this message translates to:
  /// **'NEW SPELL'**
  String get notifyNewSpellLabel;

  /// New item notification type label
  ///
  /// In en, this message translates to:
  /// **'NEW ITEM'**
  String get notifyNewItemLabel;

  /// Boss slain notification type label
  ///
  /// In en, this message translates to:
  /// **'BOSS SLAIN'**
  String get notifyBossSlainLabel;

  /// Game saved notification type label
  ///
  /// In en, this message translates to:
  /// **'SAVED'**
  String get notifySavedLabel;

  /// Info notification type label
  ///
  /// In en, this message translates to:
  /// **'INFO'**
  String get notifyInfoLabel;

  /// Warning notification type label
  ///
  /// In en, this message translates to:
  /// **'WARNING'**
  String get notifyWarningLabel;
}

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'].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();
  }

  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.',
  );
}
