Compare commits

...

9 Commits

Author SHA1 Message Date
github-actions[bot] ecc5b84a64 chore: Release v2.1.2 2026-07-29 10:17:01 +00:00
Rajarshee Chatterjee eb12bdfd62 fix: Prevent Novel Genre Rendering Crashes 2026-07-29 15:44:44 +05:30
Rajarshee Chatterjee 9612bf6f89 chore: Update Translations (#1928)
* New translations strings.json (French)

[ci skip]
[ci skip]

* New translations strings.json (Spanish)

[ci skip]
[ci skip]

* New translations strings.json (Afrikaans)

[ci skip]
[ci skip]

* New translations strings.json (Arabic)

[ci skip]
[ci skip]

* New translations strings.json (Catalan)

[ci skip]
[ci skip]

* New translations strings.json (Czech)

[ci skip]
[ci skip]

* New translations strings.json (Danish)

[ci skip]
[ci skip]

* New translations strings.json (German)

[ci skip]
[ci skip]

* New translations strings.json (Greek)

[ci skip]
[ci skip]

* New translations strings.json (Finnish)

[ci skip]
[ci skip]

* New translations strings.json (Hebrew)

[ci skip]
[ci skip]

* New translations strings.json (Hungarian)

[ci skip]
[ci skip]

* New translations strings.json (Italian)

[ci skip]
[ci skip]

* New translations strings.json (Japanese)

[ci skip]
[ci skip]

* New translations strings.json (Korean)

[ci skip]
[ci skip]

* New translations strings.json (Dutch)

[ci skip]
[ci skip]

* New translations strings.json (Norwegian)

[ci skip]
[ci skip]

* New translations strings.json (Polish)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese)

[ci skip]
[ci skip]

* New translations strings.json (Russian)

[ci skip]
[ci skip]

* New translations strings.json (Albanian)

[ci skip]
[ci skip]

* New translations strings.json (Serbian (Cyrillic))

[ci skip]
[ci skip]

* New translations strings.json (Swedish)

[ci skip]
[ci skip]

* New translations strings.json (Turkish)

[ci skip]
[ci skip]

* New translations strings.json (Ukrainian)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Simplified)

[ci skip]
[ci skip]

* New translations strings.json (Chinese Traditional)

[ci skip]
[ci skip]

* New translations strings.json (Vietnamese)

[ci skip]
[ci skip]

* New translations strings.json (Portuguese, Brazilian)

[ci skip]
[ci skip]

* New translations strings.json (Indonesian)

[ci skip]
[ci skip]

* New translations strings.json (Hindi)

[ci skip]
[ci skip]

* New translations strings.json (Assamese)

[ci skip]
[ci skip]

* New translations strings.json (Odia)

