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
+[](https://github.com/rodonisi/kover/actions/workflows/ci.yaml)
+[](https://github.com/rodonisi/kover/actions/workflows/build-and-deploy.yml)
+
+
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:

---------
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 @@
[](https://github.com/rodonisi/kover/actions/workflows/ci.yaml)
[](https://github.com/rodonisi/kover/actions/workflows/build-and-deploy.yml)
+
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:

---------
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 @@

+
+
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 @@

-
-
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:
+
+## 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:

---------
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.
+
+
[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.
-
-
+
+
+
+
+
+
+
+
-[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"