From d78c5931adfc115592bc5ca1953160fee867dee3 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Fri, 12 Jun 2026 22:33:16 +0200 Subject: [PATCH 01/70] setup localization --- .gitignore | 1 + l10n.yaml | 4 ++++ lib/i18n/en.arb | 2 ++ lib/main.dart | 3 +++ pubspec.lock | 13 +++++++++++++ pubspec.yaml | 52 ++++--------------------------------------------- 6 files changed, 27 insertions(+), 48 deletions(-) create mode 100644 l10n.yaml create mode 100644 lib/i18n/en.arb diff --git a/.gitignore b/.gitignore index 06c97231..0107d5cc 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,7 @@ app.*.map.json *.g.* *.freezed.dart /lib/api +/lib/generated # openapi.json # local environment diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 00000000..2dca67da --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,4 @@ +arb-dir: lib/i18n +output-dir: lib/generated/i18n +template-arb-file: en.arb +nullable-getter: false diff --git a/lib/i18n/en.arb b/lib/i18n/en.arb new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/lib/i18n/en.arb @@ -0,0 +1,2 @@ +{ +} diff --git a/lib/main.dart b/lib/main.dart index 519136ad..71d38199 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/router.dart'; import 'package:kover/riverpod/providers/theme.dart'; import 'package:kover/riverpod/repository/sentry_repository.dart'; @@ -40,6 +41,8 @@ class App extends ConsumerWidget { darkTheme: theme.darkTheme, themeMode: theme.mode, routerConfig: ref.watch(routerProvider), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, ), loading: () => const SizedBox.shrink(), ), diff --git a/pubspec.lock b/pubspec.lock index d4f5873d..6ad7e1ab 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -438,6 +438,11 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_markdown_plus: dependency: "direct main" description: @@ -720,6 +725,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" io: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 87ab3211..c3835a98 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,21 +1,7 @@ name: kover description: "An unofficial cross-platform Kavita frontend." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: "none" # Remove this line if you wish to publish to pub.dev -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: @@ -59,6 +45,9 @@ dependencies: flutter_secure_storage: ^10.2.0 package_info_plus: ^10.1.0 url_launcher: ^6.3.2 + flutter_localizations: + sdk: flutter + intl: ^0.20.0 dev_dependencies: sentry_dart_plugin: ^3.4.0 @@ -76,45 +65,12 @@ dev_dependencies: go_router_builder: ^4.2.0 yaml: ^3.1.3 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. flutter: - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. + generate: true uses-material-design: true - assets: - assets/icon/icon.png - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package - sentry: upload_debug_symbols: true upload_source_maps: true From 103353165b8dffcf0aef0d97cd1eec14497d66c9 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 00:02:24 +0200 Subject: [PATCH 02/70] wip extract strings --- lib/i18n/en.arb | 261 ++++++++++++++++++ lib/pages/home/home_page.dart | 10 +- lib/pages/menu_page/menu_page.dart | 16 +- .../reader/pdf_reader/pdf_toc_drawer.dart | 4 +- lib/pages/reader/reader_page.dart | 9 +- .../reading_list_app_bar.dart | 6 +- .../reading_list_chapter_entry.dart | 6 +- .../reading_lists_page.dart | 20 +- .../chapters_page/chapters_page.dart | 32 ++- .../series_detail_page/series_app_bar.dart | 4 +- .../series_detail_page.dart | 16 +- .../volume_detail_page.dart | 4 +- .../volumes_page/volumes_page.dart | 30 +- lib/pages/series_page/series_page.dart | 34 ++- lib/pages/settings/credentials_settings.dart | 10 +- .../settings/data_management_settings.dart | 43 +-- lib/pages/settings/general_settings.dart | 24 +- lib/pages/settings/settings_page.dart | 16 +- lib/pages/settings/version_label.dart | 9 +- .../want_to_read_page/want_to_read_page.dart | 4 +- lib/utils/constants/kover_icons.dart | 1 + lib/widgets/settings/option_container.dart | 3 +- lib/widgets/util/navigator_container.dart | 16 +- 23 files changed, 453 insertions(+), 125 deletions(-) diff --git a/lib/i18n/en.arb b/lib/i18n/en.arb index 2c63c085..8598243e 100644 --- a/lib/i18n/en.arb +++ b/lib/i18n/en.arb @@ -1,2 +1,263 @@ { + "onDeck": "On Deck", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "recentlyUpdated": "Recently Updated", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "recentlyAdded": "Recently Added", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + } + ,"home": "Home", + "@home": { + "description": "Label for the home page" + }, + "wantToRead": "Want To Read", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "menu": "Menu", + "@menu": { + "description": "Label for the menu button" + }, + "allSeries": "All Series", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "collections": "Collections", + "@collections": { + "description": "Label for the collections menu entry" + }, + "readingLists": "Reading Lists", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "libraries": "Libraries", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "settings": "Settings", + "@settings": { + "description": "Label for the settings menu entry" + }, + "more": "More", + "@more": { + "description": "Label for the more section" + }, + "downloadQueue": "Download Queue", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "general": "General", + "@general": { + "description": "Label for the general settings section" + }, + "themeMode": "Theme Mode", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "system": "System", + "@system": { + "description": "Label for the system theme mode option" + }, + "light": "Light", + "@light": { + "description": "Label for the light theme mode option" + }, + "dark": "Dark", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "outlinedTheme": "Outlined Theme", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "sendDiagnostics": "Send anonymous crash reports and diagnostics", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "sendDiagnosticsDescription": "Help improve the app by sending anonymous error and performance statistics. The data does not contain any personal information and is uniquely used to improve the app.", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "version": "Version: {version} ({buildNumber})", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "github": "GitHub", + "@githubLink": { + "description": "Label for the GitHub link" + }, + + "madeWithLove": "Made with ❤️", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "dataManagement": "Data Management", + "@dataManagement": { + "description": "Label for the data management section" + }, + "downloadAllCovers": "Download All Covers", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "downloadAllCoversDescription": "If disabled, covers will only be downloaded together with chapters. Covers will still be fetched from the server on demand when not downloaded and a connection is available.", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + }, + "maxConcurrentDownloads": "Max Concurrent Downloads", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "reclaimSpace": "Reclaim Space", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "clearDownloads": "Clear Downloads", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "clearCovers": "Clear Covers", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "clearDatabase": "Clear Database", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "clearDatabaseDialogTitle": "Are you sure?", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "clearDatabaseDialogContent": "This will clear the entire local database, including any unsynced progress and downloaded data. This action cannot be undone.", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "cancel": "Cancel", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "databaseBusy": "Database busy...", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "databaseSize": "Database Size", + "@databaseSize": { + "description": "Label for the database size information" + }, + + "credentials": "Credentials", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "baseUrl": "Base URL", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "apiKey": "API Key", + "@apiKey": { + "description": "Label for the API key input field" + }, + "save": "Save", + "@save": { + "description": "Label for the save credentials button" + }, + "sortBy": "Sort By", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "name": "Name", + "@name": { + "description": "Label for sorting by name option" + }, + "dateAdded": "Date Added", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "lastModified": "Last Modified", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "sortDirection": "Sort Direction", + "@direction": { + "description": "Label for the sort direction option in list" + }, + "ascending": "Ascending", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "descending": "Descending", + "@descending": { + "description": "Label for descending sort direction option" + }, + "specials": "Specials", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "storyline": "Storyline", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "volumes": "Volumes", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "chapters": "Chapters", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "genres": "Genres", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "writers": "Writers", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "filter": "Filter", + "@filter": { + "description": "Label for the filter button in lists" + }, + "hideRead": "Hide Read", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "goToChapter": "Go to Chapter", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "goToSeries": "Go to Series", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "markAsRead": "Mark as Read", + "@markAsRead": { + "description": "Label for the mark as read button in in context menus" + }, + "markAsUnread": "Mark as Unread", + "@markAsUnread": { + "description": "Label for the mark as unread button in in context menus" + }, + "items": "{count} {count, plural, =0{{count} items} =1{{count} item} other{{count} items}}", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "unsupportedFormat": "Unsupported format: {format}", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "back": "Back", + "@back": { + "description": "Label for back buttons" + }, + "tableOfContents": "Table of Contents", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + } + + + } diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 0ad31105..f73f9730 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/home/collapsible_section.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/riverpod/providers/series.dart'; @@ -53,11 +54,12 @@ class OnDeck extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final onDeck = ref.watch(onDeckProvider); return AsyncSliver( asyncValue: onDeck, - data: (data) => CollapsibleSection(title: 'On Deck', series: data), + data: (data) => CollapsibleSection(title: l.onDeck, series: data), ); } } @@ -67,12 +69,13 @@ class RecentlyUpdated extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final series = ref.watch(recentlyUpdatedProvider); return AsyncSliver( asyncValue: series, data: (data) => - CollapsibleSection(title: 'Recently Updated', series: data), + CollapsibleSection(title: l.recentlyUpdated, series: data), ); } } @@ -82,11 +85,12 @@ class RecentlyAdded extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final series = ref.watch(recentlyAddedProvider); return AsyncSliver( asyncValue: series, - data: (data) => CollapsibleSection(title: 'Recently Added', series: data), + data: (data) => CollapsibleSection(title: l.recentlyAdded, series: data), ); } } diff --git a/lib/pages/menu_page/menu_page.dart b/lib/pages/menu_page/menu_page.dart index 4f7102fd..8c8143c5 100644 --- a/lib/pages/menu_page/menu_page.dart +++ b/lib/pages/menu_page/menu_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/menu_page/app_list_tile.dart'; import 'package:kover/pages/menu_page/sliver_libraries.dart'; import 'package:kover/pages/menu_page/sliver_section.dart'; @@ -19,6 +20,7 @@ class MenuPage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); WidgetsBinding.instance.addPostFrameCallback((_) { ref.read(syncManagerProvider.notifier).syncLibraries(); }); @@ -48,7 +50,7 @@ class MenuPage extends ConsumerWidget { ), sliver: SliverToBoxAdapter( child: AppListTile( - title: 'All Series', + title: l.allSeries, icon: const Icon(LucideIcons.list), onTap: () => const AllSeriesRoute().push(context), ), @@ -61,7 +63,7 @@ class MenuPage extends ConsumerWidget { ), sliver: SliverToBoxAdapter( child: AppListTile( - title: 'Collections', + title: l.collections, icon: const Icon(KoverIcons.collection), onTap: () => const CollectionsRoute().push(context), ), @@ -74,16 +76,16 @@ class MenuPage extends ConsumerWidget { ), sliver: SliverToBoxAdapter( child: AppListTile( - title: 'Reading Lists', + title: l.readingLists, icon: const Icon(KoverIcons.readingList), onTap: () => const ReadingListsRoute().push(context), ), ), ), - const SliverSection(title: 'Libraries'), + SliverSection(title: l.libraries), const SliverLibraries(), ], - const SliverSection(title: 'More'), + SliverSection(title: l.downloadQueue), SliverPadding( padding: const EdgeInsetsGeometry.symmetric( vertical: LayoutConstants.smallerPadding, @@ -91,7 +93,7 @@ class MenuPage extends ConsumerWidget { ), sliver: SliverToBoxAdapter( child: AppListTile( - title: 'Download Queue', + title: l.downloadQueue, icon: isDownloading ? const Icon(LucideIcons.refreshCw) .animate( @@ -110,7 +112,7 @@ class MenuPage extends ConsumerWidget { ), sliver: SliverToBoxAdapter( child: AppListTile( - title: 'Settings', + title: l.settings, icon: const Icon(LucideIcons.settings), onTap: () => const SettingsRoute().push(context), ), diff --git a/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart b/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart index c305adef..e283c20a 100644 --- a/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart +++ b/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/reader/reader_navigation.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/util/async_value.dart'; @@ -21,6 +22,7 @@ class PdfTocDrawer extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final selectedKey = useState(null); final hasScrolled = useState(false); @@ -66,7 +68,7 @@ class PdfTocDrawer extends HookConsumerWidget { horizontal: LayoutConstants.mediumPadding, ), child: Text( - 'Table of Contents', + l.tableOfContents, style: Theme.of(context).textTheme.headlineMedium, ), ), diff --git a/lib/pages/reader/reader_page.dart b/lib/pages/reader/reader_page.dart index 8b4fb9da..faf02759 100644 --- a/lib/pages/reader/reader_page.dart +++ b/lib/pages/reader/reader_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/reader/epub_reader/epub_reader.dart'; import 'package:kover/pages/reader/image_reader/image_reader.dart'; import 'package:kover/pages/reader/pdf_reader/pdf_reader.dart'; @@ -33,6 +34,8 @@ class ReaderPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); + useEffect(() { SystemChrome.setEnabledSystemUIMode(.immersiveSticky); @@ -88,10 +91,12 @@ class ReaderPage extends HookConsumerWidget { size: LayoutConstants.largeIcon, color: Theme.of(context).colorScheme.error, ), - Text('Unsupported format: ${data.series.format}'), + Text( + l.unsupportedFormat(data.series.format.name.toUpperCase()), + ), FilledButton( onPressed: () => context.pop(), - child: const Text('Back'), + child: Text(l.back), ), ], ), diff --git a/lib/pages/reading_list_details_page/reading_list_app_bar.dart b/lib/pages/reading_list_details_page/reading_list_app_bar.dart index 02409bc8..4c257bf5 100644 --- a/lib/pages/reading_list_details_page/reading_list_app_bar.dart +++ b/lib/pages/reading_list_details_page/reading_list_app_bar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/reader.dart'; import 'package:kover/riverpod/providers/reading_lists.dart'; import 'package:kover/riverpod/providers/router.dart'; @@ -19,6 +20,7 @@ class ReadingListAppBar extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final readingList = ref.watch( readingListProvider(readingListId: readingListId), ); @@ -49,9 +51,7 @@ class ReadingListAppBar extends HookConsumerWidget { if (readingList.summary != null) Async( asyncValue: chapterCount, - data: (count) => Text( - '$count ${count == 1 ? 'item' : 'items'}', - ), + data: (count) => Text(l.items(count)), ), ], ), diff --git a/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart b/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart index c61000d6..26600930 100644 --- a/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart +++ b/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/chapter_model.dart'; import 'package:kover/riverpod/providers/chapter.dart'; import 'package:kover/riverpod/providers/router.dart'; @@ -21,6 +22,7 @@ class ReadingListChapterEntry extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final series = ref.watch(seriesProvider(seriesId: chapter.seriesId)); final progress = ref.watch( chapterProgressProvider(chapterId: chapter.id), @@ -32,7 +34,7 @@ class ReadingListChapterEntry extends ConsumerWidget { contextMenu: ContextMenu( entries: [ MenuItem( - label: const Text('Go to chapter'), + label: Text(l.goToChapter), icon: const Icon(KoverIcons.chapter), onSelected: (_) { ChapterDetailRoute( @@ -42,7 +44,7 @@ class ReadingListChapterEntry extends ConsumerWidget { }, ), MenuItem( - label: const Text('Go to series'), + label: Text(l.goToSeries), icon: const Icon(KoverIcons.series), onSelected: (_) { SeriesDetailRoute(seriesId: series.id).push(context); diff --git a/lib/pages/reading_lists_page/reading_lists_page.dart b/lib/pages/reading_lists_page/reading_lists_page.dart index 8da9fd03..c8759db8 100644 --- a/lib/pages/reading_lists_page/reading_lists_page.dart +++ b/lib/pages/reading_lists_page/reading_lists_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/models/reading_list_model.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; @@ -19,6 +20,7 @@ class ReadingListsPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final sortDirection = useState(SortDirection.ascending); final controller = useTextEditingController(); final readingLists = ref.watch(readingListsProvider); @@ -34,7 +36,7 @@ class ReadingListsPage extends HookConsumerWidget { keyboardDismissBehavior: .onDrag, slivers: [ SliverAppBar.large( - title: const Text('Reading Lists'), + title: Text(l.readingLists), actionsPadding: const EdgeInsets.symmetric( horizontal: LayoutConstants.smallPadding, ), @@ -45,7 +47,7 @@ class ReadingListsPage extends HookConsumerWidget { ? KoverIcons.ascending : KoverIcons.descending, ), - menu: _menu(sortDirection), + menu: _menu(sortDirection: sortDirection, context: context), ), ], ), @@ -113,14 +115,16 @@ class ReadingListsPage extends HookConsumerWidget { return sorted; } - ContextMenu _menu( - ValueNotifier sortDirection, - ) { + ContextMenu _menu({ + required ValueNotifier sortDirection, + required BuildContext context, + }) { + final l = AppLocalizations.of(context); return ContextMenu( entries: [ - const MenuHeader(text: 'Direction'), + MenuHeader(text: l.sortDirection), MenuItem( - label: const Text('Ascending'), + label: Text(l.ascending), icon: _getItemIcon( sortDirection.value == .ascending, ), @@ -129,7 +133,7 @@ class ReadingListsPage extends HookConsumerWidget { }, ), MenuItem( - label: const Text('Descending'), + label: Text(l.descending), icon: _getItemIcon( sortDirection.value == .descending, ), diff --git a/lib/pages/series_detail_page/chapters_page/chapters_page.dart b/lib/pages/series_detail_page/chapters_page/chapters_page.dart index e10fe663..48b24fd0 100644 --- a/lib/pages/series_detail_page/chapters_page/chapters_page.dart +++ b/lib/pages/series_detail_page/chapters_page/chapters_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/chapter_model.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/providers/series.dart'; @@ -19,6 +20,7 @@ class ChaptersPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final hideRead = useState(false); final sortDirection = useState(SortDirection.ascending); final chapters = ref.watch( @@ -44,7 +46,7 @@ class ChaptersPage extends HookConsumerWidget { : chapters; return _ChaptersPage( - title: 'Chapters', + title: l.chapters, seriesId: seriesId, chapters: toShow, action: ContextMenuButton( @@ -53,7 +55,11 @@ class ChaptersPage extends HookConsumerWidget { ? LucideIcons.arrowDownNarrowWide : LucideIcons.arrowDownWideNarrow, ), - menu: _getMenu(hideRead: hideRead, sortDirection: sortDirection), + menu: _getMenu( + hideRead: hideRead, + sortDirection: sortDirection, + context: context, + ), ), ); } @@ -65,6 +71,7 @@ class StorylinePage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final sortDirection = useState(SortDirection.ascending); final chapters = ref.watch( seriesDetailProvider( @@ -79,7 +86,7 @@ class StorylinePage extends HookConsumerWidget { : chapters; return _ChaptersPage( - title: 'Storyline', + title: l.storyline, seriesId: seriesId, chapters: toShow, action: ContextMenuButton( @@ -88,7 +95,7 @@ class StorylinePage extends HookConsumerWidget { ? LucideIcons.arrowDownNarrowWide : LucideIcons.arrowDownWideNarrow, ), - menu: _getMenu(sortDirection: sortDirection), + menu: _getMenu(sortDirection: sortDirection, context: context), ), ); } @@ -100,6 +107,7 @@ class SpecialsPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final sortDirection = useState(SortDirection.ascending); final chapters = ref.watch( seriesDetailProvider( @@ -114,7 +122,7 @@ class SpecialsPage extends HookConsumerWidget { : chapters; return _ChaptersPage( - title: 'Specials', + title: l.specials, seriesId: seriesId, chapters: toShow, action: ContextMenuButton( @@ -123,7 +131,7 @@ class SpecialsPage extends HookConsumerWidget { ? LucideIcons.arrowDownNarrowWide : LucideIcons.arrowDownWideNarrow, ), - menu: _getMenu(sortDirection: sortDirection), + menu: _getMenu(sortDirection: sortDirection, context: context), ), ); } @@ -197,31 +205,33 @@ class _ChaptersPage extends HookConsumerWidget { ContextMenu _getMenu({ ValueNotifier? hideRead, ValueNotifier? sortDirection, + required BuildContext context, }) { + final l = AppLocalizations.of(context); return ContextMenu( entries: [ if (hideRead != null) ...[ - const MenuHeader(text: 'Filter'), + MenuHeader(text: l.filter), MenuItem( icon: hideRead.value ? const Icon(LucideIcons.check) : null, - label: const Text('Hide Read'), + label: Text(l.hideRead), onSelected: (_) => hideRead.value = !hideRead.value, ), ], if (sortDirection != null) ...[ - const MenuHeader(text: 'Sort Direction'), + MenuHeader(text: l.sortBy), MenuItem( icon: sortDirection.value == SortDirection.ascending ? const Icon(LucideIcons.check) : null, - label: const Text('Ascending'), + label: Text(l.ascending), onSelected: (_) => sortDirection.value = SortDirection.ascending, ), MenuItem( icon: sortDirection.value == SortDirection.descending ? const Icon(LucideIcons.check) : null, - label: const Text('Descending'), + label: Text(l.descending), onSelected: (_) => sortDirection.value = SortDirection.descending, ), ], diff --git a/lib/pages/series_detail_page/series_app_bar.dart b/lib/pages/series_detail_page/series_app_bar.dart index af882ee8..c3b9eb83 100644 --- a/lib/pages/series_detail_page/series_app_bar.dart +++ b/lib/pages/series_detail_page/series_app_bar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/series_model.dart'; import 'package:kover/riverpod/managers/download_manager.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; @@ -174,6 +175,7 @@ class _Metadata extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final metadata = ref.watch(seriesMetadataProvider(seriesId: series.id)); return Async( asyncValue: metadata, @@ -204,7 +206,7 @@ class _Metadata extends ConsumerWidget { alignment: .spaceBetween, children: [ LimitedList( - title: 'Writers', + title: l.genres, items: metadata.writers .map( (w) => Text( diff --git a/lib/pages/series_detail_page/series_detail_page.dart b/lib/pages/series_detail_page/series_detail_page.dart index 7f2bb418..ff2c261a 100644 --- a/lib/pages/series_detail_page/series_detail_page.dart +++ b/lib/pages/series_detail_page/series_detail_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/menu_page/app_list_tile.dart'; import 'package:kover/pages/series_detail_page/series_app_bar.dart'; import 'package:kover/riverpod/providers/router.dart'; @@ -16,6 +17,7 @@ class SeriesDetailPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final details = ref.watch(seriesDetailProvider(seriesId: seriesId)); final summary = ref.watch( seriesMetadataProvider(seriesId: seriesId).select( @@ -43,27 +45,30 @@ class SeriesDetailPage extends HookConsumerWidget { children: [ if (detailsData.specials.isNotEmpty) AppListTile( - title: 'Specials (${detailsData.specials.length})', + title: + '${l.specials} (${detailsData.specials.length})', onTap: () => SpecialsRoute(seriesId: seriesId).push( context, ), ), if (detailsData.storyline.isNotEmpty) AppListTile( - title: 'Storyline (${detailsData.storyline.length})', + title: + '${l.storyline} (${detailsData.storyline.length})', onTap: () => StorylineRoute( seriesId: seriesId, ).push(context), ), if (detailsData.volumes.isNotEmpty) AppListTile( - title: 'Volumes (${detailsData.volumes.length})', + title: '${l.volumes} (${detailsData.volumes.length})', onTap: () => VolumesRoute(seriesId: seriesId).push(context), ), if (detailsData.chapters.isNotEmpty) AppListTile( - title: 'Chapters (${detailsData.chapters.length})', + title: + '${l.chapters} (${detailsData.chapters.length})', onTap: () => ChaptersRoute(seriesId: seriesId).push(context), ), @@ -100,6 +105,7 @@ class _Genres extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final metadata = ref.watch(seriesMetadataProvider(seriesId: seriesId)); final theme = Theme.of(context); return Async( @@ -109,7 +115,7 @@ class _Genres extends ConsumerWidget { spacing: LayoutConstants.smallPadding, children: [ Text( - 'Genres', + l.genres, style: Theme.of(context).textTheme.headlineSmall, ), Wrap( diff --git a/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart b/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart index 8cb4345f..324de437 100644 --- a/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart +++ b/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/series_detail_page/volume_detail_page/volume_app_bar.dart'; import 'package:kover/riverpod/providers/volume.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -17,6 +18,7 @@ class VolumeDetailPage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final volume = ref.watch(volumeProvider(volumeId: volumeId)).value; if (volume == null) return const SizedBox.shrink(); @@ -51,7 +53,7 @@ class VolumeDetailPage extends ConsumerWidget { ), sliver: SliverToBoxAdapter( child: Text( - 'Chapters', + l.chapters, style: Theme.of(context).textTheme.headlineSmall, ), ), diff --git a/lib/pages/series_detail_page/volumes_page/volumes_page.dart b/lib/pages/series_detail_page/volumes_page/volumes_page.dart index 6a9bbc19..3afd2ab2 100644 --- a/lib/pages/series_detail_page/volumes_page/volumes_page.dart +++ b/lib/pages/series_detail_page/volumes_page/volumes_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/providers/series.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -18,6 +19,7 @@ class VolumesPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final hideRead = useState(false); final sortDirection = useState(SortDirection.ascending); final controller = useTextEditingController(); @@ -31,13 +33,17 @@ class VolumesPage extends HookConsumerWidget { keyboardDismissBehavior: .onDrag, slivers: [ SliverAppBar.large( - title: const Text('Volumes'), + title: Text(l.volumes), actionsPadding: const EdgeInsets.symmetric( horizontal: LayoutConstants.smallPadding, ), actions: [ ContextMenuButton( - menu: _getMenu(hideRead, sortDirection), + menu: _getMenu( + hideRead: hideRead, + sortDirection: sortDirection, + context: context, + ), icon: Icon( sortDirection.value == .ascending ? LucideIcons.arrowDownNarrowWide @@ -70,31 +76,33 @@ class VolumesPage extends HookConsumerWidget { ); } - ContextMenu _getMenu( - ValueNotifier hideRead, - ValueNotifier sortDirection, - ) { + ContextMenu _getMenu({ + required ValueNotifier hideRead, + required ValueNotifier sortDirection, + required BuildContext context, + }) { + final l = AppLocalizations.of(context); return ContextMenu( entries: [ - const MenuHeader(text: 'Filter'), + MenuHeader(text: l.filter), MenuItem( icon: hideRead.value ? const Icon(LucideIcons.check) : null, - label: const Text('Hide Read'), + label: Text(l.hideRead), onSelected: (_) => hideRead.value = !hideRead.value, ), - const MenuHeader(text: 'Sort Direction'), + MenuHeader(text: l.sortDirection), MenuItem( icon: sortDirection.value == SortDirection.ascending ? const Icon(LucideIcons.check) : null, - label: const Text('Ascending'), + label: Text(l.ascending), onSelected: (_) => sortDirection.value = SortDirection.ascending, ), MenuItem( icon: sortDirection.value == SortDirection.descending ? const Icon(LucideIcons.check) : null, - label: const Text('Descending'), + label: Text(l.descending), onSelected: (_) => sortDirection.value = SortDirection.descending, ), ], diff --git a/lib/pages/series_page/series_page.dart b/lib/pages/series_page/series_page.dart index 39e35fee..b03e5003 100644 --- a/lib/pages/series_page/series_page.dart +++ b/lib/pages/series_page/series_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/enums/series_sort_option.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/providers/collections.dart'; @@ -20,7 +21,8 @@ class AllSeriesPage extends StatelessWidget { @override Widget build(BuildContext context) { - return const SeriesPage(title: 'All Series'); + final l = AppLocalizations.of(context); + return SeriesPage(title: l.allSeries); } } @@ -132,7 +134,11 @@ class SeriesPage extends HookConsumerWidget { ? LucideIcons.arrowDownNarrowWide : LucideIcons.arrowDownWideNarrow, ), - menu: _menu(sortOption, sortDirection), + menu: _menu( + sortOption: sortOption, + sortDirection: sortDirection, + context: context, + ), ), ], ), @@ -167,44 +173,46 @@ class SeriesPage extends HookConsumerWidget { ); } - ContextMenu _menu( - ValueNotifier sortOption, - ValueNotifier sortDirection, - ) { + ContextMenu _menu({ + required ValueNotifier sortOption, + required ValueNotifier sortDirection, + required BuildContext context, + }) { + final l = AppLocalizations.of(context); return ContextMenu( entries: [ - const MenuHeader(text: 'Sort by'), + MenuHeader(text: l.sortBy), MenuItem( - label: const Text('Name'), + label: Text(l.name), icon: _getItemIcon(sortOption.value == .name), onSelected: (_) { sortOption.value = .name; }, ), MenuItem( - label: const Text('Date Added'), + label: Text(l.dateAdded), icon: _getItemIcon(sortOption.value == .dateAdded), onSelected: (_) { sortOption.value = .dateAdded; }, ), MenuItem( - label: const Text('Last Modified'), + label: Text(l.lastModified), icon: _getItemIcon(sortOption.value == .lastModified), onSelected: (_) { sortOption.value = .lastModified; }, ), - const MenuHeader(text: 'Direction'), + MenuHeader(text: l.sortDirection), MenuItem( - label: const Text('Ascending'), + label: Text(l.ascending), icon: _getItemIcon(sortDirection.value == .ascending), onSelected: (_) { sortDirection.value = .ascending; }, ), MenuItem( - label: const Text('Descending'), + label: Text(l.descending), icon: _getItemIcon(sortDirection.value == .descending), onSelected: (_) { sortDirection.value = .descending; diff --git a/lib/pages/settings/credentials_settings.dart b/lib/pages/settings/credentials_settings.dart index 478204eb..621865d5 100644 --- a/lib/pages/settings/credentials_settings.dart +++ b/lib/pages/settings/credentials_settings.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/auth.dart'; import 'package:kover/riverpod/providers/server_settings.dart'; import 'package:kover/riverpod/providers/settings/credentials.dart'; @@ -40,6 +41,7 @@ class _CredentialsForm extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final obscureKey = useState(true); final urlController = useTextEditingController(text: data.url ?? ''); final apiKeyController = useTextEditingController(text: data.apiKey ?? ''); @@ -50,14 +52,14 @@ class _CredentialsForm extends HookConsumerWidget { spacing: LayoutConstants.mediumPadding, children: [ Text( - 'Credentials', + l.credentials, style: Theme.of(context).textTheme.headlineSmall, ), TextField( enabled: loginStatus != .loading, controller: urlController, decoration: const InputDecoration( - labelText: 'Base URL', + labelText:l.baseUrl, ), ), TextField( @@ -65,7 +67,7 @@ class _CredentialsForm extends HookConsumerWidget { enabled: loginStatus != .loading, controller: apiKeyController, decoration: InputDecoration( - labelText: 'API Key', + labelText: l.apiKey, suffixIcon: Padding( padding: const EdgeInsetsGeometry.symmetric( horizontal: LayoutConstants.smallPadding, @@ -99,7 +101,7 @@ class _CredentialsForm extends HookConsumerWidget { ), ); }, - label: const Text('Save'), + label: const Text(l.save), icon: const Icon(LucideIcons.save), ), ], diff --git a/lib/pages/settings/data_management_settings.dart b/lib/pages/settings/data_management_settings.dart index 215bca17..77f250b6 100644 --- a/lib/pages/settings/data_management_settings.dart +++ b/lib/pages/settings/data_management_settings.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/download_settings.dart'; import 'package:kover/riverpod/repository/database.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -14,6 +15,7 @@ class DataManagementSettings extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final theme = Theme.of(context); final settings = ref.watch(downloadSettingsProvider); @@ -29,14 +31,12 @@ class DataManagementSettings extends ConsumerWidget { spacing: LayoutConstants.largePadding, children: [ Text( - 'Data Management', + l.dataManagement, style: Theme.of(context).textTheme.headlineSmall, ), BooleanOption( - title: 'Download All Covers', - description: - 'If disabled, covers will only be downloaded together with chapters. ' - 'Covers will still be fetched from the server on demand when not downloaded and a connection is available.', + title: l.downloadAllCovers, + description: l.downloadAllCoversDescription, icon: LucideIcons.imageDownDir, value: data.downloadCovers, onChanged: (value) async { @@ -46,7 +46,7 @@ class DataManagementSettings extends ConsumerWidget { }, ), NumericOption( - title: 'Max Concurrent Downloads', + title: l.maxConcurrentDownloads, icon: LucideIcons.download, min: 1, max: 10, @@ -70,7 +70,7 @@ class DataManagementSettings extends ConsumerWidget { children: [ DatabaseClearOperationButton( asyncValue: ref.watch(reclaimSpaceProvider), - text: 'Reclaim Space', + text: l.reclaimSpace, icon: const Icon(LucideIcons.databaseZap), onPressed: () async { await ref @@ -80,7 +80,7 @@ class DataManagementSettings extends ConsumerWidget { ), DatabaseClearOperationButton( asyncValue: ref.watch(clearDownloadsProvider), - text: 'Clear Downloads', + text: l.clearDownloads, icon: const Icon(Icons.file_download_off), onPressed: () async { await ref @@ -90,7 +90,7 @@ class DataManagementSettings extends ConsumerWidget { ), DatabaseClearOperationButton( asyncValue: ref.watch(clearCoversProvider), - text: 'Clear Covers', + text: l.clearCovers, icon: const Icon(LucideIcons.imageOff), onPressed: () async { await ref @@ -100,23 +100,21 @@ class DataManagementSettings extends ConsumerWidget { ), DatabaseClearOperationButton( asyncValue: ref.watch(clearDatabaseProvider), - text: 'Clear Database', + text: l.clearDatabase, icon: const Icon(LucideIcons.trash), onPressed: () async { final confirmed = await showDialog( context: context, builder: (BuildContext context) { return AlertDialog( - title: const Text('Are you sure?'), - content: const Text( - 'This will clear the entire local database, including any unsynced progress and downloaded data. This action cannot be undone.', - ), + title: Text(l.clearDatabaseDialogTitle), + content: Text(l.clearDatabaseDialogContent), actions: [ TextButton( onPressed: () => Navigator.of( context, ).pop(false), - child: const Text('Cancel'), + child: Text(l.cancel), ), FilledButton( style: ElevatedButton.styleFrom( @@ -128,9 +126,7 @@ class DataManagementSettings extends ConsumerWidget { onPressed: () => Navigator.of( context, ).pop(true), - child: const Text( - 'Clear Database', - ), + child: Text(l.clearDatabase), ), ], ); @@ -180,6 +176,8 @@ class DatabaseClearOperationButton extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); + return Async( asyncValue: asyncValue, data: (status) { @@ -192,7 +190,7 @@ class DatabaseClearOperationButton extends ConsumerWidget { label: Text(text), ), .busy => Tooltip( - message: 'Database busy...', + message: l.databaseBusy, triggerMode: .tap, child: FilledButton.icon( onPressed: null, @@ -250,11 +248,16 @@ class DatabaseSize extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); + return Row( mainAxisSize: .min, mainAxisAlignment: .start, children: [ - Text('Database Size: ', style: Theme.of(context).textTheme.labelMedium), + Text( + '${l.databaseSize}: ', + style: Theme.of(context).textTheme.labelMedium, + ), Async( asyncValue: ref.watch(databaseSizeProvider), data: (size) { diff --git a/lib/pages/settings/general_settings.dart b/lib/pages/settings/general_settings.dart index 61ccf9ca..ba9a2074 100644 --- a/lib/pages/settings/general_settings.dart +++ b/lib/pages/settings/general_settings.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/general_settings.dart'; import 'package:kover/riverpod/providers/theme.dart' hide Theme; import 'package:kover/utils/constants/kover_icons.dart'; @@ -14,6 +15,7 @@ class GeneralSettings extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final theme = ref.watch(themeProvider); final generalSettings = ref.watch(generalSettingsProvider); @@ -29,26 +31,26 @@ class GeneralSettings extends ConsumerWidget { spacing: LayoutConstants.largePadding, children: [ Text( - 'General', + l.general, style: Theme.of(context).textTheme.headlineSmall, ), ChoiceOption( - title: 'Theme Mode', + title: l.themeMode, icon: LucideIcons.palette, - options: const [ + options: [ ChoiceOptionEntry( value: ThemeMode.system, - label: 'System', + label: l.system, icon: LucideIcons.sunMoon, ), ChoiceOptionEntry( value: ThemeMode.light, - label: 'Light', + label: l.light, icon: LucideIcons.sun, ), ChoiceOptionEntry( value: ThemeMode.dark, - label: 'Dark', + label: l.dark, icon: LucideIcons.moon, ), ], @@ -58,7 +60,7 @@ class GeneralSettings extends ConsumerWidget { }, ), BooleanOption( - title: 'Outlined Theme', + title: l.outlinedTheme, icon: LucideIcons.squareDashed, value: theme.outlined, onChanged: (value) => @@ -67,13 +69,9 @@ class GeneralSettings extends ConsumerWidget { Async( asyncValue: generalSettings, data: (generalSettings) => BooleanOption( - title: 'Send anonymous crash reports and diagnostics', + title: l.sendDiagnostics, icon: KoverIcons.analytics, - description: - 'Help improve the app by sending anonymous error and ' - 'performance statistics. The data does not contain any ' - 'personal information and is uniquely used to improve ' - 'the app.', + description: l.sendDiagnosticsDescription, value: generalSettings.sendDiagnostics, onChanged: (value) => ref .read(generalSettingsProvider.notifier) diff --git a/lib/pages/settings/settings_page.dart b/lib/pages/settings/settings_page.dart index 0544781d..90f893af 100644 --- a/lib/pages/settings/settings_page.dart +++ b/lib/pages/settings/settings_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/settings/credentials_settings.dart'; import 'package:kover/pages/settings/data_management_settings.dart'; import 'package:kover/pages/settings/general_settings.dart'; @@ -11,22 +12,23 @@ class SettingsPage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - return const Scaffold( + final l = AppLocalizations.of(context); + return Scaffold( extendBody: true, body: SafeArea( bottom: false, child: CustomScrollView( slivers: [ SliverAppBar.large( - title: Text('Settings'), + title: Text(l.settings), ), - SliverToBoxAdapter(child: CredentialsSettings()), - SliverToBoxAdapter(child: GeneralSettings()), - SliverToBoxAdapter(child: DataManagementSettings()), - SliverToBoxAdapter( + const SliverToBoxAdapter(child: CredentialsSettings()), + const SliverToBoxAdapter(child: GeneralSettings()), + const SliverToBoxAdapter(child: DataManagementSettings()), + const SliverToBoxAdapter( child: Center(child: VersionLabel()), ), - SliverBottomPadding(), + const SliverBottomPadding(), ], ), ), diff --git a/lib/pages/settings/version_label.dart b/lib/pages/settings/version_label.dart index 7ab76cdb..e0f90e55 100644 --- a/lib/pages/settings/version_label.dart +++ b/lib/pages/settings/version_label.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/package_info.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/util/async_value.dart'; @@ -10,6 +11,7 @@ class VersionLabel extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final theme = Theme.of(context); final info = ref.watch(packageInfoProvider); @@ -21,8 +23,7 @@ class VersionLabel extends ConsumerWidget { showAboutDialog( context: context, applicationName: info.appName, - applicationVersion: - 'Version: ${info.version} (${info.buildNumber})', + applicationVersion: l.version(info.buildNumber, info.version), applicationIcon: Container( width: LayoutConstants.largestIcon, height: LayoutConstants.largestIcon, @@ -45,7 +46,7 @@ class VersionLabel extends ConsumerWidget { children: [ Row( children: [ - const Text('GitHub: '), + Text('${l.github}: '), InkWell( borderRadius: BorderRadius.circular( LayoutConstants.smallBorderRadius, @@ -71,7 +72,7 @@ class VersionLabel extends ConsumerWidget { ], ), - Text('Made with ❤️', style: theme.textTheme.labelSmall), + Text(l.madeWithLove, style: theme.textTheme.labelSmall), ], ), ], diff --git a/lib/pages/want_to_read_page/want_to_read_page.dart b/lib/pages/want_to_read_page/want_to_read_page.dart index 7a395bfe..122f2293 100644 --- a/lib/pages/want_to_read_page/want_to_read_page.dart +++ b/lib/pages/want_to_read_page/want_to_read_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/riverpod/providers/want_to_read.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -14,6 +15,7 @@ class WantToReadPage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); WidgetsBinding.instance.addPostFrameCallback((_) { ref.read(syncManagerProvider.notifier).syncLibraries(); }); @@ -31,7 +33,7 @@ class WantToReadPage extends ConsumerWidget { padding: LayoutConstants.smallEdgeInsets, sliver: SliverToBoxAdapter( child: Text( - "Want to Read", + l.wantToRead, style: Theme.of(context).textTheme.headlineMedium, ), ), diff --git a/lib/utils/constants/kover_icons.dart b/lib/utils/constants/kover_icons.dart index 25a02fb4..76d6ef34 100644 --- a/lib/utils/constants/kover_icons.dart +++ b/lib/utils/constants/kover_icons.dart @@ -28,6 +28,7 @@ sealed class KoverIcons { static const IconData readingList = LucideIcons.layoutList; static const IconData check = LucideIcons.check; + static const IconData info = LucideIcons.info; static const IconData chevronRight = LucideIcons.chevronRight; } diff --git a/lib/widgets/settings/option_container.dart b/lib/widgets/settings/option_container.dart index c4d666bf..dab3cc34 100644 --- a/lib/widgets/settings/option_container.dart +++ b/lib/widgets/settings/option_container.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; +import 'package:kover/utils/constants/kover_icons.dart'; import 'package:kover/utils/layout_constants.dart'; class OptionContainer extends StatelessWidget { @@ -51,7 +52,7 @@ class OptionContainer extends StatelessWidget { ), child: const IconButton( icon: Icon( - Icons.info_outline, + KoverIcons.info, ), onPressed: null, ), diff --git a/lib/widgets/util/navigator_container.dart b/lib/widgets/util/navigator_container.dart index c24c3f50..d5a7f483 100644 --- a/lib/widgets/util/navigator_container.dart +++ b/lib/widgets/util/navigator_container.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/oneoffs.dart'; import 'package:kover/riverpod/providers/theme.dart' hide Theme; import 'package:kover/utils/layout_constants.dart'; @@ -16,6 +17,7 @@ class NavigatorContainer extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final oneOffs = ref.watch(oneOffsProvider); WidgetsBinding.instance.addPostFrameCallback((_) { @@ -69,18 +71,18 @@ class NavigatorContainer extends ConsumerWidget { initialLocation: true, ); }, - destinations: const [ + destinations: [ NavigationDestination( - icon: Icon(LucideIcons.house), - label: 'Home', + icon: const Icon(LucideIcons.house), + label: l.home, ), NavigationDestination( - icon: Icon(LucideIcons.star), - label: 'Want to Read', + icon: const Icon(LucideIcons.star), + label: l.wantToRead, ), NavigationDestination( - icon: Icon(LucideIcons.library), - label: 'Menu', + icon: const Icon(LucideIcons.library), + label: l.menu, ), ], ), From 1ae1d40713d4d224e8471b95e031bed4c26a6add Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 00:26:44 +0200 Subject: [PATCH 03/70] wip extract strings --- lib/i18n/en.arb | 316 +++++++++++++++++- .../collections_page/collections_page.dart | 13 +- .../download_queue/download_queue_page.dart | 12 +- lib/pages/home/collapsible_section.dart | 4 +- .../epub_reader/epub_reader_controls.dart | 30 +- .../reader/epub_reader/epub_toc_drawer.dart | 2 + .../image_reader/image_reader_controls.dart | 56 ++-- lib/pages/reader/overlay/reader_controls.dart | 4 +- lib/pages/reader/overlay/reader_overlay.dart | 12 +- .../pdf_reader/pdf_reader_controls.dart | 28 +- .../actions_app_bar/search_button.dart | 8 +- lib/widgets/actions_app_bar/sync_button.dart | 32 +- lib/widgets/cards/cover_card.dart | 9 +- lib/widgets/context_menu/actions_menu.dart | 32 +- lib/widgets/details/detail_app_bar.dart | 4 +- lib/widgets/details/filter_input_field.dart | 4 +- lib/widgets/details/info_widgets.dart | 13 +- lib/widgets/details/summary.dart | 6 +- lib/widgets/util/login_guard.dart | 24 +- .../util/monitoring_opt_out_popup.dart | 19 +- 20 files changed, 485 insertions(+), 143 deletions(-) diff --git a/lib/i18n/en.arb b/lib/i18n/en.arb index 8598243e..58e20612 100644 --- a/lib/i18n/en.arb +++ b/lib/i18n/en.arb @@ -3,17 +3,17 @@ "@onDeck": { "description": "Label for the home page on deck section" }, - "recentlyUpdated": "Recently Updated", + "recentlyUpdated": "Recently Updated", "@recentlyUpdated": { "description": "Label for the home page recently updated section" }, "recentlyAdded": "Recently Added", "@recentlyAdded": { "description": "Label for the home page recently added section" - } - ,"home": "Home", + }, + "home": "Home", "@home": { - "description": "Label for the home page" + "description": "Label for the home page" }, "wantToRead": "Want To Read", "@wantToRead": { @@ -69,7 +69,7 @@ }, "dark": "Dark", "@dark": { - "description": "Label for the dark theme mode option" + "description": "Label for the dark theme mode option" }, "outlinedTheme": "Outlined Theme", "@outlinedTheme": { @@ -88,10 +88,9 @@ "description": "Label for the app version, with placeholders for version and build number" }, "github": "GitHub", - "@githubLink": { + "@github": { "description": "Label for the GitHub link" }, - "madeWithLove": "Made with ❤️", "@madeWithLove": { "description": "Label for the made with love message" @@ -148,7 +147,6 @@ "@databaseSize": { "description": "Label for the database size information" }, - "credentials": "Credentials", "@credentials": { "description": "Label for the credentials section in settings" @@ -182,8 +180,8 @@ "description": "Label for sorting by last modified option" }, "sortDirection": "Sort Direction", - "@direction": { - "description": "Label for the sort direction option in list" + "@sortDirection": { + "description": "Label for the sort direction option in list" }, "ascending": "Ascending", "@ascending": { @@ -191,7 +189,7 @@ }, "descending": "Descending", "@descending": { - "description": "Label for descending sort direction option" + "description": "Label for descending sort direction option" }, "specials": "Specials", "@specials": { @@ -235,11 +233,11 @@ }, "markAsRead": "Mark as Read", "@markAsRead": { - "description": "Label for the mark as read button in in context menus" + "description": "Label for the mark as read button in context menus" }, "markAsUnread": "Mark as Unread", "@markAsUnread": { - "description": "Label for the mark as unread button in in context menus" + "description": "Label for the mark as unread button in context menus" }, "items": "{count} {count, plural, =0{{count} items} =1{{count} item} other{{count} items}}", "@items": { @@ -256,8 +254,298 @@ "tableOfContents": "Table of Contents", "@tableOfContents": { "description": "Label for the table of contents drawer in the reader" - } + }, + + "notSignedIn": "Not Signed In", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "noCredentialsDescription": "No credentials configured. Please add your server URL and API key in Settings.", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "openSettings": "Open Settings", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "connectionError": "Connection Error", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "connectionErrorDescription": "Failed to fetch user. Please check your credentials or try again.", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "retry": "Retry", + "@retry": { + "description": "Label for the retry button" + }, + "sendDiagnosticsDialogTitle": "Send anonymous crash reports and diagnostics?", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "sendDiagnosticsChangeable": "This can be changed in the settings at any time.", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "noThanks": "No, thanks", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "imIn": "I'm in!", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "addToWantToRead": "Add to Want to Read", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "removeFromWantToRead": "Remove from Want to Read", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "download": "Download", + "@download": { + "description": "Label for the download context menu item" + }, + "removeDownload": "Remove Download", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "refreshMetadata": "Refresh Metadata", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "refreshCovers": "Refresh Covers", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "noActiveSyncOperations": "No active sync operations", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "syncingAllSeries": "Syncing all series", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "syncingMetadata": "Syncing metadata", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "syncingRecentlyAdded": "Syncing recently added", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "syncingRecentlyUpdated": "Syncing recently updated", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "syncingLibraries": "Syncing libraries", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "syncingProgress": "Syncing progress", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "syncingCovers": "Syncing covers", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "syncingCollections": "Syncing collections", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "syncingReadingLists": "Syncing reading lists", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "refreshingMetadataForSeries": "Refreshing metadata for series {seriesId}", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "refreshingCoversForSeries": "Refreshing covers for series {seriesId}", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "refreshingServerSettings": "Refreshing server settings", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "series": "Series", + "@series": { + "description": "Label for the series search section header" + }, + "moreCount": "+{count} more", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "wordCount": "{wordCount} words", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "hoursCount": "~{hours} hours", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "pagesCount": "{pages} pages", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + + "continueReading": "Continue Reading", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "summary": "Summary", + "@summary": { + "description": "Label for the summary section heading" + }, + "showMore": "Show More", + "@showMore": { + "description": "Label for the show more button" + }, + "showLess": "Show Less", + "@showLess": { + "description": "Label for the show less button" + }, + "cancelAll": "Cancel All", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "noDownloadsInQueue": "No downloads in queue", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "directionLabel": "Direction", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "readerSettings": "Reader Settings", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "readingDirection": "Reading Direction", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "leftToRight": "Left to Right", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "rightToLeft": "Right to Left", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "readerMode": "Reader Mode", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "vertical": "Vertical", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "horizontal": "Horizontal", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "twoPage": "Two Page", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "fitDirection": "Fit Direction", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "contain": "Contain", + "@contain": { + "description": "Label for the contain image fit option" + }, + "width": "Width", + "@width": { + "description": "Label for the fit width image option" + }, + "height": "Height", + "@height": { + "description": "Label for the fit height image option" + }, + "margins": "Margins", + "@margins": { + "description": "Label for the margins setting" + }, + "verticalGap": "Vertical Gap", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "pageGap": "Page Gap", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "coverPage": "Cover Page", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "coverPageDescription": "Treat the first page as the cover, showing it as a single page", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "ignoreSafeAreas": "Ignore Safe Areas", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "showProgressBar": "Show Progress Bar", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "setDefaults": "Set Defaults", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "reset": "Reset", + "@reset": { + "description": "Label for the reset button" + }, + "fontSize": "Font Size", + "@fontSize": { + "description": "Label for the font size setting" + }, + "lineHeight": "Line Height", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "wordSpacing": "Word Spacing", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "letterSpacing": "Letter Spacing", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "highlightResumeParagraph": "Highlight Resume Paragraph", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "dismiss": "Dismiss", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "go": "Go", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "previousChapter": "Previous: {chapterTitle}", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "nextChapter": "Next: {chapterTitle}", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "read": "Read", + "@read": { + "description": "Label for the read action button on cover cards" + } } diff --git a/lib/pages/collections_page/collections_page.dart b/lib/pages/collections_page/collections_page.dart index 62673b67..0c4338b9 100644 --- a/lib/pages/collections_page/collections_page.dart +++ b/lib/pages/collections_page/collections_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/collection_model.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; @@ -20,6 +21,7 @@ class CollectionsPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final sortDirection = useState(SortDirection.ascending); final controller = useTextEditingController(); final collections = ref.watch(collectionsProvider); @@ -35,7 +37,7 @@ class CollectionsPage extends HookConsumerWidget { keyboardDismissBehavior: .onDrag, slivers: [ SliverAppBar.large( - title: const Text('Collections'), + title: Text(l.collections), actionsPadding: const EdgeInsets.symmetric( horizontal: LayoutConstants.smallPadding, ), @@ -46,7 +48,7 @@ class CollectionsPage extends HookConsumerWidget { ? KoverIcons.ascending : KoverIcons.descending, ), - menu: _menu(sortDirection), + menu: _menu(l, sortDirection), ), ], ), @@ -115,13 +117,14 @@ class CollectionsPage extends HookConsumerWidget { } ContextMenu _menu( + AppLocalizations l, ValueNotifier sortDirection, ) { return ContextMenu( entries: [ - const MenuHeader(text: 'Direction'), + MenuHeader(text: l.directionLabel), MenuItem( - label: const Text('Ascending'), + label: Text(l.ascending), icon: _getItemIcon( sortDirection.value == .ascending, ), @@ -130,7 +133,7 @@ class CollectionsPage extends HookConsumerWidget { }, ), MenuItem( - label: const Text('Descending'), + label: Text(l.descending), icon: _getItemIcon( sortDirection.value == .descending, ), diff --git a/lib/pages/download_queue/download_queue_page.dart b/lib/pages/download_queue/download_queue_page.dart index 8f587c43..bb495d14 100644 --- a/lib/pages/download_queue/download_queue_page.dart +++ b/lib/pages/download_queue/download_queue_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/managers/download_manager.dart'; import 'package:kover/riverpod/providers/chapter.dart'; import 'package:kover/riverpod/providers/download.dart'; @@ -16,6 +17,7 @@ class DownloadQueuePage extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final hasDls = ref.watch( downloadManagerProvider.select( (state) => state.value?.downloadQueue.isNotEmpty ?? false, @@ -27,7 +29,7 @@ class DownloadQueuePage extends ConsumerWidget { physics: hasDls ? null : const NeverScrollableScrollPhysics(), slivers: [ SliverAppBar.large( - title: const Text('Download Queue'), + title: Text(l.downloadQueue), actions: [ if (hasDls) const CancellAllAction(), ], @@ -52,11 +54,12 @@ class CancellAllAction extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); return TextButton( onPressed: () async { await ref.read(downloadManagerProvider.notifier).cancelAll(); }, - child: const Text('Cancel All'), + child: Text(l.cancelAll), ); } } @@ -70,9 +73,10 @@ class DownloadQueueList extends ConsumerWidget { return AsyncSliver( asyncValue: queued, data: (data) { + final l = AppLocalizations.of(context); if (data.downloadQueue.isEmpty) { - return const SliverFillRemaining( - child: Center(child: Text('No downloads in queue')), + return SliverFillRemaining( + child: Center(child: Text(l.noDownloadsInQueue)), ); } final queued = data.downloadQueue.toList(); diff --git a/lib/pages/home/collapsible_section.dart b/lib/pages/home/collapsible_section.dart index 04ed70bf..e7f5c46d 100644 --- a/lib/pages/home/collapsible_section.dart +++ b/lib/pages/home/collapsible_section.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/series_model.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/lists/series_sliver_grid.dart'; @@ -17,6 +18,7 @@ class CollapsibleSection extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final showAll = useState(false); final total = series.length; @@ -42,7 +44,7 @@ class CollapsibleSection extends HookConsumerWidget { onPressed: () { showAll.value = !showAll.value; }, - child: Text(showAll.value ? 'Show Less' : 'Show All'), + child: Text(showAll.value ? l.showLess : l.showMore), ), ], ), diff --git a/lib/pages/reader/epub_reader/epub_reader_controls.dart b/lib/pages/reader/epub_reader/epub_reader_controls.dart index a6312980..8976e326 100644 --- a/lib/pages/reader/epub_reader/epub_reader_controls.dart +++ b/lib/pages/reader/epub_reader/epub_reader_controls.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/read_direction.dart'; import 'package:kover/riverpod/providers/settings/epub_reader_settings.dart'; import 'package:kover/utils/constants/kover_icons.dart'; @@ -16,6 +17,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final provider = epubReaderSettingsProvider(seriesId: seriesId); return Async( @@ -38,24 +40,24 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { spacing: LayoutConstants.largePadding, children: [ Text( - 'Reader Settings', + l.readerSettings, style: Theme.of(context).textTheme.titleLarge, ), ChoiceOption( - title: 'Reading Direction', + title: l.readingDirection, icon: settings.readDirection == .leftToRight ? LucideIcons.chevronsRight : LucideIcons.chevronsLeft, value: settings.readDirection, - options: const [ + options: [ ChoiceOptionEntry( value: ReadDirection.leftToRight, - label: 'Left To Right', + label: l.leftToRight, icon: LucideIcons.chevronsRight, ), ChoiceOptionEntry( value: ReadDirection.rightToLeft, - label: 'Right To Left', + label: l.rightToLeft, icon: LucideIcons.chevronsLeft, ), ], @@ -68,7 +70,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { }, ), NumericOption( - title: 'Font Size', + title: l.fontSize, icon: LucideIcons.aLargeSmallDir, value: settings.fontSize, min: EpubReaderSettingsLimits.fontSizeMin, @@ -80,7 +82,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { .setFontSize(newValue), ), NumericOption( - title: 'Margins', + title: l.margins, icon: LucideIcons.panelLeftDashed, value: settings.marginSize, min: EpubReaderSettingsLimits.marginSizeMin, @@ -93,7 +95,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { ), NumericOption( - title: 'Line Height', + title: l.lineHeight, icon: LucideIcons.listChevronsUpDown, value: settings.lineHeight, min: EpubReaderSettingsLimits.lineHeightMin, @@ -105,7 +107,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { ), NumericOption( value: settings.wordSpacing, - title: 'Word Spacing', + title: l.wordSpacing, min: EpubReaderSettingsLimits.wordSpacingMin, max: EpubReaderSettingsLimits.wordSpacingMax, step: EpubReaderSettingsLimits.wordSpacingStep, @@ -115,7 +117,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { icon: LucideIcons.listMinus, ), NumericOption( - title: 'Letter Spacing', + title: l.letterSpacing, icon: LucideIcons.wholeWord, value: settings.letterSpacing, min: EpubReaderSettingsLimits.letterSpacingMin, @@ -127,7 +129,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { ), BooleanOption( icon: LucideIcons.highlighter, - title: 'Highlight Resume Paragraph', + title: l.highlightResumeParagraph, value: settings.highlightResumePoint, onChanged: (value) async { await ref @@ -137,7 +139,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { ), BooleanOption( icon: KoverIcons.progressBar, - title: 'Show Progress Bar', + title: l.showProgressBar, value: settings.showProgressBar, onChanged: (value) async { await ref @@ -168,7 +170,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { onPressed: () async => await ref.read(provider.notifier).setDefault(), icon: const Icon(LucideIcons.save), - label: const Text('Set Defaults'), + label: Text(l.setDefaults), ), ), Expanded( @@ -176,7 +178,7 @@ class EpubReaderSettingsBottomSheet extends ConsumerWidget { onPressed: () async => await ref.read(provider.notifier).reset(), icon: const Icon(LucideIcons.rotateCcw), - label: const Text('Reset'), + label: Text(l.reset), ), ), ], diff --git a/lib/pages/reader/epub_reader/epub_toc_drawer.dart b/lib/pages/reader/epub_reader/epub_toc_drawer.dart index 10228744..f992d436 100644 --- a/lib/pages/reader/epub_reader/epub_toc_drawer.dart +++ b/lib/pages/reader/epub_reader/epub_toc_drawer.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/book_chapter_model.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/riverpod/providers/book.dart'; @@ -19,6 +20,7 @@ class EpubTocDrawer extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final selectedKey = useState(null); final hasScrolled = useState(false); diff --git a/lib/pages/reader/image_reader/image_reader_controls.dart b/lib/pages/reader/image_reader/image_reader_controls.dart index 857d9532..fa795dd3 100644 --- a/lib/pages/reader/image_reader/image_reader_controls.dart +++ b/lib/pages/reader/image_reader/image_reader_controls.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/read_direction.dart'; import 'package:kover/riverpod/providers/breakpoints.dart'; import 'package:kover/riverpod/providers/settings/image_reader_settings.dart'; @@ -18,8 +19,10 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final provider = imageReaderSettingsProvider(seriesId: seriesId); final breakpoint = ref.watch(breakpointsProvider); + return Async( asyncValue: ref.watch(provider), data: (settings) { @@ -41,23 +44,23 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { spacing: LayoutConstants.largePadding, children: [ Text( - 'Reader Settings', + l.readerSettings, style: Theme.of(context).textTheme.titleLarge, ), ChoiceOption( - title: 'Reading Direction', + title: l.readingDirection, icon: settings.readDirection == .leftToRight ? LucideIcons.chevronsRight : LucideIcons.chevronsLeft, - options: const [ + options: [ ChoiceOptionEntry( value: .leftToRight, - label: 'Left to Right', + label: l.leftToRight, icon: LucideIcons.chevronsRight, ), ChoiceOptionEntry( value: .rightToLeft, - label: 'Right to Left', + label: l.rightToLeft, icon: LucideIcons.chevronsLeft, ), ], @@ -69,27 +72,27 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { }, ), ChoiceOption( - title: 'Reader Mode', + title: l.readerMode, icon: switch (settings.readerMode) { .horizontal => LucideIcons.moveHorizontal, .vertical => LucideIcons.moveVertical, .spread => LucideIcons.columns2, }, options: [ - const ChoiceOptionEntry( + ChoiceOptionEntry( value: .horizontal, - label: 'Horizontal', + label: l.horizontal, icon: LucideIcons.moveHorizontal, ), - const ChoiceOptionEntry( + ChoiceOptionEntry( value: .vertical, - label: 'Vertical', + label: l.vertical, icon: LucideIcons.moveVertical, ), if (breakpoint != .compact) - const ChoiceOptionEntry( + ChoiceOptionEntry( value: .spread, - label: 'Two Page', + label: l.twoPage, icon: LucideIcons.columns2, ), ], @@ -102,26 +105,26 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { ), if (settings.readerMode == .horizontal) ...[ ChoiceOption( - title: 'Fit Direction', + title: l.fitDirection, icon: switch (settings.scaleType) { .fitWidth => KoverIcons.fitWidth, .fitHeight => KoverIcons.fitHeight, .contain => KoverIcons.fitContain, }, - options: const [ + options: [ ChoiceOptionEntry( value: .contain, - label: 'Contain', + label: l.contain, icon: KoverIcons.fitContain, ), ChoiceOptionEntry( value: .fitWidth, - label: 'Width', + label: l.width, icon: KoverIcons.fitWidth, ), ChoiceOptionEntry( value: .fitHeight, - label: 'Height', + label: l.height, icon: KoverIcons.fitHeight, ), ], @@ -137,7 +140,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { ], if (settings.readerMode == .vertical) ...[ NumericOption( - title: 'Margins', + title: l.margins, icon: LucideIcons.panelLeftDashed, value: settings.verticalReaderPadding, min: ImageReaderSettingsLimits @@ -151,7 +154,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { .setVerticalReaderPadding(newValue), ), NumericOption( - title: 'Vertical Gap', + title: l.verticalGap, icon: LucideIcons.unfoldVertical, value: settings.verticalReaderGap, min: ImageReaderSettingsLimits.verticalReaderGapMin, @@ -164,7 +167,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { ], if (settings.readerMode == .spread) ...[ NumericOption( - title: 'Page Gap', + title: l.pageGap, icon: LucideIcons.unfoldHorizontal, value: settings.spreadReaderGap, min: ImageReaderSettingsLimits.spreadReaderGapMin, @@ -176,9 +179,8 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { .setSpreadReaderGap(newValue), ), BooleanOption( - title: 'Cover Page', - description: - 'Treat the first page as the cover, showing it as a single page', + title: l.coverPage, + description: l.coverPageDescription, icon: LucideIcons.bookImage, value: settings.spreadCoverPage, onChanged: (newValue) async => await ref @@ -187,7 +189,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { ), ], BooleanOption( - title: 'Ignore Safe Areas', + title: l.ignoreSafeAreas, icon: KoverIcons.safeArea, value: settings.ignoreSafeAreas, onChanged: (newValue) async => await ref @@ -195,7 +197,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { .setIgnoreSafeAreas(newValue), ), BooleanOption( - title: 'Show Progress Bar', + title: l.showProgressBar, icon: KoverIcons.progressBar, value: settings.showProgressBar, onChanged: (newValue) async => await ref @@ -225,7 +227,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { onPressed: () async => await ref.read(provider.notifier).setDefault(), icon: const Icon(LucideIcons.save), - label: const Text('Set Defaults'), + label: Text(l.setDefaults), ), ), Expanded( @@ -233,7 +235,7 @@ class ImageReaderSettingsBottomSheet extends ConsumerWidget { onPressed: () async => await ref.read(provider.notifier).reset(), icon: const Icon(LucideIcons.rotateCcw), - label: const Text('Reset'), + label: Text(l.reset), ), ), ], diff --git a/lib/pages/reader/overlay/reader_controls.dart b/lib/pages/reader/overlay/reader_controls.dart index 3ace2ebb..52de0ef1 100644 --- a/lib/pages/reader/overlay/reader_controls.dart +++ b/lib/pages/reader/overlay/reader_controls.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/reader/epub_reader/epub_reader_controls.dart'; import 'package:kover/pages/reader/image_reader/image_reader_controls.dart'; import 'package:kover/pages/reader/overlay/page_slider.dart'; @@ -85,9 +86,10 @@ class ReaderSettingsButton extends StatelessWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); return IconButton( icon: const Icon(LucideIcons.slidersHorizontal), - tooltip: 'Reader Settings', + tooltip: l.readerSettings, onPressed: () { showModalBottomSheet( context: context, diff --git a/lib/pages/reader/overlay/reader_overlay.dart b/lib/pages/reader/overlay/reader_overlay.dart index 75403ec3..3300dee2 100644 --- a/lib/pages/reader/overlay/reader_overlay.dart +++ b/lib/pages/reader/overlay/reader_overlay.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/reader/overlay/reader_controls.dart'; import 'package:kover/pages/reader/overlay/reader_header.dart'; import 'package:kover/riverpod/providers/reader.dart'; @@ -63,12 +64,12 @@ class ReaderOverlay extends HookConsumerWidget { final uiVisible = useState(false); final snackbarDismissed = useState(false); final showSnackbar = useState(ShowSnackbar.none); + final l = AppLocalizations.of(context); final provider = readerProvider( seriesId: seriesId, chapterId: chapterId, readingListId: readingListId, ); - final shouldShowSnackbar = showSnackbar.value != ShowSnackbar.none && (!snackbarDismissed.value || uiVisible.value); @@ -210,7 +211,7 @@ class ReaderOverlay extends HookConsumerWidget { alignment: .bottomCenter, child: ChapterSnackbar( - title: 'Previous: ${prevChapter.value?.title}', + title: l.previousChapter(prevChapter.value?.title ?? ''), onNavigate: () { log.debug( 'navigating to previous chapter', @@ -246,7 +247,7 @@ class ReaderOverlay extends HookConsumerWidget { alignment: .bottomCenter, child: ChapterSnackbar( - title: 'Next: ${nextChapter.value?.title}', + title: l.nextChapter(nextChapter.value?.title ?? ''), onNavigate: () { log.debug( 'navigating to next chapter', @@ -400,6 +401,7 @@ class ChapterSnackbar extends StatelessWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); return SafeArea( child: Card.filled( margin: LayoutConstants.mediumEdgeInsets, @@ -416,10 +418,10 @@ class ChapterSnackbar extends StatelessWidget { ), ), if (onDismiss != null) - TextButton(onPressed: onDismiss, child: const Text('Dismiss')), + TextButton(onPressed: onDismiss, child: Text(l.dismiss)), FilledButton( onPressed: onNavigate, - child: const Text('Go'), + child: Text(l.go), ), ], ), diff --git a/lib/pages/reader/pdf_reader/pdf_reader_controls.dart b/lib/pages/reader/pdf_reader/pdf_reader_controls.dart index 08b53895..ef964e3e 100644 --- a/lib/pages/reader/pdf_reader/pdf_reader_controls.dart +++ b/lib/pages/reader/pdf_reader/pdf_reader_controls.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/read_direction.dart'; import 'package:kover/riverpod/providers/settings/pdf_reader_settings.dart'; import 'package:kover/utils/constants/kover_icons.dart'; @@ -14,6 +15,7 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final provider = pdfReaderSettingsProvider(seriesId: seriesId); return Async( @@ -36,25 +38,25 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { spacing: LayoutConstants.largePadding, children: [ Text( - 'Reader Settings', + l.readerSettings, style: Theme.of(context).textTheme.titleLarge, ), ChoiceOption( - title: 'Reading Direction', + title: l.readingDirection, icon: switch (settings.readDirection) { .leftToRight => KoverIcons.readingDirectionLTR, .rightToLeft => KoverIcons.readingDirectionRTL, }, value: settings.readDirection, - options: const [ + options: [ ChoiceOptionEntry( value: .leftToRight, - label: 'Left To Right', + label: l.leftToRight, icon: KoverIcons.readingDirectionLTR, ), ChoiceOptionEntry( value: .rightToLeft, - label: 'Right To Left', + label: l.rightToLeft, icon: KoverIcons.readingDirectionRTL, ), ], @@ -65,22 +67,22 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { }, ), ChoiceOption( - title: 'Reader Mode', + title: l.readerMode, icon: switch (settings.readerMode) { PdfReaderMode.vertical => KoverIcons.verticalReader, PdfReaderMode.horizontal => KoverIcons.horizontalReader, }, value: settings.readerMode, - options: const [ + options: [ ChoiceOptionEntry( value: .vertical, - label: 'Vertical', + label: l.vertical, icon: KoverIcons.verticalReader, ), ChoiceOptionEntry( value: .horizontal, - label: 'Horizontal', + label: l.horizontal, icon: KoverIcons.horizontalReader, ), ], @@ -91,7 +93,7 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { }, ), BooleanOption( - title: 'Ignore Safe Areas', + title: l.ignoreSafeAreas, icon: KoverIcons.safeArea, value: settings.ignoreSafeAreas, onChanged: (newValue) async { @@ -101,7 +103,7 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { }, ), BooleanOption( - title: 'Show Progress Bar', + title: l.showProgressBar, icon: KoverIcons.progressBar, value: settings.showProgressBar, onChanged: (newValue) async { @@ -133,7 +135,7 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { onPressed: () async => await ref.read(provider.notifier).setDefault(), icon: const Icon(KoverIcons.save), - label: const Text('Set Defaults'), + label: Text(l.setDefaults), ), ), Expanded( @@ -141,7 +143,7 @@ class PdfReaderSettingsBottomSheet extends ConsumerWidget { onPressed: () async => await ref.read(provider.notifier).reset(), icon: const Icon(KoverIcons.reset), - label: const Text('Reset'), + label: Text(l.reset), ), ), ], diff --git a/lib/widgets/actions_app_bar/search_button.dart b/lib/widgets/actions_app_bar/search_button.dart index 8941da8e..347d0144 100644 --- a/lib/widgets/actions_app_bar/search_button.dart +++ b/lib/widgets/actions_app_bar/search_button.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/models/chapter_model.dart'; import 'package:kover/models/series_model.dart'; import 'package:kover/models/volume_model.dart'; @@ -64,6 +65,7 @@ class SearchButton extends HookConsumerWidget { ); }, suggestionsBuilder: (context, controller) async { + final l = AppLocalizations.of(context); final theme = Theme.of(context); final seriesResults = await ref.read( searchSeriesProvider(controller.text).future, @@ -84,7 +86,7 @@ class SearchButton extends HookConsumerWidget { return [ if (seriesResults.isNotEmpty) ...[ Text( - 'Series', + l.series, style: theme.textTheme.headlineSmall, ), ...seriesResults.map( @@ -96,7 +98,7 @@ class SearchButton extends HookConsumerWidget { ], if (volumesResults.isNotEmpty) ...[ Text( - 'Volumes', + l.volumes, style: theme.textTheme.headlineSmall, ), ...volumesResults.map( @@ -108,7 +110,7 @@ class SearchButton extends HookConsumerWidget { ], if (chaptersResults.isNotEmpty) ...[ Text( - 'Chapters', + l.chapters, style: theme.textTheme.headlineSmall, ), ...chaptersResults.map( diff --git a/lib/widgets/actions_app_bar/sync_button.dart b/lib/widgets/actions_app_bar/sync_button.dart index a07ebb81..8b617fb5 100644 --- a/lib/widgets/actions_app_bar/sync_button.dart +++ b/lib/widgets/actions_app_bar/sync_button.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; @@ -86,6 +87,7 @@ class SyncMenuOverlay extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final syncState = ref.watch(syncManagerProvider); final entries = @@ -93,7 +95,7 @@ class SyncMenuOverlay extends ConsumerWidget { syncing: (phases) => [ for (final phase in phases) ( - label: _phaseLabel(phase), + label: _phaseLabel(l, phase), ), ], ) ?? @@ -113,7 +115,7 @@ class SyncMenuOverlay extends ConsumerWidget { vertical: LayoutConstants.smallPadding, ), child: Text( - 'No active sync operations', + l.noActiveSyncOperations, style: Theme.of(context).textTheme.bodySmall, ), ), @@ -144,21 +146,21 @@ class SyncMenuOverlay extends ConsumerWidget { } } -String _phaseLabel(SyncPhase phase) { +String _phaseLabel(AppLocalizations l, SyncPhase phase) { return phase.when( - allSeries: () => 'Syncing all series', - metadata: () => 'Syncing metadata', + allSeries: () => l.syncingAllSeries, + metadata: () => l.syncingMetadata, tocs: () => 'Syncing chapters TOCs', - recentlyAdded: () => 'Syncing recently added', - recentlyUpdated: () => 'Syncing recently updated', - libraries: () => 'Syncing libraries', - progress: () => 'Syncing progress', - covers: () => 'Syncing covers', - collections: () => 'Syncing collections', - readingLists: () => 'Syncing reading lists', - refreshMetadata: (seriesId) => 'Refreshing metadata for series $seriesId', - refreshCovers: (seriesId) => 'Refreshing covers for series $seriesId', - refreshServerSettings: () => 'Refreshing server settings', + recentlyAdded: () => l.syncingRecentlyAdded, + recentlyUpdated: () => l.syncingRecentlyUpdated, + libraries: () => l.syncingLibraries, + progress: () => l.syncingProgress, + covers: () => l.syncingCovers, + collections: () => l.syncingCollections, + readingLists: () => l.syncingReadingLists, + refreshMetadata: (seriesId) => l.refreshingMetadataForSeries(seriesId), + refreshCovers: (seriesId) => l.refreshingCoversForSeries(seriesId), + refreshServerSettings: () => l.refreshingServerSettings, refreshToc: (chapterId) => 'Refreshing table of contents for chapter $chapterId', ); diff --git a/lib/widgets/cards/cover_card.dart b/lib/widgets/cards/cover_card.dart index 367f1fab..c8367c86 100644 --- a/lib/widgets/cards/cover_card.dart +++ b/lib/widgets/cards/cover_card.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; @@ -23,7 +24,7 @@ class CoverCard extends ConsumerWidget { super.key, this.title, this.icon, - this.actionLabel = 'Read', + this.actionLabel = '', this.actionIcon = const Icon(LucideIcons.bookOpen), this.actionDisabledIcon, this.actionDisabled = true, @@ -36,6 +37,8 @@ class CoverCard extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); + final effectiveLabel = actionLabel.isNotEmpty ? actionLabel : l.read; return Card.filled( clipBehavior: .antiAlias, child: InkWell( @@ -80,14 +83,14 @@ class CoverCard extends ConsumerWidget { icon: actionDisabledIcon ?? const Icon(LucideIcons.wifiOff), - label: FittedBox(child: Text(actionLabel)), + label: FittedBox(child: Text(effectiveLabel)), onPressed: null, ), ), ) : FilledButton.icon( icon: actionIcon, - label: FittedBox(child: Text(actionLabel)), + label: FittedBox(child: Text(effectiveLabel)), onPressed: onActionTap, ), ), diff --git a/lib/widgets/context_menu/actions_menu.dart b/lib/widgets/context_menu/actions_menu.dart index 7ab9529d..38896339 100644 --- a/lib/widgets/context_menu/actions_menu.dart +++ b/lib/widgets/context_menu/actions_menu.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/utils/extensions/iterable.dart'; import 'package:kover/widgets/context_menu/context_menu_button.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; @@ -32,6 +33,7 @@ class ActionsContextMenu extends StatelessWidget { Widget build(BuildContext context) { return _LocalContextMenuRegion( contextMenu: _getContextMenu( + context: context, onMarkRead: onMarkRead, onMarkUnread: onMarkUnread, onAddWantToRead: onAddWantToRead, @@ -70,6 +72,7 @@ class ActionsMenuButton extends StatelessWidget { Widget build(BuildContext context) { return ContextMenuButton( menu: _getContextMenu( + context: context, onMarkRead: onMarkRead, onMarkUnread: onMarkUnread, onDownload: onDownload, @@ -101,6 +104,7 @@ class _LocalContextMenuRegion extends StatelessWidget { } ContextMenu _getContextMenu({ + required BuildContext context, VoidCallback? onMarkRead, VoidCallback? onMarkUnread, VoidCallback? onAddWantToRead, @@ -111,18 +115,22 @@ ContextMenu _getContextMenu({ VoidCallback? onRefreshCovers, }) { final wantToReadEntries = _wantToReadEntries( + context: context, onAddWantToRead: onAddWantToRead, onRemoveWantToRead: onRemoveWantToRead, ); final markReadEntries = _markReadEntries( + context: context, onMarkRead: onMarkRead, onMarkUnread: onMarkUnread, ); final downloadEntries = _downloadEntries( + context: context, onDownload: onDownload, onRemoveDownload: onRemoveDownload, ); final refreshEntries = _refreshEntries( + context: context, onRefreshMetadata: onRefreshMetadata, onRefreshCovers: onRefreshCovers, ); @@ -147,19 +155,21 @@ List _withDividers(List> entries) { } List _wantToReadEntries({ + required BuildContext context, void Function()? onAddWantToRead, void Function()? onRemoveWantToRead, }) { + final l = AppLocalizations.of(context); return [ if (onAddWantToRead != null) MenuItem( - label: const Text('Add to Want to Read'), + label: Text(l.addToWantToRead), icon: const Icon(LucideIcons.star), onSelected: (_) => onAddWantToRead(), ), if (onRemoveWantToRead != null) MenuItem( - label: const Text('Remove from Want to Read'), + label: Text(l.removeFromWantToRead), icon: const Icon(LucideIcons.starOff), onSelected: (_) => onRemoveWantToRead(), ), @@ -167,19 +177,21 @@ List _wantToReadEntries({ } List _markReadEntries({ + required BuildContext context, void Function()? onMarkRead, void Function()? onMarkUnread, }) { + final l = AppLocalizations.of(context); return [ if (onMarkRead != null) MenuItem( - label: const Text('Mark Read'), + label: Text(l.markAsRead), icon: const Icon(LucideIcons.bookCheck), onSelected: (_) => onMarkRead(), ), if (onMarkUnread != null) MenuItem( - label: const Text('Mark Unread'), + label: Text(l.markAsUnread), icon: const Icon(LucideIcons.bookX), onSelected: (_) => onMarkUnread(), ), @@ -187,19 +199,21 @@ List _markReadEntries({ } List _downloadEntries({ + required BuildContext context, void Function()? onDownload, void Function()? onRemoveDownload, }) { + final l = AppLocalizations.of(context); return [ if (onDownload != null) MenuItem( - label: const Text('Download'), + label: Text(l.download), icon: const Icon(LucideIcons.download), onSelected: (_) => onDownload(), ), if (onRemoveDownload != null) MenuItem( - label: const Text('Remove Download'), + label: Text(l.removeDownload), icon: const Icon(LucideIcons.trash2), onSelected: (_) => onRemoveDownload(), ), @@ -207,19 +221,21 @@ List _downloadEntries({ } List _refreshEntries({ + required BuildContext context, VoidCallback? onRefreshMetadata, VoidCallback? onRefreshCovers, }) { + final l = AppLocalizations.of(context); return [ if (onRefreshMetadata != null) MenuItem( - label: const Text('Refresh Metadata'), + label: Text(l.refreshMetadata), icon: const Icon(LucideIcons.fileBracesCorner), onSelected: (_) => onRefreshMetadata(), ), if (onRefreshCovers != null) MenuItem( - label: const Text('Refresh Covers'), + label: Text(l.refreshCovers), icon: const Icon(LucideIcons.imageDown), onSelected: (_) => onRefreshCovers(), ), diff --git a/lib/widgets/details/detail_app_bar.dart b/lib/widgets/details/detail_app_bar.dart index c79fb925..34289840 100644 --- a/lib/widgets/details/detail_app_bar.dart +++ b/lib/widgets/details/detail_app_bar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/pages/series_detail_page/series_info_background.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/lists/adaptive_sliver_app_bar.dart'; @@ -130,6 +131,7 @@ class ContinuePointButton extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final theme = Theme.of(context); return Card( @@ -165,7 +167,7 @@ class ContinuePointButton extends ConsumerWidget { mainAxisSize: .min, children: [ Text( - 'Continue Reading', + l.continueReading, style: theme.textTheme.titleMedium?.copyWith( color: theme.colorScheme.onPrimaryContainer, ), diff --git a/lib/widgets/details/filter_input_field.dart b/lib/widgets/details/filter_input_field.dart index b4937bf7..de9eb38d 100644 --- a/lib/widgets/details/filter_input_field.dart +++ b/lib/widgets/details/filter_input_field.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; class FilterInputField extends HookWidget { @@ -12,11 +13,12 @@ class FilterInputField extends HookWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); useListenable(controller); return TextField( controller: controller, decoration: InputDecoration( - hintText: 'Filter', + hintText: l.filter, prefixIcon: const Icon(LucideIcons.listFilter), suffixIcon: controller.text.isNotEmpty ? IconButton( diff --git a/lib/widgets/details/info_widgets.dart b/lib/widgets/details/info_widgets.dart index 24e0514d..14156d8c 100644 --- a/lib/widgets/details/info_widgets.dart +++ b/lib/widgets/details/info_widgets.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/want_to_read.dart'; import 'package:kover/utils/extensions/int.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -19,6 +20,7 @@ class LimitedList extends StatelessWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); final display = items.take(maxItems); return Column( mainAxisSize: .min, @@ -36,7 +38,7 @@ class LimitedList extends StatelessWidget { for (final item in display) item, if (display.length < items.length) Text( - '+${items.length - display.length} more', + l.moreCount(items.length - display.length), style: Theme.of(context).textTheme.labelMedium, ), ], @@ -82,6 +84,7 @@ class WordCount extends StatelessWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); return Row( mainAxisSize: .min, spacing: LayoutConstants.smallPadding, @@ -91,7 +94,7 @@ class WordCount extends StatelessWidget { size: LayoutConstants.smallIcon, ), Text( - '${wordCount.prettyInt()} words', + l.wordCount(wordCount.prettyInt()), ), ], ); @@ -131,6 +134,7 @@ class RemainingHours extends StatelessWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); return Row( mainAxisSize: .min, spacing: LayoutConstants.smallPadding, @@ -140,7 +144,7 @@ class RemainingHours extends StatelessWidget { size: LayoutConstants.smallIcon, ), Text( - '~${hours.toStringAsFixed(1)} hours', + l.hoursCount(hours.toStringAsFixed(1)), ), ], ); @@ -156,6 +160,7 @@ class Pages extends StatelessWidget { @override Widget build(BuildContext context) { + final l = AppLocalizations.of(context); return Row( mainAxisSize: .min, spacing: LayoutConstants.smallPadding, @@ -164,7 +169,7 @@ class Pages extends StatelessWidget { LucideIcons.fileStack, size: LayoutConstants.smallIcon, ), - Text('${pages.prettyInt()} pages'), + Text(l.pagesCount(pages.prettyInt())), ], ); } diff --git a/lib/widgets/details/summary.dart b/lib/widgets/details/summary.dart index ae84abe4..8dfaba11 100644 --- a/lib/widgets/details/summary.dart +++ b/lib/widgets/details/summary.dart @@ -4,6 +4,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_markdown_plus/flutter_markdown_plus.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/utils/extensions/string.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -17,6 +18,7 @@ class Summary extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final collapsed = useState(true); if (summary == null || summary!.isEmpty) return const SizedBox.shrink(); @@ -30,13 +32,13 @@ class Summary extends HookConsumerWidget { crossAxisAlignment: .center, children: [ Text( - 'Summary', + l.summary, style: Theme.of(context).textTheme.headlineSmall, ), TextButton( onPressed: () => collapsed.value = !collapsed.value, child: Text( - collapsed.value ? 'Show More' : 'Show Less', + collapsed.value ? l.showMore : l.showLess, ), ), ], diff --git a/lib/widgets/util/login_guard.dart b/lib/widgets/util/login_guard.dart index 253eb619..6c2ba760 100644 --- a/lib/widgets/util/login_guard.dart +++ b/lib/widgets/util/login_guard.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/auth.dart'; import 'package:kover/riverpod/providers/router.dart'; import 'package:kover/riverpod/providers/settings/credentials.dart'; @@ -13,6 +14,7 @@ class LoginGuard extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final loginStatus = ref.watch(loginStatusProvider); return switch (loginStatus) { @@ -30,26 +32,26 @@ class LoginGuard extends ConsumerWidget { ), const SizedBox(height: LayoutConstants.smallPadding), Text( - 'Not Signed In', + l.notSignedIn, style: Theme.of(context).textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: LayoutConstants.smallerPadding), - const Padding( - padding: EdgeInsets.symmetric( + Padding( + padding: const EdgeInsets.symmetric( horizontal: LayoutConstants.mediumPadding, ), child: Text( - 'No credentials configured. Please add your server URL and API key in Settings.', + l.noCredentialsDescription, textAlign: TextAlign.center, ), ), const SizedBox(height: LayoutConstants.smallPadding), FilledButton( onPressed: () => const SettingsRoute().go(context), - child: const Text('Open Settings'), + child: Text(l.openSettings), ), ], ), @@ -67,19 +69,19 @@ class LoginGuard extends ConsumerWidget { ), const SizedBox(height: LayoutConstants.smallPadding), Text( - 'Connection Error', + l.connectionError, style: Theme.of(context).textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: LayoutConstants.smallerPadding), - const Padding( - padding: EdgeInsets.symmetric( + Padding( + padding: const EdgeInsets.symmetric( horizontal: LayoutConstants.mediumPadding, ), child: Text( - 'Failed to fetch user. Please check your credentials or try again.', + l.connectionErrorDescription, textAlign: TextAlign.center, ), ), @@ -94,7 +96,7 @@ class LoginGuard extends ConsumerWidget { size: LayoutConstants.smallIcon, color: Theme.of(context).colorScheme.onPrimary, ), - label: const Text('Retry'), + label: Text(l.retry), ), const SizedBox(height: LayoutConstants.smallPadding), FilledButton.icon( @@ -104,7 +106,7 @@ class LoginGuard extends ConsumerWidget { size: LayoutConstants.smallIcon, color: Theme.of(context).colorScheme.onPrimary, ), - label: const Text('Open Settings'), + label: Text(l.openSettings), ), ], ), diff --git a/lib/widgets/util/monitoring_opt_out_popup.dart b/lib/widgets/util/monitoring_opt_out_popup.dart index b850d2bb..c161c02e 100644 --- a/lib/widgets/util/monitoring_opt_out_popup.dart +++ b/lib/widgets/util/monitoring_opt_out_popup.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:kover/generated/i18n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/general_settings.dart'; import 'package:kover/utils/layout_constants.dart'; @@ -8,20 +9,16 @@ class MonitoringOptOutPopup extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); return AlertDialog( - title: const Text('Send anonymous crash reports and diagnostics?'), - content: const Column( + title: Text(l.sendDiagnosticsDialogTitle), + content: Column( spacing: LayoutConstants.mediumPadding, mainAxisSize: .min, crossAxisAlignment: .start, children: [ - Text( - 'Help improve the app by sending anonymous error and ' - 'performance statistics. The data does not contain any ' - 'personal information and is uniquely used to improve ' - 'the app.', - ), - Text('This can be changed in the settings at any time.'), + Text(l.sendDiagnosticsDescription), + Text(l.sendDiagnosticsChangeable), ], ), actions: [ @@ -40,14 +37,14 @@ class MonitoringOptOutPopup extends ConsumerWidget { context, ).colorScheme.onError, ), - child: const Text('No, thanks'), + child: Text(l.noThanks), ), FilledButton( onPressed: () { ref.read(generalSettingsProvider.notifier).setSendDiagnostics(true); Navigator.of(context).pop(); }, - child: const Text('I\'m in!'), + child: Text(l.imIn), ), ], ); From bb366bca976e1e15c874d16a4cbf3bfb01285ba1 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 00:34:46 +0200 Subject: [PATCH 04/70] add readme badges --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index df3c260a..72b6fea4 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ # Kover +[![CI](https://github.com/rodonisi/kover/actions/workflows/ci.yaml/badge.svg)](https://github.com/rodonisi/kover/actions/workflows/ci.yaml) +[![Build & Deploy](https://github.com/rodonisi/kover/actions/workflows/build-and-deploy.yml/badge.svg)](https://github.com/rodonisi/kover/actions/workflows/build-and-deploy.yml) +Translation status + An unofficial cross-platform [Kavita](https://www.kavitareader.com/) client. From 91f0df69e0738eaea8bbbb537b083b04abc39328 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 13 Jun 2026 01:28:07 +0200 Subject: [PATCH 05/70] chore(l10n): update translations (#189) Translations updated in [Hosted Weblate](https://hosted.weblate.org) for [Kover/Kover](https://hosted.weblate.org/projects/kover/kover/). Translation status: ![Weblate translation status](https://hosted.weblate.org/widget/kover/kover/horizontal-auto.svg) --------- Co-authored-by: Simon --- lib/i18n/it.arb | 546 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 546 insertions(+) create mode 100644 lib/i18n/it.arb diff --git a/lib/i18n/it.arb b/lib/i18n/it.arb new file mode 100644 index 00000000..aafb831e --- /dev/null +++ b/lib/i18n/it.arb @@ -0,0 +1,546 @@ +{ + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "@apiKey": { + "description": "Label for the API key input field" + }, + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "@back": { + "description": "Label for back buttons" + }, + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "@collections": { + "description": "Label for the collections menu entry" + }, + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "@contain": { + "description": "Label for the contain image fit option" + }, + "@continueReading": { + "description": "Label for the continue reading button" + }, + "@coverPage": { + "description": "Label for the cover page setting" + }, + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "@dark": { + "description": "Label for the dark theme mode option" + }, + "@dataManagement": { + "description": "Label for the data management section" + }, + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "@databaseSize": { + "description": "Label for the database size information" + }, + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "@descending": { + "description": "Label for descending sort direction option" + }, + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "@download": { + "description": "Label for the download context menu item" + }, + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + }, + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "@filter": { + "description": "Label for the filter button in lists" + }, + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "@fontSize": { + "description": "Label for the font size setting" + }, + "@general": { + "description": "Label for the general settings section" + }, + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "@github": { + "description": "Label for the GitHub link" + }, + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "@height": { + "description": "Label for the fit height image option" + }, + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "@home": { + "description": "Label for the home page" + }, + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "@light": { + "description": "Label for the light theme mode option" + }, + "@lineHeight": { + "description": "Label for the line height setting" + }, + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "@margins": { + "description": "Label for the margins setting" + }, + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "@menu": { + "description": "Label for the menu button" + }, + "@more": { + "description": "Label for the more section" + }, + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "@name": { + "description": "Label for sorting by name option" + }, + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "@openSettings": { + "description": "Label for the button to open settings" + }, + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "@pageGap": { + "description": "Label for the page gap setting" + }, + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "@read": { + "description": "Label for the read action button on cover cards" + }, + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "@reset": { + "description": "Label for the reset button" + }, + "@retry": { + "description": "Label for the retry button" + }, + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "@save": { + "description": "Label for the save credentials button" + }, + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "@series": { + "description": "Label for the series search section header" + }, + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "@settings": { + "description": "Label for the settings menu entry" + }, + "@showLess": { + "description": "Label for the show less button" + }, + "@showMore": { + "description": "Label for the show more button" + }, + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "@summary": { + "description": "Label for the summary section heading" + }, + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "@system": { + "description": "Label for the system theme mode option" + }, + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "@width": { + "description": "Label for the fit width image option" + }, + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "addToWantToRead": "", + "allSeries": "Tutte le Serie", + "apiKey": "", + "ascending": "", + "back": "", + "baseUrl": "", + "cancel": "", + "cancelAll": "", + "chapters": "", + "clearCovers": "", + "clearDatabase": "", + "clearDatabaseDialogContent": "", + "clearDatabaseDialogTitle": "", + "clearDownloads": "", + "collections": "Collezioni", + "connectionError": "", + "connectionErrorDescription": "", + "contain": "", + "continueReading": "", + "coverPage": "", + "coverPageDescription": "", + "credentials": "", + "dark": "Scuro", + "dataManagement": "", + "databaseBusy": "", + "databaseSize": "", + "dateAdded": "", + "descending": "", + "directionLabel": "", + "dismiss": "", + "download": "", + "downloadAllCovers": "", + "downloadAllCoversDescription": "", + "downloadQueue": "Coda Download", + "filter": "", + "fitDirection": "", + "fontSize": "", + "general": "Generali", + "genres": "", + "github": "", + "go": "", + "goToChapter": "", + "goToSeries": "", + "height": "", + "hideRead": "", + "highlightResumeParagraph": "", + "home": "Panoramica", + "horizontal": "", + "hoursCount": "", + "ignoreSafeAreas": "", + "imIn": "", + "items": "", + "lastModified": "", + "leftToRight": "", + "letterSpacing": "", + "libraries": "Librerie", + "light": "Chiaro", + "lineHeight": "", + "madeWithLove": "", + "margins": "", + "markAsRead": "", + "markAsUnread": "", + "maxConcurrentDownloads": "", + "menu": "Menu", + "more": "Altro", + "moreCount": "", + "name": "", + "nextChapter": "", + "noActiveSyncOperations": "", + "noCredentialsDescription": "", + "noDownloadsInQueue": "", + "noThanks": "", + "notSignedIn": "", + "onDeck": "In Primo Piano", + "openSettings": "", + "outlinedTheme": "", + "pageGap": "", + "pagesCount": "", + "previousChapter": "", + "read": "", + "readerMode": "", + "readerSettings": "", + "readingDirection": "", + "readingLists": "Liste di Lettura", + "recentlyAdded": "Aggiunto Recentemente", + "recentlyUpdated": "Aggiornato Recentemente", + "reclaimSpace": "", + "refreshCovers": "", + "refreshMetadata": "", + "refreshingCoversForSeries": "", + "refreshingMetadataForSeries": "", + "refreshingServerSettings": "", + "removeDownload": "", + "removeFromWantToRead": "", + "reset": "", + "retry": "", + "rightToLeft": "", + "save": "", + "sendDiagnostics": "", + "sendDiagnosticsChangeable": "", + "sendDiagnosticsDescription": "", + "sendDiagnosticsDialogTitle": "", + "series": "", + "setDefaults": "", + "settings": "Impostazioni", + "showLess": "", + "showMore": "", + "showProgressBar": "", + "sortBy": "", + "sortDirection": "", + "specials": "", + "storyline": "", + "summary": "", + "syncingAllSeries": "", + "syncingCollections": "", + "syncingCovers": "", + "syncingLibraries": "", + "syncingMetadata": "", + "syncingProgress": "", + "syncingReadingLists": "", + "syncingRecentlyAdded": "", + "syncingRecentlyUpdated": "", + "system": "Sistema", + "tableOfContents": "", + "themeMode": "Modalità Tema", + "twoPage": "", + "unsupportedFormat": "", + "version": "", + "vertical": "", + "verticalGap": "", + "volumes": "", + "wantToRead": "Da Leggere", + "width": "", + "wordCount": "", + "wordSpacing": "", + "writers": "" +} From b5a4ddf959d65b29282836b49a75d7d27c2fd9d6 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 08:32:37 +0200 Subject: [PATCH 06/70] contributing --- .github/CONTRIBUTING.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 51247ccd..19899d38 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -73,6 +73,13 @@ If an idea is not yet clearly defined, consider starting a discussion instead of --- +## Localizations + +Localization contributions are also very welcome and a great way to contribute to Kover. A Weblate project is available +to anyone interested in increasing Kover's language support. To get started, please visit the project on [Weblate](https://hosted.weblate.org/engage/kover/) + +--- + ## Developing Kover ### Codebase Overview From cb6b333fc80a45bbfe0bd62fbb984a2233675295 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 08:35:45 +0200 Subject: [PATCH 07/70] format --- lib/pages/reader/overlay/reader_overlay.dart | 8 ++++++-- lib/widgets/cards/cover_card.dart | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/pages/reader/overlay/reader_overlay.dart b/lib/pages/reader/overlay/reader_overlay.dart index 3300dee2..9fa7d498 100644 --- a/lib/pages/reader/overlay/reader_overlay.dart +++ b/lib/pages/reader/overlay/reader_overlay.dart @@ -211,7 +211,9 @@ class ReaderOverlay extends HookConsumerWidget { alignment: .bottomCenter, child: ChapterSnackbar( - title: l.previousChapter(prevChapter.value?.title ?? ''), + title: l.previousChapter( + prevChapter.value?.title ?? '', + ), onNavigate: () { log.debug( 'navigating to previous chapter', @@ -247,7 +249,9 @@ class ReaderOverlay extends HookConsumerWidget { alignment: .bottomCenter, child: ChapterSnackbar( - title: l.nextChapter(nextChapter.value?.title ?? ''), + title: l.nextChapter( + nextChapter.value?.title ?? '', + ), onNavigate: () { log.debug( 'navigating to next chapter', diff --git a/lib/widgets/cards/cover_card.dart b/lib/widgets/cards/cover_card.dart index c8367c86..aa79d6c2 100644 --- a/lib/widgets/cards/cover_card.dart +++ b/lib/widgets/cards/cover_card.dart @@ -83,7 +83,9 @@ class CoverCard extends ConsumerWidget { icon: actionDisabledIcon ?? const Icon(LucideIcons.wifiOff), - label: FittedBox(child: Text(effectiveLabel)), + label: FittedBox( + child: Text(effectiveLabel), + ), onPressed: null, ), ), From b15d89e18daf60b645447e446b22dc0415e2b148 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:14:32 +0200 Subject: [PATCH 08/70] move analyze after build --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 263fbd57..6cadf5f5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -63,11 +63,11 @@ jobs: - name: Check Format 🎨 run: dart format --output=none --set-exit-if-changed . - - name: Analyze 🔍 - run: flutter analyze - - name: Build 🏗️ run: flutter build ${{ matrix.platform }} + - name: Analyze 🔍 + run: flutter analyze + - name: Test 🧪 run: flutter test From f65abcc920b9f46460c68b84290234534b3fdacf Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:17:11 +0200 Subject: [PATCH 09/70] add step to codegen --- .github/workflows/ci.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6cadf5f5..c29c46ed 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,7 +52,9 @@ jobs: run: cd macos && fastlane disable_codesign - name: Code Generation 🧬 - run: dart run build_runner build --delete-conflicting-outputs + run: | + dart run build_runner build --delete-conflicting-outputs + flutter gen-l10n - name: Validate DB Schema 🗄️ if: matrix.platform != 'windows' @@ -63,11 +65,11 @@ jobs: - name: Check Format 🎨 run: dart format --output=none --set-exit-if-changed . - - name: Build 🏗️ - run: flutter build ${{ matrix.platform }} - - name: Analyze 🔍 run: flutter analyze + - name: Build 🏗️ + run: flutter build ${{ matrix.platform }} + - name: Test 🧪 run: flutter test From 931b7cfb32441c46e137e212f8e81ec1e5859a91 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:26:41 +0200 Subject: [PATCH 10/70] add downloads badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 72b6fea4..1a578354 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![CI](https://github.com/rodonisi/kover/actions/workflows/ci.yaml/badge.svg)](https://github.com/rodonisi/kover/actions/workflows/ci.yaml) [![Build & Deploy](https://github.com/rodonisi/kover/actions/workflows/build-and-deploy.yml/badge.svg)](https://github.com/rodonisi/kover/actions/workflows/build-and-deploy.yml) Translation status +![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/rodonisi/kover/total) An unofficial cross-platform [Kavita](https://www.kavitareader.com/) client. From 53a328f3625a3ca4b06c07183ce44019b895f55e Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 13 Jun 2026 09:28:10 +0200 Subject: [PATCH 11/70] chore(l10n): update translations (#190) Translations updated in [Hosted Weblate](https://hosted.weblate.org) for [Kover/Kover](https://hosted.weblate.org/projects/kover/kover/). Translation status: ![Weblate translation status](https://hosted.weblate.org/widget/kover/kover/horizontal-auto.svg) --------- Co-authored-by: Simon --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1a578354..7144b6c8 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ Translation status ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/rodonisi/kover/total) +![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/rodonisi/kover/total) + An unofficial cross-platform [Kavita](https://www.kavitareader.com/) client. From 38da9d4206124746c44f88d0ef2b3da3845c7c77 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:29:37 +0200 Subject: [PATCH 12/70] duplicate badge --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 7144b6c8..1a578354 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ Translation status ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/rodonisi/kover/total) -![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/rodonisi/kover/total) - An unofficial cross-platform [Kavita](https://www.kavitareader.com/) client. From e3c76224574275db9114ea47c090be7b3e324d5d Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:40:20 +0200 Subject: [PATCH 13/70] add sentry to readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 1a578354..bb6615bd 100644 --- a/README.md +++ b/README.md @@ -119,3 +119,9 @@ To connect Kover to a Kavita instance: Screenshot Screenshot

