Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ecc5b84a64 | |||
| eb12bdfd62 | |||
| 9612bf6f89 | |||
| 0ed7d878b4 | |||
| 5f45e4c7f2 | |||
| ca24671a2f | |||
| ee3a4f20bc | |||
| 0c3542836c | |||
| f71c9c8594 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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;
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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 = ({
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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([]);
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -0,0 +1,7 @@
|
||||
export const parseGenres = (genres: unknown): string[] =>
|
||||
typeof genres === 'string'
|
||||
? genres
|
||||
.split(',')
|
||||
.map(genre => genre.trim())
|
||||
.filter(Boolean)
|
||||
: [];
|
||||
@@ -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' },
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user