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_zh.dart';

// ignore_for_file: type=lint

/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.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: AppLocalizations.localizationsDelegates,
///   supportedLocales: AppLocalizations.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 AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
  AppLocalizations(String locale)
    : localeName = intl.Intl.canonicalizedLocale(locale.toString());

  final String localeName;

  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
  }

  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  /// 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('zh'),
  ];

  /// No description provided for @appTitle.
  ///
  /// In en, this message translates to:
  /// **'BadNote'**
  String get appTitle;

  /// No description provided for @settings.
  ///
  /// In en, this message translates to:
  /// **'Settings'**
  String get settings;

  /// No description provided for @search.
  ///
  /// In en, this message translates to:
  /// **'Search'**
  String get search;

  /// No description provided for @importPdf.
  ///
  /// In en, this message translates to:
  /// **'Import PDF'**
  String get importPdf;

  /// No description provided for @importPpt.
  ///
  /// In en, this message translates to:
  /// **'Import PPT'**
  String get importPpt;

  /// No description provided for @importFile.
  ///
  /// In en, this message translates to:
  /// **'Import file'**
  String get importFile;

  /// No description provided for @createNotebook.
  ///
  /// In en, this message translates to:
  /// **'Create notebook'**
  String get createNotebook;

  /// No description provided for @newNotebookTitle.
  ///
  /// In en, this message translates to:
  /// **'New notebook'**
  String get newNotebookTitle;

  /// No description provided for @notebookTitleHint.
  ///
  /// In en, this message translates to:
  /// **'Notebook title'**
  String get notebookTitleHint;

  /// No description provided for @create.
  ///
  /// In en, this message translates to:
  /// **'Create'**
  String get create;

  /// No description provided for @untitledNote.
  ///
  /// In en, this message translates to:
  /// **'Untitled'**
  String get untitledNote;

  /// No description provided for @noNotesYetHint.
  ///
  /// In en, this message translates to:
  /// **'No ink notes yet — tap + to create one'**
  String get noNotesYetHint;

  /// No description provided for @noDocumentsYet.
  ///
  /// In en, this message translates to:
  /// **'No documents yet — tap Import file'**
  String get noDocumentsYet;

  /// No description provided for @processingImport.
  ///
  /// In en, this message translates to:
  /// **'Importing…'**
  String get processingImport;

  /// No description provided for @importFailed.
  ///
  /// In en, this message translates to:
  /// **'Couldn\'t import that file: {error}'**
  String importFailed(String error);

  /// No description provided for @convertNeedsLibreOffice.
  ///
  /// In en, this message translates to:
  /// **'Importing Word documents needs LibreOffice installed. Convert to PDF first, or install LibreOffice.'**
  String get convertNeedsLibreOffice;

  /// No description provided for @unsupportedFileType.
  ///
  /// In en, this message translates to:
  /// **'Unsupported file type: {ext}'**
  String unsupportedFileType(String ext);

  /// No description provided for @penCanvasBeta.
  ///
  /// In en, this message translates to:
  /// **'Pen Canvas (beta)'**
  String get penCanvasBeta;

  /// No description provided for @newNote.
  ///
  /// In en, this message translates to:
  /// **'New Note'**
  String get newNote;

  /// No description provided for @open.
  ///
  /// In en, this message translates to:
  /// **'Open'**
  String get open;

  /// No description provided for @cancel.
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get cancel;

  /// No description provided for @delete.
  ///
  /// In en, this message translates to:
  /// **'Delete'**
  String get delete;

  /// No description provided for @deleteNoteTitle.
  ///
  /// In en, this message translates to:
  /// **'Delete note?'**
  String get deleteNoteTitle;

  /// No description provided for @deleteNote.
  ///
  /// In en, this message translates to:
  /// **'Delete note'**
  String get deleteNote;

  /// No description provided for @openInSplitView.
  ///
  /// In en, this message translates to:
  /// **'Open in Split View'**
  String get openInSplitView;

  /// No description provided for @splitViewSubtitle.
  ///
  /// In en, this message translates to:
  /// **'PDF reference + scratchpad'**
  String get splitViewSubtitle;

  /// No description provided for @removeDocument.
  ///
  /// In en, this message translates to:
  /// **'Remove document'**
  String get removeDocument;

  /// No description provided for @ok.
  ///
  /// In en, this message translates to:
  /// **'OK'**
  String get ok;

  /// No description provided for @pickColor.
  ///
  /// In en, this message translates to:
  /// **'Pick a color'**
  String get pickColor;

  /// No description provided for @clearSettingsTitle.
  ///
  /// In en, this message translates to:
  /// **'Clear all local settings?'**
  String get clearSettingsTitle;

  /// No description provided for @clear.
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get clear;

  /// No description provided for @settingsReset.
  ///
  /// In en, this message translates to:
  /// **'Settings reset to defaults'**
  String get settingsReset;

  /// No description provided for @themeSystem.
  ///
  /// In en, this message translates to:
  /// **'System'**
  String get themeSystem;

  /// No description provided for @themeLight.
  ///
  /// In en, this message translates to:
  /// **'Light'**
  String get themeLight;

  /// No description provided for @themeDark.
  ///
  /// In en, this message translates to:
  /// **'Dark'**
  String get themeDark;

  /// No description provided for @seedColorDesc.
  ///
  /// In en, this message translates to:
  /// **'Seed color for Material 3 theme'**
  String get seedColorDesc;

  /// No description provided for @searchHint.
  ///
  /// In en, this message translates to:
  /// **'Search notes and documents...'**
  String get searchHint;

  /// No description provided for @searchError.
  ///
  /// In en, this message translates to:
  /// **'Search error: {error}'**
  String searchError(String error);

  /// No description provided for @noResultsFor.
  ///
  /// In en, this message translates to:
  /// **'No results for \"{query}\"'**
  String noResultsFor(String query);

  /// No description provided for @typeToSearch.
  ///
  /// In en, this message translates to:
  /// **'Type to search your notes and documents'**
  String get typeToSearch;

  /// No description provided for @sectionNotes.
  ///
  /// In en, this message translates to:
  /// **'Notes'**
  String get sectionNotes;

  /// No description provided for @sectionDocuments.
  ///
  /// In en, this message translates to:
  /// **'Documents'**
  String get sectionDocuments;

  /// No description provided for @pageLabel.
  ///
  /// In en, this message translates to:
  /// **'Page {page}'**
  String pageLabel(int page);

  /// No description provided for @processingPptx.
  ///
  /// In en, this message translates to:
  /// **'Processing PPTX...'**
  String get processingPptx;

  /// No description provided for @processingPresentation.
  ///
  /// In en, this message translates to:
  /// **'Processing presentation...'**
  String get processingPresentation;

  /// No description provided for @couldNotOpenPresentation.
  ///
  /// In en, this message translates to:
  /// **'Could not open presentation.'**
  String get couldNotOpenPresentation;

  /// No description provided for @toolPen.
  ///
  /// In en, this message translates to:
  /// **'Pen'**
  String get toolPen;

  /// No description provided for @toolHighlighter.
  ///
  /// In en, this message translates to:
  /// **'Highlighter'**
  String get toolHighlighter;

  /// No description provided for @toolEraser.
  ///
  /// In en, this message translates to:
  /// **'Eraser'**
  String get toolEraser;

  /// No description provided for @brushPicker.
  ///
  /// In en, this message translates to:
  /// **'Brush'**
  String get brushPicker;

  /// No description provided for @brushFountainPen.
  ///
  /// In en, this message translates to:
  /// **'Fountain pen'**
  String get brushFountainPen;

  /// No description provided for @brushBallpoint.
  ///
  /// In en, this message translates to:
  /// **'Ballpoint'**
  String get brushBallpoint;

  /// No description provided for @brushPencil.
  ///
  /// In en, this message translates to:
  /// **'Pencil'**
  String get brushPencil;

  /// No description provided for @brushHighlighter.
  ///
  /// In en, this message translates to:
  /// **'Highlighter'**
  String get brushHighlighter;

  /// No description provided for @toolSelect.
  ///
  /// In en, this message translates to:
  /// **'Select'**
  String get toolSelect;

  /// No description provided for @toolShape.
  ///
  /// In en, this message translates to:
  /// **'Shape'**
  String get toolShape;

  /// No description provided for @shapePicker.
  ///
  /// In en, this message translates to:
  /// **'Shape'**
  String get shapePicker;

  /// No description provided for @shapeLine.
  ///
  /// In en, this message translates to:
  /// **'Line'**
  String get shapeLine;

  /// No description provided for @shapeRectangle.
  ///
  /// In en, this message translates to:
  /// **'Rectangle'**
  String get shapeRectangle;

  /// No description provided for @shapeEllipse.
  ///
  /// In en, this message translates to:
  /// **'Ellipse'**
  String get shapeEllipse;

  /// No description provided for @shapeArrow.
  ///
  /// In en, this message translates to:
  /// **'Arrow'**
  String get shapeArrow;

  /// No description provided for @actionDeleteSelection.
  ///
  /// In en, this message translates to:
  /// **'Delete selection'**
  String get actionDeleteSelection;

  /// No description provided for @actionUndo.
  ///
  /// In en, this message translates to:
  /// **'Undo'**
  String get actionUndo;

  /// No description provided for @actionRedo.
  ///
  /// In en, this message translates to:
  /// **'Redo'**
  String get actionRedo;

  /// No description provided for @fingerDrawingOn.
  ///
  /// In en, this message translates to:
  /// **'Finger drawing ON'**
  String get fingerDrawingOn;

  /// No description provided for @fingerDrawingOff.
  ///
  /// In en, this message translates to:
  /// **'Finger drawing OFF (pen only)'**
  String get fingerDrawingOff;

  /// No description provided for @pages.
  ///
  /// In en, this message translates to:
  /// **'Pages'**
  String get pages;

  /// No description provided for @penSettings.
  ///
  /// In en, this message translates to:
  /// **'Pen settings'**
  String get penSettings;

  /// No description provided for @inputDiagnostic.
  ///
  /// In en, this message translates to:
  /// **'Input diagnostic (writes a log file)'**
  String get inputDiagnostic;

  /// No description provided for @back.
  ///
  /// In en, this message translates to:
  /// **'Back'**
  String get back;

  /// No description provided for @previousPage.
  ///
  /// In en, this message translates to:
  /// **'Previous page'**
  String get previousPage;

  /// No description provided for @nextPage.
  ///
  /// In en, this message translates to:
  /// **'Next page'**
  String get nextPage;

  /// No description provided for @toolSelectText.
  ///
  /// In en, this message translates to:
  /// **'Select text'**
  String get toolSelectText;

  /// No description provided for @actionHighlightSelection.
  ///
  /// In en, this message translates to:
  /// **'Highlight selection'**
  String get actionHighlightSelection;

  /// No description provided for @toolRemoveHighlight.
  ///
  /// In en, this message translates to:
  /// **'Remove highlight (tap a highlight)'**
  String get toolRemoveHighlight;

  /// No description provided for @toolPlaceScratchLink.
  ///
  /// In en, this message translates to:
  /// **'Place scratch link'**
  String get toolPlaceScratchLink;

  /// No description provided for @toolText.
  ///
  /// In en, this message translates to:
  /// **'Text (tap or double-click to add)'**
  String get toolText;

  /// No description provided for @textPlaceholder.
  ///
  /// In en, this message translates to:
  /// **'Type…'**
  String get textPlaceholder;

  /// No description provided for @scratchLinkDeleteTitle.
  ///
  /// In en, this message translates to:
  /// **'Delete scratch link?'**
  String get scratchLinkDeleteTitle;

  /// No description provided for @scratchLinkDeleteBody.
  ///
  /// In en, this message translates to:
  /// **'This removes the anchor and its private scratchpad.'**
  String get scratchLinkDeleteBody;

  /// No description provided for @toolAddBookmark.
  ///
  /// In en, this message translates to:
  /// **'Add bookmark (here or at selection)'**
  String get toolAddBookmark;

  /// No description provided for @toolBookmarks.
  ///
  /// In en, this message translates to:
  /// **'Bookmarks'**
  String get toolBookmarks;

  /// No description provided for @bookmarksTitle.
  ///
  /// In en, this message translates to:
  /// **'Bookmarks'**
  String get bookmarksTitle;

  /// No description provided for @bookmarksEmpty.
  ///
  /// In en, this message translates to:
  /// **'No bookmarks yet.'**
  String get bookmarksEmpty;

  /// No description provided for @bookmarkDefaultLabel.
  ///
  /// In en, this message translates to:
  /// **'Page {page}'**
  String bookmarkDefaultLabel(int page);

  /// No description provided for @bookmarkPageLabel.
  ///
  /// In en, this message translates to:
  /// **'Page {page}'**
  String bookmarkPageLabel(int page);

  /// No description provided for @bookmarkDeleteTitle.
  ///
  /// In en, this message translates to:
  /// **'Delete bookmark?'**
  String get bookmarkDeleteTitle;

  /// No description provided for @bookmarkDeleteBody.
  ///
  /// In en, this message translates to:
  /// **'This removes the saved location.'**
  String get bookmarkDeleteBody;

  /// No description provided for @failedToOpenPdf.
  ///
  /// In en, this message translates to:
  /// **'Failed to open PDF:\n{error}'**
  String failedToOpenPdf(String error);

  /// No description provided for @pdfNoPages.
  ///
  /// In en, this message translates to:
  /// **'PDF has no pages.'**
  String get pdfNoPages;

  /// No description provided for @pageOfPages.
  ///
  /// In en, this message translates to:
  /// **'{current} / {total}'**
  String pageOfPages(int current, int total);

  /// No description provided for @libraryTab.
  ///
  /// In en, this message translates to:
  /// **'Library'**
  String get libraryTab;

  /// No description provided for @boardTab.
  ///
  /// In en, this message translates to:
  /// **'Stickies'**
  String get boardTab;

  /// No description provided for @shellTagline.
  ///
  /// In en, this message translates to:
  /// **'Ink · Annotate · Know'**
  String get shellTagline;

  /// No description provided for @notesSection.
  ///
  /// In en, this message translates to:
  /// **'Notes'**
  String get notesSection;

  /// No description provided for @documentsSection.
  ///
  /// In en, this message translates to:
  /// **'Documents'**
  String get documentsSection;

  /// No description provided for @emptyLibraryTitle.
  ///
  /// In en, this message translates to:
  /// **'Nothing here yet'**
  String get emptyLibraryTitle;

  /// No description provided for @emptyLibraryBody.
  ///
  /// In en, this message translates to:
  /// **'Create a note, or import PDF / PPT / Word'**
  String get emptyLibraryBody;

  /// No description provided for @diagnosticsSection.
  ///
  /// In en, this message translates to:
  /// **'Diagnostics'**
  String get diagnosticsSection;

  /// No description provided for @diagnosticsExport.
  ///
  /// In en, this message translates to:
  /// **'Export diagnostic pack'**
  String get diagnosticsExport;

  /// No description provided for @diagnosticsExportHint.
  ///
  /// In en, this message translates to:
  /// **'Reproduce on Surface, export, and send the zip back'**
  String get diagnosticsExportHint;

  /// No description provided for @diagnosticsToggle.
  ///
  /// In en, this message translates to:
  /// **'Input diagnostics overlay'**
  String get diagnosticsToggle;

  /// No description provided for @penSettingsUnified.
  ///
  /// In en, this message translates to:
  /// **'Pen & ink'**
  String get penSettingsUnified;

  /// No description provided for @board.
  ///
  /// In en, this message translates to:
  /// **'Board'**
  String get board;

  /// No description provided for @boardTitle.
  ///
  /// In en, this message translates to:
  /// **'Sticky Board'**
  String get boardTitle;

  /// No description provided for @boardOpen.
  ///
  /// In en, this message translates to:
  /// **'Sticky note board'**
  String get boardOpen;

  /// No description provided for @boardAddCard.
  ///
  /// In en, this message translates to:
  /// **'Add card'**
  String get boardAddCard;

  /// No description provided for @boardNewCardText.
  ///
  /// In en, this message translates to:
  /// **'New note'**
  String get boardNewCardText;

  /// No description provided for @boardDeleteCard.
  ///
  /// In en, this message translates to:
  /// **'Delete card'**
  String get boardDeleteCard;

  /// No description provided for @boardDeleteCardTitle.
  ///
  /// In en, this message translates to:
  /// **'Delete this card?'**
  String get boardDeleteCardTitle;

  /// No description provided for @boardBacklinks.
  ///
  /// In en, this message translates to:
  /// **'Linked from'**
  String get boardBacklinks;

  /// No description provided for @boardNoBacklinks.
  ///
  /// In en, this message translates to:
  /// **'Nothing links here yet'**
  String get boardNoBacklinks;

  /// No description provided for @boardDanglingLink.
  ///
  /// In en, this message translates to:
  /// **'No card named \"{target}\"'**
  String boardDanglingLink(String target);

  /// No description provided for @close.
  ///
  /// In en, this message translates to:
  /// **'Close'**
  String get close;

  /// No description provided for @vaultSetupTitle.
  ///
  /// In en, this message translates to:
  /// **'Choose your vault'**
  String get vaultSetupTitle;

  /// No description provided for @vaultSetupHeadline.
  ///
  /// In en, this message translates to:
  /// **'Pick a folder for your notebooks'**
  String get vaultSetupHeadline;

  /// No description provided for @vaultSetupBody.
  ///
  /// In en, this message translates to:
  /// **'BadNote stores your notebooks inside one folder you choose — like an Obsidian vault. Pick a folder you control (e.g. a synced folder) so your notes travel with their files.'**
  String get vaultSetupBody;

  /// No description provided for @vaultChooseFolder.
  ///
  /// In en, this message translates to:
  /// **'Choose folder'**
  String get vaultChooseFolder;

  /// No description provided for @vaultMissingTitle.
  ///
  /// In en, this message translates to:
  /// **'Your vault folder is missing'**
  String get vaultMissingTitle;

  /// No description provided for @vaultMissingBody.
  ///
  /// In en, this message translates to:
  /// **'The folder you picked can\'t be found (it may have been moved, deleted, or on a drive that\'s unplugged). Relocate it or pick a new one.'**
  String get vaultMissingBody;

  /// No description provided for @vaultPickFailed.
  ///
  /// In en, this message translates to:
  /// **'Couldn\'t open the folder picker: {error}'**
  String vaultPickFailed(String error);

  /// No description provided for @vaultNotWritable.
  ///
  /// In en, this message translates to:
  /// **'That folder isn\'t writable. Please choose another.'**
  String get vaultNotWritable;

  /// No description provided for @vaultSection.
  ///
  /// In en, this message translates to:
  /// **'Vault'**
  String get vaultSection;

  /// No description provided for @vaultFolderLabel.
  ///
  /// In en, this message translates to:
  /// **'Vault folder'**
  String get vaultFolderLabel;

  /// No description provided for @vaultNoneSelected.
  ///
  /// In en, this message translates to:
  /// **'No folder selected'**
  String get vaultNoneSelected;

  /// No description provided for @vaultChangeFolder.
  ///
  /// In en, this message translates to:
  /// **'Change vault folder'**
  String get vaultChangeFolder;

  /// No description provided for @vaultUpdated.
  ///
  /// In en, this message translates to:
  /// **'Vault folder updated'**
  String get vaultUpdated;

  /// No description provided for @syncSection.
  ///
  /// In en, this message translates to:
  /// **'Sync (WebDAV)'**
  String get syncSection;

  /// No description provided for @syncServerUrl.
  ///
  /// In en, this message translates to:
  /// **'Server URL'**
  String get syncServerUrl;

  /// No description provided for @syncServerUrlHint.
  ///
  /// In en, this message translates to:
  /// **'https://dav.example.com/remote.php/dav/files/me'**
  String get syncServerUrlHint;

  /// No description provided for @syncUsername.
  ///
  /// In en, this message translates to:
  /// **'Username'**
  String get syncUsername;

  /// No description provided for @syncPassword.
  ///
  /// In en, this message translates to:
  /// **'Password'**
  String get syncPassword;

  /// No description provided for @syncRemoteFolder.
  ///
  /// In en, this message translates to:
  /// **'Remote folder'**
  String get syncRemoteFolder;

  /// No description provided for @syncRemoteFolderHint.
  ///
  /// In en, this message translates to:
  /// **'BadNote'**
  String get syncRemoteFolderHint;

  /// No description provided for @syncSave.
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get syncSave;

  /// No description provided for @syncSaved.
  ///
  /// In en, this message translates to:
  /// **'Sync settings saved'**
  String get syncSaved;

  /// No description provided for @syncTestConnection.
  ///
  /// In en, this message translates to:
  /// **'Test connection'**
  String get syncTestConnection;

  /// No description provided for @syncTestOk.
  ///
  /// In en, this message translates to:
  /// **'Connection OK'**
  String get syncTestOk;

  /// No description provided for @syncTestFailed.
  ///
  /// In en, this message translates to:
  /// **'Connection failed: {error}'**
  String syncTestFailed(String error);

  /// No description provided for @syncNow.
  ///
  /// In en, this message translates to:
  /// **'Sync now'**
  String get syncNow;

  /// No description provided for @syncRunning.
  ///
  /// In en, this message translates to:
  /// **'Syncing…'**
  String get syncRunning;

  /// No description provided for @syncNeverRun.
  ///
  /// In en, this message translates to:
  /// **'Never synced'**
  String get syncNeverRun;

  /// No description provided for @syncLastRun.
  ///
  /// In en, this message translates to:
  /// **'Last synced: {when}'**
  String syncLastRun(String when);

  /// No description provided for @syncResultSummary.
  ///
  /// In en, this message translates to:
  /// **'{uploaded} uploaded · {downloaded} downloaded · {conflicts} conflicts'**
  String syncResultSummary(int uploaded, int downloaded, int conflicts);

  /// No description provided for @syncFailed.
  ///
  /// In en, this message translates to:
  /// **'Sync failed: {error}'**
  String syncFailed(String error);

  /// No description provided for @syncAuto.
  ///
  /// In en, this message translates to:
  /// **'Sync automatically on launch'**
  String get syncAuto;

  /// No description provided for @syncCredentialsNote.
  ///
  /// In en, this message translates to:
  /// **'Credentials are stored locally in plain text. Use a dedicated app password.'**
  String get syncCredentialsNote;

  /// No description provided for @syncNotConfigured.
  ///
  /// In en, this message translates to:
  /// **'Enter a server URL to enable sync.'**
  String get syncNotConfigured;

  /// No description provided for @settingsDefaults.
  ///
  /// In en, this message translates to:
  /// **'Defaults'**
  String get settingsDefaults;

  /// No description provided for @settingsAppearance.
  ///
  /// In en, this message translates to:
  /// **'Appearance'**
  String get settingsAppearance;

  /// No description provided for @settingsAbout.
  ///
  /// In en, this message translates to:
  /// **'About'**
  String get settingsAbout;

  /// No description provided for @settingsDefaultTool.
  ///
  /// In en, this message translates to:
  /// **'Default tool'**
  String get settingsDefaultTool;

  /// No description provided for @settingsDefaultColor.
  ///
  /// In en, this message translates to:
  /// **'Default color'**
  String get settingsDefaultColor;

  /// No description provided for @settingsDefaultWidth.
  ///
  /// In en, this message translates to:
  /// **'Default stroke width'**
  String get settingsDefaultWidth;

  /// No description provided for @settingsPressureCurve.
  ///
  /// In en, this message translates to:
  /// **'Pressure curve'**
  String get settingsPressureCurve;

  /// No description provided for @settingsClearConfirmBody.
  ///
  /// In en, this message translates to:
  /// **'This resets pen defaults and appearance. Notes and documents are not affected.'**
  String get settingsClearConfirmBody;

  /// No description provided for @serverSection.
  ///
  /// In en, this message translates to:
  /// **'BadNote Server'**
  String get serverSection;

  /// No description provided for @serverUrl.
  ///
  /// In en, this message translates to:
  /// **'Server URL'**
  String get serverUrl;

  /// No description provided for @serverUrlHint.
  ///
  /// In en, this message translates to:
  /// **'http://192.168.1.10:8080'**
  String get serverUrlHint;

  /// No description provided for @serverUsername.
  ///
  /// In en, this message translates to:
  /// **'Username'**
  String get serverUsername;

  /// No description provided for @serverPassword.
  ///
  /// In en, this message translates to:
  /// **'Password'**
  String get serverPassword;

  /// No description provided for @serverSave.
  ///
  /// In en, this message translates to:
  /// **'Save & sign in'**
  String get serverSave;

  /// No description provided for @serverTest.
  ///
  /// In en, this message translates to:
  /// **'Test connection'**
  String get serverTest;

  /// No description provided for @serverTestOk.
  ///
  /// In en, this message translates to:
  /// **'Connected · API {version}'**
  String serverTestOk(String version);

  /// No description provided for @serverTestFail.
  ///
  /// In en, this message translates to:
  /// **'Connection failed: {error}'**
  String serverTestFail(String error);

  /// No description provided for @serverLoggedIn.
  ///
  /// In en, this message translates to:
  /// **'Signed in'**
  String get serverLoggedIn;

  /// No description provided for @serverHint.
  ///
  /// In en, this message translates to:
  /// **'Optional. Self-hosted vault assist + deferred OCR; notes stay fully offline.'**
  String get serverHint;

  /// No description provided for @boardEmptyTitle.
  ///
  /// In en, this message translates to:
  /// **'No sticky notes yet'**
  String get boardEmptyTitle;

  /// No description provided for @boardEmptyBody.
  ///
  /// In en, this message translates to:
  /// **'Tap + to add a card. Write [[other-card-id]] in the body to create a backlink.'**
  String get boardEmptyBody;

  /// No description provided for @relativeJustNow.
  ///
  /// In en, this message translates to:
  /// **'Just now'**
  String get relativeJustNow;

  /// No description provided for @relativeMinutesAgo.
  ///
  /// In en, this message translates to:
  /// **'{n}m ago'**
  String relativeMinutesAgo(int n);

  /// No description provided for @relativeHoursAgo.
  ///
  /// In en, this message translates to:
  /// **'{n}h ago'**
  String relativeHoursAgo(int n);

  /// No description provided for @relativeYesterday.
  ///
  /// In en, this message translates to:
  /// **'Yesterday'**
  String get relativeYesterday;

  /// No description provided for @diagExported.
  ///
  /// In en, this message translates to:
  /// **'Diagnostic pack exported ({bytes} bytes)\nPath copied'**
  String diagExported(int bytes);

  /// No description provided for @diagExportFail.
  ///
  /// In en, this message translates to:
  /// **'Export failed: {error}'**
  String diagExportFail(String error);

  /// No description provided for @processingOcr.
  ///
  /// In en, this message translates to:
  /// **'Processing OCR…'**
  String get processingOcr;

  /// No description provided for @notebooksSection.
  ///
  /// In en, this message translates to:
  /// **'Notebooks'**
  String get notebooksSection;

  /// No description provided for @addBlankPage.
  ///
  /// In en, this message translates to:
  /// **'Blank page'**
  String get addBlankPage;

  /// No description provided for @importIntoNotebook.
  ///
  /// In en, this message translates to:
  /// **'Import into notebook'**
  String get importIntoNotebook;

  /// No description provided for @notebookMembersEmpty.
  ///
  /// In en, this message translates to:
  /// **'No pages yet'**
  String get notebookMembersEmpty;

  /// No description provided for @memberCount.
  ///
  /// In en, this message translates to:
  /// **'{count} items'**
  String memberCount(int count);

  /// No description provided for @textFontSmall.
  ///
  /// In en, this message translates to:
  /// **'S'**
  String get textFontSmall;

  /// No description provided for @textFontMedium.
  ///
  /// In en, this message translates to:
  /// **'M'**
  String get textFontMedium;

  /// No description provided for @textFontLarge.
  ///
  /// In en, this message translates to:
  /// **'L'**
  String get textFontLarge;

  /// No description provided for @textBold.
  ///
  /// In en, this message translates to:
  /// **'Bold'**
  String get textBold;

  /// No description provided for @textDragHint.
  ///
  /// In en, this message translates to:
  /// **'Drag to move'**
  String get textDragHint;
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  Future<AppLocalizations> load(Locale locale) {
    return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
  }

  @override
  bool isSupported(Locale locale) =>
      <String>['en', 'zh'].contains(locale.languageCode);

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

AppLocalizations lookupAppLocalizations(Locale locale) {
  // Lookup logic when only language code is specified.
  switch (locale.languageCode) {
    case 'en':
      return AppLocalizationsEn();
    case 'zh':
      return AppLocalizationsZh();
  }

  throw FlutterError(
    'AppLocalizations.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.',
  );
}
