All checks were successful
ci/woodpecker/pr/pr Pipeline was successful
- Add guard flag to prevent both onPopInvokedWithResult and dispose() from saving progress (double DB writes + double sync pushes) - Capture ref-dependent values synchronously in _saveProgress before any await to prevent accessing disposed ref after super.dispose() - Guard ref.invalidate() calls with mounted check for dispose safety - Add KoreaderSyncAuthException so 401 errors in getProgress and updateProgress propagate instead of being silently swallowed - Show a warning snackbar (once per session) when auth fails so the user knows sync credentials need updating Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1609 lines
46 KiB
Dart
1609 lines
46 KiB
Dart
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_es.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('es')
|
||
];
|
||
|
||
/// No description provided for @appName.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Worldhopper'**
|
||
String get appName;
|
||
|
||
/// No description provided for @navLibrary.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Library'**
|
||
String get navLibrary;
|
||
|
||
/// No description provided for @navServers.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Servers'**
|
||
String get navServers;
|
||
|
||
/// No description provided for @navSettings.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Settings'**
|
||
String get navSettings;
|
||
|
||
/// No description provided for @settingsTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Settings'**
|
||
String get settingsTitle;
|
||
|
||
/// No description provided for @settingsAppearance.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Appearance'**
|
||
String get settingsAppearance;
|
||
|
||
/// No description provided for @settingsAppearanceSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Display options'**
|
||
String get settingsAppearanceSubtitle;
|
||
|
||
/// No description provided for @settingsLanguage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Language'**
|
||
String get settingsLanguage;
|
||
|
||
/// No description provided for @settingsLanguageSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'App language'**
|
||
String get settingsLanguageSubtitle;
|
||
|
||
/// No description provided for @settingsReaders.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Readers'**
|
||
String get settingsReaders;
|
||
|
||
/// No description provided for @settingsReadersSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reader options'**
|
||
String get settingsReadersSubtitle;
|
||
|
||
/// No description provided for @settingsAdvanced.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Advanced'**
|
||
String get settingsAdvanced;
|
||
|
||
/// No description provided for @settingsAdvancedSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Developer and debugging'**
|
||
String get settingsAdvancedSubtitle;
|
||
|
||
/// No description provided for @settingsAbout.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'About'**
|
||
String get settingsAbout;
|
||
|
||
/// No description provided for @settingsAboutSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Worldhopper'**
|
||
String get settingsAboutSubtitle;
|
||
|
||
/// No description provided for @appearanceTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Appearance'**
|
||
String get appearanceTitle;
|
||
|
||
/// No description provided for @appearanceTheme.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Theme'**
|
||
String get appearanceTheme;
|
||
|
||
/// 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 @themeSystem.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'System'**
|
||
String get themeSystem;
|
||
|
||
/// No description provided for @themeSystemSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Follow device theme'**
|
||
String get themeSystemSubtitle;
|
||
|
||
/// No description provided for @languageTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Language'**
|
||
String get languageTitle;
|
||
|
||
/// No description provided for @languageSystem.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'System default'**
|
||
String get languageSystem;
|
||
|
||
/// No description provided for @languageSystemSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Use device language'**
|
||
String get languageSystemSubtitle;
|
||
|
||
/// No description provided for @readersTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Readers'**
|
||
String get readersTitle;
|
||
|
||
/// No description provided for @readersGeneralSection.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'General'**
|
||
String get readersGeneralSection;
|
||
|
||
/// No description provided for @readersEinkMode.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'E-ink mode'**
|
||
String get readersEinkMode;
|
||
|
||
/// No description provided for @readersEinkModeSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Disable animations for e-ink displays'**
|
||
String get readersEinkModeSubtitle;
|
||
|
||
/// No description provided for @readersImageReaderSection.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Image Reader'**
|
||
String get readersImageReaderSection;
|
||
|
||
/// No description provided for @readersReadingDirection.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reading direction'**
|
||
String get readersReadingDirection;
|
||
|
||
/// No description provided for @readersFilterQuality.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Filter quality'**
|
||
String get readersFilterQuality;
|
||
|
||
/// No description provided for @readersPrecachePages.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Pre-cache pages'**
|
||
String get readersPrecachePages;
|
||
|
||
/// No description provided for @readersTwoPageSpread.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Two-page spread'**
|
||
String get readersTwoPageSpread;
|
||
|
||
/// No description provided for @readersTwoPageSpreadSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show two pages side by side on wide screens'**
|
||
String get readersTwoPageSpreadSubtitle;
|
||
|
||
/// No description provided for @readersFirstPageIsCover.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'First page is cover'**
|
||
String get readersFirstPageIsCover;
|
||
|
||
/// No description provided for @readersFirstPageIsCoverSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Show the first page alone in two-page spread'**
|
||
String get readersFirstPageIsCoverSubtitle;
|
||
|
||
/// No description provided for @readingDirectionTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reading Direction'**
|
||
String get readingDirectionTitle;
|
||
|
||
/// No description provided for @readingModeLtr.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Left to right'**
|
||
String get readingModeLtr;
|
||
|
||
/// No description provided for @readingModeLtrDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Standard Western reading order'**
|
||
String get readingModeLtrDescription;
|
||
|
||
/// No description provided for @readingModeRtl.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Right to left'**
|
||
String get readingModeRtl;
|
||
|
||
/// No description provided for @readingModeRtlDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Manga-style reading order'**
|
||
String get readingModeRtlDescription;
|
||
|
||
/// No description provided for @readingModeVertical.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Vertical scroll'**
|
||
String get readingModeVertical;
|
||
|
||
/// No description provided for @readingModeVerticalDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Continuous webtoon-style scrolling'**
|
||
String get readingModeVerticalDescription;
|
||
|
||
/// No description provided for @readingDirectionHelp.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Controls the reading direction for the image reader. Left to right is standard for Western comics, right to left for manga, and vertical scroll for webtoons.'**
|
||
String get readingDirectionHelp;
|
||
|
||
/// No description provided for @readingModeShortLtr.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'LTR'**
|
||
String get readingModeShortLtr;
|
||
|
||
/// No description provided for @readingModeShortRtl.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'RTL'**
|
||
String get readingModeShortRtl;
|
||
|
||
/// No description provided for @readingModeShortVertical.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Vertical'**
|
||
String get readingModeShortVertical;
|
||
|
||
/// No description provided for @filterQualityTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Filter Quality'**
|
||
String get filterQualityTitle;
|
||
|
||
/// No description provided for @filterQualityNone.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'None'**
|
||
String get filterQualityNone;
|
||
|
||
/// No description provided for @filterQualityNoneDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Fastest, may look pixelated'**
|
||
String get filterQualityNoneDescription;
|
||
|
||
/// No description provided for @filterQualityLow.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Low'**
|
||
String get filterQualityLow;
|
||
|
||
/// No description provided for @filterQualityLowDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Bilinear interpolation'**
|
||
String get filterQualityLowDescription;
|
||
|
||
/// No description provided for @filterQualityMedium.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Medium'**
|
||
String get filterQualityMedium;
|
||
|
||
/// No description provided for @filterQualityMediumDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Bilinear with mipmaps, good balance'**
|
||
String get filterQualityMediumDescription;
|
||
|
||
/// No description provided for @filterQualityHigh.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'High'**
|
||
String get filterQualityHigh;
|
||
|
||
/// No description provided for @filterQualityHighDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Bicubic interpolation, best quality'**
|
||
String get filterQualityHighDescription;
|
||
|
||
/// No description provided for @filterQualityHelp.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Controls how images are scaled when a page is zoomed out to fit the screen. Higher quality makes text and fine details sharper but uses more GPU resources. Medium is recommended for most devices.'**
|
||
String get filterQualityHelp;
|
||
|
||
/// No description provided for @precachePagesTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Pre-cache Pages'**
|
||
String get precachePagesTitle;
|
||
|
||
/// No description provided for @precachePagesOff.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Off'**
|
||
String get precachePagesOff;
|
||
|
||
/// No description provided for @precachePagesOffDescription.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Pages load on demand'**
|
||
String get precachePagesOffDescription;
|
||
|
||
/// No description provided for @precachePages1.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'1 page'**
|
||
String get precachePages1;
|
||
|
||
/// No description provided for @precachePages1Description.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Minimal pre-loading'**
|
||
String get precachePages1Description;
|
||
|
||
/// No description provided for @precachePages2.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'2 pages'**
|
||
String get precachePages2;
|
||
|
||
/// No description provided for @precachePages2Description.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Light pre-loading'**
|
||
String get precachePages2Description;
|
||
|
||
/// No description provided for @precachePages3.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'3 pages'**
|
||
String get precachePages3;
|
||
|
||
/// No description provided for @precachePages3Description.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Balanced, recommended'**
|
||
String get precachePages3Description;
|
||
|
||
/// No description provided for @precachePages4.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'4 pages'**
|
||
String get precachePages4;
|
||
|
||
/// No description provided for @precachePages4Description.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Aggressive pre-loading'**
|
||
String get precachePages4Description;
|
||
|
||
/// No description provided for @precachePages5.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'5 pages'**
|
||
String get precachePages5;
|
||
|
||
/// No description provided for @precachePages5Description.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Maximum pre-loading, uses more bandwidth'**
|
||
String get precachePages5Description;
|
||
|
||
/// No description provided for @precachePagesHelp.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Controls how many upcoming pages are pre-loaded in the background while reading. Higher values make swiping feel more seamless but use more bandwidth and memory.'**
|
||
String get precachePagesHelp;
|
||
|
||
/// No description provided for @advancedTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Advanced'**
|
||
String get advancedTitle;
|
||
|
||
/// No description provided for @advancedDeveloperMode.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Developer mode'**
|
||
String get advancedDeveloperMode;
|
||
|
||
/// No description provided for @advancedDeveloperModeSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Enable debugging tools'**
|
||
String get advancedDeveloperModeSubtitle;
|
||
|
||
/// No description provided for @advancedTests.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Tests'**
|
||
String get advancedTests;
|
||
|
||
/// No description provided for @advancedTestsSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Preview UI components'**
|
||
String get advancedTestsSubtitle;
|
||
|
||
/// No description provided for @advancedDebuggingInfo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Debugging info'**
|
||
String get advancedDebuggingInfo;
|
||
|
||
/// No description provided for @advancedVersion.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Version'**
|
||
String get advancedVersion;
|
||
|
||
/// No description provided for @advancedBuildNumber.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Build number'**
|
||
String get advancedBuildNumber;
|
||
|
||
/// No description provided for @advancedPackageName.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Package name'**
|
||
String get advancedPackageName;
|
||
|
||
/// No description provided for @advancedDatabaseVersion.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Database version'**
|
||
String get advancedDatabaseVersion;
|
||
|
||
/// No description provided for @advancedPlatform.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Platform'**
|
||
String get advancedPlatform;
|
||
|
||
/// No description provided for @advancedCopyToClipboard.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Copy to clipboard'**
|
||
String get advancedCopyToClipboard;
|
||
|
||
/// No description provided for @advancedCopyToClipboardSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Copy all debug info for bug reports'**
|
||
String get advancedCopyToClipboardSubtitle;
|
||
|
||
/// No description provided for @advancedDebugInfoCopied.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Debug info copied to clipboard'**
|
||
String get advancedDebugInfoCopied;
|
||
|
||
/// No description provided for @advancedFailedToLoadInfo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to load info'**
|
||
String get advancedFailedToLoadInfo;
|
||
|
||
/// No description provided for @aboutTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'About'**
|
||
String get aboutTitle;
|
||
|
||
/// No description provided for @aboutVersion.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Version'**
|
||
String get aboutVersion;
|
||
|
||
/// No description provided for @aboutVersionUnknown.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'unknown'**
|
||
String get aboutVersionUnknown;
|
||
|
||
/// No description provided for @aboutSourceCode.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Source code'**
|
||
String get aboutSourceCode;
|
||
|
||
/// No description provided for @aboutReportIssue.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Report an issue'**
|
||
String get aboutReportIssue;
|
||
|
||
/// No description provided for @aboutReportIssueSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Open an issue on the repository'**
|
||
String get aboutReportIssueSubtitle;
|
||
|
||
/// No description provided for @devTestsTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Dev Tests'**
|
||
String get devTestsTitle;
|
||
|
||
/// No description provided for @devTestsSnackBars.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Snack Bars'**
|
||
String get devTestsSnackBars;
|
||
|
||
/// No description provided for @devTestsSuccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Success'**
|
||
String get devTestsSuccess;
|
||
|
||
/// No description provided for @devTestsError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error'**
|
||
String get devTestsError;
|
||
|
||
/// No description provided for @devTestsWarning.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Warning'**
|
||
String get devTestsWarning;
|
||
|
||
/// No description provided for @devTestsInfo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Info'**
|
||
String get devTestsInfo;
|
||
|
||
/// No description provided for @devTestsSuccessMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This is a success message'**
|
||
String get devTestsSuccessMessage;
|
||
|
||
/// No description provided for @devTestsErrorMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This is an error message'**
|
||
String get devTestsErrorMessage;
|
||
|
||
/// No description provided for @devTestsWarningMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This is a warning message'**
|
||
String get devTestsWarningMessage;
|
||
|
||
/// No description provided for @devTestsInfoMessage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This is an info message'**
|
||
String get devTestsInfoMessage;
|
||
|
||
/// No description provided for @serverListTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'My Servers'**
|
||
String get serverListTitle;
|
||
|
||
/// No description provided for @serverListEmpty.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No Servers Yet'**
|
||
String get serverListEmpty;
|
||
|
||
/// No description provided for @serverListEmptySubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add your first OPDS server to start browsing and reading'**
|
||
String get serverListEmptySubtitle;
|
||
|
||
/// No description provided for @serverListOffline.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'You are offline. Connect to the internet to browse servers.'**
|
||
String get serverListOffline;
|
||
|
||
/// No description provided for @serverListErrorLoading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error loading servers: {error}'**
|
||
String serverListErrorLoading(String error);
|
||
|
||
/// No description provided for @serverListRetry.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Retry'**
|
||
String get serverListRetry;
|
||
|
||
/// No description provided for @serverListAddServer.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add Server'**
|
||
String get serverListAddServer;
|
||
|
||
/// No description provided for @serverDeleteTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete Server'**
|
||
String get serverDeleteTitle;
|
||
|
||
/// No description provided for @serverDeleteConfirmation.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Are you sure you want to delete \"{name}\"?'**
|
||
String serverDeleteConfirmation(String name);
|
||
|
||
/// No description provided for @serverDeleted.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{name} deleted'**
|
||
String serverDeleted(String name);
|
||
|
||
/// No description provided for @addServerTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add Server'**
|
||
String get addServerTitle;
|
||
|
||
/// No description provided for @addServerNameLabel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Server Name'**
|
||
String get addServerNameLabel;
|
||
|
||
/// No description provided for @addServerNameHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'My Library'**
|
||
String get addServerNameHint;
|
||
|
||
/// No description provided for @addServerUrlLabel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Server URL'**
|
||
String get addServerUrlLabel;
|
||
|
||
/// No description provided for @addServerUrlHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'https://example.com/opds'**
|
||
String get addServerUrlHint;
|
||
|
||
/// No description provided for @addServerRequiresAuth.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Requires Authentication'**
|
||
String get addServerRequiresAuth;
|
||
|
||
/// No description provided for @addServerRequiresAuthSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Enable if server requires login'**
|
||
String get addServerRequiresAuthSubtitle;
|
||
|
||
/// No description provided for @addServerUsername.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Username'**
|
||
String get addServerUsername;
|
||
|
||
/// No description provided for @addServerPassword.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Password'**
|
||
String get addServerPassword;
|
||
|
||
/// No description provided for @addServerValidationNameRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a server name'**
|
||
String get addServerValidationNameRequired;
|
||
|
||
/// No description provided for @addServerValidationUrlRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a server URL'**
|
||
String get addServerValidationUrlRequired;
|
||
|
||
/// No description provided for @addServerValidationUrlInvalid.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a valid URL'**
|
||
String get addServerValidationUrlInvalid;
|
||
|
||
/// No description provided for @addServerValidationUrlScheme.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'URL must start with http:// or https://'**
|
||
String get addServerValidationUrlScheme;
|
||
|
||
/// No description provided for @addServerValidationUsernameRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a username'**
|
||
String get addServerValidationUsernameRequired;
|
||
|
||
/// No description provided for @addServerValidationPasswordRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a password'**
|
||
String get addServerValidationPasswordRequired;
|
||
|
||
/// No description provided for @addServerHelp.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Enter the root URL of your OPDS server. Credentials will be securely stored on your device.'**
|
||
String get addServerHelp;
|
||
|
||
/// No description provided for @addServerButton.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add Server'**
|
||
String get addServerButton;
|
||
|
||
/// No description provided for @addServerDuplicate.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'A server with this URL already exists'**
|
||
String get addServerDuplicate;
|
||
|
||
/// No description provided for @addServerSuccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{name} added successfully'**
|
||
String addServerSuccess(String name);
|
||
|
||
/// No description provided for @addServerError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error adding server: {error}'**
|
||
String addServerError(String error);
|
||
|
||
/// No description provided for @koreaderSyncToggle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'KOReader API Sync'**
|
||
String get koreaderSyncToggle;
|
||
|
||
/// No description provided for @koreaderSyncToggleSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync EPUB reading progress with a KOReader-compatible server'**
|
||
String get koreaderSyncToggleSubtitle;
|
||
|
||
/// No description provided for @koreaderSyncUrl.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync Server URL'**
|
||
String get koreaderSyncUrl;
|
||
|
||
/// No description provided for @koreaderSyncUrlHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'https://sync.example.com'**
|
||
String get koreaderSyncUrlHint;
|
||
|
||
/// No description provided for @koreaderSyncUsername.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync Username'**
|
||
String get koreaderSyncUsername;
|
||
|
||
/// No description provided for @koreaderSyncPassword.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync Password'**
|
||
String get koreaderSyncPassword;
|
||
|
||
/// No description provided for @koreaderSyncTestConnection.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Test Connection'**
|
||
String get koreaderSyncTestConnection;
|
||
|
||
/// No description provided for @koreaderSyncTestSuccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Connection successful! Authenticated as {username}.'**
|
||
String koreaderSyncTestSuccess(String username);
|
||
|
||
/// No description provided for @koreaderSyncTestFailed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Connection failed: {error}'**
|
||
String koreaderSyncTestFailed(String error);
|
||
|
||
/// No description provided for @koreaderSyncValidationUrlRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync server URL is required when KOReader sync is enabled'**
|
||
String get koreaderSyncValidationUrlRequired;
|
||
|
||
/// No description provided for @koreaderSyncValidationUrlInvalid.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Please enter a valid URL'**
|
||
String get koreaderSyncValidationUrlInvalid;
|
||
|
||
/// No description provided for @koreaderSyncValidationUsernameRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync username is required'**
|
||
String get koreaderSyncValidationUsernameRequired;
|
||
|
||
/// No description provided for @koreaderSyncValidationPasswordRequired.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Sync password is required'**
|
||
String get koreaderSyncValidationPasswordRequired;
|
||
|
||
/// No description provided for @koreaderSyncAuthFailed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'KOReader sync: authentication failed. Check your server credentials.'**
|
||
String get koreaderSyncAuthFailed;
|
||
|
||
/// No description provided for @koreaderSyncHelp.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Connect to a KOReader-compatible sync server to synchronize EPUB reading positions across devices.'**
|
||
String get koreaderSyncHelp;
|
||
|
||
/// No description provided for @koreaderSyncResumeInfo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'KOReader sync is enabled. Your reading position will be automatically restored from the sync server when you open this book.'**
|
||
String get koreaderSyncResumeInfo;
|
||
|
||
/// No description provided for @editServerTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Edit Server'**
|
||
String get editServerTitle;
|
||
|
||
/// No description provided for @editServerNotFound.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Server not found'**
|
||
String get editServerNotFound;
|
||
|
||
/// No description provided for @editServerInfo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Server Information'**
|
||
String get editServerInfo;
|
||
|
||
/// No description provided for @editServerAdded.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Added'**
|
||
String get editServerAdded;
|
||
|
||
/// No description provided for @editServerLastSynced.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Last Synced'**
|
||
String get editServerLastSynced;
|
||
|
||
/// No description provided for @editServerSaveButton.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Save Changes'**
|
||
String get editServerSaveButton;
|
||
|
||
/// No description provided for @editServerSuccess.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{name} updated successfully'**
|
||
String editServerSuccess(String name);
|
||
|
||
/// No description provided for @editServerError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error updating server: {error}'**
|
||
String editServerError(String error);
|
||
|
||
/// No description provided for @editServerErrorLoading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error loading server: {error}'**
|
||
String editServerErrorLoading(String error);
|
||
|
||
/// No description provided for @readerError.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error'**
|
||
String get readerError;
|
||
|
||
/// No description provided for @readerNoStreamLink.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This publication cannot be read (no stream link)'**
|
||
String get readerNoStreamLink;
|
||
|
||
/// No description provided for @readerServerNotFound.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Server not found'**
|
||
String get readerServerNotFound;
|
||
|
||
/// No description provided for @readerErrorLoadingServer.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error loading server: {error}'**
|
||
String readerErrorLoadingServer(String error);
|
||
|
||
/// No description provided for @readerReadingDirectionWithMode.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reading direction ({mode})'**
|
||
String readerReadingDirectionWithMode(String mode);
|
||
|
||
/// No description provided for @readerPageOf.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Page {current} of {total}'**
|
||
String readerPageOf(int current, int total);
|
||
|
||
/// No description provided for @readerPagesOf.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Pages {start}-{end} of {total}'**
|
||
String readerPagesOf(int start, int end, int total);
|
||
|
||
/// No description provided for @epubPreparing.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Preparing...'**
|
||
String get epubPreparing;
|
||
|
||
/// No description provided for @epubLoadingFromCache.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Loading from cache...'**
|
||
String get epubLoadingFromCache;
|
||
|
||
/// No description provided for @epubDownloading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Downloading... {percent}%'**
|
||
String epubDownloading(int percent);
|
||
|
||
/// No description provided for @epubProcessing.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Processing EPUB...'**
|
||
String get epubProcessing;
|
||
|
||
/// No description provided for @epubOpeningReader.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Opening reader...'**
|
||
String get epubOpeningReader;
|
||
|
||
/// No description provided for @epubErrorLoading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error loading EPUB: {error}'**
|
||
String epubErrorLoading(String error);
|
||
|
||
/// No description provided for @epubGoBack.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Go Back'**
|
||
String get epubGoBack;
|
||
|
||
/// No description provided for @epubSearch.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Search'**
|
||
String get epubSearch;
|
||
|
||
/// No description provided for @epubSearchHint.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Enter search term...'**
|
||
String get epubSearchHint;
|
||
|
||
/// No description provided for @epubNoResults.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No results found'**
|
||
String get epubNoResults;
|
||
|
||
/// No description provided for @epubSearchResults.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{count} results for \"{query}\"'**
|
||
String epubSearchResults(int count, String query);
|
||
|
||
/// No description provided for @epubSearchFailed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Search failed: {error}'**
|
||
String epubSearchFailed(String error);
|
||
|
||
/// No description provided for @epubChapters.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Chapters'**
|
||
String get epubChapters;
|
||
|
||
/// No description provided for @epubBack.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Back'**
|
||
String get epubBack;
|
||
|
||
/// No description provided for @libraryTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Library'**
|
||
String get libraryTitle;
|
||
|
||
/// No description provided for @libraryRecentlyRead.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Recently Read'**
|
||
String get libraryRecentlyRead;
|
||
|
||
/// No description provided for @libraryNoServers.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No Servers Configured'**
|
||
String get libraryNoServers;
|
||
|
||
/// No description provided for @libraryNoServersSubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add an OPDS server to start reading books'**
|
||
String get libraryNoServersSubtitle;
|
||
|
||
/// No description provided for @libraryAddServer.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Add Server'**
|
||
String get libraryAddServer;
|
||
|
||
/// No description provided for @libraryNoHistory.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No Reading History'**
|
||
String get libraryNoHistory;
|
||
|
||
/// No description provided for @libraryNoHistorySubtitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Start reading a book to see it here'**
|
||
String get libraryNoHistorySubtitle;
|
||
|
||
/// No description provided for @libraryBrowseServers.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Browse Servers'**
|
||
String get libraryBrowseServers;
|
||
|
||
/// No description provided for @libraryErrorLoading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error Loading Library'**
|
||
String get libraryErrorLoading;
|
||
|
||
/// No description provided for @browserLoading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Loading...'**
|
||
String get browserLoading;
|
||
|
||
/// No description provided for @browserLibrary.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Library'**
|
||
String get browserLibrary;
|
||
|
||
/// No description provided for @browserNoContent.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'No Content Available'**
|
||
String get browserNoContent;
|
||
|
||
/// No description provided for @browserLibraryEmpty.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This library appears to be empty'**
|
||
String get browserLibraryEmpty;
|
||
|
||
/// No description provided for @browserCollectionEmpty.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This collection appears to be empty'**
|
||
String get browserCollectionEmpty;
|
||
|
||
/// No description provided for @browserFailedToLoadLibrary.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to Load Library'**
|
||
String get browserFailedToLoadLibrary;
|
||
|
||
/// No description provided for @browserFailedToLoadFeed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to Load Feed'**
|
||
String get browserFailedToLoadFeed;
|
||
|
||
/// No description provided for @browserRetry.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Retry'**
|
||
String get browserRetry;
|
||
|
||
/// No description provided for @browserFailedToLoadMore.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to load more: {error}'**
|
||
String browserFailedToLoadMore(String error);
|
||
|
||
/// No description provided for @browserOfflineEpubNotCached.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This EPUB is not cached. You may not be able to read it offline.'**
|
||
String get browserOfflineEpubNotCached;
|
||
|
||
/// No description provided for @browserOfflinePagesWarning.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'You are offline. Pages may not load properly.'**
|
||
String get browserOfflinePagesWarning;
|
||
|
||
/// No description provided for @publicationPages.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{count} pages'**
|
||
String publicationPages(int count);
|
||
|
||
/// No description provided for @publicationReadingProgress.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Reading Progress'**
|
||
String get publicationReadingProgress;
|
||
|
||
/// No description provided for @publicationPageOfTotal.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Page {current} of {total}'**
|
||
String publicationPageOfTotal(int current, int total);
|
||
|
||
/// No description provided for @publicationLastRead.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Last read: {time}'**
|
||
String publicationLastRead(String time);
|
||
|
||
/// No description provided for @publicationCannotRead.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This publication cannot be read in the app'**
|
||
String get publicationCannotRead;
|
||
|
||
/// No description provided for @publicationContinueFromPage.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Continue reading from page {page}'**
|
||
String publicationContinueFromPage(int page);
|
||
|
||
/// No description provided for @publicationStartReading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Start Reading'**
|
||
String get publicationStartReading;
|
||
|
||
/// No description provided for @publicationContinueReading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Continue Reading'**
|
||
String get publicationContinueReading;
|
||
|
||
/// No description provided for @publicationReadAgain.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Read Again'**
|
||
String get publicationReadAgain;
|
||
|
||
/// No description provided for @publicationStartFromBeginning.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Start from Beginning'**
|
||
String get publicationStartFromBeginning;
|
||
|
||
/// No description provided for @publicationCollection.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Collection'**
|
||
String get publicationCollection;
|
||
|
||
/// No description provided for @recentlyReadPublicationNotFound.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Publication not found'**
|
||
String get recentlyReadPublicationNotFound;
|
||
|
||
/// No description provided for @recentlyReadErrorLoading.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Error loading publication'**
|
||
String get recentlyReadErrorLoading;
|
||
|
||
/// No description provided for @recentlyReadViewRawData.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'View raw data'**
|
||
String get recentlyReadViewRawData;
|
||
|
||
/// No description provided for @recentlyReadRemove.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Remove from Recently Read'**
|
||
String get recentlyReadRemove;
|
||
|
||
/// No description provided for @recentlyReadRemoveTitle.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Remove from Recently Read'**
|
||
String get recentlyReadRemoveTitle;
|
||
|
||
/// No description provided for @recentlyReadRemoveConfirmation.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Remove \"{title}\" from your reading history?\n\nThis will not delete the book from your library.'**
|
||
String recentlyReadRemoveConfirmation(String title);
|
||
|
||
/// No description provided for @recentlyReadRemoved.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Removed from Recently Read'**
|
||
String get recentlyReadRemoved;
|
||
|
||
/// No description provided for @recentlyReadRemoveFailed.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Failed to remove: {error}'**
|
||
String recentlyReadRemoveFailed(String error);
|
||
|
||
/// No description provided for @recentlyReadRawData.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Raw Data'**
|
||
String get recentlyReadRawData;
|
||
|
||
/// No description provided for @recentlyReadOfflineEpubNotCached.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'This EPUB is not cached. Connect to internet to download.'**
|
||
String get recentlyReadOfflineEpubNotCached;
|
||
|
||
/// No description provided for @recentlyReadOfflinePagesWarning.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'You are offline. Pages may not load.'**
|
||
String get recentlyReadOfflinePagesWarning;
|
||
|
||
/// No description provided for @recentlyReadUnsupportedFormat.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Unsupported format'**
|
||
String get recentlyReadUnsupportedFormat;
|
||
|
||
/// No description provided for @serverCardEdit.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Edit'**
|
||
String get serverCardEdit;
|
||
|
||
/// No description provided for @serverCardDelete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete'**
|
||
String get serverCardDelete;
|
||
|
||
/// No description provided for @serverCardAuthenticated.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Authenticated'**
|
||
String get serverCardAuthenticated;
|
||
|
||
/// No description provided for @serverCardLastSynced.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Last synced: {time}'**
|
||
String serverCardLastSynced(String time);
|
||
|
||
/// No description provided for @offlineSemanticLabel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Offline'**
|
||
String get offlineSemanticLabel;
|
||
|
||
/// No description provided for @nextInSeriesNext.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Next'**
|
||
String get nextInSeriesNext;
|
||
|
||
/// No description provided for @nextInSeriesFinished.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Finished'**
|
||
String get nextInSeriesFinished;
|
||
|
||
/// No description provided for @nextInSeriesBackToDetails.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Back to details'**
|
||
String get nextInSeriesBackToDetails;
|
||
|
||
/// No description provided for @nextInSeriesBackToLibrary.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Back to library'**
|
||
String get nextInSeriesBackToLibrary;
|
||
|
||
/// No description provided for @routeNotFound.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Page not found: {uri}'**
|
||
String routeNotFound(String uri);
|
||
|
||
/// No description provided for @commonCancel.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Cancel'**
|
||
String get commonCancel;
|
||
|
||
/// No description provided for @commonDelete.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Delete'**
|
||
String get commonDelete;
|
||
|
||
/// No description provided for @commonRemove.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Remove'**
|
||
String get commonRemove;
|
||
|
||
/// No description provided for @timeJustNow.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'just now'**
|
||
String get timeJustNow;
|
||
|
||
/// No description provided for @timeMinutesAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{minutes}m ago'**
|
||
String timeMinutesAgo(int minutes);
|
||
|
||
/// No description provided for @timeHoursAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{hours}h ago'**
|
||
String timeHoursAgo(int hours);
|
||
|
||
/// No description provided for @timeDaysAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{days}d ago'**
|
||
String timeDaysAgo(int days);
|
||
|
||
/// No description provided for @timeWeeksAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{weeks}w ago'**
|
||
String timeWeeksAgo(int weeks);
|
||
|
||
/// No description provided for @timeMonthsAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{months}mo ago'**
|
||
String timeMonthsAgo(int months);
|
||
|
||
/// No description provided for @timeYearsAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{years}y ago'**
|
||
String timeYearsAgo(int years);
|
||
|
||
/// No description provided for @timeToday.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Today'**
|
||
String get timeToday;
|
||
|
||
/// No description provided for @timeYesterday.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'Yesterday'**
|
||
String get timeYesterday;
|
||
|
||
/// No description provided for @timeMinAgo.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{minutes} min ago'**
|
||
String timeMinAgo(int minutes);
|
||
|
||
/// No description provided for @timeHoursAgoLong.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{count} {count, plural, =1{hour} other{hours}} ago'**
|
||
String timeHoursAgoLong(int count);
|
||
|
||
/// No description provided for @timeDaysAgoLong.
|
||
///
|
||
/// In en, this message translates to:
|
||
/// **'{days} days ago'**
|
||
String timeDaysAgoLong(int days);
|
||
}
|
||
|
||
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', 'es'].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 'es':
|
||
return AppLocalizationsEs();
|
||
}
|
||
|
||
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.');
|
||
}
|