+ +## Thanks + + + +[Sentry](https://sentry.io/) for providing an open source license for their error reporting software.. From ab92446b692685370c5d452da9c6cefed13cb51d Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:40:29 +0200 Subject: [PATCH 14/70] update contributing toc --- .github/CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 19899d38..e7de1c32 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -7,13 +7,13 @@ Thank you for your interest in contributing to Kover. This document outlines the ## Table of Contents - - [Contributing to Kover](#contributing-to-kover) - [Table of Contents](#table-of-contents) - [AI Assistance Disclosure](#ai-assistance-disclosure) - [Examples](#examples) - [Reporting Issues](#reporting-issues) - [Requesting Features & Enhancements](#requesting-features-enhancements) + - [Localizations](#localizations) - [Developing Kover](#developing-kover) - [Codebase Overview](#codebase-overview) - [Architecture](#architecture) @@ -23,7 +23,7 @@ Thank you for your interest in contributing to Kover. This document outlines the - [Pull Request Guidelines](#pull-request-guidelines) - [Release Process](#release-process) - [Getting Help and Community](#getting-help-and-community) - + --- From 4bf9021fb6186530e4df5c8c0b9cfc8528a69ab4 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:44:48 +0200 Subject: [PATCH 15/70] sentry logo in repo --- README.md | 2 +- docs/assets/sentry.svg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/assets/sentry.svg diff --git a/README.md b/README.md index bb6615bd..f05e31b0 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,6 @@ To connect Kover to a Kavita instance: ## Thanks - + [Sentry](https://sentry.io/) for providing an open source license for their error reporting software.. diff --git a/docs/assets/sentry.svg b/docs/assets/sentry.svg new file mode 100644 index 00000000..eccfedc2 --- /dev/null +++ b/docs/assets/sentry.svg @@ -0,0 +1 @@ + \ No newline at end of file From 6e629d5dde059ee7098ec36aac1b33a330e38e07 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 13 Jun 2026 09:46:19 +0200 Subject: [PATCH 16/70] chore(l10n): update translations (#191) Translations updated in [Hosted Weblate](https://hosted.weblate.org) for [Kover/Kover](https://hosted.weblate.org/projects/kover/kover/). Translation status: ![Weblate translation status](https://hosted.weblate.org/widget/kover/kover/horizontal-auto.svg) --------- Co-authored-by: Simon From 453641fc1ee0772e54fc56990d2a9f7d593f5557 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 09:45:25 +0200 Subject: [PATCH 17/70] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f05e31b0..4819ffae 100644 --- a/README.md +++ b/README.md @@ -124,4 +124,4 @@ To connect Kover to a Kavita instance: -[Sentry](https://sentry.io/) for providing an open source license for their error reporting software.. +[Sentry](https://sentry.io/) for providing an open source license for their error reporting software. From 39816f6f4e648690bbe86e69339a503d133789b5 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 10:29:54 +0200 Subject: [PATCH 18/70] use localized name first for series --- lib/models/series_model.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/series_model.dart b/lib/models/series_model.dart index d53319bd..4c0d3132 100644 --- a/lib/models/series_model.dart +++ b/lib/models/series_model.dart @@ -33,7 +33,7 @@ sealed class SeriesModel with _$SeriesModel { return SeriesModel( id: table.id, libraryId: table.libraryId, - name: table.name, + name: table.localizedName ?? table.name, format: table.format, pages: table.pages, avgHoursToRead: table.avgHoursToRead ?? 0, From 53cf268c44757caf6420b772d592bfec6980891c Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 13 Jun 2026 17:51:12 +0200 Subject: [PATCH 19/70] chore(l10n): update Italian translation Translation: Kover/Kover Language: Italian Progress: 100.0% (136 of 136 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/it/ --- lib/i18n/it.arb | 236 ++++++++++++++++++++++++------------------------ 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/lib/i18n/it.arb b/lib/i18n/it.arb index aafb831e..55bf67c6 100644 --- a/lib/i18n/it.arb +++ b/lib/i18n/it.arb @@ -407,140 +407,140 @@ "@writers": { "description": "Label for the writers metadata in the series details page" }, - "addToWantToRead": "", + "addToWantToRead": "Aggiungi a Da Leggere", "allSeries": "Tutte le Serie", - "apiKey": "", - "ascending": "", - "back": "", - "baseUrl": "", - "cancel": "", - "cancelAll": "", - "chapters": "", - "clearCovers": "", - "clearDatabase": "", - "clearDatabaseDialogContent": "", - "clearDatabaseDialogTitle": "", - "clearDownloads": "", + "apiKey": "API Key", + "ascending": "Crescente", + "back": "Indietro", + "baseUrl": "URL Base", + "cancel": "Annullare", + "cancelAll": "Cancella Tutto", + "chapters": "Capitoli", + "clearCovers": "Rimuovi Copertine", + "clearDatabase": "Pulisci Database", + "clearDatabaseDialogContent": "Questa operazione cancellerà l'intero database locale, inclusi i progressi non sincronizzati e i dati scaricati. Questa azione non può essere annullata.", + "clearDatabaseDialogTitle": "Sei sicuro/a?", + "clearDownloads": "Rimuovi Downloads", "collections": "Collezioni", - "connectionError": "", - "connectionErrorDescription": "", - "contain": "", - "continueReading": "", - "coverPage": "", - "coverPageDescription": "", - "credentials": "", + "connectionError": "Errore di Connessione", + "connectionErrorDescription": "Impossibile recuperare l'utente. Verifica le tue credenziali o riprova.", + "contain": "Contieni", + "continueReading": "Continua a Leggere", + "coverPage": "Pagina di copertina", + "coverPageDescription": "Trattare la prima pagina come copertina, visualizzandola come una pagina singola", + "credentials": "Credenziali", "dark": "Scuro", - "dataManagement": "", - "databaseBusy": "", - "databaseSize": "", - "dateAdded": "", - "descending": "", - "directionLabel": "", - "dismiss": "", - "download": "", - "downloadAllCovers": "", - "downloadAllCoversDescription": "", + "dataManagement": "Gestione dei Dati", + "databaseBusy": "Database occupato…", + "databaseSize": "Dimensione Database", + "dateAdded": "Data Aggiunta", + "descending": "Decrescente", + "directionLabel": "Direzione", + "dismiss": "Chiudi", + "download": "Scarica", + "downloadAllCovers": "Scarica Tutte le Copertine", + "downloadAllCoversDescription": "Se disattivata, le copertine verranno scaricate solo insieme ai capitoli. Le copertine non scaricate verranno comunque recuperate dal server su richiesta, se è disponibile una connessione.", "downloadQueue": "Coda Download", - "filter": "", - "fitDirection": "", - "fontSize": "", + "filter": "Filtro", + "fitDirection": "Direzione adattamento", + "fontSize": "Dimensione carattere", "general": "Generali", - "genres": "", - "github": "", - "go": "", - "goToChapter": "", - "goToSeries": "", - "height": "", - "hideRead": "", - "highlightResumeParagraph": "", + "genres": "Generi", + "github": "GitHub", + "go": "Vai", + "goToChapter": "Vai al Capitolo", + "goToSeries": "Vai alla Serie", + "height": "Altezza", + "hideRead": "Nascondi Letti", + "highlightResumeParagraph": "Evidenzia paragrafo di ripresa", "home": "Panoramica", - "horizontal": "", - "hoursCount": "", - "ignoreSafeAreas": "", - "imIn": "", - "items": "", - "lastModified": "", - "leftToRight": "", - "letterSpacing": "", + "horizontal": "Orizzontale", + "hoursCount": "~{hours} ore", + "ignoreSafeAreas": "Ignora aree sicure", + "imIn": "Ci sto!", + "items": "{count} {count, plural, =0{{count} elementi} =1{{count} elemento} other{{count} elementi}}", + "lastModified": "Ultima Modifica", + "leftToRight": "Sinistra a Destra", + "letterSpacing": "Spaziatura lettere", "libraries": "Librerie", "light": "Chiaro", - "lineHeight": "", - "madeWithLove": "", - "margins": "", - "markAsRead": "", - "markAsUnread": "", - "maxConcurrentDownloads": "", + "lineHeight": "Altezza della linea", + "madeWithLove": "Realizzato con ❤️", + "margins": "Margini", + "markAsRead": "Segna Come Letto", + "markAsUnread": "Segna Come Non Letto", + "maxConcurrentDownloads": "Download Simultanei", "menu": "Menu", "more": "Altro", - "moreCount": "", - "name": "", - "nextChapter": "", - "noActiveSyncOperations": "", - "noCredentialsDescription": "", - "noDownloadsInQueue": "", - "noThanks": "", - "notSignedIn": "", + "moreCount": "+{count} in più", + "name": "Nome", + "nextChapter": "Il prossimo: {chapterTitle}", + "noActiveSyncOperations": "Nessuna operazione di sincronizzazione attiva", + "noCredentialsDescription": "Nessuna configurazione delle credenziali. Si prega di aggiungere l'URL del server e la chiave API in Impostazioni.", + "noDownloadsInQueue": "Nessun download in coda", + "noThanks": "No, grazie", + "notSignedIn": "Non Connesso", "onDeck": "In Primo Piano", - "openSettings": "", - "outlinedTheme": "", - "pageGap": "", - "pagesCount": "", - "previousChapter": "", - "read": "", - "readerMode": "", - "readerSettings": "", - "readingDirection": "", + "openSettings": "Apri impostazioni", + "outlinedTheme": "Tema Delineato", + "pageGap": "Spazio tra pagine", + "pagesCount": "{pages} pagine", + "previousChapter": "Precedente: {chapterTitle}", + "read": "Leggi", + "readerMode": "Modalità Lettore", + "readerSettings": "Impostazioni Lettore", + "readingDirection": "Direzione Lettura", "readingLists": "Liste di Lettura", "recentlyAdded": "Aggiunto Recentemente", "recentlyUpdated": "Aggiornato Recentemente", - "reclaimSpace": "", - "refreshCovers": "", - "refreshMetadata": "", - "refreshingCoversForSeries": "", - "refreshingMetadataForSeries": "", - "refreshingServerSettings": "", - "removeDownload": "", - "removeFromWantToRead": "", - "reset": "", - "retry": "", - "rightToLeft": "", - "save": "", - "sendDiagnostics": "", - "sendDiagnosticsChangeable": "", - "sendDiagnosticsDescription": "", - "sendDiagnosticsDialogTitle": "", - "series": "", - "setDefaults": "", + "reclaimSpace": "Recupera Spazio", + "refreshCovers": "Aggiorna Copertine", + "refreshMetadata": "Aggiorna Metadati", + "refreshingCoversForSeries": "Aggiornamento copertine per serie {seriesId}", + "refreshingMetadataForSeries": "Aggiornamento metadati per serie {seriesId}", + "refreshingServerSettings": "Aggiornamento impostazioni del server", + "removeDownload": "Rimuovi Download", + "removeFromWantToRead": "Rimuovi da Da Leggere", + "reset": "Resetta", + "retry": "Riprova", + "rightToLeft": "Destra a Sinistra", + "save": "Salva", + "sendDiagnostics": "Invia statistiche anonime di arresto e diagnostica", + "sendDiagnosticsChangeable": "Questo può essere modificato nelle impostazioni in qualsiasi momento.", + "sendDiagnosticsDescription": "Aiutaci a migliorare l'app inviando statistiche anonime sugli errori e sulle prestazioni. I dati non contengono informazioni personali e vengono utilizzati esclusivamente per migliorare l'applicazione.", + "sendDiagnosticsDialogTitle": "Invia statistiche anonime di arresto e diagnostica?", + "series": "Serie", + "setDefaults": "Impostare i default", "settings": "Impostazioni", - "showLess": "", - "showMore": "", - "showProgressBar": "", - "sortBy": "", - "sortDirection": "", - "specials": "", - "storyline": "", - "summary": "", - "syncingAllSeries": "", - "syncingCollections": "", - "syncingCovers": "", - "syncingLibraries": "", - "syncingMetadata": "", - "syncingProgress": "", - "syncingReadingLists": "", - "syncingRecentlyAdded": "", - "syncingRecentlyUpdated": "", + "showLess": "Mostra di Meno", + "showMore": "Mostra di Più", + "showProgressBar": "Mostra barra di progresso", + "sortBy": "Ordina Per", + "sortDirection": "Ordine", + "specials": "Speciali", + "storyline": "Trama", + "summary": "Sinossi", + "syncingAllSeries": "Sincronizzazione di tutte le serie", + "syncingCollections": "Sincronizzazione collezioni", + "syncingCovers": "Sincronizzazione copertine", + "syncingLibraries": "Sincronizzazione delle librerie", + "syncingMetadata": "Sincronizzazione dei metadati", + "syncingProgress": "Sincronizzazione dei progressi", + "syncingReadingLists": "Sincronizzazione liste di lettura", + "syncingRecentlyAdded": "Sincronizzazione recentemente aggiunti", + "syncingRecentlyUpdated": "Sincronizzazione recentemente aggiornati", "system": "Sistema", - "tableOfContents": "", + "tableOfContents": "Indice", "themeMode": "Modalità Tema", - "twoPage": "", - "unsupportedFormat": "", - "version": "", - "vertical": "", - "verticalGap": "", - "volumes": "", + "twoPage": "Due Pagine", + "unsupportedFormat": "Formato non supportato: {format}", + "version": "Versione: {version} ({buildNumber})", + "vertical": "Verticale", + "verticalGap": "Distanza verticale", + "volumes": "Volumi", "wantToRead": "Da Leggere", - "width": "", - "wordCount": "", - "wordSpacing": "", - "writers": "" + "width": "Larghezza", + "wordCount": "{wordCount} parole", + "wordSpacing": "Spaziatura delle parole", + "writers": "Scrittori" } From 9272403feff6366b30c5b0743f5a65f3d859ef6f Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 18:30:10 +0200 Subject: [PATCH 20/70] nvm localized name --- lib/models/series_model.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/series_model.dart b/lib/models/series_model.dart index 4c0d3132..d53319bd 100644 --- a/lib/models/series_model.dart +++ b/lib/models/series_model.dart @@ -33,7 +33,7 @@ sealed class SeriesModel with _$SeriesModel { return SeriesModel( id: table.id, libraryId: table.libraryId, - name: table.localizedName ?? table.name, + name: table.name, format: table.format, pages: table.pages, avgHoursToRead: table.avgHoursToRead ?? 0, From 5f30e1e776409203b7a2145c2c1a58caedeef1b4 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 20:15:44 +0200 Subject: [PATCH 21/70] cleanup --- lib/pages/collections_page/collections_page.dart | 11 ++++++----- lib/pages/reader/overlay/reader_overlay.dart | 2 +- lib/widgets/cards/cover_card.dart | 7 ++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/pages/collections_page/collections_page.dart b/lib/pages/collections_page/collections_page.dart index 0c4338b9..57678258 100644 --- a/lib/pages/collections_page/collections_page.dart +++ b/lib/pages/collections_page/collections_page.dart @@ -48,7 +48,7 @@ class CollectionsPage extends HookConsumerWidget { ? KoverIcons.ascending : KoverIcons.descending, ), - menu: _menu(l, sortDirection), + menu: _menu(sortDirection: sortDirection, context: context), ), ], ), @@ -116,10 +116,11 @@ class CollectionsPage extends HookConsumerWidget { return sorted; } - ContextMenu _menu( - AppLocalizations l, - ValueNotifier sortDirection, - ) { + ContextMenu _menu({ + required ValueNotifier sortDirection, + required BuildContext context, + }) { + final l = AppLocalizations.of(context); return ContextMenu( entries: [ MenuHeader(text: l.directionLabel), diff --git a/lib/pages/reader/overlay/reader_overlay.dart b/lib/pages/reader/overlay/reader_overlay.dart index 9fa7d498..337e2c44 100644 --- a/lib/pages/reader/overlay/reader_overlay.dart +++ b/lib/pages/reader/overlay/reader_overlay.dart @@ -61,10 +61,10 @@ class ReaderOverlay extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); final uiVisible = useState(false); final snackbarDismissed = useState(false); final showSnackbar = useState(ShowSnackbar.none); - final l = AppLocalizations.of(context); final provider = readerProvider( seriesId: seriesId, chapterId: chapterId, diff --git a/lib/widgets/cards/cover_card.dart b/lib/widgets/cards/cover_card.dart index aa79d6c2..57433399 100644 --- a/lib/widgets/cards/cover_card.dart +++ b/lib/widgets/cards/cover_card.dart @@ -10,7 +10,7 @@ import 'package:lucide_icons_flutter/lucide_icons.dart'; class CoverCard extends ConsumerWidget { final String? title; final Icon? icon; - final String actionLabel; + final String? actionLabel; final Icon actionIcon; final Icon? actionDisabledIcon; final bool actionDisabled; @@ -24,7 +24,7 @@ class CoverCard extends ConsumerWidget { super.key, this.title, this.icon, - this.actionLabel = '', + this.actionLabel, this.actionIcon = const Icon(LucideIcons.bookOpen), this.actionDisabledIcon, this.actionDisabled = true, @@ -38,7 +38,8 @@ class CoverCard extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final l = AppLocalizations.of(context); - final effectiveLabel = actionLabel.isNotEmpty ? actionLabel : l.read; + final effectiveLabel = actionLabel ?? l.read; + return Card.filled( clipBehavior: .antiAlias, child: InkWell( From b42f781a1f7a9b20258f1681d7c7892d393c8da5 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sat, 13 Jun 2026 20:23:26 +0200 Subject: [PATCH 22/70] fix wrong key --- lib/pages/series_detail_page/series_app_bar.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/series_detail_page/series_app_bar.dart b/lib/pages/series_detail_page/series_app_bar.dart index c3b9eb83..8360acda 100644 --- a/lib/pages/series_detail_page/series_app_bar.dart +++ b/lib/pages/series_detail_page/series_app_bar.dart @@ -206,7 +206,7 @@ class _Metadata extends ConsumerWidget { alignment: .spaceBetween, children: [ LimitedList( - title: l.genres, + title: l.writers, items: metadata.writers .map( (w) => Text( From c9e7f404ff9a7f79ea470cdaf27a7e16e271cd8b Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:29 +0200 Subject: [PATCH 23/70] chore(l10n): add German translation Translation: Kover/Kover Language: German Translate-URL: https://hosted.weblate.org/projects/kover/kover/de/ --- lib/i18n/de.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/de.arb diff --git a/lib/i18n/de.arb b/lib/i18n/de.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/de.arb @@ -0,0 +1 @@ +{} From bc7cfaa077a72d072a67d8665ff4db85138e23ea Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:29 +0200 Subject: [PATCH 24/70] chore(l10n): add Spanish translation Translation: Kover/Kover Language: Spanish Translate-URL: https://hosted.weblate.org/projects/kover/kover/es/ --- lib/i18n/es.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/es.arb diff --git a/lib/i18n/es.arb b/lib/i18n/es.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/es.arb @@ -0,0 +1 @@ +{} From 5ef62a4df68024d40813c07bd86017dcd45b84eb Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:29 +0200 Subject: [PATCH 25/70] chore(l10n): add French translation Translation: Kover/Kover Language: French Translate-URL: https://hosted.weblate.org/projects/kover/kover/fr/ --- lib/i18n/fr.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/fr.arb diff --git a/lib/i18n/fr.arb b/lib/i18n/fr.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/fr.arb @@ -0,0 +1 @@ +{} From 092d545eb8f502cfb6b028476b5fb221bfd1d6ba Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:29 +0200 Subject: [PATCH 26/70] chore(l10n): add Japanese translation Translation: Kover/Kover Language: Japanese Translate-URL: https://hosted.weblate.org/projects/kover/kover/ja/ --- lib/i18n/ja.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/ja.arb diff --git a/lib/i18n/ja.arb b/lib/i18n/ja.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/ja.arb @@ -0,0 +1 @@ +{} From 20ba74afa9fd4c18a97129115b8c310b68f59c26 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:30 +0200 Subject: [PATCH 27/70] chore(l10n): add Korean translation Translation: Kover/Kover Language: Korean Translate-URL: https://hosted.weblate.org/projects/kover/kover/ko/ --- lib/i18n/ko.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/ko.arb diff --git a/lib/i18n/ko.arb b/lib/i18n/ko.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/ko.arb @@ -0,0 +1 @@ +{} From e9b33121ad26301353603e731b92607f3ba58820 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:30 +0200 Subject: [PATCH 28/70] chore(l10n): add Portuguese translation Translation: Kover/Kover Language: Portuguese Translate-URL: https://hosted.weblate.org/projects/kover/kover/pt/ --- lib/i18n/pt.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/pt.arb diff --git a/lib/i18n/pt.arb b/lib/i18n/pt.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/pt.arb @@ -0,0 +1 @@ +{} From 6c865b6f973cfa4cdecaede7d2e6527035ae7a6b Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:39:30 +0200 Subject: [PATCH 29/70] chore(l10n): add Chinese (Simplified) (zh_SIMPLIFIED) translation Translation: Kover/Kover Language: Chinese (Simplified) (zh_SIMPLIFIED) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_SIMPLIFIED/ --- lib/i18n/zh_SIMPLIFIED.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/i18n/zh_SIMPLIFIED.arb diff --git a/lib/i18n/zh_SIMPLIFIED.arb b/lib/i18n/zh_SIMPLIFIED.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/i18n/zh_SIMPLIFIED.arb @@ -0,0 +1 @@ +{} From a1eb6ee8e4991efc7d3763ba3efabeedd75f8868 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 00:50:34 +0200 Subject: [PATCH 30/70] chore(l10n): remove Chinese (Simplified) (zh_SIMPLIFIED) translation Translation: Kover/Kover Language: Chinese (Simplified) (zh_SIMPLIFIED) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_SIMPLIFIED/ --- lib/i18n/zh_SIMPLIFIED.arb | 1 - 1 file changed, 1 deletion(-) delete mode 100644 lib/i18n/zh_SIMPLIFIED.arb diff --git a/lib/i18n/zh_SIMPLIFIED.arb b/lib/i18n/zh_SIMPLIFIED.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/i18n/zh_SIMPLIFIED.arb +++ /dev/null @@ -1 +0,0 @@ -{} From 2eb8429fca1f858f2cfb304f7a6abddf57cc0249 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sun, 14 Jun 2026 19:20:11 +0200 Subject: [PATCH 31/70] missing strings --- lib/i18n/en.arb | 8 ++++++++ lib/widgets/actions_app_bar/sync_button.dart | 5 ++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/i18n/en.arb b/lib/i18n/en.arb index 58e20612..484b64b7 100644 --- a/lib/i18n/en.arb +++ b/lib/i18n/en.arb @@ -547,5 +547,13 @@ "read": "Read", "@read": { "description": "Label for the read action button on cover cards" + }, + "syncingTocs": "Syncing chapters TOCs", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "refreshingChapterToc": "Syncing chapter TOC for chapter {chapterId}", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } diff --git a/lib/widgets/actions_app_bar/sync_button.dart b/lib/widgets/actions_app_bar/sync_button.dart index 8b617fb5..4a725d6d 100644 --- a/lib/widgets/actions_app_bar/sync_button.dart +++ b/lib/widgets/actions_app_bar/sync_button.dart @@ -150,7 +150,7 @@ String _phaseLabel(AppLocalizations l, SyncPhase phase) { return phase.when( allSeries: () => l.syncingAllSeries, metadata: () => l.syncingMetadata, - tocs: () => 'Syncing chapters TOCs', + tocs: () => l.syncingTocs, recentlyAdded: () => l.syncingRecentlyAdded, recentlyUpdated: () => l.syncingRecentlyUpdated, libraries: () => l.syncingLibraries, @@ -161,7 +161,6 @@ String _phaseLabel(AppLocalizations l, SyncPhase phase) { refreshMetadata: (seriesId) => l.refreshingMetadataForSeries(seriesId), refreshCovers: (seriesId) => l.refreshingCoversForSeries(seriesId), refreshServerSettings: () => l.refreshingServerSettings, - refreshToc: (chapterId) => - 'Refreshing table of contents for chapter $chapterId', + refreshToc: (chapterId) => l.refreshingChapterToc(chapterId), ); } From 354ee7a04870b018e173f4d3a8230c2e3deba53e Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sun, 14 Jun 2026 19:21:32 +0200 Subject: [PATCH 32/70] missing translation key --- lib/pages/reader/epub_reader/epub_toc_drawer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/reader/epub_reader/epub_toc_drawer.dart b/lib/pages/reader/epub_reader/epub_toc_drawer.dart index f992d436..78557ba0 100644 --- a/lib/pages/reader/epub_reader/epub_toc_drawer.dart +++ b/lib/pages/reader/epub_reader/epub_toc_drawer.dart @@ -75,7 +75,7 @@ class EpubTocDrawer extends HookConsumerWidget { horizontal: LayoutConstants.mediumPadding, ), child: Text( - 'Table of Contents', + l.tableOfContents, style: Theme.of(context).textTheme.headlineMedium, ), ), From 504347f04c75db7c6279eacb09a81635be145d10 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sun, 14 Jun 2026 19:24:39 +0200 Subject: [PATCH 33/70] move to l10n subdir --- l10n.yaml | 4 ++-- lib/{i18n => l10n}/de.arb | 0 lib/{i18n => l10n}/en.arb | 0 lib/{i18n => l10n}/es.arb | 0 lib/{i18n => l10n}/fr.arb | 0 lib/{i18n => l10n}/it.arb | 0 lib/{i18n => l10n}/ja.arb | 0 lib/{i18n => l10n}/ko.arb | 0 lib/{i18n => l10n}/pt.arb | 0 9 files changed, 2 insertions(+), 2 deletions(-) rename lib/{i18n => l10n}/de.arb (100%) rename lib/{i18n => l10n}/en.arb (100%) rename lib/{i18n => l10n}/es.arb (100%) rename lib/{i18n => l10n}/fr.arb (100%) rename lib/{i18n => l10n}/it.arb (100%) rename lib/{i18n => l10n}/ja.arb (100%) rename lib/{i18n => l10n}/ko.arb (100%) rename lib/{i18n => l10n}/pt.arb (100%) diff --git a/l10n.yaml b/l10n.yaml index 2dca67da..2825690d 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -1,4 +1,4 @@ -arb-dir: lib/i18n -output-dir: lib/generated/i18n +arb-dir: lib/l10n +output-dir: lib/generated/l10n template-arb-file: en.arb nullable-getter: false diff --git a/lib/i18n/de.arb b/lib/l10n/de.arb similarity index 100% rename from lib/i18n/de.arb rename to lib/l10n/de.arb diff --git a/lib/i18n/en.arb b/lib/l10n/en.arb similarity index 100% rename from lib/i18n/en.arb rename to lib/l10n/en.arb diff --git a/lib/i18n/es.arb b/lib/l10n/es.arb similarity index 100% rename from lib/i18n/es.arb rename to lib/l10n/es.arb diff --git a/lib/i18n/fr.arb b/lib/l10n/fr.arb similarity index 100% rename from lib/i18n/fr.arb rename to lib/l10n/fr.arb diff --git a/lib/i18n/it.arb b/lib/l10n/it.arb similarity index 100% rename from lib/i18n/it.arb rename to lib/l10n/it.arb diff --git a/lib/i18n/ja.arb b/lib/l10n/ja.arb similarity index 100% rename from lib/i18n/ja.arb rename to lib/l10n/ja.arb diff --git a/lib/i18n/ko.arb b/lib/l10n/ko.arb similarity index 100% rename from lib/i18n/ko.arb rename to lib/l10n/ko.arb diff --git a/lib/i18n/pt.arb b/lib/l10n/pt.arb similarity index 100% rename from lib/i18n/pt.arb rename to lib/l10n/pt.arb From c1673264324c35bfc64d3ca3cfe7c57b93c1856f Mon Sep 17 00:00:00 2001 From: rodonisi Date: Sun, 14 Jun 2026 19:36:30 +0200 Subject: [PATCH 34/70] fix paths --- lib/main.dart | 2 +- lib/pages/collections_page/collections_page.dart | 2 +- lib/pages/download_queue/download_queue_page.dart | 2 +- lib/pages/home/collapsible_section.dart | 2 +- lib/pages/home/home_page.dart | 2 +- lib/pages/menu_page/menu_page.dart | 2 +- lib/pages/reader/epub_reader/epub_reader_controls.dart | 2 +- lib/pages/reader/epub_reader/epub_toc_drawer.dart | 2 +- lib/pages/reader/image_reader/image_reader_controls.dart | 2 +- lib/pages/reader/overlay/reader_controls.dart | 2 +- lib/pages/reader/overlay/reader_overlay.dart | 2 +- lib/pages/reader/pdf_reader/pdf_reader_controls.dart | 2 +- lib/pages/reader/pdf_reader/pdf_toc_drawer.dart | 2 +- lib/pages/reader/reader_page.dart | 2 +- lib/pages/reading_list_details_page/reading_list_app_bar.dart | 2 +- .../reading_list_details_page/reading_list_chapter_entry.dart | 2 +- lib/pages/reading_lists_page/reading_lists_page.dart | 2 +- lib/pages/series_detail_page/chapters_page/chapters_page.dart | 2 +- lib/pages/series_detail_page/series_app_bar.dart | 2 +- lib/pages/series_detail_page/series_detail_page.dart | 2 +- .../volume_detail_page/volume_detail_page.dart | 2 +- lib/pages/series_detail_page/volumes_page/volumes_page.dart | 2 +- lib/pages/series_page/series_page.dart | 2 +- lib/pages/settings/credentials_settings.dart | 2 +- lib/pages/settings/data_management_settings.dart | 2 +- lib/pages/settings/general_settings.dart | 2 +- lib/pages/settings/settings_page.dart | 2 +- lib/pages/settings/version_label.dart | 2 +- lib/pages/want_to_read_page/want_to_read_page.dart | 2 +- lib/widgets/actions_app_bar/search_button.dart | 2 +- lib/widgets/actions_app_bar/sync_button.dart | 2 +- lib/widgets/cards/cover_card.dart | 2 +- lib/widgets/context_menu/actions_menu.dart | 2 +- lib/widgets/details/detail_app_bar.dart | 2 +- lib/widgets/details/filter_input_field.dart | 2 +- lib/widgets/details/info_widgets.dart | 2 +- lib/widgets/details/summary.dart | 2 +- lib/widgets/util/login_guard.dart | 2 +- lib/widgets/util/monitoring_opt_out_popup.dart | 2 +- lib/widgets/util/navigator_container.dart | 2 +- 40 files changed, 40 insertions(+), 40 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 71d38199..3794f84e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/router.dart'; import 'package:kover/riverpod/providers/theme.dart'; import 'package:kover/riverpod/repository/sentry_repository.dart'; diff --git a/lib/pages/collections_page/collections_page.dart b/lib/pages/collections_page/collections_page.dart index 57678258..5c74661e 100644 --- a/lib/pages/collections_page/collections_page.dart +++ b/lib/pages/collections_page/collections_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/collection_model.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; diff --git a/lib/pages/download_queue/download_queue_page.dart b/lib/pages/download_queue/download_queue_page.dart index bb495d14..d8c5091c 100644 --- a/lib/pages/download_queue/download_queue_page.dart +++ b/lib/pages/download_queue/download_queue_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/managers/download_manager.dart'; import 'package:kover/riverpod/providers/chapter.dart'; import 'package:kover/riverpod/providers/download.dart'; diff --git a/lib/pages/home/collapsible_section.dart b/lib/pages/home/collapsible_section.dart index e7f5c46d..95522c80 100644 --- a/lib/pages/home/collapsible_section.dart +++ b/lib/pages/home/collapsible_section.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/series_model.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/lists/series_sliver_grid.dart'; diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index f73f9730..4f29ab91 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/home/collapsible_section.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/riverpod/providers/series.dart'; diff --git a/lib/pages/menu_page/menu_page.dart b/lib/pages/menu_page/menu_page.dart index 8c8143c5..dc87ab05 100644 --- a/lib/pages/menu_page/menu_page.dart +++ b/lib/pages/menu_page/menu_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/menu_page/app_list_tile.dart'; import 'package:kover/pages/menu_page/sliver_libraries.dart'; import 'package:kover/pages/menu_page/sliver_section.dart'; diff --git a/lib/pages/reader/epub_reader/epub_reader_controls.dart b/lib/pages/reader/epub_reader/epub_reader_controls.dart index 8976e326..9871f131 100644 --- a/lib/pages/reader/epub_reader/epub_reader_controls.dart +++ b/lib/pages/reader/epub_reader/epub_reader_controls.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/read_direction.dart'; import 'package:kover/riverpod/providers/settings/epub_reader_settings.dart'; import 'package:kover/utils/constants/kover_icons.dart'; diff --git a/lib/pages/reader/epub_reader/epub_toc_drawer.dart b/lib/pages/reader/epub_reader/epub_toc_drawer.dart index 78557ba0..3c127273 100644 --- a/lib/pages/reader/epub_reader/epub_toc_drawer.dart +++ b/lib/pages/reader/epub_reader/epub_toc_drawer.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/book_chapter_model.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/riverpod/providers/book.dart'; diff --git a/lib/pages/reader/image_reader/image_reader_controls.dart b/lib/pages/reader/image_reader/image_reader_controls.dart index fa795dd3..6d061122 100644 --- a/lib/pages/reader/image_reader/image_reader_controls.dart +++ b/lib/pages/reader/image_reader/image_reader_controls.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/read_direction.dart'; import 'package:kover/riverpod/providers/breakpoints.dart'; import 'package:kover/riverpod/providers/settings/image_reader_settings.dart'; diff --git a/lib/pages/reader/overlay/reader_controls.dart b/lib/pages/reader/overlay/reader_controls.dart index 52de0ef1..c9e2818a 100644 --- a/lib/pages/reader/overlay/reader_controls.dart +++ b/lib/pages/reader/overlay/reader_controls.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/reader/epub_reader/epub_reader_controls.dart'; import 'package:kover/pages/reader/image_reader/image_reader_controls.dart'; import 'package:kover/pages/reader/overlay/page_slider.dart'; diff --git a/lib/pages/reader/overlay/reader_overlay.dart b/lib/pages/reader/overlay/reader_overlay.dart index 337e2c44..97315e83 100644 --- a/lib/pages/reader/overlay/reader_overlay.dart +++ b/lib/pages/reader/overlay/reader_overlay.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/reader/overlay/reader_controls.dart'; import 'package:kover/pages/reader/overlay/reader_header.dart'; import 'package:kover/riverpod/providers/reader.dart'; diff --git a/lib/pages/reader/pdf_reader/pdf_reader_controls.dart b/lib/pages/reader/pdf_reader/pdf_reader_controls.dart index ef964e3e..559f248a 100644 --- a/lib/pages/reader/pdf_reader/pdf_reader_controls.dart +++ b/lib/pages/reader/pdf_reader/pdf_reader_controls.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/read_direction.dart'; import 'package:kover/riverpod/providers/settings/pdf_reader_settings.dart'; import 'package:kover/utils/constants/kover_icons.dart'; diff --git a/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart b/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart index e283c20a..6876e395 100644 --- a/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart +++ b/lib/pages/reader/pdf_reader/pdf_toc_drawer.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/reader/reader_navigation.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/util/async_value.dart'; diff --git a/lib/pages/reader/reader_page.dart b/lib/pages/reader/reader_page.dart index faf02759..962843b1 100644 --- a/lib/pages/reader/reader_page.dart +++ b/lib/pages/reader/reader_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/reader/epub_reader/epub_reader.dart'; import 'package:kover/pages/reader/image_reader/image_reader.dart'; import 'package:kover/pages/reader/pdf_reader/pdf_reader.dart'; diff --git a/lib/pages/reading_list_details_page/reading_list_app_bar.dart b/lib/pages/reading_list_details_page/reading_list_app_bar.dart index 4c257bf5..c7bbd08f 100644 --- a/lib/pages/reading_list_details_page/reading_list_app_bar.dart +++ b/lib/pages/reading_list_details_page/reading_list_app_bar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/reader.dart'; import 'package:kover/riverpod/providers/reading_lists.dart'; import 'package:kover/riverpod/providers/router.dart'; diff --git a/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart b/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart index 26600930..755ee8d0 100644 --- a/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart +++ b/lib/pages/reading_list_details_page/reading_list_chapter_entry.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/chapter_model.dart'; import 'package:kover/riverpod/providers/chapter.dart'; import 'package:kover/riverpod/providers/router.dart'; diff --git a/lib/pages/reading_lists_page/reading_lists_page.dart b/lib/pages/reading_lists_page/reading_lists_page.dart index c8759db8..e839b605 100644 --- a/lib/pages/reading_lists_page/reading_lists_page.dart +++ b/lib/pages/reading_lists_page/reading_lists_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/models/reading_list_model.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; diff --git a/lib/pages/series_detail_page/chapters_page/chapters_page.dart b/lib/pages/series_detail_page/chapters_page/chapters_page.dart index 48b24fd0..ff582020 100644 --- a/lib/pages/series_detail_page/chapters_page/chapters_page.dart +++ b/lib/pages/series_detail_page/chapters_page/chapters_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/chapter_model.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/providers/series.dart'; diff --git a/lib/pages/series_detail_page/series_app_bar.dart b/lib/pages/series_detail_page/series_app_bar.dart index 8360acda..80eb9b44 100644 --- a/lib/pages/series_detail_page/series_app_bar.dart +++ b/lib/pages/series_detail_page/series_app_bar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/series_model.dart'; import 'package:kover/riverpod/managers/download_manager.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; diff --git a/lib/pages/series_detail_page/series_detail_page.dart b/lib/pages/series_detail_page/series_detail_page.dart index ff2c261a..cb2ed677 100644 --- a/lib/pages/series_detail_page/series_detail_page.dart +++ b/lib/pages/series_detail_page/series_detail_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/menu_page/app_list_tile.dart'; import 'package:kover/pages/series_detail_page/series_app_bar.dart'; import 'package:kover/riverpod/providers/router.dart'; diff --git a/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart b/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart index 324de437..fe52d834 100644 --- a/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart +++ b/lib/pages/series_detail_page/volume_detail_page/volume_detail_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/series_detail_page/volume_detail_page/volume_app_bar.dart'; import 'package:kover/riverpod/providers/volume.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/pages/series_detail_page/volumes_page/volumes_page.dart b/lib/pages/series_detail_page/volumes_page/volumes_page.dart index 3afd2ab2..f3f76f5e 100644 --- a/lib/pages/series_detail_page/volumes_page/volumes_page.dart +++ b/lib/pages/series_detail_page/volumes_page/volumes_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/providers/series.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/pages/series_page/series_page.dart b/lib/pages/series_page/series_page.dart index b03e5003..94a1ed79 100644 --- a/lib/pages/series_page/series_page.dart +++ b/lib/pages/series_page/series_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/enums/series_sort_option.dart'; import 'package:kover/models/enums/sort_direction.dart'; import 'package:kover/riverpod/providers/collections.dart'; diff --git a/lib/pages/settings/credentials_settings.dart b/lib/pages/settings/credentials_settings.dart index 621865d5..1b230049 100644 --- a/lib/pages/settings/credentials_settings.dart +++ b/lib/pages/settings/credentials_settings.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/auth.dart'; import 'package:kover/riverpod/providers/server_settings.dart'; import 'package:kover/riverpod/providers/settings/credentials.dart'; diff --git a/lib/pages/settings/data_management_settings.dart b/lib/pages/settings/data_management_settings.dart index 77f250b6..1f27a7fa 100644 --- a/lib/pages/settings/data_management_settings.dart +++ b/lib/pages/settings/data_management_settings.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/download_settings.dart'; import 'package:kover/riverpod/repository/database.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/pages/settings/general_settings.dart b/lib/pages/settings/general_settings.dart index ba9a2074..d406a631 100644 --- a/lib/pages/settings/general_settings.dart +++ b/lib/pages/settings/general_settings.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/general_settings.dart'; import 'package:kover/riverpod/providers/theme.dart' hide Theme; import 'package:kover/utils/constants/kover_icons.dart'; diff --git a/lib/pages/settings/settings_page.dart b/lib/pages/settings/settings_page.dart index 90f893af..e6dee48e 100644 --- a/lib/pages/settings/settings_page.dart +++ b/lib/pages/settings/settings_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/settings/credentials_settings.dart'; import 'package:kover/pages/settings/data_management_settings.dart'; import 'package:kover/pages/settings/general_settings.dart'; diff --git a/lib/pages/settings/version_label.dart b/lib/pages/settings/version_label.dart index e0f90e55..9bf9f4a2 100644 --- a/lib/pages/settings/version_label.dart +++ b/lib/pages/settings/version_label.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/package_info.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/util/async_value.dart'; diff --git a/lib/pages/want_to_read_page/want_to_read_page.dart b/lib/pages/want_to_read_page/want_to_read_page.dart index 122f2293..242f8b04 100644 --- a/lib/pages/want_to_read_page/want_to_read_page.dart +++ b/lib/pages/want_to_read_page/want_to_read_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/riverpod/providers/want_to_read.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/widgets/actions_app_bar/search_button.dart b/lib/widgets/actions_app_bar/search_button.dart index 347d0144..a0af2c66 100644 --- a/lib/widgets/actions_app_bar/search_button.dart +++ b/lib/widgets/actions_app_bar/search_button.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/models/chapter_model.dart'; import 'package:kover/models/series_model.dart'; import 'package:kover/models/volume_model.dart'; diff --git a/lib/widgets/actions_app_bar/sync_button.dart b/lib/widgets/actions_app_bar/sync_button.dart index 4a725d6d..14aa63db 100644 --- a/lib/widgets/actions_app_bar/sync_button.dart +++ b/lib/widgets/actions_app_bar/sync_button.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/managers/sync_manager.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; diff --git a/lib/widgets/cards/cover_card.dart b/lib/widgets/cards/cover_card.dart index 57433399..9dd4058c 100644 --- a/lib/widgets/cards/cover_card.dart +++ b/lib/widgets/cards/cover_card.dart @@ -3,7 +3,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; diff --git a/lib/widgets/context_menu/actions_menu.dart b/lib/widgets/context_menu/actions_menu.dart index 38896339..5407b630 100644 --- a/lib/widgets/context_menu/actions_menu.dart +++ b/lib/widgets/context_menu/actions_menu.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_context_menu/flutter_context_menu.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/utils/extensions/iterable.dart'; import 'package:kover/widgets/context_menu/context_menu_button.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; diff --git a/lib/widgets/details/detail_app_bar.dart b/lib/widgets/details/detail_app_bar.dart index 34289840..5cade444 100644 --- a/lib/widgets/details/detail_app_bar.dart +++ b/lib/widgets/details/detail_app_bar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/pages/series_detail_page/series_info_background.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/lists/adaptive_sliver_app_bar.dart'; diff --git a/lib/widgets/details/filter_input_field.dart b/lib/widgets/details/filter_input_field.dart index de9eb38d..0d3aa2fc 100644 --- a/lib/widgets/details/filter_input_field.dart +++ b/lib/widgets/details/filter_input_field.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; class FilterInputField extends HookWidget { diff --git a/lib/widgets/details/info_widgets.dart b/lib/widgets/details/info_widgets.dart index 14156d8c..6ea7ac08 100644 --- a/lib/widgets/details/info_widgets.dart +++ b/lib/widgets/details/info_widgets.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/want_to_read.dart'; import 'package:kover/utils/extensions/int.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/widgets/details/summary.dart b/lib/widgets/details/summary.dart index 8dfaba11..80801278 100644 --- a/lib/widgets/details/summary.dart +++ b/lib/widgets/details/summary.dart @@ -4,7 +4,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_markdown_plus/flutter_markdown_plus.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/utils/extensions/string.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/widgets/util/login_guard.dart b/lib/widgets/util/login_guard.dart index 6c2ba760..ef94eb89 100644 --- a/lib/widgets/util/login_guard.dart +++ b/lib/widgets/util/login_guard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/auth.dart'; import 'package:kover/riverpod/providers/router.dart'; import 'package:kover/riverpod/providers/settings/credentials.dart'; diff --git a/lib/widgets/util/monitoring_opt_out_popup.dart b/lib/widgets/util/monitoring_opt_out_popup.dart index c161c02e..7605fbb8 100644 --- a/lib/widgets/util/monitoring_opt_out_popup.dart +++ b/lib/widgets/util/monitoring_opt_out_popup.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/general_settings.dart'; import 'package:kover/utils/layout_constants.dart'; diff --git a/lib/widgets/util/navigator_container.dart b/lib/widgets/util/navigator_container.dart index d5a7f483..c6a2f0aa 100644 --- a/lib/widgets/util/navigator_container.dart +++ b/lib/widgets/util/navigator_container.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:kover/generated/i18n/app_localizations.dart'; +import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/settings/oneoffs.dart'; import 'package:kover/riverpod/providers/theme.dart' hide Theme; import 'package:kover/utils/layout_constants.dart'; From 3357ad6963d856784102e3f0ecd673ff02ea186f Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 19:55:12 +0200 Subject: [PATCH 35/70] chore(l10n): add Chinese (Simplified Han script) translation Translation: Kover/Kover Language: Chinese (Simplified Han script) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_Hans/ --- lib/l10n/zh_Hans.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/l10n/zh_Hans.arb diff --git a/lib/l10n/zh_Hans.arb b/lib/l10n/zh_Hans.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/l10n/zh_Hans.arb @@ -0,0 +1 @@ +{} From c1c803391a037f22de3395f0b74edc07bc232e3f Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 20:06:04 +0200 Subject: [PATCH 36/70] chore(l10n): remove Chinese (Simplified Han script) translation Translation: Kover/Kover Language: Chinese (Simplified Han script) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_Hans/ --- lib/l10n/zh_Hans.arb | 1 - 1 file changed, 1 deletion(-) delete mode 100644 lib/l10n/zh_Hans.arb diff --git a/lib/l10n/zh_Hans.arb b/lib/l10n/zh_Hans.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/zh_Hans.arb +++ /dev/null @@ -1 +0,0 @@ -{} From a97e32b4c703537465b172d88970b6c5fe52c73e Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 14 Jun 2026 20:06:20 +0200 Subject: [PATCH 37/70] chore(l10n): add Chinese (Simplified Han script) translation Translation: Kover/Kover Language: Chinese (Simplified Han script) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_Hans/ --- lib/l10n/zh_Hans.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/l10n/zh_Hans.arb diff --git a/lib/l10n/zh_Hans.arb b/lib/l10n/zh_Hans.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/l10n/zh_Hans.arb @@ -0,0 +1 @@ +{} From a84a45d7a008f3bc2b9c4fa45dacbc67c25fc6fc Mon Sep 17 00:00:00 2001 From: Simon <52073517+rodonisi@users.noreply.github.com> Date: Sun, 14 Jun 2026 20:10:02 +0200 Subject: [PATCH 38/70] rename --- lib/l10n/{zh_Hans.arb => zh.arb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/l10n/{zh_Hans.arb => zh.arb} (100%) diff --git a/lib/l10n/zh_Hans.arb b/lib/l10n/zh.arb similarity index 100% rename from lib/l10n/zh_Hans.arb rename to lib/l10n/zh.arb From f4c85e134f4952ae7bea89908a7dfcd292d2ab0c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 39/70] chore(l10n): update Korean translation Translation: Kover/Kover Language: Korean Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/ko/ --- lib/l10n/ko.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/ko.arb b/lib/l10n/ko.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/ko.arb +++ b/lib/l10n/ko.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From 1a92373762ddf280d4dfe375bef7daaf0f18938a Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 40/70] chore(l10n): update Korean translation Translation: Kover/Kover Language: Korean Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/ko/ --- lib/l10n/ko.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/ko.arb b/lib/l10n/ko.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/ko.arb +++ b/lib/l10n/ko.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From 901c6a139a6d3bf7c2e894013cd927ed4c7bb93b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 41/70] chore(l10n): update German translation Translation: Kover/Kover Language: German Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/de/ --- lib/l10n/de.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/de.arb b/lib/l10n/de.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/de.arb +++ b/lib/l10n/de.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From ea15d66a4ccfc6967b46ee30c23aa631396c84f9 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 42/70] chore(l10n): update German translation Translation: Kover/Kover Language: German Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/de/ --- lib/l10n/de.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/de.arb b/lib/l10n/de.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/de.arb +++ b/lib/l10n/de.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From e3ed670455aa31995348e015601a28d7772e0639 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 43/70] chore(l10n): update Japanese translation Translation: Kover/Kover Language: Japanese Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/ja/ --- lib/l10n/ja.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/ja.arb b/lib/l10n/ja.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/ja.arb +++ b/lib/l10n/ja.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From 840a0e83caa2123897fb4ac34e82806eb2ef7ef1 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 44/70] chore(l10n): update Japanese translation Translation: Kover/Kover Language: Japanese Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/ja/ --- lib/l10n/ja.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/ja.arb b/lib/l10n/ja.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/ja.arb +++ b/lib/l10n/ja.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From fa38a099ae8a15a15a1c8a3b39dfcde7ab583af2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 45/70] chore(l10n): update Italian translation Translation: Kover/Kover Language: Italian Progress: 98.5% (136 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/it/ --- lib/l10n/it.arb | 274 ++++++++++++++++++++++++------------------------ 1 file changed, 137 insertions(+), 137 deletions(-) diff --git a/lib/l10n/it.arb b/lib/l10n/it.arb index 55bf67c6..74350b95 100644 --- a/lib/l10n/it.arb +++ b/lib/l10n/it.arb @@ -1,546 +1,546 @@ { + "addToWantToRead": "Aggiungi a Da Leggere", "@addToWantToRead": { "description": "Label for the add to want to read context menu item" }, + "allSeries": "Tutte le Serie", "@allSeries": { "description": "Label for the all series menu entry" }, + "apiKey": "API Key", "@apiKey": { "description": "Label for the API key input field" }, + "ascending": "Crescente", "@ascending": { "description": "Label for ascending sort direction option" }, + "back": "Indietro", "@back": { "description": "Label for back buttons" }, + "baseUrl": "URL Base", "@baseUrl": { "description": "Label for the base URL input field" }, + "cancel": "Annullare", "@cancel": { "description": "Label for the cancel button in dialogs" }, + "cancelAll": "Cancella Tutto", "@cancelAll": { "description": "Label for the cancel all downloads button" }, + "chapters": "Capitoli", "@chapters": { "description": "Label for the chapters section in the series details page" }, + "clearCovers": "Rimuovi Copertine", "@clearCovers": { "description": "Label for the clear covers button" }, + "clearDatabase": "Pulisci Database", "@clearDatabase": { "description": "Label for the clear database button" }, + "clearDatabaseDialogContent": "Questa operazione cancellerà l'intero database locale, inclusi i progressi non sincronizzati e i dati scaricati. Questa azione non può essere annullata.", "@clearDatabaseDialogContent": { "description": "Content for the clear database confirmation dialog" }, + "clearDatabaseDialogTitle": "Sei sicuro/a?", "@clearDatabaseDialogTitle": { "description": "Title for the clear database confirmation dialog" }, + "clearDownloads": "Rimuovi Downloads", "@clearDownloads": { "description": "Label for the clear downloads button" }, + "collections": "Collezioni", "@collections": { "description": "Label for the collections menu entry" }, + "connectionError": "Errore di Connessione", "@connectionError": { "description": "Heading text when a connection error occurs" }, + "connectionErrorDescription": "Impossibile recuperare l'utente. Verifica le tue credenziali o riprova.", "@connectionErrorDescription": { "description": "Description text when a connection error occurs" }, + "contain": "Contieni", "@contain": { "description": "Label for the contain image fit option" }, + "continueReading": "Continua a Leggere", "@continueReading": { "description": "Label for the continue reading button" }, + "coverPage": "Pagina di copertina", "@coverPage": { "description": "Label for the cover page setting" }, + "coverPageDescription": "Trattare la prima pagina come copertina, visualizzandola come una pagina singola", "@coverPageDescription": { "description": "Description for the cover page setting" }, + "credentials": "Credenziali", "@credentials": { "description": "Label for the credentials section in settings" }, + "dark": "Scuro", "@dark": { "description": "Label for the dark theme mode option" }, + "dataManagement": "Gestione dei Dati", "@dataManagement": { "description": "Label for the data management section" }, + "databaseBusy": "Database occupato…", "@databaseBusy": { "description": "Message shown when the database is busy with an operation" }, + "databaseSize": "Dimensione Database", "@databaseSize": { "description": "Label for the database size information" }, + "dateAdded": "Data Aggiunta", "@dateAdded": { "description": "Label for sorting by date added option" }, + "descending": "Decrescente", "@descending": { "description": "Label for descending sort direction option" }, + "directionLabel": "Direzione", "@directionLabel": { "description": "Label for the sort direction menu header" }, + "dismiss": "Chiudi", "@dismiss": { "description": "Label for the dismiss button in chapter snackbar" }, + "download": "Scarica", "@download": { "description": "Label for the download context menu item" }, + "downloadAllCovers": "Scarica Tutte le Copertine", "@downloadAllCovers": { "description": "Label for the download all covers option" }, + "downloadAllCoversDescription": "Se disattivata, le copertine verranno scaricate solo insieme ai capitoli. Le copertine non scaricate verranno comunque recuperate dal server su richiesta, se è disponibile una connessione.", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" }, + "downloadQueue": "Coda Download", "@downloadQueue": { "description": "Label for the download queue menu entry" }, + "filter": "Filtro", "@filter": { "description": "Label for the filter button in lists" }, + "fitDirection": "Direzione adattamento", "@fitDirection": { "description": "Label for the image fit direction setting" }, + "fontSize": "Dimensione carattere", "@fontSize": { "description": "Label for the font size setting" }, + "general": "Generali", "@general": { "description": "Label for the general settings section" }, + "genres": "Generi", "@genres": { "description": "Label for the genres chips in the series details page" }, + "github": "GitHub", "@github": { "description": "Label for the GitHub link" }, + "go": "Vai", "@go": { "description": "Label for the go button in chapter snackbar" }, + "goToChapter": "Vai al Capitolo", "@goToChapter": { "description": "Label for the go to chapter button in the reading list chapter entry context menu" }, + "goToSeries": "Vai alla Serie", "@goToSeries": { "description": "Label for the go to series button in the reading list chapter entry context menu" }, + "height": "Altezza", "@height": { "description": "Label for the fit height image option" }, + "hideRead": "Nascondi Letti", "@hideRead": { "description": "Label for the hide read filter option in lists" }, + "highlightResumeParagraph": "Evidenzia paragrafo di ripresa", "@highlightResumeParagraph": { "description": "Label for the highlight resume paragraph setting" }, + "home": "Panoramica", "@home": { "description": "Label for the home page" }, + "horizontal": "Orizzontale", "@horizontal": { "description": "Label for the horizontal reader mode option" }, + "hoursCount": "~{hours} ore", "@hoursCount": { "description": "Label for the estimated reading time in hours" }, + "ignoreSafeAreas": "Ignora aree sicure", "@ignoreSafeAreas": { "description": "Label for the ignore safe areas setting" }, + "imIn": "Ci sto!", "@imIn": { "description": "Label for the accept button in the monitoring opt-out dialog" }, + "items": "{count} {count, plural, =0{{count} elementi} =1{{count} elemento} other{{count} elementi}}", "@items": { "description": "Label for the number of items, with pluralization" }, + "lastModified": "Ultima Modifica", "@lastModified": { "description": "Label for sorting by last modified option" }, + "leftToRight": "Sinistra a Destra", "@leftToRight": { "description": "Label for the left to right reading direction option" }, + "letterSpacing": "Spaziatura lettere", "@letterSpacing": { "description": "Label for the letter spacing setting" }, + "libraries": "Librerie", "@libraries": { "description": "Label for the libraries menu entry" }, + "light": "Chiaro", "@light": { "description": "Label for the light theme mode option" }, + "lineHeight": "Altezza della linea", "@lineHeight": { "description": "Label for the line height setting" }, + "madeWithLove": "Realizzato con ❤️", "@madeWithLove": { "description": "Label for the made with love message" }, + "margins": "Margini", "@margins": { "description": "Label for the margins setting" }, + "markAsRead": "Segna Come Letto", "@markAsRead": { "description": "Label for the mark as read button in context menus" }, + "markAsUnread": "Segna Come Non Letto", "@markAsUnread": { "description": "Label for the mark as unread button in context menus" }, + "maxConcurrentDownloads": "Download Simultanei", "@maxConcurrentDownloads": { "description": "Label for the max concurrent downloads setting" }, + "menu": "Menu", "@menu": { "description": "Label for the menu button" }, + "more": "Altro", "@more": { "description": "Label for the more section" }, + "moreCount": "+{count} in più", "@moreCount": { "description": "Label indicating there are more items beyond the displayed count" }, + "name": "Nome", "@name": { "description": "Label for sorting by name option" }, + "nextChapter": "Il prossimo: {chapterTitle}", "@nextChapter": { "description": "Label for the next chapter snackbar with the chapter title" }, + "noActiveSyncOperations": "Nessuna operazione di sincronizzazione attiva", "@noActiveSyncOperations": { "description": "Message shown when there are no active sync operations" }, + "noCredentialsDescription": "Nessuna configurazione delle credenziali. Si prega di aggiungere l'URL del server e la chiave API in Impostazioni.", "@noCredentialsDescription": { "description": "Description text when no credentials are configured" }, + "noDownloadsInQueue": "Nessun download in coda", "@noDownloadsInQueue": { "description": "Message shown when there are no downloads in the queue" }, + "noThanks": "No, grazie", "@noThanks": { "description": "Label for the decline button in the monitoring opt-out dialog" }, + "notSignedIn": "Non Connesso", "@notSignedIn": { "description": "Heading text when user is not signed in" }, + "onDeck": "In Primo Piano", "@onDeck": { "description": "Label for the home page on deck section" }, + "openSettings": "Apri impostazioni", "@openSettings": { "description": "Label for the button to open settings" }, + "outlinedTheme": "Tema Delineato", "@outlinedTheme": { "description": "Label for the outlined theme setting" }, + "pageGap": "Spazio tra pagine", "@pageGap": { "description": "Label for the page gap setting" }, + "pagesCount": "{pages} pagine", "@pagesCount": { "description": "Label for the page count of a chapter" }, + "previousChapter": "Precedente: {chapterTitle}", "@previousChapter": { "description": "Label for the previous chapter snackbar with the chapter title" }, + "read": "Leggi", "@read": { "description": "Label for the read action button on cover cards" }, + "readerMode": "Modalità Lettore", "@readerMode": { "description": "Label for the reader mode setting" }, + "readerSettings": "Impostazioni Lettore", "@readerSettings": { "description": "Label for the reader settings bottom sheet title" }, + "readingDirection": "Direzione Lettura", "@readingDirection": { "description": "Label for the reading direction setting" }, + "readingLists": "Liste di Lettura", "@readingLists": { "description": "Label for the reading lists menu entry" }, + "recentlyAdded": "Aggiunto Recentemente", "@recentlyAdded": { "description": "Label for the home page recently added section" }, + "recentlyUpdated": "Aggiornato Recentemente", "@recentlyUpdated": { "description": "Label for the home page recently updated section" }, + "reclaimSpace": "Recupera Spazio", "@reclaimSpace": { "description": "Label for the reclaim space button" }, + "refreshCovers": "Aggiorna Copertine", "@refreshCovers": { "description": "Label for the refresh covers context menu item" }, + "refreshMetadata": "Aggiorna Metadati", "@refreshMetadata": { "description": "Label for the refresh metadata context menu item" }, + "refreshingCoversForSeries": "Aggiornamento copertine per serie {seriesId}", "@refreshingCoversForSeries": { "description": "Label for the refreshing covers phase with the series ID" }, + "refreshingMetadataForSeries": "Aggiornamento metadati per serie {seriesId}", "@refreshingMetadataForSeries": { "description": "Label for the refreshing metadata phase with the series ID" }, + "refreshingServerSettings": "Aggiornamento impostazioni del server", "@refreshingServerSettings": { "description": "Label for the refreshing server settings phase" }, + "removeDownload": "Rimuovi Download", "@removeDownload": { "description": "Label for the remove download context menu item" }, + "removeFromWantToRead": "Rimuovi da Da Leggere", "@removeFromWantToRead": { "description": "Label for the remove from want to read context menu item" }, + "reset": "Resetta", "@reset": { "description": "Label for the reset button" }, + "retry": "Riprova", "@retry": { "description": "Label for the retry button" }, + "rightToLeft": "Destra a Sinistra", "@rightToLeft": { "description": "Label for the right to left reading direction option" }, + "save": "Salva", "@save": { "description": "Label for the save credentials button" }, + "sendDiagnostics": "Invia statistiche anonime di arresto e diagnostica", "@sendDiagnostics": { "description": "Label for the send diagnostics setting" }, + "sendDiagnosticsChangeable": "Questo può essere modificato nelle impostazioni in qualsiasi momento.", "@sendDiagnosticsChangeable": { "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" }, + "sendDiagnosticsDescription": "Aiutaci a migliorare l'app inviando statistiche anonime sugli errori e sulle prestazioni. I dati non contengono informazioni personali e vengono utilizzati esclusivamente per migliorare l'applicazione.", "@sendDiagnosticsDescription": { "description": "Description for the send diagnostics setting" }, + "sendDiagnosticsDialogTitle": "Invia statistiche anonime di arresto e diagnostica?", "@sendDiagnosticsDialogTitle": { "description": "Title for the monitoring opt-out dialog" }, + "series": "Serie", "@series": { "description": "Label for the series search section header" }, + "setDefaults": "Impostare i default", "@setDefaults": { "description": "Label for the set defaults button" }, + "settings": "Impostazioni", "@settings": { "description": "Label for the settings menu entry" }, + "showLess": "Mostra di Meno", "@showLess": { "description": "Label for the show less button" }, + "showMore": "Mostra di Più", "@showMore": { "description": "Label for the show more button" }, + "showProgressBar": "Mostra barra di progresso", "@showProgressBar": { "description": "Label for the show progress bar setting" }, + "sortBy": "Ordina Per", "@sortBy": { "description": "Label for the sort by option in list" }, + "sortDirection": "Ordine", "@sortDirection": { "description": "Label for the sort direction option in list" }, + "specials": "Speciali", "@specials": { "description": "Label for the specials section in the series details page" }, + "storyline": "Trama", "@storyline": { "description": "Label for the storyline section in the series details page" }, + "summary": "Sinossi", "@summary": { "description": "Label for the summary section heading" }, + "syncingAllSeries": "Sincronizzazione di tutte le serie", "@syncingAllSeries": { "description": "Label for the syncing all series phase" }, + "syncingCollections": "Sincronizzazione collezioni", "@syncingCollections": { "description": "Label for the syncing collections phase" }, + "syncingCovers": "Sincronizzazione copertine", "@syncingCovers": { "description": "Label for the syncing covers phase" }, + "syncingLibraries": "Sincronizzazione delle librerie", "@syncingLibraries": { "description": "Label for the syncing libraries phase" }, + "syncingMetadata": "Sincronizzazione dei metadati", "@syncingMetadata": { "description": "Label for the syncing metadata phase" }, + "syncingProgress": "Sincronizzazione dei progressi", "@syncingProgress": { "description": "Label for the syncing progress phase" }, + "syncingReadingLists": "Sincronizzazione liste di lettura", "@syncingReadingLists": { "description": "Label for the syncing reading lists phase" }, + "syncingRecentlyAdded": "Sincronizzazione recentemente aggiunti", "@syncingRecentlyAdded": { "description": "Label for the syncing recently added phase" }, + "syncingRecentlyUpdated": "Sincronizzazione recentemente aggiornati", "@syncingRecentlyUpdated": { "description": "Label for the syncing recently updated phase" }, + "system": "Sistema", "@system": { "description": "Label for the system theme mode option" }, + "tableOfContents": "Indice", "@tableOfContents": { "description": "Label for the table of contents drawer in the reader" }, + "themeMode": "Modalità Tema", "@themeMode": { "description": "Label for the theme mode setting" }, + "twoPage": "Due Pagine", "@twoPage": { "description": "Label for the two page reader mode option" }, + "unsupportedFormat": "Formato non supportato: {format}", "@unsupportedFormat": { "description": "Message shown when trying to open a chapter in an unsupported format" }, + "version": "Versione: {version} ({buildNumber})", "@version": { "description": "Label for the app version, with placeholders for version and build number" }, + "vertical": "Verticale", "@vertical": { "description": "Label for the vertical reader mode option" }, + "verticalGap": "Distanza verticale", "@verticalGap": { "description": "Label for the vertical gap setting" }, + "volumes": "Volumi", "@volumes": { "description": "Label for the volumes section in the series details page" }, + "wantToRead": "Da Leggere", "@wantToRead": { "description": "Label for the want to read shelf" }, + "width": "Larghezza", "@width": { "description": "Label for the fit width image option" }, + "wordCount": "{wordCount} parole", "@wordCount": { "description": "Label for the word count of a chapter" }, + "wordSpacing": "Spaziatura delle parole", "@wordSpacing": { "description": "Label for the word spacing setting" }, + "writers": "Scrittori", "@writers": { "description": "Label for the writers metadata in the series details page" - }, - "addToWantToRead": "Aggiungi a Da Leggere", - "allSeries": "Tutte le Serie", - "apiKey": "API Key", - "ascending": "Crescente", - "back": "Indietro", - "baseUrl": "URL Base", - "cancel": "Annullare", - "cancelAll": "Cancella Tutto", - "chapters": "Capitoli", - "clearCovers": "Rimuovi Copertine", - "clearDatabase": "Pulisci Database", - "clearDatabaseDialogContent": "Questa operazione cancellerà l'intero database locale, inclusi i progressi non sincronizzati e i dati scaricati. Questa azione non può essere annullata.", - "clearDatabaseDialogTitle": "Sei sicuro/a?", - "clearDownloads": "Rimuovi Downloads", - "collections": "Collezioni", - "connectionError": "Errore di Connessione", - "connectionErrorDescription": "Impossibile recuperare l'utente. Verifica le tue credenziali o riprova.", - "contain": "Contieni", - "continueReading": "Continua a Leggere", - "coverPage": "Pagina di copertina", - "coverPageDescription": "Trattare la prima pagina come copertina, visualizzandola come una pagina singola", - "credentials": "Credenziali", - "dark": "Scuro", - "dataManagement": "Gestione dei Dati", - "databaseBusy": "Database occupato…", - "databaseSize": "Dimensione Database", - "dateAdded": "Data Aggiunta", - "descending": "Decrescente", - "directionLabel": "Direzione", - "dismiss": "Chiudi", - "download": "Scarica", - "downloadAllCovers": "Scarica Tutte le Copertine", - "downloadAllCoversDescription": "Se disattivata, le copertine verranno scaricate solo insieme ai capitoli. Le copertine non scaricate verranno comunque recuperate dal server su richiesta, se è disponibile una connessione.", - "downloadQueue": "Coda Download", - "filter": "Filtro", - "fitDirection": "Direzione adattamento", - "fontSize": "Dimensione carattere", - "general": "Generali", - "genres": "Generi", - "github": "GitHub", - "go": "Vai", - "goToChapter": "Vai al Capitolo", - "goToSeries": "Vai alla Serie", - "height": "Altezza", - "hideRead": "Nascondi Letti", - "highlightResumeParagraph": "Evidenzia paragrafo di ripresa", - "home": "Panoramica", - "horizontal": "Orizzontale", - "hoursCount": "~{hours} ore", - "ignoreSafeAreas": "Ignora aree sicure", - "imIn": "Ci sto!", - "items": "{count} {count, plural, =0{{count} elementi} =1{{count} elemento} other{{count} elementi}}", - "lastModified": "Ultima Modifica", - "leftToRight": "Sinistra a Destra", - "letterSpacing": "Spaziatura lettere", - "libraries": "Librerie", - "light": "Chiaro", - "lineHeight": "Altezza della linea", - "madeWithLove": "Realizzato con ❤️", - "margins": "Margini", - "markAsRead": "Segna Come Letto", - "markAsUnread": "Segna Come Non Letto", - "maxConcurrentDownloads": "Download Simultanei", - "menu": "Menu", - "more": "Altro", - "moreCount": "+{count} in più", - "name": "Nome", - "nextChapter": "Il prossimo: {chapterTitle}", - "noActiveSyncOperations": "Nessuna operazione di sincronizzazione attiva", - "noCredentialsDescription": "Nessuna configurazione delle credenziali. Si prega di aggiungere l'URL del server e la chiave API in Impostazioni.", - "noDownloadsInQueue": "Nessun download in coda", - "noThanks": "No, grazie", - "notSignedIn": "Non Connesso", - "onDeck": "In Primo Piano", - "openSettings": "Apri impostazioni", - "outlinedTheme": "Tema Delineato", - "pageGap": "Spazio tra pagine", - "pagesCount": "{pages} pagine", - "previousChapter": "Precedente: {chapterTitle}", - "read": "Leggi", - "readerMode": "Modalità Lettore", - "readerSettings": "Impostazioni Lettore", - "readingDirection": "Direzione Lettura", - "readingLists": "Liste di Lettura", - "recentlyAdded": "Aggiunto Recentemente", - "recentlyUpdated": "Aggiornato Recentemente", - "reclaimSpace": "Recupera Spazio", - "refreshCovers": "Aggiorna Copertine", - "refreshMetadata": "Aggiorna Metadati", - "refreshingCoversForSeries": "Aggiornamento copertine per serie {seriesId}", - "refreshingMetadataForSeries": "Aggiornamento metadati per serie {seriesId}", - "refreshingServerSettings": "Aggiornamento impostazioni del server", - "removeDownload": "Rimuovi Download", - "removeFromWantToRead": "Rimuovi da Da Leggere", - "reset": "Resetta", - "retry": "Riprova", - "rightToLeft": "Destra a Sinistra", - "save": "Salva", - "sendDiagnostics": "Invia statistiche anonime di arresto e diagnostica", - "sendDiagnosticsChangeable": "Questo può essere modificato nelle impostazioni in qualsiasi momento.", - "sendDiagnosticsDescription": "Aiutaci a migliorare l'app inviando statistiche anonime sugli errori e sulle prestazioni. I dati non contengono informazioni personali e vengono utilizzati esclusivamente per migliorare l'applicazione.", - "sendDiagnosticsDialogTitle": "Invia statistiche anonime di arresto e diagnostica?", - "series": "Serie", - "setDefaults": "Impostare i default", - "settings": "Impostazioni", - "showLess": "Mostra di Meno", - "showMore": "Mostra di Più", - "showProgressBar": "Mostra barra di progresso", - "sortBy": "Ordina Per", - "sortDirection": "Ordine", - "specials": "Speciali", - "storyline": "Trama", - "summary": "Sinossi", - "syncingAllSeries": "Sincronizzazione di tutte le serie", - "syncingCollections": "Sincronizzazione collezioni", - "syncingCovers": "Sincronizzazione copertine", - "syncingLibraries": "Sincronizzazione delle librerie", - "syncingMetadata": "Sincronizzazione dei metadati", - "syncingProgress": "Sincronizzazione dei progressi", - "syncingReadingLists": "Sincronizzazione liste di lettura", - "syncingRecentlyAdded": "Sincronizzazione recentemente aggiunti", - "syncingRecentlyUpdated": "Sincronizzazione recentemente aggiornati", - "system": "Sistema", - "tableOfContents": "Indice", - "themeMode": "Modalità Tema", - "twoPage": "Due Pagine", - "unsupportedFormat": "Formato non supportato: {format}", - "version": "Versione: {version} ({buildNumber})", - "vertical": "Verticale", - "verticalGap": "Distanza verticale", - "volumes": "Volumi", - "wantToRead": "Da Leggere", - "width": "Larghezza", - "wordCount": "{wordCount} parole", - "wordSpacing": "Spaziatura delle parole", - "writers": "Scrittori" + } } From 5bc460a740e43be1dc97727aa72998f21bff01ad Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 46/70] chore(l10n): update Italian translation Translation: Kover/Kover Language: Italian Progress: 98.5% (136 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/it/ --- lib/l10n/it.arb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/l10n/it.arb b/lib/l10n/it.arb index 74350b95..c52ef80d 100644 --- a/lib/l10n/it.arb +++ b/lib/l10n/it.arb @@ -542,5 +542,13 @@ "writers": "Scrittori", "@writers": { "description": "Label for the writers metadata in the series details page" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" } } From 2567f674710ed34e624c5c22578d8c48914d0648 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 47/70] chore(l10n): update French translation Translation: Kover/Kover Language: French Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/fr/ --- lib/l10n/fr.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/fr.arb b/lib/l10n/fr.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/fr.arb +++ b/lib/l10n/fr.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From 0b64e20cc95aa15e861f8df5bbf65c716a4b3c70 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 48/70] chore(l10n): update French translation Translation: Kover/Kover Language: French Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/fr/ --- lib/l10n/fr.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/fr.arb b/lib/l10n/fr.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/fr.arb +++ b/lib/l10n/fr.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From fa9ad5e2b484a39249bf4eda61d74cef11a02633 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 49/70] chore(l10n): update Portuguese translation Translation: Kover/Kover Language: Portuguese Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/pt/ --- lib/l10n/pt.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/pt.arb b/lib/l10n/pt.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/pt.arb +++ b/lib/l10n/pt.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From a741c8424db7733ccb13264f5c48aa03cbe49a58 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 50/70] chore(l10n): update Portuguese translation Translation: Kover/Kover Language: Portuguese Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/pt/ --- lib/l10n/pt.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/pt.arb b/lib/l10n/pt.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/pt.arb +++ b/lib/l10n/pt.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From 2a8d9b18488c92efd316eb1232c01801d86f2347 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 51/70] chore(l10n): update Chinese (Simplified Han script) translation Translation: Kover/Kover Language: Chinese (Simplified Han script) Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_Hans/ --- lib/l10n/zh.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/zh.arb b/lib/l10n/zh.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/zh.arb +++ b/lib/l10n/zh.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From 33d554238ca3dd5f22c2788a81f3edb0209b66c5 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 52/70] chore(l10n): update Chinese (Simplified Han script) translation Translation: Kover/Kover Language: Chinese (Simplified Han script) Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_Hans/ --- lib/l10n/zh.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/zh.arb b/lib/l10n/zh.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/zh.arb +++ b/lib/l10n/zh.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From 0dea48582a45ce7f78709028a69d9eb28b1e64af Mon Sep 17 00:00:00 2001 From: Anonymous Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 53/70] chore(l10n): update Spanish translation Translation: Kover/Kover Language: Spanish Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/es/ --- lib/l10n/es.arb | 551 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 550 insertions(+), 1 deletion(-) diff --git a/lib/l10n/es.arb b/lib/l10n/es.arb index 0967ef42..c40a90ba 100644 --- a/lib/l10n/es.arb +++ b/lib/l10n/es.arb @@ -1 +1,550 @@ -{} +{ + "sendDiagnosticsDialogTitle": "", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "wordSpacing": "", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "dismiss": "", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "ascending": "", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "continueReading": "", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "horizontal": "", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "syncingLibraries": "", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "save": "", + "@save": { + "description": "Label for the save credentials button" + }, + "rightToLeft": "", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "noDownloadsInQueue": "", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "recentlyAdded": "", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "filter": "", + "@filter": { + "description": "Label for the filter button in lists" + }, + "reset": "", + "@reset": { + "description": "Label for the reset button" + }, + "syncingRecentlyAdded": "", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "sendDiagnosticsDescription": "", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "addToWantToRead": "", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "notSignedIn": "", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "syncingRecentlyUpdated": "", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "volumes": "", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "highlightResumeParagraph": "", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "collections": "", + "@collections": { + "description": "Label for the collections menu entry" + }, + "coverPageDescription": "", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "specials": "", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "goToChapter": "", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "syncingReadingLists": "", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "clearDatabaseDialogTitle": "", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "descending": "", + "@descending": { + "description": "Label for descending sort direction option" + }, + "removeFromWantToRead": "", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "height": "", + "@height": { + "description": "Label for the fit height image option" + }, + "sortBy": "", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "lineHeight": "", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "outlinedTheme": "", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "maxConcurrentDownloads": "", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "moreCount": "", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "baseUrl": "", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "storyline": "", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "downloadAllCovers": "", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "github": "", + "@github": { + "description": "Label for the GitHub link" + }, + "directionLabel": "", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "items": "", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "readingDirection": "", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "hideRead": "", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "dataManagement": "", + "@dataManagement": { + "description": "Label for the data management section" + }, + "chapters": "", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "lastModified": "", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "name": "", + "@name": { + "description": "Label for sorting by name option" + }, + "leftToRight": "", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "fitDirection": "", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "light": "", + "@light": { + "description": "Label for the light theme mode option" + }, + "showLess": "", + "@showLess": { + "description": "Label for the show less button" + }, + "back": "", + "@back": { + "description": "Label for back buttons" + }, + "letterSpacing": "", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "menu": "", + "@menu": { + "description": "Label for the menu button" + }, + "version": "", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "databaseSize": "", + "@databaseSize": { + "description": "Label for the database size information" + }, + "onDeck": "", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "syncingTocs": "", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "hoursCount": "", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "credentials": "", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "series": "", + "@series": { + "description": "Label for the series search section header" + }, + "refreshMetadata": "", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "retry": "", + "@retry": { + "description": "Label for the retry button" + }, + "connectionErrorDescription": "", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "sendDiagnostics": "", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "contain": "", + "@contain": { + "description": "Label for the contain image fit option" + }, + "apiKey": "", + "@apiKey": { + "description": "Label for the API key input field" + }, + "syncingCovers": "", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "download": "", + "@download": { + "description": "Label for the download context menu item" + }, + "sortDirection": "", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "refreshCovers": "", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "readerMode": "", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "sendDiagnosticsChangeable": "", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "refreshingServerSettings": "", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "allSeries": "", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "madeWithLove": "", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "read": "", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "coverPage": "", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "themeMode": "", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "recentlyUpdated": "", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "verticalGap": "", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "more": "", + "@more": { + "description": "Label for the more section" + }, + "syncingCollections": "", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "markAsUnread": "", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "clearDatabase": "", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "dark": "", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "width": "", + "@width": { + "description": "Label for the fit width image option" + }, + "home": "", + "@home": { + "description": "Label for the home page" + }, + "cancel": "", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "syncingProgress": "", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "showProgressBar": "", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "twoPage": "", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "imIn": "", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "previousChapter": "", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "general": "", + "@general": { + "description": "Label for the general settings section" + }, + "refreshingMetadataForSeries": "", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "unsupportedFormat": "", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "cancelAll": "", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "openSettings": "", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "setDefaults": "", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "goToSeries": "", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "fontSize": "", + "@fontSize": { + "description": "Label for the font size setting" + }, + "vertical": "", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "connectionError": "", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "removeDownload": "", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "dateAdded": "", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "refreshingCoversForSeries": "", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "noActiveSyncOperations": "", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "clearDatabaseDialogContent": "", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "showMore": "", + "@showMore": { + "description": "Label for the show more button" + }, + "nextChapter": "", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "wantToRead": "", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "syncingMetadata": "", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "readerSettings": "", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "settings": "", + "@settings": { + "description": "Label for the settings menu entry" + }, + "libraries": "", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "downloadQueue": "", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "pageGap": "", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "tableOfContents": "", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "markAsRead": "", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "genres": "", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "go": "", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "clearCovers": "", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "readingLists": "", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "databaseBusy": "", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "reclaimSpace": "", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "margins": "", + "@margins": { + "description": "Label for the margins setting" + }, + "system": "", + "@system": { + "description": "Label for the system theme mode option" + }, + "noThanks": "", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "summary": "", + "@summary": { + "description": "Label for the summary section heading" + }, + "ignoreSafeAreas": "", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "pagesCount": "", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "writers": "", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "clearDownloads": "", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "noCredentialsDescription": "", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "wordCount": "", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "syncingAllSeries": "", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "downloadAllCoversDescription": "", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + } +} From 58179424685f0eb6aa204ebef1a05d628856886f Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:16:18 +0200 Subject: [PATCH 54/70] chore(l10n): update Spanish translation Translation: Kover/Kover Language: Spanish Progress: 0.0% (0 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/es/ --- lib/l10n/es.arb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/l10n/es.arb b/lib/l10n/es.arb index c40a90ba..a364afff 100644 --- a/lib/l10n/es.arb +++ b/lib/l10n/es.arb @@ -546,5 +546,9 @@ "downloadAllCoversDescription": "", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" + }, + "refreshingChapterToc": "", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" } } From b0e5d46956d20ab40e98a81168529c91b386f95b Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:21:26 +0200 Subject: [PATCH 55/70] chore(l10n): update English translation Translation: Kover/Kover Language: English Progress: 100.0% (138 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/en/ --- lib/l10n/en.arb | 1109 +++++++++++++++++++++++------------------------ 1 file changed, 552 insertions(+), 557 deletions(-) diff --git a/lib/l10n/en.arb b/lib/l10n/en.arb index 484b64b7..63ce970e 100644 --- a/lib/l10n/en.arb +++ b/lib/l10n/en.arb @@ -1,559 +1,554 @@ { - "onDeck": "On Deck", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "recentlyUpdated": "Recently Updated", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "recentlyAdded": "Recently Added", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "home": "Home", - "@home": { - "description": "Label for the home page" - }, - "wantToRead": "Want To Read", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "menu": "Menu", - "@menu": { - "description": "Label for the menu button" - }, - "allSeries": "All Series", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "collections": "Collections", - "@collections": { - "description": "Label for the collections menu entry" - }, - "readingLists": "Reading Lists", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "libraries": "Libraries", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "settings": "Settings", - "@settings": { - "description": "Label for the settings menu entry" - }, - "more": "More", - "@more": { - "description": "Label for the more section" - }, - "downloadQueue": "Download Queue", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "general": "General", - "@general": { - "description": "Label for the general settings section" - }, - "themeMode": "Theme Mode", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "system": "System", - "@system": { - "description": "Label for the system theme mode option" - }, - "light": "Light", - "@light": { - "description": "Label for the light theme mode option" - }, - "dark": "Dark", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "outlinedTheme": "Outlined Theme", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "sendDiagnostics": "Send anonymous crash reports and diagnostics", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "sendDiagnosticsDescription": "Help improve the app by sending anonymous error and performance statistics. The data does not contain any personal information and is uniquely used to improve the app.", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "version": "Version: {version} ({buildNumber})", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "github": "GitHub", - "@github": { - "description": "Label for the GitHub link" - }, - "madeWithLove": "Made with ❤️", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "dataManagement": "Data Management", - "@dataManagement": { - "description": "Label for the data management section" - }, - "downloadAllCovers": "Download All Covers", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "downloadAllCoversDescription": "If disabled, covers will only be downloaded together with chapters. Covers will still be fetched from the server on demand when not downloaded and a connection is available.", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "maxConcurrentDownloads": "Max Concurrent Downloads", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "reclaimSpace": "Reclaim Space", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "clearDownloads": "Clear Downloads", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "clearCovers": "Clear Covers", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "clearDatabase": "Clear Database", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "clearDatabaseDialogTitle": "Are you sure?", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "clearDatabaseDialogContent": "This will clear the entire local database, including any unsynced progress and downloaded data. This action cannot be undone.", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "cancel": "Cancel", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "databaseBusy": "Database busy...", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "databaseSize": "Database Size", - "@databaseSize": { - "description": "Label for the database size information" - }, - "credentials": "Credentials", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "baseUrl": "Base URL", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "apiKey": "API Key", - "@apiKey": { - "description": "Label for the API key input field" - }, - "save": "Save", - "@save": { - "description": "Label for the save credentials button" - }, - "sortBy": "Sort By", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "name": "Name", - "@name": { - "description": "Label for sorting by name option" - }, - "dateAdded": "Date Added", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "lastModified": "Last Modified", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "sortDirection": "Sort Direction", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "ascending": "Ascending", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "descending": "Descending", - "@descending": { - "description": "Label for descending sort direction option" - }, - "specials": "Specials", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "storyline": "Storyline", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "volumes": "Volumes", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "chapters": "Chapters", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "genres": "Genres", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "writers": "Writers", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "filter": "Filter", - "@filter": { - "description": "Label for the filter button in lists" - }, - "hideRead": "Hide Read", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "goToChapter": "Go to Chapter", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "goToSeries": "Go to Series", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "markAsRead": "Mark as Read", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "markAsUnread": "Mark as Unread", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "items": "{count} {count, plural, =0{{count} items} =1{{count} item} other{{count} items}}", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "unsupportedFormat": "Unsupported format: {format}", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "back": "Back", - "@back": { - "description": "Label for back buttons" - }, - "tableOfContents": "Table of Contents", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - - "notSignedIn": "Not Signed In", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "noCredentialsDescription": "No credentials configured. Please add your server URL and API key in Settings.", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "openSettings": "Open Settings", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "connectionError": "Connection Error", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "connectionErrorDescription": "Failed to fetch user. Please check your credentials or try again.", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "retry": "Retry", - "@retry": { - "description": "Label for the retry button" - }, - "sendDiagnosticsDialogTitle": "Send anonymous crash reports and diagnostics?", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "sendDiagnosticsChangeable": "This can be changed in the settings at any time.", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "noThanks": "No, thanks", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "imIn": "I'm in!", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "addToWantToRead": "Add to Want to Read", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "removeFromWantToRead": "Remove from Want to Read", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "download": "Download", - "@download": { - "description": "Label for the download context menu item" - }, - "removeDownload": "Remove Download", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "refreshMetadata": "Refresh Metadata", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "refreshCovers": "Refresh Covers", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "noActiveSyncOperations": "No active sync operations", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "syncingAllSeries": "Syncing all series", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "syncingMetadata": "Syncing metadata", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "syncingRecentlyAdded": "Syncing recently added", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "syncingRecentlyUpdated": "Syncing recently updated", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "syncingLibraries": "Syncing libraries", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "syncingProgress": "Syncing progress", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "syncingCovers": "Syncing covers", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "syncingCollections": "Syncing collections", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "syncingReadingLists": "Syncing reading lists", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "refreshingMetadataForSeries": "Refreshing metadata for series {seriesId}", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "refreshingCoversForSeries": "Refreshing covers for series {seriesId}", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "refreshingServerSettings": "Refreshing server settings", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "series": "Series", - "@series": { - "description": "Label for the series search section header" - }, - "moreCount": "+{count} more", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "wordCount": "{wordCount} words", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "hoursCount": "~{hours} hours", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "pagesCount": "{pages} pages", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - - "continueReading": "Continue Reading", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "summary": "Summary", - "@summary": { - "description": "Label for the summary section heading" - }, - "showMore": "Show More", - "@showMore": { - "description": "Label for the show more button" - }, - "showLess": "Show Less", - "@showLess": { - "description": "Label for the show less button" - }, - - "cancelAll": "Cancel All", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "noDownloadsInQueue": "No downloads in queue", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - - "directionLabel": "Direction", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - - "readerSettings": "Reader Settings", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "readingDirection": "Reading Direction", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "leftToRight": "Left to Right", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "rightToLeft": "Right to Left", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "readerMode": "Reader Mode", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "vertical": "Vertical", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "horizontal": "Horizontal", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "twoPage": "Two Page", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "fitDirection": "Fit Direction", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "contain": "Contain", - "@contain": { - "description": "Label for the contain image fit option" - }, - "width": "Width", - "@width": { - "description": "Label for the fit width image option" - }, - "height": "Height", - "@height": { - "description": "Label for the fit height image option" - }, - "margins": "Margins", - "@margins": { - "description": "Label for the margins setting" - }, - "verticalGap": "Vertical Gap", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "pageGap": "Page Gap", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "coverPage": "Cover Page", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "coverPageDescription": "Treat the first page as the cover, showing it as a single page", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "ignoreSafeAreas": "Ignore Safe Areas", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "showProgressBar": "Show Progress Bar", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "setDefaults": "Set Defaults", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "reset": "Reset", - "@reset": { - "description": "Label for the reset button" - }, - "fontSize": "Font Size", - "@fontSize": { - "description": "Label for the font size setting" - }, - "lineHeight": "Line Height", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "wordSpacing": "Word Spacing", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "letterSpacing": "Letter Spacing", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "highlightResumeParagraph": "Highlight Resume Paragraph", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "dismiss": "Dismiss", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "go": "Go", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "previousChapter": "Previous: {chapterTitle}", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "nextChapter": "Next: {chapterTitle}", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "read": "Read", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "syncingTocs": "Syncing chapters TOCs", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "refreshingChapterToc": "Syncing chapter TOC for chapter {chapterId}", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } + "onDeck": "On Deck", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "recentlyUpdated": "Recently Updated", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "recentlyAdded": "Recently Added", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "home": "Home", + "@home": { + "description": "Label for the home page" + }, + "wantToRead": "Want To Read", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "menu": "Menu", + "@menu": { + "description": "Label for the menu button" + }, + "allSeries": "All Series", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "collections": "Collections", + "@collections": { + "description": "Label for the collections menu entry" + }, + "readingLists": "Reading Lists", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "libraries": "Libraries", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "settings": "Settings", + "@settings": { + "description": "Label for the settings menu entry" + }, + "more": "More", + "@more": { + "description": "Label for the more section" + }, + "downloadQueue": "Download Queue", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "general": "General", + "@general": { + "description": "Label for the general settings section" + }, + "themeMode": "Theme Mode", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "system": "System", + "@system": { + "description": "Label for the system theme mode option" + }, + "light": "Light", + "@light": { + "description": "Label for the light theme mode option" + }, + "dark": "Dark", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "outlinedTheme": "Outlined Theme", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "sendDiagnostics": "Send anonymous crash reports and diagnostics", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "sendDiagnosticsDescription": "Help improve the app by sending anonymous error and performance statistics. The data does not contain any personal information and is uniquely used to improve the app.", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "version": "Version: {version} ({buildNumber})", + "@version": { + "description": "Label for the app version, with placeholders for version and build number" + }, + "github": "GitHub", + "@github": { + "description": "Label for the GitHub link" + }, + "madeWithLove": "Made with ❤️", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "dataManagement": "Data Management", + "@dataManagement": { + "description": "Label for the data management section" + }, + "downloadAllCovers": "Download All Covers", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "downloadAllCoversDescription": "If disabled, covers will only be downloaded together with chapters. Covers will still be fetched from the server on demand when not downloaded and a connection is available.", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + }, + "maxConcurrentDownloads": "Max Concurrent Downloads", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "reclaimSpace": "Reclaim Space", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "clearDownloads": "Clear Downloads", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "clearCovers": "Clear Covers", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "clearDatabase": "Clear Database", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "clearDatabaseDialogTitle": "Are you sure?", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "clearDatabaseDialogContent": "This will clear the entire local database, including any unsynced progress and downloaded data. This action cannot be undone.", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "cancel": "Cancel", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "databaseBusy": "Database busy…", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "databaseSize": "Database Size", + "@databaseSize": { + "description": "Label for the database size information" + }, + "credentials": "Credentials", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "baseUrl": "Base URL", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "apiKey": "API Key", + "@apiKey": { + "description": "Label for the API key input field" + }, + "save": "Save", + "@save": { + "description": "Label for the save credentials button" + }, + "sortBy": "Sort By", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "name": "Name", + "@name": { + "description": "Label for sorting by name option" + }, + "dateAdded": "Date Added", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "lastModified": "Last Modified", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "sortDirection": "Sort Direction", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "ascending": "Ascending", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "descending": "Descending", + "@descending": { + "description": "Label for descending sort direction option" + }, + "specials": "Specials", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "storyline": "Storyline", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "volumes": "Volumes", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "chapters": "Chapters", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "genres": "Genres", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "writers": "Writers", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "filter": "Filter", + "@filter": { + "description": "Label for the filter button in lists" + }, + "hideRead": "Hide Read", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "goToChapter": "Go to Chapter", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "goToSeries": "Go to Series", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "markAsRead": "Mark as Read", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "markAsUnread": "Mark as Unread", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "items": "{count} {count, plural, =0{{count} items} =1{{count} item} other{{count} items}}", + "@items": { + "description": "Label for the number of items, with pluralization" + }, + "unsupportedFormat": "Unsupported format: {format}", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format" + }, + "back": "Back", + "@back": { + "description": "Label for back buttons" + }, + "tableOfContents": "Table of Contents", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "notSignedIn": "Not Signed In", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "noCredentialsDescription": "No credentials configured. Please add your server URL and API key in Settings.", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "openSettings": "Open Settings", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "connectionError": "Connection Error", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "connectionErrorDescription": "Failed to fetch user. Please check your credentials or try again.", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "retry": "Retry", + "@retry": { + "description": "Label for the retry button" + }, + "sendDiagnosticsDialogTitle": "Send anonymous crash reports and diagnostics?", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "sendDiagnosticsChangeable": "This can be changed in the settings at any time.", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "noThanks": "No, thanks", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "imIn": "I'm in!", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "addToWantToRead": "Add to Want to Read", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "removeFromWantToRead": "Remove from Want to Read", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "download": "Download", + "@download": { + "description": "Label for the download context menu item" + }, + "removeDownload": "Remove Download", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "refreshMetadata": "Refresh Metadata", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "refreshCovers": "Refresh Covers", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "noActiveSyncOperations": "No active sync operations", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "syncingAllSeries": "Syncing all series", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "syncingMetadata": "Syncing metadata", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "syncingRecentlyAdded": "Syncing recently added", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "syncingRecentlyUpdated": "Syncing recently updated", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "syncingLibraries": "Syncing libraries", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "syncingProgress": "Syncing progress", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "syncingCovers": "Syncing covers", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "syncingCollections": "Syncing collections", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "syncingReadingLists": "Syncing reading lists", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "refreshingMetadataForSeries": "Refreshing metadata for series {seriesId}", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID" + }, + "refreshingCoversForSeries": "Refreshing covers for series {seriesId}", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID" + }, + "refreshingServerSettings": "Refreshing server settings", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "series": "Series", + "@series": { + "description": "Label for the series search section header" + }, + "moreCount": "+{count} more", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed count" + }, + "wordCount": "{wordCount} words", + "@wordCount": { + "description": "Label for the word count of a chapter" + }, + "hoursCount": "~{hours} hours", + "@hoursCount": { + "description": "Label for the estimated reading time in hours" + }, + "pagesCount": "{pages} pages", + "@pagesCount": { + "description": "Label for the page count of a chapter" + }, + "continueReading": "Continue Reading", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "summary": "Summary", + "@summary": { + "description": "Label for the summary section heading" + }, + "showMore": "Show More", + "@showMore": { + "description": "Label for the show more button" + }, + "showLess": "Show Less", + "@showLess": { + "description": "Label for the show less button" + }, + "cancelAll": "Cancel All", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "noDownloadsInQueue": "No downloads in queue", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "directionLabel": "Direction", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "readerSettings": "Reader Settings", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "readingDirection": "Reading Direction", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "leftToRight": "Left to Right", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "rightToLeft": "Right to Left", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "readerMode": "Reader Mode", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "vertical": "Vertical", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "horizontal": "Horizontal", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "twoPage": "Two Page", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "fitDirection": "Fit Direction", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "contain": "Contain", + "@contain": { + "description": "Label for the contain image fit option" + }, + "width": "Width", + "@width": { + "description": "Label for the fit width image option" + }, + "height": "Height", + "@height": { + "description": "Label for the fit height image option" + }, + "margins": "Margins", + "@margins": { + "description": "Label for the margins setting" + }, + "verticalGap": "Vertical Gap", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "pageGap": "Page Gap", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "coverPage": "Cover Page", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "coverPageDescription": "Treat the first page as the cover, showing it as a single page", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "ignoreSafeAreas": "Ignore Safe Areas", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "showProgressBar": "Show Progress Bar", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "setDefaults": "Set Defaults", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "reset": "Reset", + "@reset": { + "description": "Label for the reset button" + }, + "fontSize": "Font Size", + "@fontSize": { + "description": "Label for the font size setting" + }, + "lineHeight": "Line Height", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "wordSpacing": "Word Spacing", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "letterSpacing": "Letter Spacing", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "highlightResumeParagraph": "Highlight Resume Paragraph", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "dismiss": "Dismiss", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "go": "Go", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "previousChapter": "Previous: {chapterTitle}", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title" + }, + "nextChapter": "Next: {chapterTitle}", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title" + }, + "read": "Read", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "syncingTocs": "Syncing chapters TOCs", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "refreshingChapterToc": "Refreshing chapter TOC for chapter {chapterId}", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID" + } } From 1093ff788b6cffed2322447a8aef763ae5bbd458 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 15 Jun 2026 21:21:40 +0200 Subject: [PATCH 56/70] chore(l10n): update Italian translation Translation: Kover/Kover Language: Italian Progress: 100.0% (138 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/it/ --- lib/l10n/it.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/it.arb b/lib/l10n/it.arb index c52ef80d..37d2f657 100644 --- a/lib/l10n/it.arb +++ b/lib/l10n/it.arb @@ -543,11 +543,11 @@ "@writers": { "description": "Label for the writers metadata in the series details page" }, - "refreshingChapterToc": "", + "refreshingChapterToc": "Aggiornamento indice per capitolo {chapterId}", "@refreshingChapterToc": { "description": "Label for the syncing chapter TOC phase with the chapter ID" }, - "syncingTocs": "", + "syncingTocs": "Sincronizzazione indici capitoli", "@syncingTocs": { "description": "Label for the syncing chapters TOCs phase" } From 52cc06c1f9bfd0a08a545d6b324163f91454a827 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Thu, 18 Jun 2026 19:58:56 +0200 Subject: [PATCH 57/70] add weblate thanks entry --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4819ffae..916aa910 100644 --- a/README.md +++ b/README.md @@ -125,3 +125,5 @@ To connect Kover to a Kavita instance: [Sentry](https://sentry.io/) for providing an open source license for their error reporting software. + +[Weblate](https://weblate.org/) for providing free hosting to support translations. From fe40d6e44f09101c1fbfa6eeaa0a66c02bf8312c Mon Sep 17 00:00:00 2001 From: rodonisi Date: Thu, 18 Jun 2026 20:04:13 +0200 Subject: [PATCH 58/70] add localization codestyle entry --- .github/CONTRIBUTING.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e7de1c32..11890cdc 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -7,6 +7,7 @@ Thank you for your interest in contributing to Kover. This document outlines the ## Table of Contents + - [Contributing to Kover](#contributing-to-kover) - [Table of Contents](#table-of-contents) - [AI Assistance Disclosure](#ai-assistance-disclosure) @@ -23,7 +24,7 @@ Thank you for your interest in contributing to Kover. This document outlines the - [Pull Request Guidelines](#pull-request-guidelines) - [Release Process](#release-process) - [Getting Help and Community](#getting-help-and-community) - + --- @@ -141,6 +142,8 @@ graph LR - Avoid manually modifying generated code. - Avoid violating the architecture layer boundaries. - For example, UI code should not directly access the database or API, but rather go through providers and managers. +- New text strings exposed in the UI should be added to the English localization file `lib/l10n/en.arb` and accompanied by a description for the string in + the respective `@` entry. No other localization files should be manually edited as those are managed through Weblate. ### Setting Up Your Development Environment From 162ce2f1db0e59a57beb8a0c9f9383a28f3072b4 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Thu, 18 Jun 2026 20:23:37 +0200 Subject: [PATCH 59/70] weblate logo --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 916aa910..5adeb458 100644 --- a/README.md +++ b/README.md @@ -126,4 +126,7 @@ To connect Kover to a Kavita instance: [Sentry](https://sentry.io/) for providing an open source license for their error reporting software. +File:Weblate logo.svg + [Weblate](https://weblate.org/) for providing free hosting to support translations. From befa647c9b8a5eb006731338158c3dc98483ee13 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Thu, 18 Jun 2026 20:27:43 +0200 Subject: [PATCH 60/70] reorganize logos --- README.md | 17 ++++++++++------- docs/assets/sentry.svg | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5adeb458..fb8ca1ef 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,14 @@ To connect Kover to a Kavita instance: ## Thanks - - -[Sentry](https://sentry.io/) for providing an open source license for their error reporting software. - -File:Weblate logo.svg +