[ci skip]
[ci skip]
2026-07-29 14:36:36 +05:30
Rajarshee Chatterjee 0ed7d878b4 fix: Prevent White Reader Drawer Seam 2026-07-29 14:21:59 +05:30
Rajarshee Chatterjee 5f45e4c7f2 fix: Recover Interrupted Chapter Migrations 2026-07-28 20:36:59 +05:30
Rajarshee Chatterjee ca24671a2f fix: Support Fork-Safe Preview Builds 2026-07-28 15:38:09 +05:30
Rajarshee Chatterjee ee3a4f20bc fix: Preserve Default Category After Reordering (Closes #1922) 2026-07-28 14:46:03 +05:30
Rajarshee Chatterjee 0c3542836c fix: Synchronize Library Updates And Optimize Import Refreshes 2026-07-28 14:46:03 +05:30
Patrick Loser f71c9c8594 fix: Ignore Discord Notifications Outside the Main Repository (#1923) 2026-07-28 14:30:52 +05:30
62 changed files with 2369 additions and 107 deletions
+2 -2
View File
@@ -45,7 +45,7 @@ body:
label: LNReader version
description: You can find your LNReader version in **More → About**.
placeholder: |
Example: "2.1.1"
Example: "2.1.2"
validations:
required: true
@@ -88,7 +88,7 @@ body:
required: true
- label: If this is an issue with a plugin, I should be opening an issue in the [plugins repository](https://github.com/lnreader/lnreader-plugins/issues/new/choose).
required: true
- label: I have updated the app to version **[2.1.1](https://github.com/lnreader/lnreader/releases/latest)**.
- label: I have updated the app to version **[2.1.2](https://github.com/lnreader/lnreader/releases/latest)**.
required: true
- label: I will fill out all of the requested information in this form.
required: true
+1 -1
View File
@@ -34,7 +34,7 @@ body:
required: true
- label: If this is an issue with a source, I should be opening an issue in the [sources repository](https://github.com/lnreader/lnreader-sources/issues/new/choose).
required: true
- label: I have updated the app to version **[2.1.1](https://github.com/lnreader/lnreader/releases/latest)**.
- label: I have updated the app to version **[2.1.2](https://github.com/lnreader/lnreader/releases/latest)**.
required: true
- label: I will fill out all of the requested information in this form.
required: true
+13 -3
View File
@@ -100,9 +100,7 @@ jobs:
run: |
pnpm generate:env:release \
--build-type "GitHub Action" \
--node-env "production" \
--myanimelist-client-id "$MYANIMELIST_CLIENT_ID" \
--anilist-client-id "$ANILIST_CLIENT_ID"
--node-env "production"
- name: Generate Native Android Project
run: |
@@ -158,7 +156,19 @@ jobs:
retention-days: 14
compression-level: 0
- name: Check Discord Notification
id: discord
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_NIGHTLY_WEBHOOK }}
run: |
if [ -n "$DISCORD_WEBHOOK_URL" ]; then
echo "configured=true" >> "$GITHUB_OUTPUT"
else
echo "configured=false" >> "$GITHUB_OUTPUT"
fi
- name: Notify Discord
if: steps.discord.outputs.configured == 'true'
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_NIGHTLY_WEBHOOK }}
ARTIFACT_URL: ${{ steps.upload-nightly.outputs.artifact-url }}
+2 -2
View File
@@ -1,6 +1,6 @@
{
"expo": {
"version": "2.1.1",
"version": "2.1.2",
"name": "LNReader",
"slug": "LNReader",
"scheme": "lnreader",
@@ -47,7 +47,7 @@
]
],
"android": {
"versionCode": 4196353,
"versionCode": 4196354,
"package": "com.rajarsheechatterjee.LNReader",
"adaptiveIcon": {
"foregroundImage": "./assets/native/ic_launcher_foreground.png",
@@ -92,7 +92,42 @@ DELETE FROM `NovelCategory`;--> statement-breakpoint
DELETE FROM `Chapter`;--> statement-breakpoint
DROP TABLE IF EXISTS `Novel`;--> statement-breakpoint
ALTER TABLE `__new_Novel` RENAME TO `Novel`;--> statement-breakpoint
INSERT OR REPLACE INTO `Chapter` SELECT * FROM `__migration_Chapter`;--> statement-breakpoint
INSERT OR REPLACE INTO `Chapter` (
`id`,
`novelId`,
`path`,
`name`,
`releaseTime`,
`bookmark`,
`unread`,
`readTime`,
`isDownloaded`,
`updatedTime`,
`chapterNumber`,
`page`,
`position`,
`progress`,
`scanlator`,
`timeSpent`
)
SELECT
`id`,
`novelId`,
`path`,
`name`,
`releaseTime`,
`bookmark`,
`unread`,
`readTime`,
`isDownloaded`,
`updatedTime`,
`chapterNumber`,
`page`,
`position`,
`progress`,
`scanlator`,
`timeSpent`
FROM `__migration_Chapter`;--> statement-breakpoint
INSERT OR REPLACE INTO `NovelCategory` SELECT * FROM `__migration_NovelCategory`;--> statement-breakpoint
DROP TABLE `__migration_Novel`;--> statement-breakpoint
DROP TABLE `__migration_Chapter`;--> statement-breakpoint
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "lnreader",
"version": "2.1.1",
"version": "2.1.2",
"private": true,
"scripts": {
"dev:android:release": "pnpm run generate:env:release && npx expo run:android --variant release",
+121
View File
@@ -6,6 +6,7 @@ import { schema } from '@database/schema';
import {
getPendingMigrations,
repairChapterMigrationSnapshot,
repairInterruptedNovelMigration,
repairMigrationHistory,
runDatabaseBootstrap,
@@ -464,6 +465,126 @@ describe('production migrations', () => {
}
});
it('repairs an interrupted Chapter snapshot missing recent columns', async () => {
const sqlite = open({ name: ':memory:' });
(sqlite as any).executeAsync ??= sqlite.execute;
(sqlite as any).executeRawAsync ??= sqlite.executeRaw;
try {
createSchema(sqlite);
sqlite.executeSync(`
INSERT INTO Category (id, name, sort)
VALUES (1, 'Existing category', 1)
`);
sqlite.executeSync(`
INSERT INTO Novel (id, path, pluginId, name, inLibrary)
VALUES (1, '/interrupted', 'legacy-plugin', 'Interrupted novel', 1)
`);
sqlite.executeSync(`
INSERT INTO Chapter (
id,
novelId,
path,
name,
unread,
isDownloaded
)
VALUES (
1,
1,
'/interrupted/chapter-1',
'Chapter 1',
1,
1
)
`);
sqlite.executeSync(`
INSERT INTO NovelCategory (id, novelId, categoryId)
VALUES (1, 1, 1)
`);
sqlite.executeSync(
'CREATE TABLE __migration_Chapter AS SELECT * FROM Chapter',
);
sqlite.executeSync('ALTER TABLE Chapter ADD scanlator text');
sqlite.executeSync('ALTER TABLE Chapter ADD timeSpent integer DEFAULT 0');
sqlite.executeSync(
'CREATE TABLE __migration_Novel AS SELECT * FROM Novel',
);
sqlite.executeSync(
'CREATE TABLE __migration_NovelCategory AS SELECT * FROM NovelCategory',
);
sqlite.executeSync(`
CREATE TABLE __drizzle_migrations (
id INTEGER PRIMARY KEY,
hash text NOT NULL,
created_at numeric,
name text,
applied_at text
)
`);
sqlite.executeSync(`
INSERT INTO __drizzle_migrations (hash, created_at, name)
VALUES ('', 1766417172000, NULL)
`);
repairChapterMigrationSnapshot(sqlite);
repairMigrationHistory(sqlite);
const snapshotColumns = sqlite
.executeRawSync('PRAGMA table_info(__migration_Chapter)')
.map(column => column[1]);
expect(snapshotColumns).toEqual(
expect.arrayContaining(['scanlator', 'timeSpent']),
);
const drizzleDb = drizzle(sqlite, { schema });
await migrate(drizzleDb, getPendingMigrations(sqlite));
expect(
sqlite.executeSync('SELECT id, name, scanlator, timeSpent FROM Chapter')
.rows,
).toEqual([
{
id: 1,
name: 'Chapter 1',
scanlator: null,
timeSpent: 0,
},
]);
} finally {
sqlite.close();
}
});
it('preserves snapshot columns while adding a missing timeSpent column', () => {
const sqlite = open({ name: ':memory:' });
try {
createSchema(sqlite);
sqlite.executeSync('ALTER TABLE Chapter ADD scanlator text');
sqlite.executeSync(`
INSERT INTO Novel (id, path, pluginId, name)
VALUES (1, '/snapshot', 'legacy-plugin', 'Snapshot novel')
`);
sqlite.executeSync(`
INSERT INTO Chapter (id, novelId, path, name, scanlator)
VALUES (1, 1, '/snapshot/chapter-1', 'Chapter 1', 'Group')
`);
sqlite.executeSync(
'CREATE TABLE __migration_Chapter AS SELECT * FROM Chapter',
);
repairChapterMigrationSnapshot(sqlite);
expect(
sqlite.executeSync(
'SELECT id, scanlator, timeSpent FROM __migration_Chapter',
).rows,
).toEqual([{ id: 1, scanlator: 'Group', timeSpent: 0 }]);
} finally {
sqlite.close();
}
});
it('recovers when Chapter columns exist without migration records', async () => {
const sqlite = open({ name: ':memory:' });
(sqlite as any).executeAsync ??= sqlite.execute;
+5
View File
@@ -28,3 +28,8 @@ export const CHAPTER_FILTER = {
export type ChapterFilterPositiveKey = keyof typeof CHAPTER_FILTER_POSITIVE;
export type ChapterFilterKey = keyof typeof CHAPTER_FILTER;
export type ChapterFilter = (typeof CHAPTER_FILTER)[ChapterFilterKey];
export const BUILT_IN_CATEGORY_IDS = {
default: 1,
local: 2,
} as const;
+29
View File
@@ -36,11 +36,13 @@ const TIME_SPENT_MIGRATION_CREATED_AT = 1784471667000;
const CHAPTER_COLUMN_MIGRATIONS = [
{
columnName: 'scanlator',
columnDefinition: 'text',
migrationName: SCANLATOR_MIGRATION_NAME,
createdAt: SCANLATOR_MIGRATION_CREATED_AT,
},
{
columnName: 'timeSpent',
columnDefinition: 'integer DEFAULT 0',
migrationName: TIME_SPENT_MIGRATION_NAME,
createdAt: TIME_SPENT_MIGRATION_CREATED_AT,
},
@@ -108,6 +110,32 @@ export const repairInterruptedNovelMigration = (
executor.executeSync("ALTER TABLE '__new_Novel' RENAME TO 'Novel';");
};
/**
* Brings a retained Chapter snapshot up to the current schema before an
* interrupted migration is retried. Older snapshots can predate columns that
* were added to Chapter, so restoring them with the current migration would
* otherwise fail with a column-count mismatch.
*/
export const repairChapterMigrationSnapshot = (executor: MigrationExecutor) => {
const snapshotColumns = executor.executeRawSync(
'PRAGMA table_info(__migration_Chapter);',
);
if (snapshotColumns.length === 0) {
return;
}
const snapshotColumnNames = new Set(snapshotColumns.map(row => row[1]));
for (const migration of CHAPTER_COLUMN_MIGRATIONS) {
if (snapshotColumnNames.has(migration.columnName)) {
continue;
}
executor.executeSync(
`ALTER TABLE '__migration_Chapter' ADD COLUMN '${migration.columnName}' ${migration.columnDefinition};`,
);
}
};
/**
* Repairs migration metadata created by older Drizzle versions and interrupted
* migrations. SQLite cannot add a column conditionally, so an existing column
@@ -232,6 +260,7 @@ export const initializeDatabase = () => {
if (!initialization) {
setPragmas(_db);
repairInterruptedNovelMigration(_db);
repairChapterMigrationSnapshot(_db);
repairMigrationHistory(_db);
initialization = migrate(drizzleDb, getPendingMigrations(_db)).then(() => {
runDatabaseBootstrap(_db);
+2 -2
View File
@@ -186,10 +186,10 @@ export const updateCategoryOrderInDb = async (
}
await dbManager.write(async tx => {
for (const category of categories) {
for (const [index, category] of categories.entries()) {
await tx
.update(categorySchema)
.set({ sort: category.sort })
.set({ sort: index + 1 })
.where(eq(categorySchema.id, category.id))
.run();
}
+1 -1
View File
@@ -47,7 +47,7 @@ export const insertChapters = async (
return;
}
const nowSql = sql`datetime('now','localtime')`;
const nowSql = sql`strftime('%Y-%m-%dT%H:%M:%fZ','now')`;
const rows = chapters.map((c, index) => {
let scanlatorStr: string | null = null;
+5 -1
View File
@@ -61,7 +61,11 @@ export const getLibraryNovelsFromDb = (
.$dynamic();
if (sortOrder) {
query.orderBy(sql.raw(sortOrder));
const dateAwareSortOrder = sortOrder.replace(
/^lastUpdatedAt (ASC|DESC)$/,
'julianday(lastUpdatedAt) $1',
);
query.orderBy(sql.raw(dateAwareSortOrder));
}
return query.all();
+4 -3
View File
@@ -21,6 +21,7 @@ import {
import type { TransactionParameter } from '@database/manager/manager.d';
import { getLibraryDefaultCategoryId } from '@hooks/persisted/useSettings';
import NativeFile from '@modules/native-file';
import { BUILT_IN_CATEGORY_IDS } from '@database/constants';
const getCategoryForNewNovel = async (tx: TransactionParameter) => {
const preferredCategoryId = getLibraryDefaultCategoryId();
@@ -40,7 +41,7 @@ const getCategoryForNewNovel = async (tx: TransactionParameter) => {
return tx
.select({ id: categorySchema.id })
.from(categorySchema)
.where(eq(categorySchema.sort, 1))
.where(eq(categorySchema.id, BUILT_IN_CATEGORY_IDS.default))
.get();
};
@@ -174,7 +175,7 @@ export const switchNovelToLibraryQuery = async (
.insert(novelCategorySchema)
.values({
novelId: novel.id,
categoryId: 2,
categoryId: BUILT_IN_CATEGORY_IDS.local,
})
.onConflictDoNothing()
.run();
@@ -386,7 +387,7 @@ export const updateNovelCategories = async (
.where(
and(
inArray(novelCategorySchema.novelId, novelIds),
ne(novelCategorySchema.categoryId, 2),
ne(novelCategorySchema.categoryId, BUILT_IN_CATEGORY_IDS.local),
),
)
.run();
@@ -212,7 +212,7 @@ describe('CategoryQueries', () => {
});
describe('updateCategoryOrderInDb', () => {
it('should update sort order for multiple categories', async () => {
it('should persist categories using one-based display order', async () => {
const testDb = getTestDb();
const cat1 = await insertTestCategory(testDb, {
name: 'Cat 1',
@@ -231,8 +231,8 @@ describe('CategoryQueries', () => {
const categories = await getCategoriesFromDb();
const updated1 = categories.find(c => c.id === cat1);
const updated2 = categories.find(c => c.id === cat2);
expect(updated1?.sort).toBe(30);
expect(updated2?.sort).toBe(40);
expect(updated1?.sort).toBe(1);
expect(updated2?.sort).toBe(2);
});
it('should handle empty array', async () => {
@@ -52,6 +52,40 @@ describe('LibraryQueries', () => {
expect(novels.map(n => n.name)).toEqual(['Novel B', 'Novel A']);
});
it('should sort mixed timestamp formats by their actual date', async () => {
await insertTestNovel(testDb, {
inLibrary: true,
name: 'ISO timestamp',
lastUpdatedAt: '2026-07-28T09:00:00.000Z',
});
await insertTestNovel(testDb, {
inLibrary: true,
name: 'SQLite timestamp',
lastUpdatedAt: '2026-07-28 10:00:00',
});
const novels = await getLibraryNovelsFromDb('lastUpdatedAt DESC');
expect(novels.map(n => n.name)).toEqual([
'SQLite timestamp',
'ISO timestamp',
]);
});
it('should update lastUpdatedAt across mixed timestamp formats', async () => {
const novelId = await insertTestNovel(testDb, {
inLibrary: true,
lastUpdatedAt: '2026-07-28T09:00:00.000Z',
});
await insertTestChapter(testDb, novelId, {
updatedTime: '2026-07-28 10:00:00',
});
const novel = await getLibraryNovelsFromDb();
expect(novel[0].lastUpdatedAt).toBe('2026-07-28 10:00:00');
});
it('should filter novels by raw SQL filter', async () => {
await insertTestNovel(testDb, {
inLibrary: true,
@@ -13,7 +13,8 @@ import {
clearAllTables,
} from './testData';
import { categorySchema, novelCategorySchema } from '@database/schema';
import { eq, sql } from 'drizzle-orm';
import { eq } from 'drizzle-orm';
import { BUILT_IN_CATEGORY_IDS } from '@database/constants';
import {
getAllNovels,
@@ -178,7 +179,7 @@ describe('NovelQueries', () => {
expect(Boolean(novel?.inLibrary)).toBe(false);
});
it('should assign default category when adding to library', async () => {
it('should fall back to the built-in default category by ID', async () => {
const testDb = getTestDb();
const novelId = await insertTestNovel(testDb, {
inLibrary: false,
@@ -186,12 +187,16 @@ describe('NovelQueries', () => {
pluginId: 'test-plugin',
});
// Get default category (sort = 1)
const defaultCategory = await testDb.drizzleDb
.select()
.from(categorySchema)
.where(sql`${categorySchema.sort} = 1`)
.get();
await testDb.drizzleDb
.update(categorySchema)
.set({ sort: 0 })
.where(eq(categorySchema.id, BUILT_IN_CATEGORY_IDS.default))
.run();
await testDb.drizzleDb
.update(categorySchema)
.set({ sort: 1 })
.where(eq(categorySchema.id, BUILT_IN_CATEGORY_IDS.local))
.run();
await switchNovelToLibraryQuery('/test/novel', 'test-plugin');
@@ -202,10 +207,17 @@ describe('NovelQueries', () => {
.all();
expect(associations.length).toBeGreaterThan(0);
expect(
associations.some(a => a.categoryId === (defaultCategory?.id ?? -1)),
).toBe(!!defaultCategory);
associations.some(
association =>
association.categoryId === BUILT_IN_CATEGORY_IDS.default,
),
).toBe(true);
expect(
associations.some(
association => association.categoryId === BUILT_IN_CATEGORY_IDS.local,
),
).toBe(false);
});
it('should assign the user-selected default category', async () => {
@@ -257,7 +269,10 @@ describe('NovelQueries', () => {
.all();
expect(
associations.some(association => association.categoryId === 1),
associations.some(
association =>
association.categoryId === BUILT_IN_CATEGORY_IDS.default,
),
).toBe(true);
});
});
+18 -3
View File
@@ -8,7 +8,10 @@ BEGIN
chaptersUnread = chaptersUnread + CASE WHEN NEW.unread = 1 THEN 1 ELSE 0 END,
lastUpdatedAt = CASE
WHEN NEW.updatedTime IS NOT NULL
AND (lastUpdatedAt IS NULL OR NEW.updatedTime > lastUpdatedAt)
AND (
lastUpdatedAt IS NULL
OR julianday(NEW.updatedTime) > julianday(lastUpdatedAt)
)
THEN NEW.updatedTime
ELSE lastUpdatedAt
END
@@ -24,7 +27,13 @@ BEGIN
chaptersDownloaded = (SELECT COUNT(*) FROM Chapter WHERE Chapter.novelId = Novel.id AND Chapter.isDownloaded = 1),
chaptersUnread = (SELECT COUNT(*) FROM Chapter WHERE Chapter.novelId = Novel.id AND Chapter.unread = 1),
lastReadAt = (SELECT MAX(readTime) FROM Chapter WHERE Chapter.novelId = Novel.id),
lastUpdatedAt = (SELECT MAX(updatedTime) FROM Chapter WHERE Chapter.novelId = Novel.id)
lastUpdatedAt = (
SELECT updatedTime
FROM Chapter
WHERE Chapter.novelId = Novel.id AND updatedTime IS NOT NULL
ORDER BY julianday(updatedTime) DESC
LIMIT 1
)
WHERE id = NEW.novelId;
END;
`;
@@ -37,7 +46,13 @@ BEGIN
chaptersUnread = (SELECT COUNT(*) FROM Chapter WHERE Chapter.novelId = Novel.id AND Chapter.unread = 1),
totalChapters = (SELECT COUNT(*) FROM Chapter WHERE Chapter.novelId = Novel.id),
lastReadAt = (SELECT MAX(readTime) FROM Chapter WHERE Chapter.novelId = Novel.id),
lastUpdatedAt = (SELECT MAX(updatedTime) FROM Chapter WHERE Chapter.novelId = Novel.id)
lastUpdatedAt = (
SELECT updatedTime
FROM Chapter
WHERE Chapter.novelId = Novel.id AND updatedTime IS NOT NULL
ORDER BY julianday(updatedTime) DESC
LIMIT 1
)
WHERE id = OLD.novelId;
END;
`;
@@ -0,0 +1,76 @@
import { renderHook, waitFor } from '@testing-library/react-native';
import useImport from '../useImport';
import { useLibraryContext } from '@components/Context/LibraryContext';
import { QueuedBackgroundTask } from '@services/backgroundTasks';
let mockQueue: QueuedBackgroundTask[] = [];
jest.mock('react-native-mmkv', () => ({
useMMKVObject: () => [mockQueue],
}));
jest.mock('@components/Context/LibraryContext', () => ({
useLibraryContext: jest.fn(),
}));
jest.mock('@services/backgroundTasks', () => ({
BACKGROUND_TASKS_STORE_KEY: 'tasks',
backgroundTasks: {
enqueue: jest.fn(),
resumeAll: jest.fn(),
pauseAll: jest.fn(),
cancelByType: jest.fn(),
},
}));
const mockUseLibraryContext = useLibraryContext as jest.MockedFunction<
typeof useLibraryContext
>;
const importTask = (id: string, progress = 0): QueuedBackgroundTask => ({
id,
task: { name: 'IMPORT_EPUB', data: { files: [] } },
state: 'running',
meta: {
name: 'Import',
isRunning: true,
progress,
progressText: undefined,
},
});
describe('useImport', () => {
const refetchLibrary = jest.fn().mockResolvedValue(undefined);
beforeEach(() => {
mockQueue = [];
refetchLibrary.mockClear();
mockUseLibraryContext.mockReturnValue({
refetchLibrary,
} as unknown as ReturnType<typeof useLibraryContext>);
});
it('ignores import progress updates and refetches when an import finishes', async () => {
mockQueue = [importTask('import-1')];
const { rerender } = renderHook(useImport);
mockQueue = [importTask('import-1', 0.5)];
rerender({});
expect(refetchLibrary).not.toHaveBeenCalled();
mockQueue = [];
rerender({});
await waitFor(() => expect(refetchLibrary).toHaveBeenCalledTimes(1));
});
it('does not refetch when an import is enqueued', () => {
const { rerender } = renderHook(useImport);
mockQueue = [importTask('import-1')];
rerender({});
expect(refetchLibrary).not.toHaveBeenCalled();
});
});
+7 -3
View File
@@ -5,7 +5,7 @@ import {
QueuedBackgroundTask,
} from '@services/backgroundTasks';
import { DocumentPickerResult } from 'expo-document-picker';
import { useCallback, useEffect, useMemo } from 'react';
import { useCallback, useEffect, useMemo, useRef } from 'react';
import { useMMKVObject } from 'react-native-mmkv';
export default function useImport() {
@@ -17,10 +17,14 @@ export default function useImport() {
() => queue?.filter(t => t.task.name === 'IMPORT_EPUB') || [],
[queue],
);
const previousImportCount = useRef(importQueue.length);
useEffect(() => {
refetchLibrary();
}, [importQueue, refetchLibrary]);
if (previousImportCount.current > importQueue.length) {
void refetchLibrary();
}
previousImportCount.current = importQueue.length;
}, [importQueue.length, refetchLibrary]);
const importNovel = useCallback((pickedNovel: DocumentPickerResult) => {
if (pickedNovel.canceled) return;
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "اسم النسخة الاحتياطية",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "لم يتم العثور على ملف الإعدادات في النسخة الاحتياطية",
"settingsRestoreFailed": "فشل استعادة الإعدادات: %{error}",
"settingsFileWriteFailed": "فشل كتابة ملف الإعدادات: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "مجلد نسخة احتياطية غير صالح",
"localBackup": "نسخ احتياطي محلي",
"noBackupFound": "لم يتم العثور على نسخة احتياطية",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "تحضير البيانات",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "نسخ احتياطي للاستضافة الذاتية",
"host": "المضيف",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "استعادة النسخ الاحتياطية الكبيرة قد تؤدي لتجميد التطبيق حتى انتهاء الاستعادة",
"restorinBackup": "استعادة النسخة الاحتياطية",
"restoringData": "استعادة البيانات",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "استضافة ذاتية",
"selfHostDesc": "نسخ احتياطي إلى خادمك الخاص",
"uploadingData": "رفع البيانات",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "رفع الملفات المحملة"
},
"browse": "تصفح",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "نسخ احتياطي محلي",
"LOCAL_RESTORE": "استعادة من نسخة احتياطية محلية",
"MIGRATE_NOVEL": "جاري نقل الرواية",
"DOWNLOAD_CHAPTER": "جاري تنزيل الفصل"
"DOWNLOAD_CHAPTER": "جاري تنزيل الفصل",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "ব্ৰাউজ কৰক",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Procházet",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Durchsuchen",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Περιήγηση",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Nombre de copia de seguridad",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Copia de Seguridad Fallida",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Carpeta para Copia de seguridad inválida",
"localBackup": "Local Backup",
"noBackupFound": "No se encontró ninguna copia de seguridad",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparando datos",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Autohostear copias de seguridad",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restaurar grandes copias de seguridad puede congelar la aplicación hasta que se complete el proceso",
"restorinBackup": "Restaurando copia de seguridad",
"restoringData": "Restaurando datos",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Autoalojar",
"selfHostDesc": "Guardar copia de seguridad en tu servidor",
"uploadingData": "Subiendo datos",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Navegar",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Nom de la sauvegarde",
"backupCreated": "Sauvegarde créée avec succès",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Sauvegarde restaurée avec succès",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Enregistrement de la sauvegarde",
"categoriesRestored": "%{count} catégories restaurées",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "La sauvegarde a échoué",
"novelsRestored": "%{count} romans récupérés",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restauration des catégories en cours",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Récupération des romans en cours",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restauration des paramètres",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Paramètres restaurés",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Dossier de sauvegarde invalide",
"localBackup": "Sauvegarde locale",
"noBackupFound": "Aucune sauvegarde trouvée",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Parcourir",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "שם הגיבוי",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Böngészés",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Indonesia",
"categoriesRestored": "%{count}Indonesia",
"categoriesRestoredWithErrors": "%{failedCount}(indonesia) ",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "%{categoryName}(indonesia) %{error}",
"categoryFileNotFound": "Indonesia",
"categoryFileReadFailed": "%{error}Indonesia",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Telusur",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Esplora",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "閲覧",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Bladeren",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Salvar nome",
"backupCreated": "Backup criado com sucesso",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restaurado com sucesso!",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Salvando Backup",
"categoriesRestored": "Categorias %{count} restauradas",
"categoriesRestoredWithErrors": "Categorias %{count} restauradas (%{failedCount} falhou)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Falha ao restaurar a categoria: %{categoryName} - %{error}",
"categoryFileNotFound": "Arquivo de categoria não encontrado no backup",
"categoryFileReadFailed": "Falha ao ler arquivo de categoria: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup falhou",
"novelsRestored": "%{count} novels restaurados",
"novelsRestoredWithErrors": "%{count} novels restaurados (%{failedCount} falhou)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Falha ao fazer backup da novel: %{novelName} - %{error}",
"novelRestoreFailed": "Falha ao restaurar a novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Diretório da novel não foi encontrado no backup",
"novelDirectoryReadFailed": "Falha ao ler o diretório da novel: %{error}",
"restoringCategories": "Restaurando Categorias",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restaurando novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restaurando Configurações",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Configurações restauradas",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Arquivo de configurações não encontrado no backup",
"settingsRestoreFailed": "Falha ao restaurar as configurações: %{error}",
"settingsFileWriteFailed": "Falha ao escrever o arquivo de configurações: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Pasta de backup inválida",
"localBackup": "Backup local",
"noBackupFound": "Nenhum backup encontrado",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparando os dados",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "“Backup” do servidor pessoal",
"host": "Servidor",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restaurar “backups” grandes pode congelar o aplicativo até que a restauração seja concluída",
"restorinBackup": "Restaurando cópia de segurança",
"restoringData": "Restaurando dados",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Auto hospedar",
"selfHostDesc": "Fazer “backup” em seu servidor",
"uploadingData": "Enviando dados",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Baixando arquivos salvos"
},
"browse": "Navegar",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Имя резервной копии",
"backupCreated": "Резервная копия успешно создана",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Резервная копия успешно восстановлена",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Сохранение резервной копии",
"categoriesRestored": "Восстановлены %{count} категории",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Резервное копирование не удалось",
"novelsRestored": "Восстановлено %{count} новелл",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Восстановление категорий",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Восстановление новелл",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Восстановление настроек",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Настройки восстановлены",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Файл настроек в резервной копии не найден",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Неверная папка резервной копии",
"localBackup": "Локальное резервное копирование",
"noBackupFound": "Резервные копии не найдены",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Подготовка данных",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Резервное копирование на свой сервер",
"host": "Сервер",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Восстановление больших резервных копий может привести к зависанию приложения до завершения восстановления",
"restorinBackup": "Восстановление резервной копии",
"restoringData": "Восстановление данных",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Свой сервер",
"selfHostDesc": "Резервное копирование на свой сервер",
"uploadingData": "Выгрузка данных",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Выгрузка скаченных файлов"
},
"browse": "Обзор",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Локальное резервное копирование",
"LOCAL_RESTORE": "Локальное восстановление",
"MIGRATE_NOVEL": "Миграция новелл",
"DOWNLOAD_CHAPTER": "Загруженные главы"
"DOWNLOAD_CHAPTER": "Загруженные главы",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Browse",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Yedek ismi",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Yedekleme hatası",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Geçersiz yedekleme klasörü",
"localBackup": "Local Backup",
"noBackupFound": "Yedek bulunamadı",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Veri hazırlanıyor",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Yerel Sunucuya Yedekle",
"host": "Sunucu",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Büyük boyutlu yedekleri geri yüklemek uygulamanın yedeğin geri yüklenmesi bitene kadar donmasına neden olabilir",
"restorinBackup": "Yedek geri yükleniyor",
"restoringData": "Veri geri yükleniyor",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Yerel Sunucu",
"selfHostDesc": "Sunucunuza yedekleyin",
"uploadingData": "Veri yükleniyor",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Göz at",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Назва резервної копії",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Некоректна папка резервної копії",
"localBackup": "Local Backup",
"noBackupFound": "Резервну копію не знайдено",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Підготовка даних",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Резервне копіювання на власний сервер",
"host": "Хост",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Відновлення великих резервних копій може призвести до тимчасового зависання додатка",
"restorinBackup": "Відновлення резервної копії",
"restoringData": "Відновлення даних",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Власний сервер",
"selfHostDesc": "Резервне копіювання на власний сервер",
"uploadingData": "Відправлення даних",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Огляд",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Tên sao lưu",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Thư mục sao lưu không hợp lệ",
"localBackup": "Local Backup",
"noBackupFound": "Không tìm thấy sao lưu",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Chuẩn bị dữ liệu",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Sao lưu tự dựng",
"host": "Máy chủ",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Khôi phục sao lưu lớn có thể đóng băng ứng dụng đến khi hoàn thành",
"restorinBackup": "Đang khôi phục sao lưu",
"restoringData": "Đang khôi phục dữ liệu",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Tự dựng",
"selfHostDesc": "Sao lưu lên máy chủ của bạn",
"uploadingData": "Đang tải lên dữ liệu",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "Tìm kiếm",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "备份名称",
"backupCreated": "成功创建备份",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "成功恢复备份",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "正在保存备份",
"categoriesRestored": "已恢复%{count}个分类",
"categoriesRestoredWithErrors": "已恢复%{count}个分类(%{failedCount}个恢复失败)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "恢复分类失败:%{categoryName} - %{error}",
"categoryFileNotFound": "未能在备份中找到分类文件",
"categoryFileReadFailed": "读取分类文件失败:%{error}",
@@ -100,14 +114,34 @@
"failed": "备份失败",
"novelsRestored": "已恢复%{count}部小说",
"novelsRestoredWithErrors": "已恢复%{count}部小说(%{failedCount}部恢复失败)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "备份小说失败:%{novelName} - %{error}",
"novelRestoreFailed": "恢复小说失败:%{novelName} - %{error}",
"novelDirectoryNotFound": "未能在备份中找到小说目录",
"novelDirectoryReadFailed": "读取小说目录失败:%{error}",
"restoringCategories": "正在恢复分类",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "正在恢复小说",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "正在恢复设置",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "设置已恢复",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "未能在备份文件中找到设置文件",
"settingsRestoreFailed": "恢复设置失败:%{error}",
"settingsFileWriteFailed": "写入设置文件失败:%{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "备份文件夹有误",
"localBackup": "本地备份",
"noBackupFound": "没有找到备份",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "准备数据",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "自托管备份",
"host": "主机",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "恢复大量备份可能会冻结应用程序,直到恢复完成",
"restorinBackup": "恢复备份",
"restoringData": "恢复数据",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "自托管",
"selfHostDesc": "备份到您的服务器",
"uploadingData": "上传数据",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "正在上传已下载的文件"
},
"browse": "浏览",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "本地备份",
"LOCAL_RESTORE": "本地恢复",
"MIGRATE_NOVEL": "正在迁移小说",
"DOWNLOAD_CHAPTER": "正在下载章节"
"DOWNLOAD_CHAPTER": "正在下载章节",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+54 -1
View File
@@ -84,10 +84,24 @@
"backupScreen": {
"backupName": "Backup name",
"backupCreated": "Backup created successfully",
"backupCreatedWithWarnings": "Backup created with warnings: %{warnings}",
"backupRestored": "Backup restored successfully",
"backupRestoredSelectedWithWarnings": "Backup restored with warnings: %{warnings}",
"backupRestoredSummary": {
"one": "Restored %{count} novel",
"other": "Restored %{count} novels"
},
"backupRestoredWithWarnings": {
"one": "Restored %{count} novel with warnings: %{warnings}",
"other": "Restored %{count} novels with warnings: %{warnings}"
},
"savingBackup": "Saving Backup",
"categoriesRestored": "Restored %{count} categories",
"categoriesRestoredWithErrors": "Restored %{count} categories (%{failedCount} failed)",
"categoriesRestoreFailedSummary": {
"one": "%{count} category failed",
"other": "%{count} categories failed"
},
"categoryRestoreFailed": "Failed to restore category: %{categoryName} - %{error}",
"categoryFileNotFound": "Category file not found in backup",
"categoryFileReadFailed": "Failed to read category file: %{error}",
@@ -100,14 +114,34 @@
"failed": "Backup failed",
"novelsRestored": "Restored %{count} novels",
"novelsRestoredWithErrors": "Restored %{count} novels (%{failedCount} failed)",
"novelsBackupFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelsRestoreFailedSummary": {
"one": "%{count} novel failed",
"other": "%{count} novels failed"
},
"novelBackupFailed": "Failed to backup novel: %{novelName} - %{error}",
"novelRestoreFailed": "Failed to restore novel: %{novelName} - %{error}",
"novelDirectoryNotFound": "Novel directory not found in backup",
"novelDirectoryReadFailed": "Failed to read novel directory: %{error}",
"restoringCategories": "Restoring Categories",
"restoringCategoriesProgress": "Restoring categories (%{current}/%{total})",
"restoringNovels": "Restoring Novels",
"restoringNovelsProgress": "Restoring novels (%{current}/%{total})",
"restoringSettings": "Restoring Settings",
"missingPluginsAfterRestore": "Missing plugins: %{plugins}",
"sectionsRestoreFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"sectionsBackupFailedSummary": {
"one": "%{count} backup section failed",
"other": "%{count} backup sections failed"
},
"settingsRestored": "Settings restored",
"settingsRestoreFailedSummary": "settings failed",
"settingsFileNotFound": "Settings file not found in backup",
"settingsRestoreFailed": "Failed to restore settings: %{error}",
"settingsFileWriteFailed": "Failed to write settings file: %{error}",
@@ -124,7 +158,21 @@
"invalidBackupFolder": "Invalid backup folder",
"localBackup": "Local Backup",
"noBackupFound": "No backup found",
"options": {
"title": "Backup contents",
"description": "Choose what to include in this backup.",
"selectAll": "Select all",
"library": "Library data",
"libraryDescription": "Novels, chapter lists, reading progress, bookmarks, and categories.",
"settings": "Settings",
"settingsDescription": "App, reader, and update preferences.",
"plugins": "Plugins",
"pluginsDescription": "Installed source plugin files.",
"downloadedFiles": "Downloaded chapters and covers",
"downloadedFilesDescription": "Downloaded chapter content and saved novel covers. This may be large."
},
"preparingData": "Preparing Data",
"preparingSelectedFiles": "Preparing selected files",
"remote": {
"backup": "Self Host Backup",
"host": "Host",
@@ -136,9 +184,11 @@
"restoreLargeBackupsWarning": "Restoring large backups may freeze the app until restoring is finished",
"restorinBackup": "Restoring backup",
"restoringData": "Restoring Data",
"restoringSelectedFiles": "Restoring selected files",
"selfHost": "Self Host",
"selfHostDesc": "Backup to your server",
"uploadingData": "Uploading Data",
"uploadingSelectedFiles": "Uploading selected files",
"uploadingDownloadedFiles": "Uploading Downloaded Files"
},
"browse": "浏览",
@@ -686,7 +736,10 @@
"LOCAL_BACKUP": "Local Backup",
"LOCAL_RESTORE": "Local Restore",
"MIGRATE_NOVEL": "Migrating Novel",
"DOWNLOAD_CHAPTER": "Downloading Chapter"
"DOWNLOAD_CHAPTER": "Downloading Chapter",
"taskQueued": "%{task} queued",
"taskCompleted": "Completed",
"taskFailed": "Failed: %{error}"
},
"time": {
"seconds": {
+2 -7
View File
@@ -51,13 +51,8 @@ const CategoriesScreen = () => {
return;
}
const updatedOrderCategories = data.map((category, index) => ({
...category,
sort: index,
}));
setCategories(updatedOrderCategories);
updateCategoryOrderInDb(updatedOrderCategories);
setCategories(data);
updateCategoryOrderInDb(data);
};
const renderItem = ({
+1 -1
View File
@@ -27,7 +27,7 @@ export type UseLibraryReturnType = {
setLibrary: React.Dispatch<React.SetStateAction<NovelInfo[]>>;
novelInLibrary: (pluginId: string, novelPath: string) => boolean;
switchNovelToLibrary: (novelPath: string, pluginId: string) => Promise<void>;
refetchLibrary: () => void;
refetchLibrary: () => Promise<void>;
setLibrarySearchText: (text: string) => void;
};
+12 -8
View File
@@ -1,4 +1,4 @@
import React, { useState } from 'react';
import React, { useMemo, useState } from 'react';
import {
FlatList,
Pressable,
@@ -19,6 +19,7 @@ import { NovelInfo } from '@database/types';
import { NovelStatus } from '@plugins/types';
import { translateNovelStatus } from '@utils/translateEnum';
import { showToast } from '@utils/showToast';
import { parseGenres } from '../utils/genres';
interface EditInfoModalProps {
theme: ThemeColors;
@@ -55,12 +56,15 @@ const EditInfoModalContent = ({
const [saving, setSaving] = useState(false);
const [newGenre, setNewGenre] = useState('');
const genres = useMemo(
() => parseGenres(novelInfo.genres),
[novelInfo.genres],
);
const removeTag = (t: string) => {
setNovelInfo(current => ({
...current,
genres: current.genres
?.split(',')
genres: parseGenres(current.genres)
.filter(item => item !== t)
.join(','),
}));
@@ -199,9 +203,9 @@ const EditInfoModalContent = ({
setNovelInfo(prevVal => ({
...prevVal,
genres: prevVal.genres
? `${prevVal.genres},` + newGenreTrimmed
: newGenreTrimmed,
genres: [...parseGenres(prevVal.genres), newGenreTrimmed].join(
',',
),
}));
setNewGenre('');
}}
@@ -210,11 +214,11 @@ const EditInfoModalContent = ({
style={styles.inputWrapper}
/>
{novelInfo.genres !== undefined && novelInfo.genres !== '' ? (
{genres.length > 0 ? (
<FlatList
style={getGenreListStyle()}
horizontal
data={novelInfo.genres?.split(',')}
data={genres}
keyExtractor={(_, index) => 'novelTag' + index}
renderItem={({ item }) => (
<GenreChip theme={theme} onPress={() => removeTag(item)}>
@@ -9,6 +9,7 @@ import { isMissingNovelCover } from '../../../../components/NovelCoverImage';
import { ThemeColors } from '@theme/types';
import { getString } from '@i18n/translations';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { parseGenres } from '../../utils/genres';
interface CoverImageProps {
children: React.ReactNode;
@@ -269,26 +270,29 @@ const TrackerButton = ({
const genreKeyExtractor = (_item: string, index: number) => 'genre' + index;
const NovelGenres = memo(
({ theme, genres }: { theme: ThemeColors; genres: string }) => {
const data = useMemo(() => genres.split(/,\s*/), [genres]);
const renderGenre = useCallback(
({ item }: { item: string }) => <Chip label={item} theme={theme} />,
[theme],
);
interface NovelGenresProps {
theme: ThemeColors;
genres?: string | null;
}
return (
<FlatList
contentContainerStyle={styles.genreContainer}
horizontal
data={data}
keyExtractor={genreKeyExtractor}
renderItem={renderGenre}
showsHorizontalScrollIndicator={false}
/>
);
},
);
const NovelGenres = memo(({ theme, genres }: NovelGenresProps) => {
const data = useMemo(() => parseGenres(genres), [genres]);
const renderGenre = useCallback(
({ item }: { item: string }) => <Chip label={item} theme={theme} />,
[theme],
);
return (
<FlatList
contentContainerStyle={styles.genreContainer}
horizontal
data={data}
keyExtractor={genreKeyExtractor}
renderItem={renderGenre}
showsHorizontalScrollIndicator={false}
/>
);
});
export {
NovelInfoContainer,
@@ -0,0 +1,36 @@
import { render, screen } from '@testing-library/react-native';
import type { ThemeColors } from '@theme/types';
import { NovelGenres } from '../NovelInfoComponents';
jest.mock('../../../../../components', () => {
const { Text } = require('react-native');
return {
Chip: ({ label }: { label: string }) => <Text>{label}</Text>,
NovelCoverImage: () => null,
};
});
const theme = {} as ThemeColors;
describe('NovelGenres', () => {
it('renders normalized genres', () => {
render(
<NovelGenres theme={theme} genres="Fantasy, Adventure, , Romance " />,
);
expect(screen.getByText('Fantasy')).toBeTruthy();
expect(screen.getByText('Adventure')).toBeTruthy();
expect(screen.getByText('Romance')).toBeTruthy();
});
it.each([
['missing', undefined],
['null', null],
['malformed', ['Fantasy'] as unknown as string],
])('does not crash for %s genres', (_case, genres) => {
expect(() =>
render(<NovelGenres theme={theme} genres={genres} />),
).not.toThrow();
});
});
@@ -0,0 +1,92 @@
import { act, renderHook } from '@testing-library/react-native';
import { useNovelRefresh } from '../useNovelRefresh';
import { updateNovel } from '@services/updates/LibraryUpdateQueries';
import { useLibraryContext } from '@components/Context/LibraryContext';
import { NovelInfo } from '@database/types';
jest.mock('@services/updates/LibraryUpdateQueries', () => ({
updateNovel: jest.fn(),
}));
jest.mock('@components/Context/LibraryContext', () => ({
useLibraryContext: jest.fn(),
}));
jest.mock('@i18n/translations', () => ({
getString: (key: string) => key,
}));
jest.mock('@utils/showToast', () => ({
showToast: jest.fn(),
}));
const mockUpdateNovel = updateNovel as jest.MockedFunction<typeof updateNovel>;
const mockUseLibraryContext = useLibraryContext as jest.MockedFunction<
typeof useLibraryContext
>;
const novel = {
id: 1,
name: 'Novel',
path: '/novel',
pluginId: 'plugin',
inLibrary: true,
} as NovelInfo;
describe('useNovelRefresh', () => {
const reloadNovel = jest.fn().mockResolvedValue(undefined);
const refetchLibrary = jest.fn().mockResolvedValue(undefined);
const enqueue = jest.fn();
beforeEach(() => {
reloadNovel.mockClear();
refetchLibrary.mockClear();
enqueue.mockClear();
mockUpdateNovel.mockClear();
mockUpdateNovel.mockResolvedValue(undefined);
mockUseLibraryContext.mockReturnValue({
refetchLibrary,
} as unknown as ReturnType<typeof useLibraryContext>);
});
it('refreshes the novel and library after updating a library novel', async () => {
const { result } = renderHook(() =>
useNovelRefresh({
novel,
downloadNewChapters: false,
refreshNovelMetadata: false,
enqueue,
reloadNovel,
}),
);
await act(result.current.refresh);
expect(mockUpdateNovel).toHaveBeenCalledWith(
novel.pluginId,
novel.path,
novel.id,
expect.objectContaining({ enqueue }),
);
expect(reloadNovel).toHaveBeenCalledTimes(1);
expect(refetchLibrary).toHaveBeenCalledTimes(1);
});
it('does not refresh the library for a novel outside the library', async () => {
const { result } = renderHook(() =>
useNovelRefresh({
novel: { ...novel, inLibrary: false },
downloadNewChapters: false,
refreshNovelMetadata: false,
enqueue,
reloadNovel,
}),
);
await act(result.current.refresh);
expect(reloadNovel).toHaveBeenCalledTimes(1);
expect(refetchLibrary).not.toHaveBeenCalled();
});
});
+7 -1
View File
@@ -4,6 +4,7 @@ import { BackgroundTaskEnqueuer } from '@services/backgroundTasks';
import { updateNovel } from '@services/updates/LibraryUpdateQueries';
import { getString } from '@i18n/translations';
import { showToast } from '@utils/showToast';
import { useLibraryContext } from '@components/Context/LibraryContext';
interface UseNovelRefreshOptions {
novel: NovelInfo | undefined;
@@ -21,6 +22,7 @@ export const useNovelRefresh = ({
reloadNovel,
}: UseNovelRefreshOptions) => {
const [updating, setUpdating] = useState(false);
const { refetchLibrary } = useLibraryContext();
const refresh = useCallback(async () => {
if (!novel || updating) {
@@ -34,7 +36,10 @@ export const useNovelRefresh = ({
refreshNovelMetadata,
enqueue,
});
await reloadNovel();
await Promise.all([
reloadNovel(),
novel.inLibrary ? refetchLibrary() : Promise.resolve(),
]);
showToast(getString('novelScreen.updatedToast', { name: novel.name }));
} catch (error) {
showToast(
@@ -49,6 +54,7 @@ export const useNovelRefresh = ({
downloadNewChapters,
enqueue,
novel,
refetchLibrary,
refreshNovelMetadata,
reloadNovel,
updating,
@@ -0,0 +1,18 @@
import { parseGenres } from '../genres';
describe('parseGenres', () => {
it('normalizes comma-separated genres', () => {
expect(parseGenres('Fantasy, Adventure, , Romance ')).toEqual([
'Fantasy',
'Adventure',
'Romance',
]);
});
it.each([undefined, null, ['Fantasy'], { genre: 'Fantasy' }])(
'returns an empty list for malformed input: %p',
genres => {
expect(parseGenres(genres)).toEqual([]);
},
);
});
+7
View File
@@ -0,0 +1,7 @@
export const parseGenres = (genres: unknown): string[] =>
typeof genres === 'string'
? genres
.split(',')
.map(genre => genre.trim())
.filter(Boolean)
: [];
+2
View File
@@ -61,6 +61,7 @@ const Chapter = ({ route, navigation }: ChapterScreenProps) => {
initialChapter={route.params.chapter}
>
<Drawer
drawerStyle={styles.drawer}
open={open}
onOpen={openDrawer}
onClose={closeDrawer}
@@ -312,4 +313,5 @@ export default Chapter;
const styles = StyleSheet.create({
container: { flex: 1 },
drawer: { backgroundColor: 'transparent' },
});