+ + Sentry + + + Weblate + +

-[Weblate](https://weblate.org/) for providing free hosting to support translations. +- [Sentry](https://sentry.io/) for providing an open source license for their error reporting software. +- [Weblate](https://weblate.org/) for providing free hosting to support translations. diff --git a/docs/assets/sentry.svg b/docs/assets/sentry.svg index eccfedc2..ff30f3f2 100644 --- a/docs/assets/sentry.svg +++ b/docs/assets/sentry.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 00b63242e937be6c85cc1501eea5ada23d3adbf0 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 18 Jun 2026 21:23:33 +0200 Subject: [PATCH 61/70] chore(l10n): update translation files Add-on: Remove blank strings Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/kover/kover/ Translation: Kover/Kover --- lib/l10n/de.arb | 555 +----------------------------------------------- lib/l10n/es.arb | 555 +----------------------------------------------- lib/l10n/fr.arb | 555 +----------------------------------------------- lib/l10n/ja.arb | 555 +----------------------------------------------- lib/l10n/ko.arb | 555 +----------------------------------------------- lib/l10n/pt.arb | 555 +----------------------------------------------- lib/l10n/zh.arb | 555 +----------------------------------------------- 7 files changed, 7 insertions(+), 3878 deletions(-) diff --git a/lib/l10n/de.arb b/lib/l10n/de.arb index a364afff..0967ef42 100644 --- a/lib/l10n/de.arb +++ b/lib/l10n/de.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} diff --git a/lib/l10n/es.arb b/lib/l10n/es.arb index a364afff..0967ef42 100644 --- a/lib/l10n/es.arb +++ b/lib/l10n/es.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} diff --git a/lib/l10n/fr.arb b/lib/l10n/fr.arb index a364afff..0967ef42 100644 --- a/lib/l10n/fr.arb +++ b/lib/l10n/fr.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} diff --git a/lib/l10n/ja.arb b/lib/l10n/ja.arb index a364afff..0967ef42 100644 --- a/lib/l10n/ja.arb +++ b/lib/l10n/ja.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} diff --git a/lib/l10n/ko.arb b/lib/l10n/ko.arb index a364afff..0967ef42 100644 --- a/lib/l10n/ko.arb +++ b/lib/l10n/ko.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} diff --git a/lib/l10n/pt.arb b/lib/l10n/pt.arb index a364afff..0967ef42 100644 --- a/lib/l10n/pt.arb +++ b/lib/l10n/pt.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} diff --git a/lib/l10n/zh.arb b/lib/l10n/zh.arb index a364afff..0967ef42 100644 --- a/lib/l10n/zh.arb +++ b/lib/l10n/zh.arb @@ -1,554 +1 @@ -{ - "sendDiagnosticsDialogTitle": "", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "wordSpacing": "", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "dismiss": "", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "ascending": "", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "continueReading": "", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "horizontal": "", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "syncingLibraries": "", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "save": "", - "@save": { - "description": "Label for the save credentials button" - }, - "rightToLeft": "", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "noDownloadsInQueue": "", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "recentlyAdded": "", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "filter": "", - "@filter": { - "description": "Label for the filter button in lists" - }, - "reset": "", - "@reset": { - "description": "Label for the reset button" - }, - "syncingRecentlyAdded": "", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "sendDiagnosticsDescription": "", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "addToWantToRead": "", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "notSignedIn": "", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "syncingRecentlyUpdated": "", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "volumes": "", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "highlightResumeParagraph": "", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "collections": "", - "@collections": { - "description": "Label for the collections menu entry" - }, - "coverPageDescription": "", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "specials": "", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "goToChapter": "", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "syncingReadingLists": "", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "clearDatabaseDialogTitle": "", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "descending": "", - "@descending": { - "description": "Label for descending sort direction option" - }, - "removeFromWantToRead": "", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "height": "", - "@height": { - "description": "Label for the fit height image option" - }, - "sortBy": "", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "lineHeight": "", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "outlinedTheme": "", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "maxConcurrentDownloads": "", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "moreCount": "", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "baseUrl": "", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "storyline": "", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "downloadAllCovers": "", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "github": "", - "@github": { - "description": "Label for the GitHub link" - }, - "directionLabel": "", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "items": "", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "readingDirection": "", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "hideRead": "", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "dataManagement": "", - "@dataManagement": { - "description": "Label for the data management section" - }, - "chapters": "", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "lastModified": "", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "name": "", - "@name": { - "description": "Label for sorting by name option" - }, - "leftToRight": "", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "fitDirection": "", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "light": "", - "@light": { - "description": "Label for the light theme mode option" - }, - "showLess": "", - "@showLess": { - "description": "Label for the show less button" - }, - "back": "", - "@back": { - "description": "Label for back buttons" - }, - "letterSpacing": "", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "menu": "", - "@menu": { - "description": "Label for the menu button" - }, - "version": "", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "databaseSize": "", - "@databaseSize": { - "description": "Label for the database size information" - }, - "onDeck": "", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "syncingTocs": "", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "hoursCount": "", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "credentials": "", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "series": "", - "@series": { - "description": "Label for the series search section header" - }, - "refreshMetadata": "", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "retry": "", - "@retry": { - "description": "Label for the retry button" - }, - "connectionErrorDescription": "", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "sendDiagnostics": "", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "contain": "", - "@contain": { - "description": "Label for the contain image fit option" - }, - "apiKey": "", - "@apiKey": { - "description": "Label for the API key input field" - }, - "syncingCovers": "", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "download": "", - "@download": { - "description": "Label for the download context menu item" - }, - "sortDirection": "", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "refreshCovers": "", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "readerMode": "", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "sendDiagnosticsChangeable": "", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "refreshingServerSettings": "", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "allSeries": "", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "madeWithLove": "", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "read": "", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "coverPage": "", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "themeMode": "", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "recentlyUpdated": "", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "verticalGap": "", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "more": "", - "@more": { - "description": "Label for the more section" - }, - "syncingCollections": "", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "markAsUnread": "", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "clearDatabase": "", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "dark": "", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "width": "", - "@width": { - "description": "Label for the fit width image option" - }, - "home": "", - "@home": { - "description": "Label for the home page" - }, - "cancel": "", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "syncingProgress": "", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "showProgressBar": "", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "twoPage": "", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "imIn": "", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "previousChapter": "", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "general": "", - "@general": { - "description": "Label for the general settings section" - }, - "refreshingMetadataForSeries": "", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "unsupportedFormat": "", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "cancelAll": "", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "openSettings": "", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "setDefaults": "", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "goToSeries": "", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "fontSize": "", - "@fontSize": { - "description": "Label for the font size setting" - }, - "vertical": "", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "connectionError": "", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "removeDownload": "", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "dateAdded": "", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "refreshingCoversForSeries": "", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "noActiveSyncOperations": "", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "clearDatabaseDialogContent": "", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "showMore": "", - "@showMore": { - "description": "Label for the show more button" - }, - "nextChapter": "", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "wantToRead": "", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "syncingMetadata": "", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "readerSettings": "", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "settings": "", - "@settings": { - "description": "Label for the settings menu entry" - }, - "libraries": "", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "downloadQueue": "", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "pageGap": "", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "tableOfContents": "", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "markAsRead": "", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "genres": "", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "go": "", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "clearCovers": "", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "readingLists": "", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "databaseBusy": "", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "reclaimSpace": "", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "margins": "", - "@margins": { - "description": "Label for the margins setting" - }, - "system": "", - "@system": { - "description": "Label for the system theme mode option" - }, - "noThanks": "", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "summary": "", - "@summary": { - "description": "Label for the summary section heading" - }, - "ignoreSafeAreas": "", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "pagesCount": "", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "writers": "", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "clearDownloads": "", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "noCredentialsDescription": "", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "wordCount": "", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "syncingAllSeries": "", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "downloadAllCoversDescription": "", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "refreshingChapterToc": "", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" - } -} +{} From d8b1c518abbc6996c30ce27f56b0ff0063dd6706 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 18 Jun 2026 21:23:33 +0200 Subject: [PATCH 62/70] chore(l10n): add German translation chore(l10n): remove Spanish translation chore(l10n): remove Portuguese translation chore(l10n): remove Korean translation chore(l10n): remove Japanese translation chore(l10n): remove French translation chore(l10n): remove Chinese (Simplified Han script) translation chore(l10n): remove German translation Co-authored-by: Simon Language: Chinese (Simplified Han script) Language: French Language: German Language: Japanese Language: Korean Language: Portuguese Language: Spanish Translate-URL: https://hosted.weblate.org/projects/kover/kover/de/ Translate-URL: https://hosted.weblate.org/projects/kover/kover/es/ Translate-URL: https://hosted.weblate.org/projects/kover/kover/fr/ Translate-URL: https://hosted.weblate.org/projects/kover/kover/ja/ Translate-URL: https://hosted.weblate.org/projects/kover/kover/ko/ Translate-URL: https://hosted.weblate.org/projects/kover/kover/pt/ Translate-URL: https://hosted.weblate.org/projects/kover/kover/zh_Hans/ Translation: Kover/Kover --- lib/l10n/es.arb | 1 - lib/l10n/fr.arb | 1 - lib/l10n/ja.arb | 1 - lib/l10n/ko.arb | 1 - lib/l10n/pt.arb | 1 - lib/l10n/zh.arb | 1 - 6 files changed, 6 deletions(-) delete mode 100644 lib/l10n/es.arb delete mode 100644 lib/l10n/fr.arb delete mode 100644 lib/l10n/ja.arb delete mode 100644 lib/l10n/ko.arb delete mode 100644 lib/l10n/pt.arb delete mode 100644 lib/l10n/zh.arb diff --git a/lib/l10n/es.arb b/lib/l10n/es.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/es.arb +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/lib/l10n/fr.arb b/lib/l10n/fr.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/fr.arb +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/lib/l10n/ja.arb b/lib/l10n/ja.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/ja.arb +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/lib/l10n/ko.arb b/lib/l10n/ko.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/ko.arb +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/lib/l10n/pt.arb b/lib/l10n/pt.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/pt.arb +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/lib/l10n/zh.arb b/lib/l10n/zh.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/zh.arb +++ /dev/null @@ -1 +0,0 @@ -{} From dee9969ac0d0893820b13de47a120a8b15874398 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Jun 2026 18:29:48 +0200 Subject: [PATCH 63/70] chore(l10n): remove German translation Translation: Kover/Kover Language: German Translate-URL: https://hosted.weblate.org/projects/kover/kover/de/ --- lib/l10n/de.arb | 1 - 1 file changed, 1 deletion(-) delete mode 100644 lib/l10n/de.arb diff --git a/lib/l10n/de.arb b/lib/l10n/de.arb deleted file mode 100644 index 0967ef42..00000000 --- a/lib/l10n/de.arb +++ /dev/null @@ -1 +0,0 @@ -{} From 4dc8d517757a44ded725135cea1eaa7ab749a39c Mon Sep 17 00:00:00 2001 From: rodonisi Date: Fri, 19 Jun 2026 18:34:01 +0200 Subject: [PATCH 64/70] format --- lib/pages/settings/credentials_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/settings/credentials_settings.dart b/lib/pages/settings/credentials_settings.dart index 1b230049..44d31de7 100644 --- a/lib/pages/settings/credentials_settings.dart +++ b/lib/pages/settings/credentials_settings.dart @@ -59,7 +59,7 @@ class _CredentialsForm extends HookConsumerWidget { enabled: loginStatus != .loading, controller: urlController, decoration: const InputDecoration( - labelText:l.baseUrl, + labelText: l.baseUrl, ), ), TextField( From bca2077a62f46210a01507d11cb09b5e285020e4 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Fri, 19 Jun 2026 18:39:59 +0200 Subject: [PATCH 65/70] invalid consts --- lib/pages/settings/credentials_settings.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/settings/credentials_settings.dart b/lib/pages/settings/credentials_settings.dart index 44d31de7..7e0c2ae8 100644 --- a/lib/pages/settings/credentials_settings.dart +++ b/lib/pages/settings/credentials_settings.dart @@ -58,7 +58,7 @@ class _CredentialsForm extends HookConsumerWidget { TextField( enabled: loginStatus != .loading, controller: urlController, - decoration: const InputDecoration( + decoration: InputDecoration( labelText: l.baseUrl, ), ), @@ -101,7 +101,7 @@ class _CredentialsForm extends HookConsumerWidget { ), ); }, - label: const Text(l.save), + label: Text(l.save), icon: const Icon(LucideIcons.save), ), ], From 55d2481d36fe5b2a2e143868c5adca4d3e48ed29 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Fri, 19 Jun 2026 19:20:04 +0200 Subject: [PATCH 66/70] add parameter descriptions --- lib/l10n/en.arb | 1198 +++++++++++++------------ lib/pages/settings/version_label.dart | 2 +- lib/widgets/details/info_widgets.dart | 7 +- 3 files changed, 651 insertions(+), 556 deletions(-) diff --git a/lib/l10n/en.arb b/lib/l10n/en.arb index 63ce970e..925644e6 100644 --- a/lib/l10n/en.arb +++ b/lib/l10n/en.arb @@ -1,554 +1,650 @@ { - "onDeck": "On Deck", - "@onDeck": { - "description": "Label for the home page on deck section" - }, - "recentlyUpdated": "Recently Updated", - "@recentlyUpdated": { - "description": "Label for the home page recently updated section" - }, - "recentlyAdded": "Recently Added", - "@recentlyAdded": { - "description": "Label for the home page recently added section" - }, - "home": "Home", - "@home": { - "description": "Label for the home page" - }, - "wantToRead": "Want To Read", - "@wantToRead": { - "description": "Label for the want to read shelf" - }, - "menu": "Menu", - "@menu": { - "description": "Label for the menu button" - }, - "allSeries": "All Series", - "@allSeries": { - "description": "Label for the all series menu entry" - }, - "collections": "Collections", - "@collections": { - "description": "Label for the collections menu entry" - }, - "readingLists": "Reading Lists", - "@readingLists": { - "description": "Label for the reading lists menu entry" - }, - "libraries": "Libraries", - "@libraries": { - "description": "Label for the libraries menu entry" - }, - "settings": "Settings", - "@settings": { - "description": "Label for the settings menu entry" - }, - "more": "More", - "@more": { - "description": "Label for the more section" - }, - "downloadQueue": "Download Queue", - "@downloadQueue": { - "description": "Label for the download queue menu entry" - }, - "general": "General", - "@general": { - "description": "Label for the general settings section" - }, - "themeMode": "Theme Mode", - "@themeMode": { - "description": "Label for the theme mode setting" - }, - "system": "System", - "@system": { - "description": "Label for the system theme mode option" - }, - "light": "Light", - "@light": { - "description": "Label for the light theme mode option" - }, - "dark": "Dark", - "@dark": { - "description": "Label for the dark theme mode option" - }, - "outlinedTheme": "Outlined Theme", - "@outlinedTheme": { - "description": "Label for the outlined theme setting" - }, - "sendDiagnostics": "Send anonymous crash reports and diagnostics", - "@sendDiagnostics": { - "description": "Label for the send diagnostics setting" - }, - "sendDiagnosticsDescription": "Help improve the app by sending anonymous error and performance statistics. The data does not contain any personal information and is uniquely used to improve the app.", - "@sendDiagnosticsDescription": { - "description": "Description for the send diagnostics setting" - }, - "version": "Version: {version} ({buildNumber})", - "@version": { - "description": "Label for the app version, with placeholders for version and build number" - }, - "github": "GitHub", - "@github": { - "description": "Label for the GitHub link" - }, - "madeWithLove": "Made with ❤️", - "@madeWithLove": { - "description": "Label for the made with love message" - }, - "dataManagement": "Data Management", - "@dataManagement": { - "description": "Label for the data management section" - }, - "downloadAllCovers": "Download All Covers", - "@downloadAllCovers": { - "description": "Label for the download all covers option" - }, - "downloadAllCoversDescription": "If disabled, covers will only be downloaded together with chapters. Covers will still be fetched from the server on demand when not downloaded and a connection is available.", - "@downloadAllCoversDescription": { - "description": "Description for the download all covers option" - }, - "maxConcurrentDownloads": "Max Concurrent Downloads", - "@maxConcurrentDownloads": { - "description": "Label for the max concurrent downloads setting" - }, - "reclaimSpace": "Reclaim Space", - "@reclaimSpace": { - "description": "Label for the reclaim space button" - }, - "clearDownloads": "Clear Downloads", - "@clearDownloads": { - "description": "Label for the clear downloads button" - }, - "clearCovers": "Clear Covers", - "@clearCovers": { - "description": "Label for the clear covers button" - }, - "clearDatabase": "Clear Database", - "@clearDatabase": { - "description": "Label for the clear database button" - }, - "clearDatabaseDialogTitle": "Are you sure?", - "@clearDatabaseDialogTitle": { - "description": "Title for the clear database confirmation dialog" - }, - "clearDatabaseDialogContent": "This will clear the entire local database, including any unsynced progress and downloaded data. This action cannot be undone.", - "@clearDatabaseDialogContent": { - "description": "Content for the clear database confirmation dialog" - }, - "cancel": "Cancel", - "@cancel": { - "description": "Label for the cancel button in dialogs" - }, - "databaseBusy": "Database busy…", - "@databaseBusy": { - "description": "Message shown when the database is busy with an operation" - }, - "databaseSize": "Database Size", - "@databaseSize": { - "description": "Label for the database size information" - }, - "credentials": "Credentials", - "@credentials": { - "description": "Label for the credentials section in settings" - }, - "baseUrl": "Base URL", - "@baseUrl": { - "description": "Label for the base URL input field" - }, - "apiKey": "API Key", - "@apiKey": { - "description": "Label for the API key input field" - }, - "save": "Save", - "@save": { - "description": "Label for the save credentials button" - }, - "sortBy": "Sort By", - "@sortBy": { - "description": "Label for the sort by option in list" - }, - "name": "Name", - "@name": { - "description": "Label for sorting by name option" - }, - "dateAdded": "Date Added", - "@dateAdded": { - "description": "Label for sorting by date added option" - }, - "lastModified": "Last Modified", - "@lastModified": { - "description": "Label for sorting by last modified option" - }, - "sortDirection": "Sort Direction", - "@sortDirection": { - "description": "Label for the sort direction option in list" - }, - "ascending": "Ascending", - "@ascending": { - "description": "Label for ascending sort direction option" - }, - "descending": "Descending", - "@descending": { - "description": "Label for descending sort direction option" - }, - "specials": "Specials", - "@specials": { - "description": "Label for the specials section in the series details page" - }, - "storyline": "Storyline", - "@storyline": { - "description": "Label for the storyline section in the series details page" - }, - "volumes": "Volumes", - "@volumes": { - "description": "Label for the volumes section in the series details page" - }, - "chapters": "Chapters", - "@chapters": { - "description": "Label for the chapters section in the series details page" - }, - "genres": "Genres", - "@genres": { - "description": "Label for the genres chips in the series details page" - }, - "writers": "Writers", - "@writers": { - "description": "Label for the writers metadata in the series details page" - }, - "filter": "Filter", - "@filter": { - "description": "Label for the filter button in lists" - }, - "hideRead": "Hide Read", - "@hideRead": { - "description": "Label for the hide read filter option in lists" - }, - "goToChapter": "Go to Chapter", - "@goToChapter": { - "description": "Label for the go to chapter button in the reading list chapter entry context menu" - }, - "goToSeries": "Go to Series", - "@goToSeries": { - "description": "Label for the go to series button in the reading list chapter entry context menu" - }, - "markAsRead": "Mark as Read", - "@markAsRead": { - "description": "Label for the mark as read button in context menus" - }, - "markAsUnread": "Mark as Unread", - "@markAsUnread": { - "description": "Label for the mark as unread button in context menus" - }, - "items": "{count} {count, plural, =0{{count} items} =1{{count} item} other{{count} items}}", - "@items": { - "description": "Label for the number of items, with pluralization" - }, - "unsupportedFormat": "Unsupported format: {format}", - "@unsupportedFormat": { - "description": "Message shown when trying to open a chapter in an unsupported format" - }, - "back": "Back", - "@back": { - "description": "Label for back buttons" - }, - "tableOfContents": "Table of Contents", - "@tableOfContents": { - "description": "Label for the table of contents drawer in the reader" - }, - "notSignedIn": "Not Signed In", - "@notSignedIn": { - "description": "Heading text when user is not signed in" - }, - "noCredentialsDescription": "No credentials configured. Please add your server URL and API key in Settings.", - "@noCredentialsDescription": { - "description": "Description text when no credentials are configured" - }, - "openSettings": "Open Settings", - "@openSettings": { - "description": "Label for the button to open settings" - }, - "connectionError": "Connection Error", - "@connectionError": { - "description": "Heading text when a connection error occurs" - }, - "connectionErrorDescription": "Failed to fetch user. Please check your credentials or try again.", - "@connectionErrorDescription": { - "description": "Description text when a connection error occurs" - }, - "retry": "Retry", - "@retry": { - "description": "Label for the retry button" - }, - "sendDiagnosticsDialogTitle": "Send anonymous crash reports and diagnostics?", - "@sendDiagnosticsDialogTitle": { - "description": "Title for the monitoring opt-out dialog" - }, - "sendDiagnosticsChangeable": "This can be changed in the settings at any time.", - "@sendDiagnosticsChangeable": { - "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" - }, - "noThanks": "No, thanks", - "@noThanks": { - "description": "Label for the decline button in the monitoring opt-out dialog" - }, - "imIn": "I'm in!", - "@imIn": { - "description": "Label for the accept button in the monitoring opt-out dialog" - }, - "addToWantToRead": "Add to Want to Read", - "@addToWantToRead": { - "description": "Label for the add to want to read context menu item" - }, - "removeFromWantToRead": "Remove from Want to Read", - "@removeFromWantToRead": { - "description": "Label for the remove from want to read context menu item" - }, - "download": "Download", - "@download": { - "description": "Label for the download context menu item" - }, - "removeDownload": "Remove Download", - "@removeDownload": { - "description": "Label for the remove download context menu item" - }, - "refreshMetadata": "Refresh Metadata", - "@refreshMetadata": { - "description": "Label for the refresh metadata context menu item" - }, - "refreshCovers": "Refresh Covers", - "@refreshCovers": { - "description": "Label for the refresh covers context menu item" - }, - "noActiveSyncOperations": "No active sync operations", - "@noActiveSyncOperations": { - "description": "Message shown when there are no active sync operations" - }, - "syncingAllSeries": "Syncing all series", - "@syncingAllSeries": { - "description": "Label for the syncing all series phase" - }, - "syncingMetadata": "Syncing metadata", - "@syncingMetadata": { - "description": "Label for the syncing metadata phase" - }, - "syncingRecentlyAdded": "Syncing recently added", - "@syncingRecentlyAdded": { - "description": "Label for the syncing recently added phase" - }, - "syncingRecentlyUpdated": "Syncing recently updated", - "@syncingRecentlyUpdated": { - "description": "Label for the syncing recently updated phase" - }, - "syncingLibraries": "Syncing libraries", - "@syncingLibraries": { - "description": "Label for the syncing libraries phase" - }, - "syncingProgress": "Syncing progress", - "@syncingProgress": { - "description": "Label for the syncing progress phase" - }, - "syncingCovers": "Syncing covers", - "@syncingCovers": { - "description": "Label for the syncing covers phase" - }, - "syncingCollections": "Syncing collections", - "@syncingCollections": { - "description": "Label for the syncing collections phase" - }, - "syncingReadingLists": "Syncing reading lists", - "@syncingReadingLists": { - "description": "Label for the syncing reading lists phase" - }, - "refreshingMetadataForSeries": "Refreshing metadata for series {seriesId}", - "@refreshingMetadataForSeries": { - "description": "Label for the refreshing metadata phase with the series ID" - }, - "refreshingCoversForSeries": "Refreshing covers for series {seriesId}", - "@refreshingCoversForSeries": { - "description": "Label for the refreshing covers phase with the series ID" - }, - "refreshingServerSettings": "Refreshing server settings", - "@refreshingServerSettings": { - "description": "Label for the refreshing server settings phase" - }, - "series": "Series", - "@series": { - "description": "Label for the series search section header" - }, - "moreCount": "+{count} more", - "@moreCount": { - "description": "Label indicating there are more items beyond the displayed count" - }, - "wordCount": "{wordCount} words", - "@wordCount": { - "description": "Label for the word count of a chapter" - }, - "hoursCount": "~{hours} hours", - "@hoursCount": { - "description": "Label for the estimated reading time in hours" - }, - "pagesCount": "{pages} pages", - "@pagesCount": { - "description": "Label for the page count of a chapter" - }, - "continueReading": "Continue Reading", - "@continueReading": { - "description": "Label for the continue reading button" - }, - "summary": "Summary", - "@summary": { - "description": "Label for the summary section heading" - }, - "showMore": "Show More", - "@showMore": { - "description": "Label for the show more button" - }, - "showLess": "Show Less", - "@showLess": { - "description": "Label for the show less button" - }, - "cancelAll": "Cancel All", - "@cancelAll": { - "description": "Label for the cancel all downloads button" - }, - "noDownloadsInQueue": "No downloads in queue", - "@noDownloadsInQueue": { - "description": "Message shown when there are no downloads in the queue" - }, - "directionLabel": "Direction", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, - "readerSettings": "Reader Settings", - "@readerSettings": { - "description": "Label for the reader settings bottom sheet title" - }, - "readingDirection": "Reading Direction", - "@readingDirection": { - "description": "Label for the reading direction setting" - }, - "leftToRight": "Left to Right", - "@leftToRight": { - "description": "Label for the left to right reading direction option" - }, - "rightToLeft": "Right to Left", - "@rightToLeft": { - "description": "Label for the right to left reading direction option" - }, - "readerMode": "Reader Mode", - "@readerMode": { - "description": "Label for the reader mode setting" - }, - "vertical": "Vertical", - "@vertical": { - "description": "Label for the vertical reader mode option" - }, - "horizontal": "Horizontal", - "@horizontal": { - "description": "Label for the horizontal reader mode option" - }, - "twoPage": "Two Page", - "@twoPage": { - "description": "Label for the two page reader mode option" - }, - "fitDirection": "Fit Direction", - "@fitDirection": { - "description": "Label for the image fit direction setting" - }, - "contain": "Contain", - "@contain": { - "description": "Label for the contain image fit option" - }, - "width": "Width", - "@width": { - "description": "Label for the fit width image option" - }, - "height": "Height", - "@height": { - "description": "Label for the fit height image option" - }, - "margins": "Margins", - "@margins": { - "description": "Label for the margins setting" - }, - "verticalGap": "Vertical Gap", - "@verticalGap": { - "description": "Label for the vertical gap setting" - }, - "pageGap": "Page Gap", - "@pageGap": { - "description": "Label for the page gap setting" - }, - "coverPage": "Cover Page", - "@coverPage": { - "description": "Label for the cover page setting" - }, - "coverPageDescription": "Treat the first page as the cover, showing it as a single page", - "@coverPageDescription": { - "description": "Description for the cover page setting" - }, - "ignoreSafeAreas": "Ignore Safe Areas", - "@ignoreSafeAreas": { - "description": "Label for the ignore safe areas setting" - }, - "showProgressBar": "Show Progress Bar", - "@showProgressBar": { - "description": "Label for the show progress bar setting" - }, - "setDefaults": "Set Defaults", - "@setDefaults": { - "description": "Label for the set defaults button" - }, - "reset": "Reset", - "@reset": { - "description": "Label for the reset button" - }, - "fontSize": "Font Size", - "@fontSize": { - "description": "Label for the font size setting" - }, - "lineHeight": "Line Height", - "@lineHeight": { - "description": "Label for the line height setting" - }, - "wordSpacing": "Word Spacing", - "@wordSpacing": { - "description": "Label for the word spacing setting" - }, - "letterSpacing": "Letter Spacing", - "@letterSpacing": { - "description": "Label for the letter spacing setting" - }, - "highlightResumeParagraph": "Highlight Resume Paragraph", - "@highlightResumeParagraph": { - "description": "Label for the highlight resume paragraph setting" - }, - "dismiss": "Dismiss", - "@dismiss": { - "description": "Label for the dismiss button in chapter snackbar" - }, - "go": "Go", - "@go": { - "description": "Label for the go button in chapter snackbar" - }, - "previousChapter": "Previous: {chapterTitle}", - "@previousChapter": { - "description": "Label for the previous chapter snackbar with the chapter title" - }, - "nextChapter": "Next: {chapterTitle}", - "@nextChapter": { - "description": "Label for the next chapter snackbar with the chapter title" - }, - "read": "Read", - "@read": { - "description": "Label for the read action button on cover cards" - }, - "syncingTocs": "Syncing chapters TOCs", - "@syncingTocs": { - "description": "Label for the syncing chapters TOCs phase" - }, - "refreshingChapterToc": "Refreshing chapter TOC for chapter {chapterId}", - "@refreshingChapterToc": { - "description": "Label for the syncing chapter TOC phase with the chapter ID" + "@@locale": "en", + "onDeck": "On Deck", + "@onDeck": { + "description": "Label for the home page on deck section" + }, + "recentlyUpdated": "Recently Updated", + "@recentlyUpdated": { + "description": "Label for the home page recently updated section" + }, + "recentlyAdded": "Recently Added", + "@recentlyAdded": { + "description": "Label for the home page recently added section" + }, + "home": "Home", + "@home": { + "description": "Label for the home page" + }, + "wantToRead": "Want To Read", + "@wantToRead": { + "description": "Label for the want to read shelf" + }, + "menu": "Menu", + "@menu": { + "description": "Label for the menu button" + }, + "allSeries": "All Series", + "@allSeries": { + "description": "Label for the all series menu entry" + }, + "collections": "Collections", + "@collections": { + "description": "Label for the collections menu entry" + }, + "readingLists": "Reading Lists", + "@readingLists": { + "description": "Label for the reading lists menu entry" + }, + "libraries": "Libraries", + "@libraries": { + "description": "Label for the libraries menu entry" + }, + "settings": "Settings", + "@settings": { + "description": "Label for the settings menu entry" + }, + "more": "More", + "@more": { + "description": "Label for the more section" + }, + "downloadQueue": "Download Queue", + "@downloadQueue": { + "description": "Label for the download queue menu entry" + }, + "general": "General", + "@general": { + "description": "Label for the general settings section" + }, + "themeMode": "Theme Mode", + "@themeMode": { + "description": "Label for the theme mode setting" + }, + "system": "System", + "@system": { + "description": "Label for the system theme mode option" + }, + "light": "Light", + "@light": { + "description": "Label for the light theme mode option" + }, + "dark": "Dark", + "@dark": { + "description": "Label for the dark theme mode option" + }, + "outlinedTheme": "Outlined Theme", + "@outlinedTheme": { + "description": "Label for the outlined theme setting" + }, + "sendDiagnostics": "Send anonymous crash reports and diagnostics", + "@sendDiagnostics": { + "description": "Label for the send diagnostics setting" + }, + "sendDiagnosticsDescription": "Help improve the app by sending anonymous error and performance statistics. The data does not contain any personal information and is uniquely used to improve the app.", + "@sendDiagnosticsDescription": { + "description": "Description for the send diagnostics setting" + }, + "version": "Version: {version} ({buildNumber})", + "@version": { + "description": "Label for the app version, with placeholders for version and build number", + "placeholders": { + "version": { + "description": "The version string of the application", + "type": "String", + "example": "1.0.0" + }, + "buildNumber": { + "description": "The build number of the application", + "type": "String", + "example": "123" + } } + }, + "github": "GitHub", + "@github": { + "description": "Label for the GitHub link" + }, + "madeWithLove": "Made with ❤️", + "@madeWithLove": { + "description": "Label for the made with love message" + }, + "dataManagement": "Data Management", + "@dataManagement": { + "description": "Label for the data management section" + }, + "downloadAllCovers": "Download All Covers", + "@downloadAllCovers": { + "description": "Label for the download all covers option" + }, + "downloadAllCoversDescription": "If disabled, covers will only be downloaded together with chapters. Covers will still be fetched from the server on demand when not downloaded and a connection is available.", + "@downloadAllCoversDescription": { + "description": "Description for the download all covers option" + }, + "maxConcurrentDownloads": "Max Concurrent Downloads", + "@maxConcurrentDownloads": { + "description": "Label for the max concurrent downloads setting" + }, + "reclaimSpace": "Reclaim Space", + "@reclaimSpace": { + "description": "Label for the reclaim space button" + }, + "clearDownloads": "Clear Downloads", + "@clearDownloads": { + "description": "Label for the clear downloads button" + }, + "clearCovers": "Clear Covers", + "@clearCovers": { + "description": "Label for the clear covers button" + }, + "clearDatabase": "Clear Database", + "@clearDatabase": { + "description": "Label for the clear database button" + }, + "clearDatabaseDialogTitle": "Are you sure?", + "@clearDatabaseDialogTitle": { + "description": "Title for the clear database confirmation dialog" + }, + "clearDatabaseDialogContent": "This will clear the entire local database, including any unsynced progress and downloaded data. This action cannot be undone.", + "@clearDatabaseDialogContent": { + "description": "Content for the clear database confirmation dialog" + }, + "cancel": "Cancel", + "@cancel": { + "description": "Label for the cancel button in dialogs" + }, + "databaseBusy": "Database busy…", + "@databaseBusy": { + "description": "Message shown when the database is busy with an operation" + }, + "databaseSize": "Database Size", + "@databaseSize": { + "description": "Label for the database size information" + }, + "credentials": "Credentials", + "@credentials": { + "description": "Label for the credentials section in settings" + }, + "baseUrl": "Base URL", + "@baseUrl": { + "description": "Label for the base URL input field" + }, + "apiKey": "API Key", + "@apiKey": { + "description": "Label for the API key input field" + }, + "save": "Save", + "@save": { + "description": "Label for the save credentials button" + }, + "sortBy": "Sort By", + "@sortBy": { + "description": "Label for the sort by option in list" + }, + "name": "Name", + "@name": { + "description": "Label for sorting by name option" + }, + "dateAdded": "Date Added", + "@dateAdded": { + "description": "Label for sorting by date added option" + }, + "lastModified": "Last Modified", + "@lastModified": { + "description": "Label for sorting by last modified option" + }, + "sortDirection": "Sort Direction", + "@sortDirection": { + "description": "Label for the sort direction option in list" + }, + "ascending": "Ascending", + "@ascending": { + "description": "Label for ascending sort direction option" + }, + "descending": "Descending", + "@descending": { + "description": "Label for descending sort direction option" + }, + "specials": "Specials", + "@specials": { + "description": "Label for the specials section in the series details page" + }, + "storyline": "Storyline", + "@storyline": { + "description": "Label for the storyline section in the series details page" + }, + "volumes": "Volumes", + "@volumes": { + "description": "Label for the volumes section in the series details page" + }, + "chapters": "Chapters", + "@chapters": { + "description": "Label for the chapters section in the series details page" + }, + "genres": "Genres", + "@genres": { + "description": "Label for the genres chips in the series details page" + }, + "writers": "Writers", + "@writers": { + "description": "Label for the writers metadata in the series details page" + }, + "filter": "Filter", + "@filter": { + "description": "Label for the filter button in lists" + }, + "hideRead": "Hide Read", + "@hideRead": { + "description": "Label for the hide read filter option in lists" + }, + "goToChapter": "Go to Chapter", + "@goToChapter": { + "description": "Label for the go to chapter button in the reading list chapter entry context menu" + }, + "goToSeries": "Go to Series", + "@goToSeries": { + "description": "Label for the go to series button in the reading list chapter entry context menu" + }, + "markAsRead": "Mark as Read", + "@markAsRead": { + "description": "Label for the mark as read button in context menus" + }, + "markAsUnread": "Mark as Unread", + "@markAsUnread": { + "description": "Label for the mark as unread button in context menus" + }, + "items": "{count} {count, plural, =0{{count} items} =1{{count} item} other{{count} items}}", + "@items": { + "description": "Label for the number of items, with pluralization", + "placeholders": { + "count": { + "description": "The amount of items", + "type": "int", + "example": "2" + } + } + }, + "unsupportedFormat": "Unsupported format: {format}", + "@unsupportedFormat": { + "description": "Message shown when trying to open a chapter in an unsupported format", + "placeholders": { + "format": { + "description": "The format enum name for the unsupported format", + "type": "String", + "example": "epub" + } + } + }, + "back": "Back", + "@back": { + "description": "Label for back buttons" + }, + "tableOfContents": "Table of Contents", + "@tableOfContents": { + "description": "Label for the table of contents drawer in the reader" + }, + "notSignedIn": "Not Signed In", + "@notSignedIn": { + "description": "Heading text when user is not signed in" + }, + "noCredentialsDescription": "No credentials configured. Please add your server URL and API key in Settings.", + "@noCredentialsDescription": { + "description": "Description text when no credentials are configured" + }, + "openSettings": "Open Settings", + "@openSettings": { + "description": "Label for the button to open settings" + }, + "connectionError": "Connection Error", + "@connectionError": { + "description": "Heading text when a connection error occurs" + }, + "connectionErrorDescription": "Failed to fetch user. Please check your credentials or try again.", + "@connectionErrorDescription": { + "description": "Description text when a connection error occurs" + }, + "retry": "Retry", + "@retry": { + "description": "Label for the retry button" + }, + "sendDiagnosticsDialogTitle": "Send anonymous crash reports and diagnostics?", + "@sendDiagnosticsDialogTitle": { + "description": "Title for the monitoring opt-out dialog" + }, + "sendDiagnosticsChangeable": "This can be changed in the settings at any time.", + "@sendDiagnosticsChangeable": { + "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" + }, + "noThanks": "No, thanks", + "@noThanks": { + "description": "Label for the decline button in the monitoring opt-out dialog" + }, + "imIn": "I'm in!", + "@imIn": { + "description": "Label for the accept button in the monitoring opt-out dialog" + }, + "addToWantToRead": "Add to Want to Read", + "@addToWantToRead": { + "description": "Label for the add to want to read context menu item" + }, + "removeFromWantToRead": "Remove from Want to Read", + "@removeFromWantToRead": { + "description": "Label for the remove from want to read context menu item" + }, + "download": "Download", + "@download": { + "description": "Label for the download context menu item" + }, + "removeDownload": "Remove Download", + "@removeDownload": { + "description": "Label for the remove download context menu item" + }, + "refreshMetadata": "Refresh Metadata", + "@refreshMetadata": { + "description": "Label for the refresh metadata context menu item" + }, + "refreshCovers": "Refresh Covers", + "@refreshCovers": { + "description": "Label for the refresh covers context menu item" + }, + "noActiveSyncOperations": "No active sync operations", + "@noActiveSyncOperations": { + "description": "Message shown when there are no active sync operations" + }, + "syncingAllSeries": "Syncing all series", + "@syncingAllSeries": { + "description": "Label for the syncing all series phase" + }, + "syncingMetadata": "Syncing metadata", + "@syncingMetadata": { + "description": "Label for the syncing metadata phase" + }, + "syncingRecentlyAdded": "Syncing recently added", + "@syncingRecentlyAdded": { + "description": "Label for the syncing recently added phase" + }, + "syncingRecentlyUpdated": "Syncing recently updated", + "@syncingRecentlyUpdated": { + "description": "Label for the syncing recently updated phase" + }, + "syncingLibraries": "Syncing libraries", + "@syncingLibraries": { + "description": "Label for the syncing libraries phase" + }, + "syncingProgress": "Syncing progress", + "@syncingProgress": { + "description": "Label for the syncing progress phase" + }, + "syncingCovers": "Syncing covers", + "@syncingCovers": { + "description": "Label for the syncing covers phase" + }, + "syncingCollections": "Syncing collections", + "@syncingCollections": { + "description": "Label for the syncing collections phase" + }, + "syncingReadingLists": "Syncing reading lists", + "@syncingReadingLists": { + "description": "Label for the syncing reading lists phase" + }, + "refreshingMetadataForSeries": "Refreshing metadata for series {seriesId}", + "@refreshingMetadataForSeries": { + "description": "Label for the refreshing metadata phase with the series ID", + "placeholders": { + "seriesId": { + "description": "The ID of the series being refreshed", + "type": "int", + "example": "42" + } + } + }, + "refreshingCoversForSeries": "Refreshing covers for series {seriesId}", + "@refreshingCoversForSeries": { + "description": "Label for the refreshing covers phase with the series ID", + "placeholders": { + "seriesId": { + "description": "The ID of the series which covers are being refreshed", + "type": "int", + "example": "42" + } + } + }, + "refreshingServerSettings": "Refreshing server settings", + "@refreshingServerSettings": { + "description": "Label for the refreshing server settings phase" + }, + "series": "Series", + "@series": { + "description": "Label for the series search section header" + }, + "moreCount": "+{count} more", + "@moreCount": { + "description": "Label indicating there are more items beyond the displayed amount", + "placeholders": { + "count": { + "description": "The count of items beyond the displayed amount", + "type": "int", + "example": "42" + } + } + }, + "wordCount": "{wordCount} words", + "@wordCount": { + "description": "Label for the word count of a book entry", + "placeholders": { + "wordCount": { + "description": "The amount of words", + "type": "int", + "format": "compact", + "example": "42000" + } + } + }, + "hoursCount": "~{hours} hours", + "@hoursCount": { + "description": "Label for the estimated reading time in hours", + "placeholders": { + "hours": { + "description": "The estimated amount of hours", + "type": "double", + "format": "decimalPattern", + "optionalParameters": { + "decimalDigits": 1 + }, + "example": "4.2" + } + } + }, + "pagesCount": "{pages} pages", + "@pagesCount": { + "description": "Label for the page count of a an entry", + "placeholders": { + "pages": { + "description": "The amount of pages", + "type": "int", + "format": "compact", + "example": "42000" + } + } + }, + "continueReading": "Continue Reading", + "@continueReading": { + "description": "Label for the continue reading button" + }, + "summary": "Summary", + "@summary": { + "description": "Label for the summary section heading" + }, + "showMore": "Show More", + "@showMore": { + "description": "Label for the show more button" + }, + "showLess": "Show Less", + "@showLess": { + "description": "Label for the show less button" + }, + "cancelAll": "Cancel All", + "@cancelAll": { + "description": "Label for the cancel all downloads button" + }, + "noDownloadsInQueue": "No downloads in queue", + "@noDownloadsInQueue": { + "description": "Message shown when there are no downloads in the queue" + }, + "directionLabel": "Direction", + "@directionLabel": { + "description": "Label for the sort direction menu header" + }, + "readerSettings": "Reader Settings", + "@readerSettings": { + "description": "Label for the reader settings bottom sheet title" + }, + "readingDirection": "Reading Direction", + "@readingDirection": { + "description": "Label for the reading direction setting" + }, + "leftToRight": "Left to Right", + "@leftToRight": { + "description": "Label for the left to right reading direction option" + }, + "rightToLeft": "Right to Left", + "@rightToLeft": { + "description": "Label for the right to left reading direction option" + }, + "readerMode": "Reader Mode", + "@readerMode": { + "description": "Label for the reader mode setting" + }, + "vertical": "Vertical", + "@vertical": { + "description": "Label for the vertical reader mode option" + }, + "horizontal": "Horizontal", + "@horizontal": { + "description": "Label for the horizontal reader mode option" + }, + "twoPage": "Two Page", + "@twoPage": { + "description": "Label for the two page reader mode option" + }, + "fitDirection": "Fit Direction", + "@fitDirection": { + "description": "Label for the image fit direction setting" + }, + "contain": "Contain", + "@contain": { + "description": "Label for the contain image fit option" + }, + "width": "Width", + "@width": { + "description": "Label for the fit width image option" + }, + "height": "Height", + "@height": { + "description": "Label for the fit height image option" + }, + "margins": "Margins", + "@margins": { + "description": "Label for the margins setting" + }, + "verticalGap": "Vertical Gap", + "@verticalGap": { + "description": "Label for the vertical gap setting" + }, + "pageGap": "Page Gap", + "@pageGap": { + "description": "Label for the page gap setting" + }, + "coverPage": "Cover Page", + "@coverPage": { + "description": "Label for the cover page setting" + }, + "coverPageDescription": "Treat the first page as the cover, showing it as a single page", + "@coverPageDescription": { + "description": "Description for the cover page setting" + }, + "ignoreSafeAreas": "Ignore Safe Areas", + "@ignoreSafeAreas": { + "description": "Label for the ignore safe areas setting" + }, + "showProgressBar": "Show Progress Bar", + "@showProgressBar": { + "description": "Label for the show progress bar setting" + }, + "setDefaults": "Set Defaults", + "@setDefaults": { + "description": "Label for the set defaults button" + }, + "reset": "Reset", + "@reset": { + "description": "Label for the reset button" + }, + "fontSize": "Font Size", + "@fontSize": { + "description": "Label for the font size setting" + }, + "lineHeight": "Line Height", + "@lineHeight": { + "description": "Label for the line height setting" + }, + "wordSpacing": "Word Spacing", + "@wordSpacing": { + "description": "Label for the word spacing setting" + }, + "letterSpacing": "Letter Spacing", + "@letterSpacing": { + "description": "Label for the letter spacing setting" + }, + "highlightResumeParagraph": "Highlight Resume Paragraph", + "@highlightResumeParagraph": { + "description": "Label for the highlight resume paragraph setting" + }, + "dismiss": "Dismiss", + "@dismiss": { + "description": "Label for the dismiss button in chapter snackbar" + }, + "go": "Go", + "@go": { + "description": "Label for the go button in chapter snackbar" + }, + "previousChapter": "Previous: {chapterTitle}", + "@previousChapter": { + "description": "Label for the previous chapter snackbar with the chapter title", + "placeholders": { + "chapterTitle": { + "description": "The title of the previous chapter", + "type": "String", + "example": "Chapter 2" + } + } + }, + "nextChapter": "Next: {chapterTitle}", + "@nextChapter": { + "description": "Label for the next chapter snackbar with the chapter title", + "placeholders": { + "chapterTitle": { + "description": "The title of the next chapter", + "type": "String", + "example": "Chapter 3" + } + } + }, + "read": "Read", + "@read": { + "description": "Label for the read action button on cover cards" + }, + "syncingTocs": "Syncing chapters TOCs", + "@syncingTocs": { + "description": "Label for the syncing chapters TOCs phase" + }, + "refreshingChapterToc": "Refreshing chapter TOC for chapter {chapterId}", + "@refreshingChapterToc": { + "description": "Label for the syncing chapter TOC phase with the chapter ID", + "placeholders": { + "chapterId": { + "description": "The ID of the chapter which TOC is being refreshed", + "type": "int", + "example": "42" + } + } + } } diff --git a/lib/pages/settings/version_label.dart b/lib/pages/settings/version_label.dart index 9bf9f4a2..98ca4b6c 100644 --- a/lib/pages/settings/version_label.dart +++ b/lib/pages/settings/version_label.dart @@ -23,7 +23,7 @@ class VersionLabel extends ConsumerWidget { showAboutDialog( context: context, applicationName: info.appName, - applicationVersion: l.version(info.buildNumber, info.version), + applicationVersion: l.version(info.version, info.buildNumber), applicationIcon: Container( width: LayoutConstants.largestIcon, height: LayoutConstants.largestIcon, diff --git a/lib/widgets/details/info_widgets.dart b/lib/widgets/details/info_widgets.dart index 6ea7ac08..5cf8df73 100644 --- a/lib/widgets/details/info_widgets.dart +++ b/lib/widgets/details/info_widgets.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:kover/generated/l10n/app_localizations.dart'; import 'package:kover/riverpod/providers/want_to_read.dart'; -import 'package:kover/utils/extensions/int.dart'; import 'package:kover/utils/layout_constants.dart'; import 'package:kover/widgets/util/async_value.dart'; import 'package:lucide_icons_flutter/lucide_icons.dart'; @@ -94,7 +93,7 @@ class WordCount extends StatelessWidget { size: LayoutConstants.smallIcon, ), Text( - l.wordCount(wordCount.prettyInt()), + l.wordCount(wordCount), ), ], ); @@ -144,7 +143,7 @@ class RemainingHours extends StatelessWidget { size: LayoutConstants.smallIcon, ), Text( - l.hoursCount(hours.toStringAsFixed(1)), + l.hoursCount(hours), ), ], ); @@ -169,7 +168,7 @@ class Pages extends StatelessWidget { LucideIcons.fileStack, size: LayoutConstants.smallIcon, ), - Text(l.pagesCount(pages.prettyInt())), + Text(l.pagesCount(pages)), ], ); } From f310a8bdb947dda22ac7de349be8058f75ed5bef Mon Sep 17 00:00:00 2001 From: rodonisi Date: Fri, 19 Jun 2026 19:46:52 +0200 Subject: [PATCH 67/70] fix decimal string format --- lib/l10n/en.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/en.arb b/lib/l10n/en.arb index 925644e6..3d18d2e5 100644 --- a/lib/l10n/en.arb +++ b/lib/l10n/en.arb @@ -446,7 +446,7 @@ "hours": { "description": "The estimated amount of hours", "type": "double", - "format": "decimalPattern", + "format": "decimalPatternDigits", "optionalParameters": { "decimalDigits": 1 }, From 0c09abaa66d30b43ca64182e7943aa9284925182 Mon Sep 17 00:00:00 2001 From: rodonisi Date: Fri, 19 Jun 2026 20:21:39 +0200 Subject: [PATCH 68/70] duplicate key; missing key --- lib/l10n/en.arb | 8 ++++---- lib/pages/collections_page/collections_page.dart | 2 +- lib/pages/settings/credentials_settings.dart | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/l10n/en.arb b/lib/l10n/en.arb index 3d18d2e5..1e667b54 100644 --- a/lib/l10n/en.arb +++ b/lib/l10n/en.arb @@ -490,10 +490,6 @@ "@noDownloadsInQueue": { "description": "Message shown when there are no downloads in the queue" }, - "directionLabel": "Direction", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, "readerSettings": "Reader Settings", "@readerSettings": { "description": "Label for the reader settings bottom sheet title" @@ -646,5 +642,9 @@ "example": "42" } } + }, + "invalidCredentials": "Invalid Credentials", + "@invalidCredentials": { + "description": "User display error displayed when credentials are invalid" } } diff --git a/lib/pages/collections_page/collections_page.dart b/lib/pages/collections_page/collections_page.dart index 5c74661e..fa8a0c16 100644 --- a/lib/pages/collections_page/collections_page.dart +++ b/lib/pages/collections_page/collections_page.dart @@ -123,7 +123,7 @@ class CollectionsPage extends HookConsumerWidget { final l = AppLocalizations.of(context); return ContextMenu( entries: [ - MenuHeader(text: l.directionLabel), + MenuHeader(text: l.sortDirection), MenuItem( label: Text(l.ascending), icon: _getItemIcon( diff --git a/lib/pages/settings/credentials_settings.dart b/lib/pages/settings/credentials_settings.dart index 7e0c2ae8..5ef90b9f 100644 --- a/lib/pages/settings/credentials_settings.dart +++ b/lib/pages/settings/credentials_settings.dart @@ -118,6 +118,7 @@ class _User extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final l = AppLocalizations.of(context); return switch (loginStatus) { LoginStatus.noCredentials => const SizedBox.shrink(), LoginStatus.loading => const SizedBox.square( @@ -132,7 +133,7 @@ class _User extends ConsumerWidget { color: Theme.of(context).colorScheme.error, ), Text( - 'Invalid credentials', + l.invalidCredentials, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context).colorScheme.error, ), From 80c7a0d4849734e1fb0d2d70bee8139fec684ce8 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Jun 2026 20:23:23 +0200 Subject: [PATCH 69/70] chore(l10n): update Italian translation chore(l10n): update Italian translation Co-authored-by: Simon Language: Italian Progress: 100.0% (138 of 138 strings) Translate-URL: https://hosted.weblate.org/projects/kover/kover/it/ Translation: Kover/Kover --- lib/l10n/it.arb | 98 +++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/lib/l10n/it.arb b/lib/l10n/it.arb index 37d2f657..86ea67fc 100644 --- a/lib/l10n/it.arb +++ b/lib/l10n/it.arb @@ -1,13 +1,13 @@ { - "addToWantToRead": "Aggiungi a Da Leggere", + "addToWantToRead": "Aggiungi da leggere", "@addToWantToRead": { "description": "Label for the add to want to read context menu item" }, - "allSeries": "Tutte le Serie", + "allSeries": "Tutte le serie", "@allSeries": { "description": "Label for the all series menu entry" }, - "apiKey": "API Key", + "apiKey": "API key", "@apiKey": { "description": "Label for the API key input field" }, @@ -19,7 +19,7 @@ "@back": { "description": "Label for back buttons" }, - "baseUrl": "URL Base", + "baseUrl": "URL di base", "@baseUrl": { "description": "Label for the base URL input field" }, @@ -27,7 +27,7 @@ "@cancel": { "description": "Label for the cancel button in dialogs" }, - "cancelAll": "Cancella Tutto", + "cancelAll": "Cancella tutto", "@cancelAll": { "description": "Label for the cancel all downloads button" }, @@ -35,11 +35,11 @@ "@chapters": { "description": "Label for the chapters section in the series details page" }, - "clearCovers": "Rimuovi Copertine", + "clearCovers": "Rimuovi copertine", "@clearCovers": { "description": "Label for the clear covers button" }, - "clearDatabase": "Pulisci Database", + "clearDatabase": "Pulisci database", "@clearDatabase": { "description": "Label for the clear database button" }, @@ -51,7 +51,7 @@ "@clearDatabaseDialogTitle": { "description": "Title for the clear database confirmation dialog" }, - "clearDownloads": "Rimuovi Downloads", + "clearDownloads": "Rimuovi downloads", "@clearDownloads": { "description": "Label for the clear downloads button" }, @@ -59,7 +59,7 @@ "@collections": { "description": "Label for the collections menu entry" }, - "connectionError": "Errore di Connessione", + "connectionError": "Errore di connessione", "@connectionError": { "description": "Heading text when a connection error occurs" }, @@ -71,7 +71,7 @@ "@contain": { "description": "Label for the contain image fit option" }, - "continueReading": "Continua a Leggere", + "continueReading": "Continua a leggere", "@continueReading": { "description": "Label for the continue reading button" }, @@ -99,11 +99,11 @@ "@databaseBusy": { "description": "Message shown when the database is busy with an operation" }, - "databaseSize": "Dimensione Database", + "databaseSize": "Dimensione database", "@databaseSize": { "description": "Label for the database size information" }, - "dateAdded": "Data Aggiunta", + "dateAdded": "Data di aggiunta", "@dateAdded": { "description": "Label for sorting by date added option" }, @@ -123,15 +123,15 @@ "@download": { "description": "Label for the download context menu item" }, - "downloadAllCovers": "Scarica Tutte le Copertine", + "downloadAllCovers": "Scarica tutte le copertine", "@downloadAllCovers": { "description": "Label for the download all covers option" }, - "downloadAllCoversDescription": "Se disattivata, le copertine verranno scaricate solo insieme ai capitoli. Le copertine non scaricate verranno comunque recuperate dal server su richiesta, se è disponibile una connessione.", + "downloadAllCoversDescription": "Se disattivata, le copertine verranno scaricate solo insieme ai capitoli. Le copertine non scaricate verranno ancora recuperate dal server su richiesta, se è disponibile una connessione.", "@downloadAllCoversDescription": { "description": "Description for the download all covers option" }, - "downloadQueue": "Coda Download", + "downloadQueue": "Coda download", "@downloadQueue": { "description": "Label for the download queue menu entry" }, @@ -163,11 +163,11 @@ "@go": { "description": "Label for the go button in chapter snackbar" }, - "goToChapter": "Vai al Capitolo", + "goToChapter": "Vai al capitolo", "@goToChapter": { "description": "Label for the go to chapter button in the reading list chapter entry context menu" }, - "goToSeries": "Vai alla Serie", + "goToSeries": "Vai alla serie", "@goToSeries": { "description": "Label for the go to series button in the reading list chapter entry context menu" }, @@ -175,7 +175,7 @@ "@height": { "description": "Label for the fit height image option" }, - "hideRead": "Nascondi Letti", + "hideRead": "Nascondi letti", "@hideRead": { "description": "Label for the hide read filter option in lists" }, @@ -207,11 +207,11 @@ "@items": { "description": "Label for the number of items, with pluralization" }, - "lastModified": "Ultima Modifica", + "lastModified": "Ultima modifica", "@lastModified": { "description": "Label for sorting by last modified option" }, - "leftToRight": "Sinistra a Destra", + "leftToRight": "Sinistra a destra", "@leftToRight": { "description": "Label for the left to right reading direction option" }, @@ -239,15 +239,15 @@ "@margins": { "description": "Label for the margins setting" }, - "markAsRead": "Segna Come Letto", + "markAsRead": "Segna come letto", "@markAsRead": { "description": "Label for the mark as read button in context menus" }, - "markAsUnread": "Segna Come Non Letto", + "markAsUnread": "Segna come non letto", "@markAsUnread": { "description": "Label for the mark as unread button in context menus" }, - "maxConcurrentDownloads": "Download Simultanei", + "maxConcurrentDownloads": "Download simultanei", "@maxConcurrentDownloads": { "description": "Label for the max concurrent downloads setting" }, @@ -267,7 +267,7 @@ "@name": { "description": "Label for sorting by name option" }, - "nextChapter": "Il prossimo: {chapterTitle}", + "nextChapter": "Prossimo: {chapterTitle}", "@nextChapter": { "description": "Label for the next chapter snackbar with the chapter title" }, @@ -287,11 +287,11 @@ "@noThanks": { "description": "Label for the decline button in the monitoring opt-out dialog" }, - "notSignedIn": "Non Connesso", + "notSignedIn": "Non connesso", "@notSignedIn": { "description": "Heading text when user is not signed in" }, - "onDeck": "In Primo Piano", + "onDeck": "In primo piano", "@onDeck": { "description": "Label for the home page on deck section" }, @@ -299,7 +299,7 @@ "@openSettings": { "description": "Label for the button to open settings" }, - "outlinedTheme": "Tema Delineato", + "outlinedTheme": "Tema delineato", "@outlinedTheme": { "description": "Label for the outlined theme setting" }, @@ -319,39 +319,39 @@ "@read": { "description": "Label for the read action button on cover cards" }, - "readerMode": "Modalità Lettore", + "readerMode": "Modalità lettore", "@readerMode": { "description": "Label for the reader mode setting" }, - "readerSettings": "Impostazioni Lettore", + "readerSettings": "Impostazioni lettore", "@readerSettings": { "description": "Label for the reader settings bottom sheet title" }, - "readingDirection": "Direzione Lettura", + "readingDirection": "Direzione di lettura", "@readingDirection": { "description": "Label for the reading direction setting" }, - "readingLists": "Liste di Lettura", + "readingLists": "Liste di lettura", "@readingLists": { "description": "Label for the reading lists menu entry" }, - "recentlyAdded": "Aggiunto Recentemente", + "recentlyAdded": "Aggiunto recentemente", "@recentlyAdded": { "description": "Label for the home page recently added section" }, - "recentlyUpdated": "Aggiornato Recentemente", + "recentlyUpdated": "Aggiornato recentemente", "@recentlyUpdated": { "description": "Label for the home page recently updated section" }, - "reclaimSpace": "Recupera Spazio", + "reclaimSpace": "Recupera spazio", "@reclaimSpace": { "description": "Label for the reclaim space button" }, - "refreshCovers": "Aggiorna Copertine", + "refreshCovers": "Aggiorna copertine", "@refreshCovers": { "description": "Label for the refresh covers context menu item" }, - "refreshMetadata": "Aggiorna Metadati", + "refreshMetadata": "Aggiorna metadati", "@refreshMetadata": { "description": "Label for the refresh metadata context menu item" }, @@ -367,11 +367,11 @@ "@refreshingServerSettings": { "description": "Label for the refreshing server settings phase" }, - "removeDownload": "Rimuovi Download", + "removeDownload": "Rimuovi download", "@removeDownload": { "description": "Label for the remove download context menu item" }, - "removeFromWantToRead": "Rimuovi da Da Leggere", + "removeFromWantToRead": "Rimuovi da leggere", "@removeFromWantToRead": { "description": "Label for the remove from want to read context menu item" }, @@ -383,7 +383,7 @@ "@retry": { "description": "Label for the retry button" }, - "rightToLeft": "Destra a Sinistra", + "rightToLeft": "Destra a sinistra", "@rightToLeft": { "description": "Label for the right to left reading direction option" }, @@ -399,7 +399,7 @@ "@sendDiagnosticsChangeable": { "description": "Message shown in the monitoring opt-out dialog indicating the setting can be changed later" }, - "sendDiagnosticsDescription": "Aiutaci a migliorare l'app inviando statistiche anonime sugli errori e sulle prestazioni. I dati non contengono informazioni personali e vengono utilizzati esclusivamente per migliorare l'applicazione.", + "sendDiagnosticsDescription": "Aiuta a migliorare l'app inviando statistiche anonime di errore e prestazioni. I dati non contengono alcuna informazione personale e sono utilizzati in unicamente per migliorare l'app.", "@sendDiagnosticsDescription": { "description": "Description for the send diagnostics setting" }, @@ -419,11 +419,11 @@ "@settings": { "description": "Label for the settings menu entry" }, - "showLess": "Mostra di Meno", + "showLess": "Mostra di meno", "@showLess": { "description": "Label for the show less button" }, - "showMore": "Mostra di Più", + "showMore": "Mostra di più", "@showMore": { "description": "Label for the show more button" }, @@ -431,11 +431,11 @@ "@showProgressBar": { "description": "Label for the show progress bar setting" }, - "sortBy": "Ordina Per", + "sortBy": "Ordina per", "@sortBy": { "description": "Label for the sort by option in list" }, - "sortDirection": "Ordine", + "sortDirection": "Direzione ordine", "@sortDirection": { "description": "Label for the sort direction option in list" }, @@ -495,11 +495,11 @@ "@tableOfContents": { "description": "Label for the table of contents drawer in the reader" }, - "themeMode": "Modalità Tema", + "themeMode": "Modalità tema", "@themeMode": { "description": "Label for the theme mode setting" }, - "twoPage": "Due Pagine", + "twoPage": "Due pagine", "@twoPage": { "description": "Label for the two page reader mode option" }, @@ -523,7 +523,7 @@ "@volumes": { "description": "Label for the volumes section in the series details page" }, - "wantToRead": "Da Leggere", + "wantToRead": "Da leggere", "@wantToRead": { "description": "Label for the want to read shelf" }, @@ -550,5 +550,9 @@ "syncingTocs": "Sincronizzazione indici capitoli", "@syncingTocs": { "description": "Label for the syncing chapters TOCs phase" + }, + "invalidCredentials": "Credenziali non valide", + "@invalidCredentials": { + "description": "User display error displayed when credentials are invalid" } } From ae50d9ff337ee99f430cf61fb69deabc5bb56ef0 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 19 Jun 2026 20:23:24 +0200 Subject: [PATCH 70/70] chore(l10n): update translation files Add-on: Cleanup translation files Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/kover/kover/ Translation: Kover/Kover --- lib/l10n/it.arb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/l10n/it.arb b/lib/l10n/it.arb index 86ea67fc..25a6713f 100644 --- a/lib/l10n/it.arb +++ b/lib/l10n/it.arb @@ -111,10 +111,6 @@ "@descending": { "description": "Label for descending sort direction option" }, - "directionLabel": "Direzione", - "@directionLabel": { - "description": "Label for the sort direction menu header" - }, "dismiss": "Chiudi", "@dismiss": { "description": "Label for the dismiss button in chapter snackbar"