Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

kunfei 4 лет назад
Родитель
Сommit
6085f0f6f9

+ 1666 - 0
app/schemas/io.legado.app.data.AppDatabase/50.json

@@ -0,0 +1,1666 @@
+{
+  "formatVersion": 1,
+  "database": {
+    "version": 50,
+    "identityHash": "524cf3564400bd897a49355afd984ac1",
+    "entities": [
+      {
+        "tableName": "books",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookUrl` TEXT NOT NULL DEFAULT '', `tocUrl` TEXT NOT NULL DEFAULT '', `origin` TEXT NOT NULL DEFAULT '', `originName` TEXT NOT NULL DEFAULT '', `name` TEXT NOT NULL DEFAULT '', `author` TEXT NOT NULL DEFAULT '', `kind` TEXT, `customTag` TEXT, `coverUrl` TEXT, `customCoverUrl` TEXT, `intro` TEXT, `customIntro` TEXT, `charset` TEXT, `type` INTEGER NOT NULL DEFAULT 0, `group` INTEGER NOT NULL DEFAULT 0, `latestChapterTitle` TEXT, `latestChapterTime` INTEGER NOT NULL DEFAULT 0, `lastCheckTime` INTEGER NOT NULL DEFAULT 0, `lastCheckCount` INTEGER NOT NULL DEFAULT 0, `totalChapterNum` INTEGER NOT NULL DEFAULT 0, `durChapterTitle` TEXT, `durChapterIndex` INTEGER NOT NULL DEFAULT 0, `durChapterPos` INTEGER NOT NULL DEFAULT 0, `durChapterTime` INTEGER NOT NULL DEFAULT 0, `wordCount` TEXT, `canUpdate` INTEGER NOT NULL DEFAULT 1, `order` INTEGER NOT NULL DEFAULT 0, `originOrder` INTEGER NOT NULL DEFAULT 0, `variable` TEXT, `readConfig` TEXT, PRIMARY KEY(`bookUrl`))",
+        "fields": [
+          {
+            "fieldPath": "bookUrl",
+            "columnName": "bookUrl",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "tocUrl",
+            "columnName": "tocUrl",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "origin",
+            "columnName": "origin",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "originName",
+            "columnName": "originName",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "author",
+            "columnName": "author",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "kind",
+            "columnName": "kind",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "customTag",
+            "columnName": "customTag",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "coverUrl",
+            "columnName": "coverUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "customCoverUrl",
+            "columnName": "customCoverUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "intro",
+            "columnName": "intro",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "customIntro",
+            "columnName": "customIntro",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "charset",
+            "columnName": "charset",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "type",
+            "columnName": "type",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "group",
+            "columnName": "group",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "latestChapterTitle",
+            "columnName": "latestChapterTitle",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "latestChapterTime",
+            "columnName": "latestChapterTime",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "lastCheckTime",
+            "columnName": "lastCheckTime",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "lastCheckCount",
+            "columnName": "lastCheckCount",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "totalChapterNum",
+            "columnName": "totalChapterNum",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "durChapterTitle",
+            "columnName": "durChapterTitle",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "durChapterIndex",
+            "columnName": "durChapterIndex",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "durChapterPos",
+            "columnName": "durChapterPos",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "durChapterTime",
+            "columnName": "durChapterTime",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "wordCount",
+            "columnName": "wordCount",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "canUpdate",
+            "columnName": "canUpdate",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          },
+          {
+            "fieldPath": "order",
+            "columnName": "order",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "originOrder",
+            "columnName": "originOrder",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "variable",
+            "columnName": "variable",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "readConfig",
+            "columnName": "readConfig",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "bookUrl"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_books_name_author",
+            "unique": true,
+            "columnNames": [
+              "name",
+              "author"
+            ],
+            "orders": [],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_books_name_author` ON `${TABLE_NAME}` (`name`, `author`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "book_groups",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `groupName` TEXT NOT NULL, `cover` TEXT, `order` INTEGER NOT NULL, `show` INTEGER NOT NULL, PRIMARY KEY(`groupId`))",
+        "fields": [
+          {
+            "fieldPath": "groupId",
+            "columnName": "groupId",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "groupName",
+            "columnName": "groupName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "cover",
+            "columnName": "cover",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "order",
+            "columnName": "order",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "show",
+            "columnName": "show",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "groupId"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "book_sources",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookSourceUrl` TEXT NOT NULL, `bookSourceName` TEXT NOT NULL, `bookSourceGroup` TEXT, `bookSourceType` INTEGER NOT NULL, `bookUrlPattern` TEXT, `customOrder` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `enabledExplore` INTEGER NOT NULL, `enabledCookieJar` INTEGER DEFAULT 0, `concurrentRate` TEXT, `header` TEXT, `loginUrl` TEXT, `loginUi` TEXT, `loginCheckJs` TEXT, `bookSourceComment` TEXT, `variableComment` TEXT, `lastUpdateTime` INTEGER NOT NULL, `respondTime` INTEGER NOT NULL, `weight` INTEGER NOT NULL, `exploreUrl` TEXT, `ruleExplore` TEXT, `searchUrl` TEXT, `ruleSearch` TEXT, `ruleBookInfo` TEXT, `ruleToc` TEXT, `ruleContent` TEXT, PRIMARY KEY(`bookSourceUrl`))",
+        "fields": [
+          {
+            "fieldPath": "bookSourceUrl",
+            "columnName": "bookSourceUrl",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookSourceName",
+            "columnName": "bookSourceName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookSourceGroup",
+            "columnName": "bookSourceGroup",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "bookSourceType",
+            "columnName": "bookSourceType",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookUrlPattern",
+            "columnName": "bookUrlPattern",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "customOrder",
+            "columnName": "customOrder",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "enabled",
+            "columnName": "enabled",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "enabledExplore",
+            "columnName": "enabledExplore",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "enabledCookieJar",
+            "columnName": "enabledCookieJar",
+            "affinity": "INTEGER",
+            "notNull": false,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "concurrentRate",
+            "columnName": "concurrentRate",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "header",
+            "columnName": "header",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginUrl",
+            "columnName": "loginUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginUi",
+            "columnName": "loginUi",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginCheckJs",
+            "columnName": "loginCheckJs",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "bookSourceComment",
+            "columnName": "bookSourceComment",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "variableComment",
+            "columnName": "variableComment",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "lastUpdateTime",
+            "columnName": "lastUpdateTime",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "respondTime",
+            "columnName": "respondTime",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "weight",
+            "columnName": "weight",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "exploreUrl",
+            "columnName": "exploreUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleExplore",
+            "columnName": "ruleExplore",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "searchUrl",
+            "columnName": "searchUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleSearch",
+            "columnName": "ruleSearch",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleBookInfo",
+            "columnName": "ruleBookInfo",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleToc",
+            "columnName": "ruleToc",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleContent",
+            "columnName": "ruleContent",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "bookSourceUrl"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_book_sources_bookSourceUrl",
+            "unique": false,
+            "columnNames": [
+              "bookSourceUrl"
+            ],
+            "orders": [],
+            "createSql": "CREATE INDEX IF NOT EXISTS `index_book_sources_bookSourceUrl` ON `${TABLE_NAME}` (`bookSourceUrl`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "chapters",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `isVolume` INTEGER NOT NULL, `baseUrl` TEXT NOT NULL, `bookUrl` TEXT NOT NULL, `index` INTEGER NOT NULL, `isVip` INTEGER NOT NULL, `isPay` INTEGER NOT NULL, `resourceUrl` TEXT, `tag` TEXT, `start` INTEGER, `end` INTEGER, `startFragmentId` TEXT, `endFragmentId` TEXT, `variable` TEXT, PRIMARY KEY(`url`, `bookUrl`), FOREIGN KEY(`bookUrl`) REFERENCES `books`(`bookUrl`) ON UPDATE NO ACTION ON DELETE CASCADE )",
+        "fields": [
+          {
+            "fieldPath": "url",
+            "columnName": "url",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "title",
+            "columnName": "title",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "isVolume",
+            "columnName": "isVolume",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "baseUrl",
+            "columnName": "baseUrl",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookUrl",
+            "columnName": "bookUrl",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "index",
+            "columnName": "index",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "isVip",
+            "columnName": "isVip",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "isPay",
+            "columnName": "isPay",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "resourceUrl",
+            "columnName": "resourceUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "tag",
+            "columnName": "tag",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "start",
+            "columnName": "start",
+            "affinity": "INTEGER",
+            "notNull": false
+          },
+          {
+            "fieldPath": "end",
+            "columnName": "end",
+            "affinity": "INTEGER",
+            "notNull": false
+          },
+          {
+            "fieldPath": "startFragmentId",
+            "columnName": "startFragmentId",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "endFragmentId",
+            "columnName": "endFragmentId",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "variable",
+            "columnName": "variable",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "url",
+            "bookUrl"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_chapters_bookUrl",
+            "unique": false,
+            "columnNames": [
+              "bookUrl"
+            ],
+            "orders": [],
+            "createSql": "CREATE INDEX IF NOT EXISTS `index_chapters_bookUrl` ON `${TABLE_NAME}` (`bookUrl`)"
+          },
+          {
+            "name": "index_chapters_bookUrl_index",
+            "unique": true,
+            "columnNames": [
+              "bookUrl",
+              "index"
+            ],
+            "orders": [],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_chapters_bookUrl_index` ON `${TABLE_NAME}` (`bookUrl`, `index`)"
+          }
+        ],
+        "foreignKeys": [
+          {
+            "table": "books",
+            "onDelete": "CASCADE",
+            "onUpdate": "NO ACTION",
+            "columns": [
+              "bookUrl"
+            ],
+            "referencedColumns": [
+              "bookUrl"
+            ]
+          }
+        ]
+      },
+      {
+        "tableName": "replace_rules",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL DEFAULT '', `group` TEXT, `pattern` TEXT NOT NULL DEFAULT '', `replacement` TEXT NOT NULL DEFAULT '', `scope` TEXT, `scopeTitle` INTEGER NOT NULL DEFAULT 0, `scopeContent` INTEGER NOT NULL DEFAULT 1, `isEnabled` INTEGER NOT NULL DEFAULT 1, `isRegex` INTEGER NOT NULL DEFAULT 1, `timeoutMillisecond` INTEGER NOT NULL DEFAULT 3000, `sortOrder` INTEGER NOT NULL DEFAULT 0)",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "group",
+            "columnName": "group",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "pattern",
+            "columnName": "pattern",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "replacement",
+            "columnName": "replacement",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "scope",
+            "columnName": "scope",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "scopeTitle",
+            "columnName": "scopeTitle",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "scopeContent",
+            "columnName": "scopeContent",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          },
+          {
+            "fieldPath": "isEnabled",
+            "columnName": "isEnabled",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          },
+          {
+            "fieldPath": "isRegex",
+            "columnName": "isRegex",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "1"
+          },
+          {
+            "fieldPath": "timeoutMillisecond",
+            "columnName": "timeoutMillisecond",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "3000"
+          },
+          {
+            "fieldPath": "order",
+            "columnName": "sortOrder",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [
+          {
+            "name": "index_replace_rules_id",
+            "unique": false,
+            "columnNames": [
+              "id"
+            ],
+            "orders": [],
+            "createSql": "CREATE INDEX IF NOT EXISTS `index_replace_rules_id` ON `${TABLE_NAME}` (`id`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "searchBooks",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookUrl` TEXT NOT NULL, `origin` TEXT NOT NULL, `originName` TEXT NOT NULL, `type` INTEGER NOT NULL, `name` TEXT NOT NULL, `author` TEXT NOT NULL, `kind` TEXT, `coverUrl` TEXT, `intro` TEXT, `wordCount` TEXT, `latestChapterTitle` TEXT, `tocUrl` TEXT NOT NULL, `time` INTEGER NOT NULL, `variable` TEXT, `originOrder` INTEGER NOT NULL, PRIMARY KEY(`bookUrl`), FOREIGN KEY(`origin`) REFERENCES `book_sources`(`bookSourceUrl`) ON UPDATE NO ACTION ON DELETE CASCADE )",
+        "fields": [
+          {
+            "fieldPath": "bookUrl",
+            "columnName": "bookUrl",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "origin",
+            "columnName": "origin",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "originName",
+            "columnName": "originName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "type",
+            "columnName": "type",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "author",
+            "columnName": "author",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "kind",
+            "columnName": "kind",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "coverUrl",
+            "columnName": "coverUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "intro",
+            "columnName": "intro",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "wordCount",
+            "columnName": "wordCount",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "latestChapterTitle",
+            "columnName": "latestChapterTitle",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "tocUrl",
+            "columnName": "tocUrl",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "time",
+            "columnName": "time",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "variable",
+            "columnName": "variable",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "originOrder",
+            "columnName": "originOrder",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "bookUrl"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_searchBooks_bookUrl",
+            "unique": true,
+            "columnNames": [
+              "bookUrl"
+            ],
+            "orders": [],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_searchBooks_bookUrl` ON `${TABLE_NAME}` (`bookUrl`)"
+          },
+          {
+            "name": "index_searchBooks_origin",
+            "unique": false,
+            "columnNames": [
+              "origin"
+            ],
+            "orders": [],
+            "createSql": "CREATE INDEX IF NOT EXISTS `index_searchBooks_origin` ON `${TABLE_NAME}` (`origin`)"
+          }
+        ],
+        "foreignKeys": [
+          {
+            "table": "book_sources",
+            "onDelete": "CASCADE",
+            "onUpdate": "NO ACTION",
+            "columns": [
+              "origin"
+            ],
+            "referencedColumns": [
+              "bookSourceUrl"
+            ]
+          }
+        ]
+      },
+      {
+        "tableName": "search_keywords",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `usage` INTEGER NOT NULL, `lastUseTime` INTEGER NOT NULL, PRIMARY KEY(`word`))",
+        "fields": [
+          {
+            "fieldPath": "word",
+            "columnName": "word",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "usage",
+            "columnName": "usage",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "lastUseTime",
+            "columnName": "lastUseTime",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "word"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_search_keywords_word",
+            "unique": true,
+            "columnNames": [
+              "word"
+            ],
+            "orders": [],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_search_keywords_word` ON `${TABLE_NAME}` (`word`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "cookies",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `cookie` TEXT NOT NULL, PRIMARY KEY(`url`))",
+        "fields": [
+          {
+            "fieldPath": "url",
+            "columnName": "url",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "cookie",
+            "columnName": "cookie",
+            "affinity": "TEXT",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "url"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_cookies_url",
+            "unique": true,
+            "columnNames": [
+              "url"
+            ],
+            "orders": [],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_cookies_url` ON `${TABLE_NAME}` (`url`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "rssSources",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`sourceUrl` TEXT NOT NULL, `sourceName` TEXT NOT NULL, `sourceIcon` TEXT NOT NULL, `sourceGroup` TEXT, `sourceComment` TEXT, `enabled` INTEGER NOT NULL, `variableComment` TEXT, `enabledCookieJar` INTEGER DEFAULT 0, `concurrentRate` TEXT, `header` TEXT, `loginUrl` TEXT, `loginUi` TEXT, `loginCheckJs` TEXT, `sortUrl` TEXT, `singleUrl` INTEGER NOT NULL, `articleStyle` INTEGER NOT NULL, `ruleArticles` TEXT, `ruleNextPage` TEXT, `ruleTitle` TEXT, `rulePubDate` TEXT, `ruleDescription` TEXT, `ruleImage` TEXT, `ruleLink` TEXT, `ruleContent` TEXT, `style` TEXT, `enableJs` INTEGER NOT NULL, `loadWithBaseUrl` INTEGER NOT NULL, `customOrder` INTEGER NOT NULL, PRIMARY KEY(`sourceUrl`))",
+        "fields": [
+          {
+            "fieldPath": "sourceUrl",
+            "columnName": "sourceUrl",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "sourceName",
+            "columnName": "sourceName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "sourceIcon",
+            "columnName": "sourceIcon",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "sourceGroup",
+            "columnName": "sourceGroup",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "sourceComment",
+            "columnName": "sourceComment",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "enabled",
+            "columnName": "enabled",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "variableComment",
+            "columnName": "variableComment",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "enabledCookieJar",
+            "columnName": "enabledCookieJar",
+            "affinity": "INTEGER",
+            "notNull": false,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "concurrentRate",
+            "columnName": "concurrentRate",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "header",
+            "columnName": "header",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginUrl",
+            "columnName": "loginUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginUi",
+            "columnName": "loginUi",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginCheckJs",
+            "columnName": "loginCheckJs",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "sortUrl",
+            "columnName": "sortUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "singleUrl",
+            "columnName": "singleUrl",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "articleStyle",
+            "columnName": "articleStyle",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "ruleArticles",
+            "columnName": "ruleArticles",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleNextPage",
+            "columnName": "ruleNextPage",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleTitle",
+            "columnName": "ruleTitle",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "rulePubDate",
+            "columnName": "rulePubDate",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleDescription",
+            "columnName": "ruleDescription",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleImage",
+            "columnName": "ruleImage",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleLink",
+            "columnName": "ruleLink",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "ruleContent",
+            "columnName": "ruleContent",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "style",
+            "columnName": "style",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "enableJs",
+            "columnName": "enableJs",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "loadWithBaseUrl",
+            "columnName": "loadWithBaseUrl",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "customOrder",
+            "columnName": "customOrder",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "sourceUrl"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_rssSources_sourceUrl",
+            "unique": false,
+            "columnNames": [
+              "sourceUrl"
+            ],
+            "orders": [],
+            "createSql": "CREATE INDEX IF NOT EXISTS `index_rssSources_sourceUrl` ON `${TABLE_NAME}` (`sourceUrl`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "bookmarks",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`time` INTEGER NOT NULL, `bookName` TEXT NOT NULL, `bookAuthor` TEXT NOT NULL, `chapterIndex` INTEGER NOT NULL, `chapterPos` INTEGER NOT NULL, `chapterName` TEXT NOT NULL, `bookText` TEXT NOT NULL, `content` TEXT NOT NULL, PRIMARY KEY(`time`))",
+        "fields": [
+          {
+            "fieldPath": "time",
+            "columnName": "time",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookName",
+            "columnName": "bookName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookAuthor",
+            "columnName": "bookAuthor",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "chapterIndex",
+            "columnName": "chapterIndex",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "chapterPos",
+            "columnName": "chapterPos",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "chapterName",
+            "columnName": "chapterName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookText",
+            "columnName": "bookText",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "content",
+            "columnName": "content",
+            "affinity": "TEXT",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "time"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_bookmarks_bookName_bookAuthor",
+            "unique": false,
+            "columnNames": [
+              "bookName",
+              "bookAuthor"
+            ],
+            "orders": [],
+            "createSql": "CREATE INDEX IF NOT EXISTS `index_bookmarks_bookName_bookAuthor` ON `${TABLE_NAME}` (`bookName`, `bookAuthor`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "rssArticles",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`origin` TEXT NOT NULL, `sort` TEXT NOT NULL, `title` TEXT NOT NULL, `order` INTEGER NOT NULL, `link` TEXT NOT NULL, `pubDate` TEXT, `description` TEXT, `content` TEXT, `image` TEXT, `read` INTEGER NOT NULL, `variable` TEXT, PRIMARY KEY(`origin`, `link`))",
+        "fields": [
+          {
+            "fieldPath": "origin",
+            "columnName": "origin",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "sort",
+            "columnName": "sort",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "title",
+            "columnName": "title",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "order",
+            "columnName": "order",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "link",
+            "columnName": "link",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "pubDate",
+            "columnName": "pubDate",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "description",
+            "columnName": "description",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "content",
+            "columnName": "content",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "image",
+            "columnName": "image",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "read",
+            "columnName": "read",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "variable",
+            "columnName": "variable",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "origin",
+            "link"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "rssReadRecords",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`record` TEXT NOT NULL, `read` INTEGER NOT NULL, PRIMARY KEY(`record`))",
+        "fields": [
+          {
+            "fieldPath": "record",
+            "columnName": "record",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "read",
+            "columnName": "read",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "record"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "rssStars",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`origin` TEXT NOT NULL, `sort` TEXT NOT NULL, `title` TEXT NOT NULL, `starTime` INTEGER NOT NULL, `link` TEXT NOT NULL, `pubDate` TEXT, `description` TEXT, `content` TEXT, `image` TEXT, `variable` TEXT, PRIMARY KEY(`origin`, `link`))",
+        "fields": [
+          {
+            "fieldPath": "origin",
+            "columnName": "origin",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "sort",
+            "columnName": "sort",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "title",
+            "columnName": "title",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "starTime",
+            "columnName": "starTime",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "link",
+            "columnName": "link",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "pubDate",
+            "columnName": "pubDate",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "description",
+            "columnName": "description",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "content",
+            "columnName": "content",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "image",
+            "columnName": "image",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "variable",
+            "columnName": "variable",
+            "affinity": "TEXT",
+            "notNull": false
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "origin",
+            "link"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "txtTocRules",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `rule` TEXT NOT NULL, `serialNumber` INTEGER NOT NULL, `enable` INTEGER NOT NULL, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "rule",
+            "columnName": "rule",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "serialNumber",
+            "columnName": "serialNumber",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "enable",
+            "columnName": "enable",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "readRecord",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`deviceId` TEXT NOT NULL, `bookName` TEXT NOT NULL, `readTime` INTEGER NOT NULL, PRIMARY KEY(`deviceId`, `bookName`))",
+        "fields": [
+          {
+            "fieldPath": "deviceId",
+            "columnName": "deviceId",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "bookName",
+            "columnName": "bookName",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "readTime",
+            "columnName": "readTime",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "deviceId",
+            "bookName"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "httpTTS",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `contentType` TEXT, `concurrentRate` TEXT DEFAULT '0', `loginUrl` TEXT, `loginUi` TEXT, `header` TEXT, `enabledCookieJar` INTEGER DEFAULT 0, `loginCheckJs` TEXT, `lastUpdateTime` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "url",
+            "columnName": "url",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "contentType",
+            "columnName": "contentType",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "concurrentRate",
+            "columnName": "concurrentRate",
+            "affinity": "TEXT",
+            "notNull": false,
+            "defaultValue": "'0'"
+          },
+          {
+            "fieldPath": "loginUrl",
+            "columnName": "loginUrl",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "loginUi",
+            "columnName": "loginUi",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "header",
+            "columnName": "header",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "enabledCookieJar",
+            "columnName": "enabledCookieJar",
+            "affinity": "INTEGER",
+            "notNull": false,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "loginCheckJs",
+            "columnName": "loginCheckJs",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "lastUpdateTime",
+            "columnName": "lastUpdateTime",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "caches",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `value` TEXT, `deadline` INTEGER NOT NULL, PRIMARY KEY(`key`))",
+        "fields": [
+          {
+            "fieldPath": "key",
+            "columnName": "key",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "value",
+            "columnName": "value",
+            "affinity": "TEXT",
+            "notNull": false
+          },
+          {
+            "fieldPath": "deadline",
+            "columnName": "deadline",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "key"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [
+          {
+            "name": "index_caches_key",
+            "unique": true,
+            "columnNames": [
+              "key"
+            ],
+            "orders": [],
+            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_caches_key` ON `${TABLE_NAME}` (`key`)"
+          }
+        ],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "ruleSubs",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `type` INTEGER NOT NULL, `customOrder` INTEGER NOT NULL, `autoUpdate` INTEGER NOT NULL, `update` INTEGER NOT NULL, PRIMARY KEY(`id`))",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "url",
+            "columnName": "url",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "type",
+            "columnName": "type",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "customOrder",
+            "columnName": "customOrder",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "autoUpdate",
+            "columnName": "autoUpdate",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "update",
+            "columnName": "update",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "id"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "keyboardAssists",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` INTEGER NOT NULL DEFAULT 0, `key` TEXT NOT NULL DEFAULT '', `value` TEXT NOT NULL DEFAULT '', `serialNo` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`type`, `key`))",
+        "fields": [
+          {
+            "fieldPath": "type",
+            "columnName": "type",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          },
+          {
+            "fieldPath": "key",
+            "columnName": "key",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "value",
+            "columnName": "value",
+            "affinity": "TEXT",
+            "notNull": true,
+            "defaultValue": "''"
+          },
+          {
+            "fieldPath": "serialNo",
+            "columnName": "serialNo",
+            "affinity": "INTEGER",
+            "notNull": true,
+            "defaultValue": "0"
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "type",
+            "key"
+          ],
+          "autoGenerate": false
+        },
+        "indices": [],
+        "foreignKeys": []
+      }
+    ],
+    "views": [],
+    "setupQueries": [
+      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '524cf3564400bd897a49355afd984ac1')"
+    ]
+  }
+}

+ 145 - 120
app/src/main/assets/help/appHelp.md

@@ -1,190 +1,215 @@
 # 帮助文档
 # 帮助文档
 
 
-## **新人必读** 
+【温馨提醒】 *本帮助可以在“**我的**”——右上角帮助按钮再次打开,更新前一定要做好备份,以免数据丢失!*
 
 
-【温馨提醒】 *本帮助可以在我的-右上角帮助按钮再次打开,更新前一定要做好备份,以免数据丢失!*
+## 新人必读 
 
 
-1. 为什么第一次安装好之后什么东西都没有?
-* 阅读只是一个转码工具,不提供内容,第一次安装app,需要自己手动导入书源,可以从公众号 **[开源阅读]**、QQ群、酷安评论里获取由书友制作分享的书源。
+### 1. 为什么第一次安装好之后什么东西都没有?
+阅读只是一个转码工具,不提供内容,第一次安装 APP,需要自己手动导入书源,可以从公众号 **【开源阅读】**、QQ 群或酷安评论里获取由书友制作分享的书源。
 
 
-2. 正文出现缺字漏字、内容缺失、排版错乱等情况,如何处理?
-* 有可能是净化规则出现问题,先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。
+### 2. 正文出现缺字漏字、内容缺失或排版错乱等情况,如何处理?
+有可能是净化规则出现问题,先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。
 
 
-3. 漫画源看书显示乱码,如何解决?
-* 异次元和阅读是两个不同的软件,**两个软件的源并不通用**,请导入阅读的支持的漫画源!
+### 3. 漫画源看书显示乱码,如何解决?
+【异次元】和【阅读】是两个不同的软件,**两个软件的源并不通用**,请导入【阅读】的支持的漫画源!
 
 
 ## 书源相关
 ## 书源相关
 
 
-1. 如何导入本地书源文件?
-* 下载群文件里的书源文件(书源格式后缀有txt、json,其中json文件某些情况下无法导入,需要修改后缀为txt格式才可导入);
-* 打开阅读软件;
-* 我的 - 点击“书源管理”;
-* 点击右上角选择“本地导入”;
+### 1. 如何导入本地书源文件?
+以导入 QQ 接收到的书源文件为例:
+* 下载群文件里的书源文件;
+* 打开【阅读】软件;
+* 点击“**我的**”——“**书源管理**”;
+* 点击右上角选择“**本地导入**”;
 * 左下角选择书源文件所在的路径;
 * 左下角选择书源文件所在的路径;
 * 点击书源文件导入;
 * 点击书源文件导入;
 * 导入后返回书源管理界面;
 * 导入后返回书源管理界面;
-* 新版qq下载路径:Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/
 
 
-![QQ导入书源](https://cdn.jsdelivr.net/gh/gedoor/gedoor.github.io@master/images/importSource.jpg)
+**【注】** 
+1. *新版 QQ 文件下载路径:`Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/`。*
+2. *书源格式后缀有 .txt 和 .json,其中 .json 文件在某些情况下可能无法导入,需要修改后缀为 .txt 才可导入。*
+
+![QQ 导入书源](https://cdn.jsdelivr.net/gh/gedoor/gedoor.github.io@master/images/importSource.jpg)
 
 
-2. 如何新建大佬发的单独书源?
+### 2. 如何新建大佬发的单独书源?
 * 复制书源代码;
 * 复制书源代码;
 * 打开阅读软件;
 * 打开阅读软件;
-* 我的 - 点击“书源管理”;
-* 右上角选择“新建书源”;
-* 进入新建书源后点击右上角“粘贴源”;
-* 粘贴书源完成后点击上方保存;
+* 点击“**我的**”——“**书源管理**”;
+* 右上角“**⁝**”——“**+ 新建书源**”;
+* 进入后点击右上角“**⁝**”——“**粘贴源**”;
+* 粘贴完成后点击上方保存“**🖫**”按钮;
 * 本次新建单独书源操作完成。
 * 本次新建单独书源操作完成。
-* 注:如果书源有错误或者复制不全会显示格式错误,请重新复制。
 
 
-3. 为什么导入2.0书源后无法阅读?
-* 部分2.0书源并不适用于3.0版本的阅读,建议导入后进行筛选。
+**【注】** *如果书源有错误或者复制不全会显示格式错误,请重新复制。*
 
 
-4. 阅读2.0数据如何导入阅读3.0?
-* 先对阅读2.0的数据进行备份,然后进入阅读3.0,点击“我的”,选择“备份与恢复”,再点击“导入旧版本数据”。
+### 3. 为什么导入 2.0 书源后无法阅读?
+部分 2.0 书源并不适用于 3.0 版本的阅读,建议导入后进行筛选。
 
 
-5. 如何给朋友分享我的书源?
-* 打开阅读软件;
+### 4. 【阅读】2.0 数据如何导入【阅读】3.0?
+先对【阅读】2.0 的数据进行备份,然后进入【阅读】3.0,点击“**我的**”,选择“**备份与恢复**”,再点击“**导入旧版本数据**”。
+
+### 5. 如何给朋友分享我的书源?
+* 打开【阅读】软件;
 * 点击备份;
 * 点击备份;
-* 打开手机自带的文件管理;
-* 手机自带内存根目录找到YueDu3.0文件夹;
-* 找到myBookSource.json长按选择分享;
-* 选择微信分享或者QQ分享;
+* 打开手机系统自带的文件管理;
+* 在手机内置存储根目录找到 `YueDu3.0` 文件夹;
+* 找到 `myBookSource.json`,长按选择分享;
+* 选择微信分享或者 QQ 分享;
 * 选择你要分享的好友点击发送;
 * 选择你要分享的好友点击发送;
-* 好友接收后在手机自带内存根目录找到myBookSource.json文件(最新版QQ 安卓10及以下版本在Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/,安卓11版本用户由于系统限制无法访问data目录,微信在Tencent/MicroMsg/Download);
-* 复制该文件到手机自带内存根目录找到YueDu3.0文件夹(如已有该文件请先删除该文件或者备份到其他地方再复制到文件夹);
-* 打开阅读软件点击恢复。
-* 注:备份路径如已修改过请在修改后的路径下查找书源文件。
+* 好友接收后在手机内置存储根目录找到 `myBookSource.json` 文件;
+* 复制该文件到手机内置存储根目录找到 `YueDu3.0` 文件夹(如已有该文件请先删除该文件或者备份到其他地方再复制到文件夹);
+* 打开【阅读】软件点击恢复。
 
 
-6. 效验书源显示失效就说明书源不能用了吗?
-* 效验书源只是测试书源,可以做个参考,失效了不代表书源不能用了。
+**【注】**
+1. *备份路径如已修改过请在修改后的路径下查找书源文件。*
+2. *Android 10 及以下版本系统,新版 QQ 文件接收路径在 `Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/`,旧版 QQ 文件接收路径则在 `Tencent/QQfile_recv/`;新版微信文件接收路径在 `Android/data/com.tencent.mobileqq/Tencent/MicroMsg/Download`,旧版微信文件接收路径则在 `Tencent/MicroMsg/Download`。*
+3. *Android 11 及以上系统版本用户,由于系统限制,无法访问 `Android/data` 目录。*
 
 
-7. 发现和正版书源能不能使用?
-* 发现和正版书源只能用来找书,看排行榜,不能用来看书,如需看书请切换书源。
+### 6. 效验书源显示失效就说明书源不能用了吗?
+效验书源只是测试书源,可以做为参考,但失效了不代表书源不能用了。
 
 
-8. 为什么书源这么多,发现里却只有一点点?
-* 书源想要在发现界面里显示需要在书源里添加发现规则,并不是所有书源都有发现规则。
+### 7. “发现”和正版书源能不能使用?
+发现和正版书源只能用来找书或看排行榜,不能用来看书,如需看书请切换书源。
+
+### 8. 为什么书源这么多,“发现”里却只有一点点?
+书源想要在发现界面里显示需要在书源里添加发现规则,并不是所有书源都有发现规则。
 
 
 ## 本地书籍相关
 ## 本地书籍相关
-1. 目前阅读支持哪些格式的本地书籍?
-* 目前支持TXT、EPUB格式
 
 
-2. 如何导入本地书籍?
-* 在书架页面点击右上角,选择“添加本地”,授予相关权限后即可导入本地书籍。也可在文件管理器中使用 **阅读** 打开相关书籍。
+### 1. 目前阅读支持哪些格式的本地书籍?
+目前支持 TXT 和 EPUB 格式。
+
+### 2. 如何导入本地书籍?
+在书架页面点击右上角“**⁝**”,选择“**添加本地**”,授予相关权限后即可导入本地书籍。也可在文件管理器中使用【阅读】打开相关书籍。
 
 
-3. 导入TXT文件提示“LoadTocError”或“List is empty”是怎么回事?
-* 请先去应用详情中确认是否授予了阅读“读写手机存储”的权限。
+### 3. 导入 TXT 文件提示“LoadTocError”或“List is empty”是怎么回事?
+* 请先去应用详情中确认是否授予了【阅读】“读写手机存储”的权限。
 * 自动识别目录失败,可能是相关目录规则未开启,请点击右上角的换源按钮手动更换目录规则。
 * 自动识别目录失败,可能是相关目录规则未开启,请点击右上角的换源按钮手动更换目录规则。
-* 如果尝试所有规则均无法识别,请在github上提交issue并附件相关txt文件,也可以发送邮件至i@qnmlgb.trade(标题:legado本地文件章节无法识别,内容对其具体情况进行简要说明,附件上传相关txt文件)。
 
 
-4. 如何下载书籍到本地?
-* 把在线书籍加入到书架后,在书架页面点击右上角,选择“离线缓存”即可。
+如果尝试所有规则均无法识别,请在 GitHub 上提交 Issue 并附上相关 TXT 文件,也可以发送邮件至 i@qnmlgb.trade(标题:legado 本地文件章节无法识别;内容对其具体情况进行简要说明,附件上传相关 TXT 文件)。
+
+### 4. 如何下载书籍到本地?
+把在线书籍加入到书架后,在书架页面点击右上角,选择“**离线缓存**”即可。
 
 
-5. 如何自定义导出的txt/epub文件名称?
-* 点击 **离线缓存** - **导出文件名**.
+### 5. 如何自定义导出的 TXT 或 EPUB 文件名称?
+* 点击“**离线缓存**“——”**导出文件名**“
 * 使用方法:
 * 使用方法:
-  - 导出文件名支持js语法
-  - 可用变量: name - 书名  author-作者
-  - 示例:  
-  > {name+"作者:"+author}  
+  - 导出文件名支持 js 语法
+  - 可用变量: name(书名)和 author(作者)
+  - 示例:
+  > name + "作者:" + author
   - 导出文件名:
   - 导出文件名:
-  >  Legado是最好的在线阅读软件 作者: kunfei.
+  >  Legado 是最好的在线阅读软件 作者: kunfei
 
 
-**注意:** name、author等变量与字符串的拼接都需要在js环境中进行,即必须使用{  } 将变量与字符串包裹起来.
+**【注】** *name、author 等变量与字符串的拼接都需要在 JSON 上下文环境中进行,即必须使用 `{}` 将变量与字符串包裹起来。*
 
 
-6. 为什么我打开本地的TXT文件,显示内容却是乱码?
-* 部分编码在阅读上会识别错误,建议先用文本编辑器转换为常用的UTF-8格式。
+### 6. 为什么我打开本地的 TXT 文件,显示内容却是乱码?
+部分编码在阅读上会识别错误,建议先用文本编辑器转换为常用的 UTF-8 格式。
 
 
-7. 阅读对部分把正文(如所有含引号的句子)识别成标题,如何解决?
-* 点击右上角更换目录规则即可。
+### 7. 阅读对部分把正文(如所有含引号的句子)识别成标题,如何解决?
+点击右上角更换目录规则即可。
 
 
 ## 书籍界面相关
 ## 书籍界面相关
 
 
-1. 如何刷新书架?
-* 在书架界面下拉即可刷新。
+### 1. 如何刷新书架?
+在书架界面下拉即可刷新。
 
 
-2. 书架界面书籍右上角的红色或者灰色背景小数字代表什么?
-* 红色代表书籍有更新,灰色代表无更新,数字代表未读章节。
+### 2. 书架界面书籍右上角的红色或者灰色背景小数字代表什么?
+红色代表书籍有更新,灰色代表无更新,数字代表未读章节。
 
 
-3. 如何查看书籍详情?
-* 长按书籍。
+### 3. 如何查看书籍详情?
+长按书籍即可查看。
 
 
-4. 如何对书架上的书进行删除、切换书架的操作?
-* 书籍详情页操作即可。
+### 4. 如何对书架上的书进行删除、切换书架的操作?
+书籍详情页操作即可。
 
 
-5. 如何禁止或允许某本书更新?
-* 书籍详情页,点击右上角 - “允许更新”。
+### 5. 如何禁止或允许某本书更新?
+书籍详情页,点击右上角——“**允许更新**”。
 
 
-6. 如何更换小说封面、名字、作者或简介?
-* 书籍详情页,点击右上角修改按钮。
+### 6. 如何更换小说封面、名字、作者或简介?
+书籍详情页,点击右上角修改按钮。
 
 
-7. 怎么使用自定义字体?
-* 阅读界面 - 字体-点击右上角选择字体文件路径。
+### 7. 怎么使用自定义字体?
+阅读界面——“**字体**”——点击右上角选择字体文件路径。
 
 
-8. 目前支持哪些格式的字体文件?
-* 目前支持ttf、otf格式。
+### 8. 目前支持哪些格式的字体文件?
+目前支持 TTF 和 OTF 格式。
 
 
-9. 书籍经常“正在加载中”怎么办?
-* 在线书籍出现这个问题通常是由于源质量不好或不兼容引起的,可以换其它源多试试;本地书籍出现这个问题大概率是目录规则问题,手动切换规则可以解决。
+### 9. 书籍经常“正在加载中”怎么办?
+在线书籍出现这个问题通常是由于源质量不好或不兼容引起的,可以换其它源多试试;本地书籍出现这个问题大概率是目录规则问题,手动切换规则可以解决。
 
 
-10. 书籍内容只有标题,正文内容是路径怎么办?
-* 通常是缓存路径引起的,更换缓存路径即可。
+### 10. 书籍内容只有标题,正文内容是路径怎么办?
+通常是缓存路径引起的,更换缓存路径即可。
 
 
-11. 看书时如遇到“目录为空”、“加载失败”和长串英文等情况怎么办?
-* 在线书籍一般是书源问题,切换或更新书源即可。本地书籍请尝试手动更换目录规则。
+### 11. 看书时如遇到“目录为空”、“加载失败”或长串英文等情况怎么办?
+在线书籍一般是书源问题,切换或更新书源即可。本地书籍请尝试手动更换目录规则。
 
 
-12. 为什么每一章的最后一页,阅读的文字和横线背景总是对不齐?
-* 请在 设置-文字底部对齐 选项中关闭底部对齐,再调整排版。
+### 12. 为什么每一章的最后一页,阅读的文字和横线背景总是对不齐?
+请在“**设置**”——“**文字底部对齐**”选项中关闭底部对齐,再调整排版。
 
 
-13. 漫画源或图片章节只能看到第一页,如何解决?
-* 请先查看原网页是否正常,若正常,请在书籍阅读界面点击右上角的 **⁝** 按钮,在弹出的菜单中,选择 **翻页动画(本书)**,将翻页动画更改为 **滚动**。
+### 13. 漫画源或图片章节只能看到第一页,如何解决?
+请先查看原网页是否正常,若正常,请在书籍阅读界面点击右上角的“**⁝**”按钮,在弹出的菜单中,选择“**翻页动画(本书)**”,将翻页动画更改为“**滚动**”。
 
 
-14. 阅读图片章节、漫画或epub插图时,图片被缩放到一页中,以至无法看清,如何处理?
-* 临时处理方案:长按图片可以进行双指缩放。图片章节请先参考Q13中的方案将翻页动画更改为**滚动**
-* 3.0旧版可以点击书籍界面的章节标题进入 **编辑书源** 界面,在 正文-图片样式 中填入 *full*,保存更改,刷新当前章节即可。
-* 3.0新版可以直接在书籍阅读界面点击右上角的 **⁝** 按钮,选择 图片样式- *full*.
+### 14. 阅读图片章节、漫画或 EPUB 插图时,图片被缩放到一页中,以至无法看清,如何处理?
+* 临时处理方案:长按图片可以进行双指缩放。图片章节请先参考 Q13 中的方案将翻页动画更改为“**滚动**”。
+* 3.0 旧版可以点击书籍界面的章节标题进入“**编辑书源**”界面,在“**正文**”——“**图片样式**”中填入 *`full`*,保存更改,刷新当前章节即可。
+* 3.0 新版可以直接在书籍阅读界面点击右上角的“**⁝**”按钮,选择“**图片样式**”——***`full`***。
 
 
 
 
 ## 替换净化相关
 ## 替换净化相关
-1. 替换净化是什么?
-* 替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。
 
 
-2. 如何自己填写净化替换规则?
-* 第一行:替换规则名称 - 根据自己需求对替换净化规则进行命名;
-* 第二行:分组 - 净化规则的分组组别;
-* 第三行:替换规则 - 填写需要被替换的内容;
-* 第四行:替换为 - 填写想替换成的内容(如不填则默认表示删除第三行里填写的内容);
-* 第五行:替换范围,选填书名或者源名 - 填写此替换净化规则需要对哪本书籍或者哪个书源生效(如不填则对所有书籍和书源生效)。
-* 注:如常规去除方法去除不掉,则需要勾选“使用正则表达式”,同时第三行里的替换规则也需要按照正则表达式来填写(正则表达式填写方法可自行百度学习)。
+### 1. 替换净化是什么?
+替换净化可以去除书籍内容里的广告、错别字、屏蔽词等。
+
+### 2. 如何自己填写净化替换规则?
+* 第一行:替换规则名称。请根据自己需求对替换净化规则进行命名;
+* 第二行:分组。净化规则的分组组别;
+* 第三行:替换规则。填写需要被替换的内容;
+* 第四行:替换为。填写想替换成的内容(如不填则默认表示删除第三行里填写的内容);
+* 第五行:替换范围,选填书名或者源名。填写此替换净化规则需要对哪本书籍或者哪个书源生效(如不填则对所有书籍和书源生效)。
+
+**【注】** *如常规去除方法去除不掉,则需要勾选“使用正则表达式”,同时第三行里的替换规则也需要按照正则表达式来填写(正则表达式填写方法可自行网上搜索学习)。*
 
 
 
 
 ## 备份相关
 ## 备份相关
 
 
-1. 云备份在哪?
-* 我的 - 备份与恢复 - WebDav设置。
+### 1. 云备份在哪?
+“**我的**”——“**备份与恢复**”——“**WebDav 设置**”。
+
+### 2. 如何操作进行云备份?
+* 侧栏设置,WebDav 设置;
+* 正确填写 WebDAV 服务器地址、账号和密码;
+* 无需操作,APP 默认每天自动云备份一次。
+
+作者在此诚挚推荐使用【坚果云】进行 WebDav 备份。
 
 
-2. 如何操作进行云备份?
-* 侧栏设置,WebDav设置;
-* 正确填写WebDAV 服务器地址、WebDAV 账号、WebDAV 密码;(要获得这三项的信息,需要注册一个坚果云账号,如果直接在手机上注册,坚果云会让你下载app,过程比较麻烦,为了一步到位,最好是在电脑上打开这个注册链接:https://www.jianguoyun.com/d/signup ;注册后,进入坚果云;点击右上角账户名处选择 “账户信息”,然后选择“安全选项”;在“安全选项” 中找到“第三方应用管理”,并选择“添加应用”,输入名称如“阅读”后,会生成密码,选择完成;其中 https://dav.jianguoyun.com/dav/ 就是填入“WebDAV 服务器地址”的内容,“使用情况”后面的邮箱地址就是你的“WebDAV 账号”,点击显示密码后得到的密码就是你的“WebDAV 密码”。)
-* 无需操作,APP默认每天自动云备份一次。
+如果直接在手机上注册,须下载【坚果云】APP,步骤较为繁琐。推荐在电脑上进行操作:
+1. 打开注册链接:https://www.jianguoyun.com/d/signup ;
+2. 注册后,进入坚果云;
+3. 点击右上角账户名处选择“**账户信息**”,然后选择“**安全选项**”;
+4. 在“**安全选项**”中找到“**第三方应用管理**”,并选择“**添加应用**”,输入名称(如“阅读”)后,会生成密码,选择完成;
+5. 其中 `https://dav.jianguoyun.com/dav/` 就是填入“**WebDAV 服务器地址**”的内容,“**使用情况**”后面的邮箱地址就是你的“**WebDAV 账号**”,点击“**显示密码**“后得到的密码就是你的“**WebDAV 密码**”。
 
 
-3. 关于云备份的相关说明
-* 在正确设置好云备份的情况下,APP默认每天自动云备份一次,当日多次手动云备份会对当日的旧云备份文件进行覆盖,并不会覆盖之前及之后不同日期的备份文件,每天所自动云备份的文件会按照日期进行命名。
+### 3. 关于云备份的相关说明
 
 
-4. 本地备份和云备份都能备份哪些东西?
-* 书架、看书进度、搜索记录、书源、替换、APP设置等都会备份,基本涵盖所有内容。
+在正确设置好云备份的情况下,APP 默认每天自动云备份一次,当日多次手动云备份会对当日的旧云备份文件进行覆盖,并不会覆盖之前及之后不同日期的备份文件,每天所自动云备份的文件会按照日期进行命名。
 
 
-5. 出现某些未知bug怎么办?
-* 清除软件数据试试看,不行再进行反馈。
+### 4. 本地备份和云备份都能备份哪些东西?
+书架、看书进度、搜索记录、书源、替换和 APP 设置等都会备份,基本涵盖所有内容。
+
+### 5. 出现某些未知 Bug 怎么办?
+清除软件数据试试看,不行再进行反馈。
 
 
 
 
 ## 其他
 ## 其他
-1. 如何听书?
-* 可以使用手机自带的朗读引擎,也可使用第三方如谷歌、小米等朗读引擎。
-* 【具体操作:安装-系统设置-其他高级设置-辅助功能-TTS输出-选择安装的朗读引擎(不同品牌手机的操作方法及步骤也不同,视情况而定)。】
 
 
-2. 如何设置屏幕方向、屏幕显示时长、显示/隐藏状态栏、显示/隐藏导航栏、音量键翻页、长按选择文本、点击总是翻下一页、自定义翻页案件?
-* 阅读界面,设置(可上划,下面还有其他设置)。
+### 1. 如何听书?
+可以使用手机自带的朗读引擎,也可使用第三方如 Google(谷歌)或小米等朗读引擎。
+
+【具体操作】*安装——系统设置——其他高级设置——辅助功能——TTS 输出——选择安装的朗读引擎(不同品牌手机的操作方法及步骤也不同,视情况而定)。*
+
+### 2. 如何设置屏幕方向、屏幕显示时长、显示/隐藏状态栏、显示/隐藏导航栏、音量键翻页、长按选择文本、点击总是翻下一页或自定义翻页按键?
+阅读界面——“**设置**”(可上划,下面还有其他设置)。
 
 
-3. 搜索的时候感觉手机卡顿,如何解决?
-* 我的 - 其他设置 - “更新和搜索线程数”调低。
+### 3. 搜索的时候感觉手机卡顿,如何解决?
+“**我的**”——“**其他设置**”——调低“**更新和搜索线程数**”。

+ 4 - 0
app/src/main/assets/updateLog.md

@@ -11,6 +11,10 @@
 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则或简繁转换出现问题。
 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
 
 
+**2022/06/05**
+
+* 添加源变量说明,输入源变量界面显示说明
+
 **2022/06/01**
 **2022/06/01**
 
 
 * 更新cronet: 102.0.5005.78
 * 更新cronet: 102.0.5005.78

+ 3 - 2
app/src/main/java/io/legado/app/data/AppDatabase.kt

@@ -20,7 +20,7 @@ val appDb by lazy {
 }
 }
 
 
 @Database(
 @Database(
-    version = 49,
+    version = 50,
     exportSchema = true,
     exportSchema = true,
     entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
     entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class,
         ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
         ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
@@ -33,7 +33,8 @@ val appDb by lazy {
         AutoMigration(from = 45, to = 46),
         AutoMigration(from = 45, to = 46),
         AutoMigration(from = 46, to = 47),
         AutoMigration(from = 46, to = 47),
         AutoMigration(from = 47, to = 48),
         AutoMigration(from = 47, to = 48),
-        AutoMigration(from = 48, to = 49)
+        AutoMigration(from = 48, to = 49),
+        AutoMigration(from = 49, to = 50)
     ]
     ]
 )
 )
 abstract class AppDatabase : RoomDatabase() {
 abstract class AppDatabase : RoomDatabase() {

+ 10 - 0
app/src/main/java/io/legado/app/data/entities/BookSource.kt

@@ -54,6 +54,8 @@ data class BookSource(
     var loginCheckJs: String? = null,
     var loginCheckJs: String? = null,
     // 注释
     // 注释
     var bookSourceComment: String? = null,
     var bookSourceComment: String? = null,
+    // 自定义变量说明
+    var variableComment: String? = null,
     // 最后更新时间,用于排序
     // 最后更新时间,用于排序
     var lastUpdateTime: Long = 0,
     var lastUpdateTime: Long = 0,
     // 响应时间,用于排序
     // 响应时间,用于排序
@@ -211,6 +213,14 @@ data class BookSource(
         }?.joinToString() ?: ""
         }?.joinToString() ?: ""
     }
     }
 
 
+    fun getDisplayVariableComment(otherComment: String): String {
+        return if (variableComment.isNullOrBlank()) {
+            otherComment
+        } else {
+            "${variableComment}\n$otherComment"
+        }
+    }
+
     fun equal(source: BookSource) =
     fun equal(source: BookSource) =
         equal(bookSourceName, source.bookSourceName)
         equal(bookSourceName, source.bookSourceName)
                 && equal(bookSourceUrl, source.bookSourceUrl)
                 && equal(bookSourceUrl, source.bookSourceUrl)

+ 27 - 6
app/src/main/java/io/legado/app/data/entities/RssSource.kt

@@ -15,22 +15,35 @@ import splitties.init.appCtx
 data class RssSource(
 data class RssSource(
     @PrimaryKey
     @PrimaryKey
     var sourceUrl: String = "",
     var sourceUrl: String = "",
+    // 名称
     var sourceName: String = "",
     var sourceName: String = "",
+    // 图标
     var sourceIcon: String = "",
     var sourceIcon: String = "",
+    // 分组
     var sourceGroup: String? = null,
     var sourceGroup: String? = null,
+    // 注释
     var sourceComment: String? = null,
     var sourceComment: String? = null,
+    // 是否启用
     var enabled: Boolean = true,
     var enabled: Boolean = true,
+    // 自定义变量说明
+    var variableComment: String? = null,
     @ColumnInfo(defaultValue = "0")
     @ColumnInfo(defaultValue = "0")
     override var enabledCookieJar: Boolean? = false,
     override var enabledCookieJar: Boolean? = false,
-    override var concurrentRate: String? = null,    //并发率
-    override var header: String? = null,            // 请求头
-    override var loginUrl: String? = null,          // 登录地址
-    override var loginUi: String? = null,               //登录UI
-    var loginCheckJs: String? = null,               //登录检测js
+    //并发率
+    override var concurrentRate: String? = null,
+    // 请求头
+    override var header: String? = null,
+    // 登录地址
+    override var loginUrl: String? = null,
+    //登录UI
+    override var loginUi: String? = null,
+    //登录检测js
+    var loginCheckJs: String? = null,
     var sortUrl: String? = null,
     var sortUrl: String? = null,
     var singleUrl: Boolean = false,
     var singleUrl: Boolean = false,
     /*列表规则*/
     /*列表规则*/
-    var articleStyle: Int = 0,                      //列表样式,0,1,2
+    //列表样式,0,1,2
+    var articleStyle: Int = 0,
     var ruleArticles: String? = null,
     var ruleArticles: String? = null,
     var ruleNextPage: String? = null,
     var ruleNextPage: String? = null,
     var ruleTitle: String? = null,
     var ruleTitle: String? = null,
@@ -131,6 +144,14 @@ data class RssSource(
         }
         }
     }
     }
 
 
+    fun getDisplayVariableComment(otherComment: String): String {
+        return if (variableComment.isNullOrBlank()) {
+            otherComment
+        } else {
+            "${variableComment}\n$otherComment"
+        }
+    }
+
     @Suppress("MemberVisibilityCanBePrivate")
     @Suppress("MemberVisibilityCanBePrivate")
     companion object {
     companion object {
 
 

+ 3 - 4
app/src/main/java/io/legado/app/model/localBook/EpubFile.kt

@@ -122,11 +122,10 @@ class EpubFile(var book: Book) {
 
 
     private fun getContent(chapter: BookChapter): String? {
     private fun getContent(chapter: BookChapter): String? {
          /**
          /**
-          * <image width="1038" height="670" xlink:href="cover.jpeg"/>
-          * <img width="1038" height="670" src="cover.jpeg"/>
-          * titlepage.xhtml
+          * <image width="1038" height="670" xlink:href="..."/>
+          * ...titlepage.xhtml
           */
           */
-        if (chapter.url == "titlepage.xhtml") {
+        if (chapter.url.contains("titlepage.xhtml")) {
             return "<img src=\"cover.jpeg\" />"
             return "<img src=\"cover.jpeg\" />"
         }
         }
         /*获取当前章节文本*/
         /*获取当前章节文本*/

+ 2 - 1
app/src/main/java/io/legado/app/model/localBook/LocalBook.kt

@@ -76,7 +76,8 @@ object LocalBook {
         if (chapters.isEmpty()) {
         if (chapters.isEmpty()) {
             throw TocEmptyException(appCtx.getString(R.string.chapter_list_empty))
             throw TocEmptyException(appCtx.getString(R.string.chapter_list_empty))
         }
         }
-        return chapters
+        val lh = LinkedHashSet(chapters)
+        return ArrayList(lh)
     }
     }
 
 
     fun getContent(book: Book, chapter: BookChapter): String? {
     fun getContent(book: Book, chapter: BookChapter): String? {

+ 5 - 1
app/src/main/java/io/legado/app/ui/book/cache/CacheViewModel.kt

@@ -49,7 +49,11 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
         val bindings = SimpleBindings()
         val bindings = SimpleBindings()
         bindings["name"] = book.name
         bindings["name"] = book.name
         bindings["author"] = book.getRealAuthor()
         bindings["author"] = book.getRealAuthor()
-        return AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString()
+        return kotlin.runCatching {
+            AppConst.SCRIPT_ENGINE.eval(jsStr, bindings).toString()
+        }.onFailure {
+            context.toastOnUi("书名规则错误\n${it.localizedMessage}")
+        }.getOrDefault("${book.name} 作者:${book.getRealAuthor()}")
     }
     }
 
 
     fun export(path: String, book: Book) {
     fun export(path: String, book: Book) {

+ 18 - 4
app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt

@@ -247,7 +247,11 @@ class BookInfoActivity :
                 binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading))
                 binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading))
             }
             }
             chapterList.isNullOrEmpty() -> {
             chapterList.isNullOrEmpty() -> {
-                binding.tvToc.text = if (viewModel.isImportBookOnLine) getString(R.string.click_read_button_load) else getString(R.string.toc_s, getString(R.string.error_load_toc))
+                binding.tvToc.text =
+                    if (viewModel.isImportBookOnLine) getString(R.string.click_read_button_load) else getString(
+                        R.string.toc_s,
+                        getString(R.string.error_load_toc)
+                    )
             }
             }
             else -> {
             else -> {
                 viewModel.bookData.value?.let {
                 viewModel.bookData.value?.let {
@@ -358,9 +362,14 @@ class BookInfoActivity :
 
 
     private fun setSourceVariable() {
     private fun setSourceVariable() {
         launch {
         launch {
-            val variable = withContext(IO) { viewModel.bookSource?.getVariable() }
+            val source = viewModel.bookSource
+            if (source == null) {
+                toastOnUi("书源不存在")
+                return@launch
+            }
+            val variable = withContext(IO) { source.getVariable() }
             alert(R.string.set_source_variable) {
             alert(R.string.set_source_variable) {
-                setMessage("源变量可在js中通过source.getVariable()获取")
+                setMessage(source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取"))
                 val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
                 val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
                     editView.hint = "source variable"
                     editView.hint = "source variable"
                     editView.setText(variable)
                     editView.setText(variable)
@@ -379,9 +388,14 @@ class BookInfoActivity :
 
 
     private fun setBookVariable() {
     private fun setBookVariable() {
         launch {
         launch {
+            val source = viewModel.bookSource
+            if (source == null) {
+                toastOnUi("书源不存在")
+                return@launch
+            }
             val variable = withContext(IO) { viewModel.bookData.value?.getVariable("custom") }
             val variable = withContext(IO) { viewModel.bookData.value?.getVariable("custom") }
             alert(R.string.set_source_variable) {
             alert(R.string.set_source_variable) {
-                setMessage("""书籍变量可在js中通过book.getVariable("custom")获取""")
+                setMessage(source.getDisplayVariableComment("""书籍变量可在js中通过book.getVariable("custom")获取"""))
                 val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
                 val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
                     editView.hint = "book variable"
                     editView.hint = "book variable"
                     editView.setText(variable)
                     editView.setText(variable)

+ 3 - 7
app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt

@@ -215,13 +215,8 @@ class BookSourceEditActivity :
             add(EditEntity("loginCheckJs", source?.loginCheckJs, R.string.login_check_js))
             add(EditEntity("loginCheckJs", source?.loginCheckJs, R.string.login_check_js))
             add(EditEntity("bookUrlPattern", source?.bookUrlPattern, R.string.book_url_pattern))
             add(EditEntity("bookUrlPattern", source?.bookUrlPattern, R.string.book_url_pattern))
             add(EditEntity("header", source?.header, R.string.source_http_header))
             add(EditEntity("header", source?.header, R.string.source_http_header))
-            add(
-                EditEntity(
-                    "concurrentRate",
-                    source?.concurrentRate,
-                    R.string.source_concurrent_rate
-                )
-            )
+            add(EditEntity("variableComment", source?.variableComment, R.string.variable_comment))
+            add(EditEntity("concurrentRate", source?.concurrentRate, R.string.concurrent_rate))
         }
         }
         //搜索
         //搜索
         val sr = source?.getSearchRule()
         val sr = source?.getSearchRule()
@@ -328,6 +323,7 @@ class BookSourceEditActivity :
                 "header" -> source.header = it.value
                 "header" -> source.header = it.value
                 "bookSourceComment" -> source.bookSourceComment = it.value ?: ""
                 "bookSourceComment" -> source.bookSourceComment = it.value ?: ""
                 "concurrentRate" -> source.concurrentRate = it.value
                 "concurrentRate" -> source.concurrentRate = it.value
+                "variableComment" -> source.variableComment = it.value
             }
             }
         }
         }
         searchEntities.forEach {
         searchEntities.forEach {

+ 8 - 6
app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt

@@ -17,11 +17,8 @@ import io.legado.app.lib.dialogs.alert
 import io.legado.app.lib.theme.accentColor
 import io.legado.app.lib.theme.accentColor
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.login.SourceLoginActivity
 import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
 import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
-import io.legado.app.utils.StartActivityContract
-import io.legado.app.utils.gone
-import io.legado.app.utils.startActivity
+import io.legado.app.utils.*
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
-import io.legado.app.utils.visible
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withContext
@@ -106,9 +103,14 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
 
 
     private fun setSourceVariable() {
     private fun setSourceVariable() {
         launch {
         launch {
-            val variable = withContext(Dispatchers.IO) { viewModel.rssSource?.getVariable() }
+            val source = viewModel.rssSource
+            if (source == null) {
+                toastOnUi("源不存在")
+                return@launch
+            }
+            val variable = withContext(Dispatchers.IO) { source.getVariable() }
             alert(R.string.set_source_variable) {
             alert(R.string.set_source_variable) {
-                setMessage("源变量可在js中通过source.getVariable()获取")
+                setMessage(source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取"))
                 val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
                 val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply {
                     editView.hint = "source variable"
                     editView.hint = "source variable"
                     editView.setText(variable)
                     editView.setText(variable)

+ 1 - 1
app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt

@@ -315,7 +315,7 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
             return true
             return true
         }
         }
 
 
-        @Suppress("DEPRECATION")
+        @Suppress("DEPRECATION", "OVERRIDE_DEPRECATION")
         override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
         override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
             url?.let {
             url?.let {
                 return shouldOverrideUrlLoading(Uri.parse(it))
                 return shouldOverrideUrlLoading(Uri.parse(it))

+ 3 - 5
app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt

@@ -170,11 +170,8 @@ class RssSourceEditActivity :
             add(EditEntity("loginUi", source?.loginUi, R.string.login_ui))
             add(EditEntity("loginUi", source?.loginUi, R.string.login_ui))
             add(EditEntity("loginCheckJs", source?.loginCheckJs, R.string.login_check_js))
             add(EditEntity("loginCheckJs", source?.loginCheckJs, R.string.login_check_js))
             add(EditEntity("header", source?.header, R.string.source_http_header))
             add(EditEntity("header", source?.header, R.string.source_http_header))
-            add(
-                EditEntity(
-                    "concurrentRate", source?.concurrentRate, R.string.source_concurrent_rate
-                )
-            )
+            add(EditEntity("variableComment", source?.variableComment, R.string.variable_comment))
+            add(EditEntity("concurrentRate", source?.concurrentRate, R.string.concurrent_rate))
             add(EditEntity("sortUrl", source?.sortUrl, R.string.sort_url))
             add(EditEntity("sortUrl", source?.sortUrl, R.string.sort_url))
             add(EditEntity("ruleArticles", source?.ruleArticles, R.string.r_articles))
             add(EditEntity("ruleArticles", source?.ruleArticles, R.string.r_articles))
             add(EditEntity("ruleNextPage", source?.ruleNextPage, R.string.r_next))
             add(EditEntity("ruleNextPage", source?.ruleNextPage, R.string.r_next))
@@ -207,6 +204,7 @@ class RssSourceEditActivity :
                 "loginUi" -> source.loginUi = it.value
                 "loginUi" -> source.loginUi = it.value
                 "loginCheckJs" -> source.loginCheckJs = it.value
                 "loginCheckJs" -> source.loginCheckJs = it.value
                 "header" -> source.header = it.value
                 "header" -> source.header = it.value
+                "variableComment" -> source.variableComment = it.value
                 "concurrentRate" -> source.concurrentRate = it.value
                 "concurrentRate" -> source.concurrentRate = it.value
                 "sortUrl" -> source.sortUrl = it.value
                 "sortUrl" -> source.sortUrl = it.value
                 "ruleArticles" -> source.ruleArticles = it.value
                 "ruleArticles" -> source.ruleArticles = it.value

+ 2 - 1
app/src/main/res/values-es-rES/strings.xml

@@ -388,7 +388,7 @@
     <string name="source_group">源分组(sourceGroup)</string>
     <string name="source_group">源分组(sourceGroup)</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
-    <string name="source_concurrent_rate">并发率(concurrentRate)</string>
+    <string name="concurrent_rate">并发率(concurrentRate)</string>
     <string name="sort_url">分类Url(sortUrl)</string>
     <string name="sort_url">分类Url(sortUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_ui">登录UI(loginUi)</string>
     <string name="login_ui">登录UI(loginUi)</string>
@@ -995,4 +995,5 @@
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>

+ 2 - 1
app/src/main/res/values-ja-rJP/strings.xml

@@ -392,7 +392,7 @@
     <string name="source_group">源分组(sourceGroup)</string>
     <string name="source_group">源分组(sourceGroup)</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
-    <string name="source_concurrent_rate">并发率(concurrentRate)</string>
+    <string name="concurrent_rate">并发率(concurrentRate)</string>
     <string name="sort_url">分类Url(sortUrl)</string>
     <string name="sort_url">分类Url(sortUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_ui">登录UI(loginUi)</string>
     <string name="login_ui">登录UI(loginUi)</string>
@@ -998,4 +998,5 @@
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>

+ 2 - 1
app/src/main/res/values-pt-rBR/strings.xml

@@ -390,7 +390,7 @@
     <string name="source_group">源分组(fonteGrupo)</string>
     <string name="source_group">源分组(fonteGrupo)</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
-    <string name="source_concurrent_rate">并发率(taxaSimultânea)</string>
+    <string name="concurrent_rate">并发率(taxaSimultânea)</string>
     <string name="sort_url">分类Url(ordenarUrl)</string>
     <string name="sort_url">分类Url(ordenarUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_ui">登UI(loginIU)</string>
     <string name="login_ui">登UI(loginIU)</string>
@@ -998,4 +998,5 @@
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>

+ 2 - 1
app/src/main/res/values-zh-rHK/strings.xml

@@ -388,7 +388,7 @@
     <string name="source_url">源URL (sourceUrl)</string>
     <string name="source_url">源URL (sourceUrl)</string>
     <string name="source_group">源分組 (sourceGroup)</string>
     <string name="source_group">源分組 (sourceGroup)</string>
     <string name="sort_url">分類 Url(sortUrl)</string>
     <string name="sort_url">分類 Url(sortUrl)</string>
-    <string name="source_concurrent_rate">並發率(concurrentRate)</string>
+    <string name="concurrent_rate">並發率(concurrentRate)</string>
     <string name="login_url">登錄 URL(loginUrl)</string>
     <string name="login_url">登錄 URL(loginUrl)</string>
     <string name="login_ui">登錄UI(loginUi)</string>
     <string name="login_ui">登錄UI(loginUi)</string>
     <string name="login_check_js">登錄檢查JS(loginCheckJs)</string>
     <string name="login_check_js">登錄檢查JS(loginCheckJs)</string>
@@ -995,4 +995,5 @@
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">图片解码失败</string>
     <string name="error_decode_bitmap">图片解码失败</string>
     <string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
     <string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>

+ 2 - 1
app/src/main/res/values-zh-rTW/strings.xml

@@ -391,7 +391,7 @@
     <string name="source_group">源分組(sourceGroup)</string>
     <string name="source_group">源分組(sourceGroup)</string>
     <string name="diy_source_group">自訂源分組</string>
     <string name="diy_source_group">自訂源分組</string>
     <string name="diy_edit_source_group">輸入自訂源分組名稱</string>
     <string name="diy_edit_source_group">輸入自訂源分組名稱</string>
-    <string name="source_concurrent_rate">並發率(concurrentRate)</string>
+    <string name="concurrent_rate">並發率(concurrentRate)</string>
     <string name="sort_url">分類Url(sortUrl)</string>
     <string name="sort_url">分類Url(sortUrl)</string>
     <string name="login_url">登入URL(loginUrl)</string>
     <string name="login_url">登入URL(loginUrl)</string>
     <string name="login_ui">登入UI(loginUi)</string>
     <string name="login_ui">登入UI(loginUi)</string>
@@ -997,4 +997,5 @@
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">图片解码失败</string>
     <string name="error_decode_bitmap">图片解码失败</string>
     <string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
     <string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>

+ 203 - 202
app/src/main/res/values-zh/strings.xml

@@ -2,20 +2,20 @@
     <!--App-->
     <!--App-->
     <string name="app_name">阅读</string>
     <string name="app_name">阅读</string>
     <string name="receiving_shared_label">阅读·搜索</string>
     <string name="receiving_shared_label">阅读·搜索</string>
-    <string name="tip_perm_request_storage">阅读需要访问存储卡权限,请前往“设置”—“应用权限”—打开所需权限</string>
+    <string name="tip_perm_request_storage">阅读需要访问存储卡权限,请前往“设置”—“应用权限”,打开所需权限</string>
 
 
     <!--Other-->
     <!--Other-->
     <string name="menu_backup">Home</string>
     <string name="menu_backup">Home</string>
     <string name="menu_restore">恢复</string>
     <string name="menu_restore">恢复</string>
     <string name="menu_import_old">导入阅读数据</string>
     <string name="menu_import_old">导入阅读数据</string>
     <string name="webdav_cache_backup">离线缓存书籍备份</string>
     <string name="webdav_cache_backup">离线缓存书籍备份</string>
-    <string name="webdav_cache_backup_s">导出本地同时备份到legado文件夹下exports目录</string>
+    <string name="webdav_cache_backup_s">导出本地同时备份到 legado 文件夹下的 exports 目录</string>
     <string name="backup_path">备份路径</string>
     <string name="backup_path">备份路径</string>
     <string name="select_backup_path">请选择备份路径</string>
     <string name="select_backup_path">请选择备份路径</string>
     <string name="menu_import_old_version">导入旧版数据</string>
     <string name="menu_import_old_version">导入旧版数据</string>
-    <string name="menu_import_github">导入Github数据</string>
+    <string name="menu_import_github">导入 Github 数据</string>
     <string name="menu_replace_rule">净化替换</string>
     <string name="menu_replace_rule">净化替换</string>
-    <string name="menu_send">Send</string>
+    <string name="menu_send">发送</string>
 
 
     <string name="dialog_title">提示</string>
     <string name="dialog_title">提示</string>
     <string name="dialog_cancel">取消</string>
     <string name="dialog_cancel">取消</string>
@@ -59,7 +59,7 @@
     <string name="book_local">添加本地</string>
     <string name="book_local">添加本地</string>
     <string name="book_source">书源</string>
     <string name="book_source">书源</string>
     <string name="book_source_manage">书源管理</string>
     <string name="book_source_manage">书源管理</string>
-    <string name="book_source_manage_desc">新建/导入/编辑/管理书源</string>
+    <string name="book_source_manage_desc">新建、导入、编辑或管理书源</string>
     <string name="setting">设置</string>
     <string name="setting">设置</string>
     <string name="theme_setting">主题设置</string>
     <string name="theme_setting">主题设置</string>
     <string name="theme_setting_s">与界面/颜色相关的一些设置</string>
     <string name="theme_setting_s">与界面/颜色相关的一些设置</string>
@@ -68,33 +68,33 @@
     <string name="about">关于</string>
     <string name="about">关于</string>
     <string name="donate">捐赠</string>
     <string name="donate">捐赠</string>
     <string name="exit">退出</string>
     <string name="exit">退出</string>
-    <string name="exit_no_save">尚未保存,是否继续编辑</string>
+    <string name="exit_no_save">尚未保存,是否继续编辑</string>
     <string name="read_style">阅读样式设置</string>
     <string name="read_style">阅读样式设置</string>
     <string name="version">版本</string>
     <string name="version">版本</string>
     <string name="local">本地</string>
     <string name="local">本地</string>
     <string name="search">搜索</string>
     <string name="search">搜索</string>
-    <string name="origin_format">来源: %s</string>
-    <string name="read_dur_progress">最近: %s</string>
+    <string name="origin_format">来源:%s</string>
+    <string name="read_dur_progress">最近:%s</string>
     <string name="book_name">书名</string>
     <string name="book_name">书名</string>
-    <string name="lasted_show">最新: %s</string>
+    <string name="lasted_show">最新:%s</string>
     <string name="check_add_bookshelf">是否将《%s》放入书架?</string>
     <string name="check_add_bookshelf">是否将《%s》放入书架?</string>
-    <string name="import_books_count">共%s个Text文件</string>
+    <string name="import_books_count">共 %s 个文本文件</string>
     <string name="is_loading">加载中…</string>
     <string name="is_loading">加载中…</string>
     <string name="retry">重试</string>
     <string name="retry">重试</string>
     <string name="web_service">Web 服务</string>
     <string name="web_service">Web 服务</string>
-    <string name="web_service_desc">浏览器写源,看书</string>
-    <string name="web_edit_source">web编辑书源</string>
+    <string name="web_service_desc">用浏览器写源或看书</string>
+    <string name="web_edit_source">Web 编辑书源</string>
     <string name="offline_cache">离线缓存</string>
     <string name="offline_cache">离线缓存</string>
     <string name="offline_cache_t">离线缓存</string>
     <string name="offline_cache_t">离线缓存</string>
     <string name="offline_cache_s">缓存选择的章节到本地</string>
     <string name="offline_cache_s">缓存选择的章节到本地</string>
     <string name="change_origin">换源</string>
     <string name="change_origin">换源</string>
     <string name="about_description">
     <string name="about_description">
-        \u3000\u3000这是一款使用Kotlin全新开发的开源的阅读软件,欢迎您的加入。关注公众号[开源阅读]!
+        \u3000\u3000这是一款使用 Kotlin 全新开发的开源的阅读软件,欢迎您的加入。关注公众号【开源阅读】!
     </string>
     </string>
     <string name="app_share_description">
     <string name="app_share_description">
-        阅读3.0下载地址:\nhttps://www.coolapk.com/apk/256030
+        阅读 3.0 下载地址:\nhttps://www.coolapk.com/apk/256030
     </string>
     </string>
-    <string name="version_name">Version %s</string>
+    <string name="version_name">版本 %s</string>
     <string name="pt_background_verification">后台校验书源</string>
     <string name="pt_background_verification">后台校验书源</string>
     <string name="ps_background_verification">打开后可以在校验书源时自由操作</string>
     <string name="ps_background_verification">打开后可以在校验书源时自由操作</string>
     <string name="pt_auto_refresh">自动刷新</string>
     <string name="pt_auto_refresh">自动刷新</string>
@@ -102,16 +102,16 @@
     <string name="pt_auto_download">自动下载最新章节</string>
     <string name="pt_auto_download">自动下载最新章节</string>
     <string name="ps_auto_download">更新书籍时自动下载最新章节</string>
     <string name="ps_auto_download">更新书籍时自动下载最新章节</string>
     <string name="backup_restore">备份与恢复</string>
     <string name="backup_restore">备份与恢复</string>
-    <string name="web_dav_set">WebDav设置</string>
-    <string name="web_dav_set_import_old">WebDav设置/导入旧版本数据</string>
+    <string name="web_dav_set">WebDav 设置</string>
+    <string name="web_dav_set_import_old">WebDav 设置/导入旧版本数据</string>
     <string name="backup">备份</string>
     <string name="backup">备份</string>
     <string name="restore">恢复</string>
     <string name="restore">恢复</string>
-    <string name="backup_permission">备份请给与存储权限</string>
-    <string name="restore_permission">恢复请给与存储权限</string>
+    <string name="backup_permission">备份请给予存储权限</string>
+    <string name="restore_permission">恢复请给予存储权限</string>
     <string name="ok">确认</string>
     <string name="ok">确认</string>
     <string name="cancel">取消</string>
     <string name="cancel">取消</string>
     <string name="backup_confirmation">确认备份吗?</string>
     <string name="backup_confirmation">确认备份吗?</string>
-    <string name="backup_message">新备份会替换原有备份。\n备份文件夹YueDu</string>
+    <string name="backup_message">新备份会替换原有备份。\n备份文件夹 YueDu</string>
     <string name="restore_confirmation">确认恢复吗?</string>
     <string name="restore_confirmation">确认恢复吗?</string>
     <string name="restore_message">恢复书架会覆盖现有书架。</string>
     <string name="restore_message">恢复书架会覆盖现有书架。</string>
     <string name="backup_success">备份成功</string>
     <string name="backup_success">备份成功</string>
@@ -125,7 +125,7 @@
     <string name="screen_portrait">竖向</string>
     <string name="screen_portrait">竖向</string>
     <string name="screen_unspecified">跟随系统</string>
     <string name="screen_unspecified">跟随系统</string>
     <string name="disclaimer">免责声明</string>
     <string name="disclaimer">免责声明</string>
-    <string name="all_chapter_num">共%d章</string>
+    <string name="all_chapter_num">共 %d 章</string>
     <string name="interface_setting">界面</string>
     <string name="interface_setting">界面</string>
     <string name="brightness">亮度</string>
     <string name="brightness">亮度</string>
     <string name="chapter_list">目录</string>
     <string name="chapter_list">目录</string>
@@ -148,8 +148,8 @@
     <string name="resume">继续</string>
     <string name="resume">继续</string>
     <string name="set_timer">定时</string>
     <string name="set_timer">定时</string>
     <string name="read_aloud_pause">朗读暂停</string>
     <string name="read_aloud_pause">朗读暂停</string>
-    <string name="read_aloud_timer">正在朗读(还剩%d分钟)</string>
-    <string name="playing_timer">正在播放(还剩%d分钟)</string>
+    <string name="read_aloud_timer">正在朗读(还剩 %d 分钟)</string>
+    <string name="playing_timer">正在播放(还剩 %d 分钟)</string>
     <string name="ps_hide_navigation_bar">阅读界面隐藏虚拟按键</string>
     <string name="ps_hide_navigation_bar">阅读界面隐藏虚拟按键</string>
     <string name="pt_hide_navigation_bar">隐藏导航栏</string>
     <string name="pt_hide_navigation_bar">隐藏导航栏</string>
     <string name="re_navigation_bar_color">导航栏颜色</string>
     <string name="re_navigation_bar_color">导航栏颜色</string>
@@ -162,7 +162,7 @@
     <string name="add_book_url">添加书籍网址</string>
     <string name="add_book_url">添加书籍网址</string>
     <string name="background">背景</string>
     <string name="background">背景</string>
     <string name="author">作者</string>
     <string name="author">作者</string>
-    <string name="author_show">作者: %s</string>
+    <string name="author_show">作者:%s</string>
     <string name="aloud_stop">朗读停止</string>
     <string name="aloud_stop">朗读停止</string>
     <string name="clear_cache">清理缓存</string>
     <string name="clear_cache">清理缓存</string>
     <string name="clear_cache_success">成功清理缓存</string>
     <string name="clear_cache_success">成功清理缓存</string>
@@ -197,20 +197,20 @@
     <string name="volume_key_page">音量键翻页</string>
     <string name="volume_key_page">音量键翻页</string>
     <string name="click_turn_page">点击翻页</string>
     <string name="click_turn_page">点击翻页</string>
     <string name="page_anim">翻页动画</string>
     <string name="page_anim">翻页动画</string>
-    <string name="book_page_anim">翻页动画(本书)</string>
+    <string name="book_page_anim">翻页动画(本书)</string>
     <string name="keep_light">屏幕超时</string>
     <string name="keep_light">屏幕超时</string>
     <string name="back">返回</string>
     <string name="back">返回</string>
     <string name="menu">菜单</string>
     <string name="menu">菜单</string>
     <string name="adjust">调节</string>
     <string name="adjust">调节</string>
     <string name="scroll_bar">滚动条</string>
     <string name="scroll_bar">滚动条</string>
-    <string name="clear_all_content">清除缓存会删除所有已保存章节,是否确认删除?</string>
+    <string name="clear_all_content">清除缓存会删除所有已保存章节,是否确认删除?</string>
     <string name="book_source_share_url">书源共享</string>
     <string name="book_source_share_url">书源共享</string>
     <string name="replace_rule_summary">替换规则名称</string>
     <string name="replace_rule_summary">替换规则名称</string>
     <string name="replace_rule_invalid">替换规则为空或者不满足正则表达式要求</string>
     <string name="replace_rule_invalid">替换规则为空或者不满足正则表达式要求</string>
     <string name="select_action">选择操作</string>
     <string name="select_action">选择操作</string>
     <string name="select_all">全选</string>
     <string name="select_all">全选</string>
-    <string name="select_all_count">全选(%1$d/%2$d)</string>
-    <string name="select_cancel_count">取消全选(%1$d/%2$d)</string>
+    <string name="select_all_count">全选(%1$d/%2$d)</string>
+    <string name="select_cancel_count">取消全选(%1$d/%2$d)</string>
     <string name="dark_theme">深色模式</string>
     <string name="dark_theme">深色模式</string>
     <string name="welcome">启动页</string>
     <string name="welcome">启动页</string>
     <string name="download_start">开始下载</string>
     <string name="download_start">开始下载</string>
@@ -218,17 +218,17 @@
     <string name="no_download">暂无任务</string>
     <string name="no_download">暂无任务</string>
     <string name="download_count">已下载 %1$d/%2$d</string>
     <string name="download_count">已下载 %1$d/%2$d</string>
     <string name="import_select_book">导入选择书籍</string>
     <string name="import_select_book">导入选择书籍</string>
-    <string name="threads_num_title">更新和搜索线程数,太多会卡顿</string>
+    <string name="threads_num_title">更新和搜索线程数(太多会卡顿)</string>
     <string name="change_icon">切换图标</string>
     <string name="change_icon">切换图标</string>
     <string name="remove_from_bookshelf">删除书籍</string>
     <string name="remove_from_bookshelf">删除书籍</string>
     <string name="start_read">开始阅读</string>
     <string name="start_read">开始阅读</string>
     <string name="data_loading">加载数据中…</string>
     <string name="data_loading">加载数据中…</string>
-    <string name="load_error_retry">加载失败,点击重试</string>
+    <string name="load_error_retry">加载失败,点击重试</string>
     <string name="book_intro">内容简介</string>
     <string name="book_intro">内容简介</string>
-    <string name="intro_show">简介:%s</string>
-    <string name="intro_show_null">简介: 暂无简介</string>
+    <string name="intro_show">简介:%s</string>
+    <string name="intro_show_null">简介:暂无简介</string>
     <string name="open_from_other">打开外部书籍</string>
     <string name="open_from_other">打开外部书籍</string>
-    <string name="origin_show">来源: %s</string>
+    <string name="origin_show">来源:%s</string>
     <string name="import_replace_rule">导入替换规则</string>
     <string name="import_replace_rule">导入替换规则</string>
     <string name="import_replace_rule_on_line">导入在线规则</string>
     <string name="import_replace_rule_on_line">导入在线规则</string>
     <string name="check_update_interval">检查更新间隔</string>
     <string name="check_update_interval">检查更新间隔</string>
@@ -239,11 +239,11 @@
     <string name="read_type">阅读方式</string>
     <string name="read_type">阅读方式</string>
     <string name="compose_type">排版</string>
     <string name="compose_type">排版</string>
     <string name="del_select">删除所选</string>
     <string name="del_select">删除所选</string>
-    <string name="del_msg">是否确认删除?</string>
+    <string name="del_msg">是否确认删除?</string>
     <string name="clear_font">默认字体</string>
     <string name="clear_font">默认字体</string>
     <string name="find_on_www">发现</string>
     <string name="find_on_www">发现</string>
     <string name="find_source_manage">发现管理</string>
     <string name="find_source_manage">发现管理</string>
-    <string name="find_empty">没有内容,去书源里自定义吧!</string>
+    <string name="find_empty">还没有内容,去书源里自定义吧!</string>
     <string name="del_all">删除所有</string>
     <string name="del_all">删除所有</string>
     <string name="searchHistory">搜索历史</string>
     <string name="searchHistory">搜索历史</string>
     <string name="clear">清除</string>
     <string name="clear">清除</string>
@@ -257,9 +257,9 @@
     <string name="copy_text">拷贝内容</string>
     <string name="copy_text">拷贝内容</string>
     <string name="download_all">一键缓存</string>
     <string name="download_all">一键缓存</string>
     <string name="content_sl">这是一段测试文字\n\u3000\u3000只是让你看看效果的</string>
     <string name="content_sl">这是一段测试文字\n\u3000\u3000只是让你看看效果的</string>
-    <string name="text_bg_style">文字颜色和背景(长按自定义)</string>
+    <string name="text_bg_style">文字颜色和背景(长按自定义)</string>
     <string name="immersion_status_bar">沉浸式状态栏</string>
     <string name="immersion_status_bar">沉浸式状态栏</string>
-    <string name="un_download">还剩%d章未下载</string>
+    <string name="un_download">还剩 %d 章未下载</string>
     <string name="long_click_input_color">长按输入颜色值</string>
     <string name="long_click_input_color">长按输入颜色值</string>
     <string name="loading">加载中…</string>
     <string name="loading">加载中…</string>
     <string name="group_zg">追更区</string>
     <string name="group_zg">追更区</string>
@@ -268,14 +268,14 @@
     <string name="bookmark_add">添加书签</string>
     <string name="bookmark_add">添加书签</string>
     <string name="action_del">删除</string>
     <string name="action_del">删除</string>
     <string name="load_over_time">加载超时</string>
     <string name="load_over_time">加载超时</string>
-    <string name="join_group">关注:%s</string>
+    <string name="join_group">关注:%s</string>
     <string name="copy_complete">已拷贝</string>
     <string name="copy_complete">已拷贝</string>
     <string name="bookshelf_management">书架管理</string>
     <string name="bookshelf_management">书架管理</string>
     <string name="clear_bookshelf_s">这将会删除所有书籍,请谨慎操作。</string>
     <string name="clear_bookshelf_s">这将会删除所有书籍,请谨慎操作。</string>
     <string name="search_book_source">搜索书源</string>
     <string name="search_book_source">搜索书源</string>
     <string name="search_rss_source">搜索订阅源</string>
     <string name="search_rss_source">搜索订阅源</string>
-    <string name="search_book_source_num">搜索(共%d个书源)</string>
-    <string name="chapter_list_size">目录(%d)</string>
+    <string name="search_book_source_num">搜索(共 %d 个书源)</string>
+    <string name="chapter_list_size">目录(%d)</string>
     <string name="text_bold">加粗</string>
     <string name="text_bold">加粗</string>
     <string name="text_font">字体</string>
     <string name="text_font">字体</string>
     <string name="text">文字</string>
     <string name="text">文字</string>
@@ -292,19 +292,19 @@
     <string name="check_book_source">校验书源</string>
     <string name="check_book_source">校验书源</string>
     <string name="check_select_source">校验所选</string>
     <string name="check_select_source">校验所选</string>
     <string name="progress_show">%1$s      进度 %2$d/%3$d</string>
     <string name="progress_show">%1$s      进度 %2$d/%3$d</string>
-    <string name="tts_fix">请安装并选择中文TTS!</string>
-    <string name="tts_init_failed">TTS初始化失败!</string>
+    <string name="tts_fix">请安装并选择中文 TTS!</string>
+    <string name="tts_init_failed">TTS 初始化失败!</string>
     <string name="jf_convert">简繁转换</string>
     <string name="jf_convert">简繁转换</string>
     <string name="jf_convert_o">关闭</string>
     <string name="jf_convert_o">关闭</string>
     <string name="jf_convert_f">简转繁</string>
     <string name="jf_convert_f">简转繁</string>
     <string name="jf_convert_j">繁转简</string>
     <string name="jf_convert_j">繁转简</string>
     <string name="page_mode">翻页模式</string>
     <string name="page_mode">翻页模式</string>
     <string name="nb_file_sub_count">%1$d 项</string>
     <string name="nb_file_sub_count">%1$d 项</string>
-    <string name="nb_file_path">存储卡:</string>
+    <string name="nb_file_path">存储卡:</string>
     <string name="nb_file_add_shelf">加入书架</string>
     <string name="nb_file_add_shelf">加入书架</string>
-    <string name="nb_file_add_shelves">加入书架(%1$d)</string>
-    <string name="nb_file_add_succeed">成功添加%1$d本书</string>
-    <string name="fonts_folder">请将字体文件放到SD根目录Fonts文件夹下重新选择</string>
+    <string name="nb_file_add_shelves">加入书架(%1$d)</string>
+    <string name="nb_file_add_succeed">成功添加 %1$d 本书</string>
+    <string name="fonts_folder">请将字体文件放到存储根目录 Fonts 文件夹下后重新选择</string>
     <string name="default_font">默认字体</string>
     <string name="default_font">默认字体</string>
     <string name="select_font">选择字体</string>
     <string name="select_font">选择字体</string>
     <string name="text_size">字号</string>
     <string name="text_size">字号</string>
@@ -325,14 +325,14 @@
     <string name="book_info_edit">书籍信息编辑</string>
     <string name="book_info_edit">书籍信息编辑</string>
     <string name="ps_default_read">默认打开书架</string>
     <string name="ps_default_read">默认打开书架</string>
     <string name="pt_default_read">自动跳转最近阅读</string>
     <string name="pt_default_read">自动跳转最近阅读</string>
-    <string name="use_to">替换范围,选填书名或者书源url</string>
+    <string name="use_to">替换范围,选填书名或者书源 URL</string>
     <string name="menu_action_group">分组</string>
     <string name="menu_action_group">分组</string>
     <string name="download_path">内容缓存路径</string>
     <string name="download_path">内容缓存路径</string>
     <string name="sys_file_picker">系统文件选择器</string>
     <string name="sys_file_picker">系统文件选择器</string>
     <string name="new_version">新版本</string>
     <string name="new_version">新版本</string>
     <string name="download_update">下载更新</string>
     <string name="download_update">下载更新</string>
     <string name="volume_key_page_on_play">朗读时音量键翻页</string>
     <string name="volume_key_page_on_play">朗读时音量键翻页</string>
-    <string name="tip_margin_change">Tip边距跟随边距调整</string>
+    <string name="tip_margin_change">提示边距跟随页边距调整</string>
     <string name="allow_update">允许更新</string>
     <string name="allow_update">允许更新</string>
     <string name="disable_update">禁止更新</string>
     <string name="disable_update">禁止更新</string>
     <string name="split_long_chapter">拆分超长章节</string>
     <string name="split_long_chapter">拆分超长章节</string>
@@ -344,7 +344,7 @@
     <string name="pt_show_all_find">显示所有发现</string>
     <string name="pt_show_all_find">显示所有发现</string>
     <string name="ps_show_all_find">关闭则只显示勾选源的发现</string>
     <string name="ps_show_all_find">关闭则只显示勾选源的发现</string>
     <string name="update_toc">更新目录</string>
     <string name="update_toc">更新目录</string>
-    <string name="txt_toc_regex">Txt目录正则</string>
+    <string name="txt_toc_regex">TXT 目录正则</string>
     <string name="set_charset">设置编码</string>
     <string name="set_charset">设置编码</string>
     <string name="swap_sort">倒序-顺序</string>
     <string name="swap_sort">倒序-顺序</string>
     <string name="sort">排序</string>
     <string name="sort">排序</string>
@@ -375,74 +375,74 @@
     <string name="page_anim_none">无动画</string>
     <string name="page_anim_none">无动画</string>
     <string name="donate_s">此书源使用了高级功能,请到捐赠里点击支付宝红包搜索码领取红包开启。</string>
     <string name="donate_s">此书源使用了高级功能,请到捐赠里点击支付宝红包搜索码领取红包开启。</string>
     <string name="up_change_source_last_chapter_t">后台更新换源最新章节</string>
     <string name="up_change_source_last_chapter_t">后台更新换源最新章节</string>
-    <string name="up_change_source_last_chapter_s">开启则会在软件打开1分钟后开始更新</string>
-    <string name="behavior_main_t">书架ToolBar自动隐藏</string>
-    <string name="behavior_main_s">滚动书架时ToolBar自动隐藏与显示</string>
+    <string name="up_change_source_last_chapter_s">开启则会在软件打开 1 分钟后开始更新</string>
+    <string name="behavior_main_t">书架工具栏自动隐藏</string>
+    <string name="behavior_main_s">滚动书架时工具栏自动隐藏与显示</string>
     <string name="login">登录</string>
     <string name="login">登录</string>
-    <string name="login_source">登录%s</string>
+    <string name="login_source">登录 %s</string>
     <string name="success">成功</string>
     <string name="success">成功</string>
     <string name="source_no_login">当前源没有配置登陆地址</string>
     <string name="source_no_login">当前源没有配置登陆地址</string>
     <string name="no_prev_page">没有上一页</string>
     <string name="no_prev_page">没有上一页</string>
     <string name="no_next_page">没有下一页</string>
     <string name="no_next_page">没有下一页</string>
 
 
     <!-- source start-->
     <!-- source start-->
-    <string name="source_name">源名称(sourceName)</string>
-    <string name="source_url">源URL(sourceUrl)</string>
-    <string name="source_group">源分组(sourceGroup)</string>
+    <string name="source_name">源名称(sourceName)</string>
+    <string name="source_url">源 URL(sourceUrl)</string>
+    <string name="source_group">源分组(sourceGroup)</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
-    <string name="source_concurrent_rate">并发率(concurrentRate)</string>
-    <string name="sort_url">分类Url(sortUrl)</string>
-    <string name="login_url">登录URL(loginUrl)</string>
-    <string name="login_ui">登录UI(loginUi)</string>
-    <string name="login_check_js">登录检查JS(loginCheckJs)</string>
-    <string name="comment">源注释(sourceComment)</string>
-    <string name="r_search_url">搜索地址(url)</string>
-    <string name="r_find_url">发现地址规则(url)</string>
-    <string name="r_book_list">书籍列表规则(bookList)</string>
-    <string name="r_book_name">书名规则(name)</string>
-    <string name="r_book_url">详情页url规则(bookUrl)</string>
-    <string name="r_author">作者规则(author)</string>
-    <string name="rule_book_kind">分类规则(kind)</string>
-    <string name="rule_book_intro">简介规则(intro)</string>
-    <string name="rule_cover_url">封面规则(coverUrl)</string>
-    <string name="rule_last_chapter">最新章节规则(lastChapter)</string>
-    <string name="rule_word_count">字数规则(wordCount)</string>
-    <string name="book_url_pattern">书籍URL正则(bookUrlPattern)</string>
-    <string name="rule_book_info_init">预处理规则(bookInfoInit)</string>
-    <string name="rule_toc_url">目录URL规则(tocUrl)</string>
-    <string name="rule_can_re_name">允许修改书名作者(canReName)</string>
-    <string name="rule_next_toc_url">目录下一页规则(nextTocUrl)</string>
-    <string name="rule_chapter_list">目录列表规则(chapterList)</string>
-    <string name="rule_chapter_name">章节名称规则(ChapterName)</string>
-    <string name="rule_chapter_url">章节URL规则(chapterUrl)</string>
-    <string name="rule_is_volume">Volume标识(isVolume)</string>
-    <string name="rule_is_vip">VIP标识(isVip)</string>
-    <string name="rule_update_time">更新时间(ChapterInfo)</string>
-    <string name="pre_update_js">更新之前Js(preUpdateJs)</string>
-    <string name="rule_book_content">正文规则(content)</string>
-    <string name="rule_next_content">正文下一页URL规则(nextContentUrl)</string>
-    <string name="rule_web_js">WebViewJs(webJs)</string>
-    <string name="rule_image_style">图片样式(imageStyle)</string>
-    <string name="rule_replace_regex">替换规则(replaceRegex)</string>
-    <string name="rule_source_regex">资源正则(sourceRegex)</string>
-    <string name="rule_pay_action">购买操作(payAction)</string>
+    <string name="concurrent_rate">并发率(concurrentRate)</string>
+    <string name="sort_url">分类 URL(sortUrl)</string>
+    <string name="login_url">登录 URL(loginUrl)</string>
+    <string name="login_ui">登录 UI(loginUi)</string>
+    <string name="login_check_js">登录检查 JS(loginCheckJs)</string>
+    <string name="comment">源注释(sourceComment)</string>
+    <string name="r_search_url">搜索地址(url)</string>
+    <string name="r_find_url">发现地址规则(url)</string>
+    <string name="r_book_list">书籍列表规则(bookList)</string>
+    <string name="r_book_name">书名规则(name)</string>
+    <string name="r_book_url">详情页 URL 规则(bookUrl)</string>
+    <string name="r_author">作者规则(author)</string>
+    <string name="rule_book_kind">分类规则(kind)</string>
+    <string name="rule_book_intro">简介规则(intro)</string>
+    <string name="rule_cover_url">封面规则(coverUrl)</string>
+    <string name="rule_last_chapter">最新章节规则(lastChapter)</string>
+    <string name="rule_word_count">字数规则(wordCount)</string>
+    <string name="book_url_pattern">书籍 URL 正则(bookUrlPattern)</string>
+    <string name="rule_book_info_init">预处理规则(bookInfoInit)</string>
+    <string name="rule_toc_url">目录 URL 规则(tocUrl)</string>
+    <string name="rule_can_re_name">允许修改书名作者(canReName)</string>
+    <string name="rule_next_toc_url">目录下一页规则(nextTocUrl)</string>
+    <string name="rule_chapter_list">目录列表规则(chapterList)</string>
+    <string name="rule_chapter_name">章节名称规则(ChapterName)</string>
+    <string name="rule_chapter_url">章节 URL 规则(chapterUrl)</string>
+    <string name="rule_is_volume">Volume 标识(isVolume)</string>
+    <string name="rule_is_vip">VIP 标识(isVip)</string>
+    <string name="rule_update_time">更新时间(ChapterInfo)</string>
+    <string name="pre_update_js">更新之前 JS(preUpdateJs)</string>
+    <string name="rule_book_content">正文规则(content)</string>
+    <string name="rule_next_content">正文下一页 URL 规则(nextContentUrl)</string>
+    <string name="rule_web_js">WebView JS(webJs)</string>
+    <string name="rule_image_style">图片样式(imageStyle)</string>
+    <string name="rule_replace_regex">替换规则(replaceRegex)</string>
+    <string name="rule_source_regex">资源正则(sourceRegex)</string>
+    <string name="rule_pay_action">购买操作(payAction)</string>
 
 
-    <string name="source_icon">图标(sourceIcon)</string>
-    <string name="r_articles">列表规则(ruleArticles)</string>
-    <string name="r_next">列表下一页规则(ruleArticles)</string>
-    <string name="r_title">标题规则(ruleTitle)</string>
-    <string name="r_guid">guid规则(ruleGuid)</string>
-    <string name="r_date">时间规则(rulePubDate)</string>
-    <string name="r_categories">类别规则(ruleCategories)</string>
-    <string name="r_description">描述规则(ruleDescription)</string>
-    <string name="r_image">图片url规则(ruleImage)</string>
-    <string name="r_content">内容规则(ruleContent)</string>
-    <string name="r_style">样式(style)</string>
-    <string name="r_link">链接规则(ruleLink)</string>
-    <string name="check_key_word">校验关键字(checkKeyWord)</string>
-    <string name="rule_actions">操作(actions)</string>
-    <string name="rule_is_pay">购买标识(isPay)</string>
+    <string name="source_icon">图标(sourceIcon)</string>
+    <string name="r_articles">列表规则(ruleArticles)</string>
+    <string name="r_next">列表下一页规则(ruleArticles)</string>
+    <string name="r_title">标题规则(ruleTitle)</string>
+    <string name="r_guid">GUID 规则(ruleGuid)</string>
+    <string name="r_date">时间规则(rulePubDate)</string>
+    <string name="r_categories">类别规则(ruleCategories)</string>
+    <string name="r_description">描述规则(ruleDescription)</string>
+    <string name="r_image">图片 URL 规则(ruleImage)</string>
+    <string name="r_content">内容规则(ruleContent)</string>
+    <string name="r_style">样式(style)</string>
+    <string name="r_link">链接规则(ruleLink)</string>
+    <string name="check_key_word">校验关键字(checkKeyWord)</string>
+    <string name="rule_actions">操作(actions)</string>
+    <string name="rule_is_pay">购买标识(isPay)</string>
     <!-- source end-->
     <!-- source end-->
 
 
     <!--error string start-->
     <!--error string start-->
@@ -450,7 +450,7 @@
     <string name="error_get_book_info">书籍信息获取失败</string>
     <string name="error_get_book_info">书籍信息获取失败</string>
     <string name="error_get_content">内容获取失败</string>
     <string name="error_get_content">内容获取失败</string>
     <string name="error_get_chapter_list">目录获取失败</string>
     <string name="error_get_chapter_list">目录获取失败</string>
-    <string name="error_get_web_content">访问网站失败:%s</string>
+    <string name="error_get_web_content">访问网站失败:%s</string>
     <string name="error_read_file">文件读取失败</string>
     <string name="error_read_file">文件读取失败</string>
     <string name="error_load_toc">加载目录失败</string>
     <string name="error_load_toc">加载目录失败</string>
     <string name="error_get_data">获取数据失败!</string>
     <string name="error_get_data">获取数据失败!</string>
@@ -460,7 +460,7 @@
     <string name="net_error_10003">数据解析失败</string>
     <string name="net_error_10003">数据解析失败</string>
     <!--error string end-->
     <!--error string end-->
 
 
-    <string name="source_http_header">请求头(header)</string>
+    <string name="source_http_header">请求头(header)</string>
     <string name="debug_source">调试源</string>
     <string name="debug_source">调试源</string>
     <string name="import_by_qr_code">二维码导入</string>
     <string name="import_by_qr_code">二维码导入</string>
     <string name="share_selected_source">分享选中源</string>
     <string name="share_selected_source">分享选中源</string>
@@ -469,23 +469,23 @@
     <string name="theme">主题</string>
     <string name="theme">主题</string>
     <string name="theme_mode">主题模式</string>
     <string name="theme_mode">主题模式</string>
     <string name="theme_mode_desc">选择主题模式</string>
     <string name="theme_mode_desc">选择主题模式</string>
-    <string name="join_qq_group">加入QQ群</string>
+    <string name="join_qq_group">加入 QQ 群</string>
     <string name="bg_image_per">获取背景图片需存储权限</string>
     <string name="bg_image_per">获取背景图片需存储权限</string>
     <string name="input_book_source_url">输入书源网址</string>
     <string name="input_book_source_url">输入书源网址</string>
     <string name="del_file">删除文件</string>
     <string name="del_file">删除文件</string>
     <string name="del_file_success">删除文件成功</string>
     <string name="del_file_success">删除文件成功</string>
-    <string name="sure_del_file">确定删除文件吗?</string>
+    <string name="sure_del_file">确定删除文件吗?</string>
     <string name="files_tree">手机目录</string>
     <string name="files_tree">手机目录</string>
     <string name="intelligent_import">智能导入</string>
     <string name="intelligent_import">智能导入</string>
     <string name="discovery">发现</string>
     <string name="discovery">发现</string>
     <string name="switch_display_style">切换显示样式</string>
     <string name="switch_display_style">切换显示样式</string>
-    <string name="import_per">导入本地书籍需存储权限</string>
+    <string name="import_per">导入本地书籍需要存储权限</string>
     <string name="night_theme">夜间模式</string>
     <string name="night_theme">夜间模式</string>
     <string name="eink_theme">E-Ink 模式</string>
     <string name="eink_theme">E-Ink 模式</string>
     <string name="eink_theme_desc">电子墨水屏模式</string>
     <string name="eink_theme_desc">电子墨水屏模式</string>
     <string name="get_storage_per">需要存储权限</string>
     <string name="get_storage_per">需要存储权限</string>
     <string name="double_click_exit">再按一次退出程序</string>
     <string name="double_click_exit">再按一次退出程序</string>
-    <string name="import_book_per">导入本地书籍需存储权限</string>
+    <string name="import_book_per">导入本地书籍需要存储权限</string>
     <string name="network_connection_unavailable">网络连接不可用</string>
     <string name="network_connection_unavailable">网络连接不可用</string>
     <string name="yes">是</string>
     <string name="yes">是</string>
     <string name="no">否</string>
     <string name="no">否</string>
@@ -495,14 +495,14 @@
     <string name="sure_del_all_book">是否删除全部书籍?</string>
     <string name="sure_del_all_book">是否删除全部书籍?</string>
     <string name="sure_del_download_book">是否同时删除已下载的书籍目录?</string>
     <string name="sure_del_download_book">是否同时删除已下载的书籍目录?</string>
     <string name="qr_per">扫描二维码需相机权限</string>
     <string name="qr_per">扫描二维码需相机权限</string>
-    <string name="aloud_can_not_auto_page">朗读正在运行,不能自动翻页</string>
+    <string name="aloud_can_not_auto_page">朗读正在运行,不能自动翻页</string>
     <string name="input_charset">输入编码</string>
     <string name="input_charset">输入编码</string>
-    <string name="text_chapter_list_rule">TXT目录规则</string>
-    <string name="open_local_book_per">打开外部书籍需获取存储权限</string>
+    <string name="text_chapter_list_rule">TXT 目录规则</string>
+    <string name="open_local_book_per">打开外部书籍需要存储权限</string>
     <string name="no_book_name">未获取到书名</string>
     <string name="no_book_name">未获取到书名</string>
     <string name="input_replace_url">输入替换规则网址</string>
     <string name="input_replace_url">输入替换规则网址</string>
-    <string name="get_book_list_success">搜索列表获取成功%d</string>
-    <string name="non_null_name_url">名称和URL不能为空</string>
+    <string name="get_book_list_success">搜索列表获取成功 %d</string>
+    <string name="non_null_name_url">名称和 URL 不能为空</string>
     <string name="gallery">图库</string>
     <string name="gallery">图库</string>
     <string name="get_ali_pay_hb">领支付宝红包</string>
     <string name="get_ali_pay_hb">领支付宝红包</string>
     <string name="non_update_url">没有获取到更新地址</string>
     <string name="non_update_url">没有获取到更新地址</string>
@@ -536,14 +536,14 @@
     <string name="source_tab_content">正文</string>
     <string name="source_tab_content">正文</string>
 
 
     <string name="e_ink_mode">E-Ink 模式</string>
     <string name="e_ink_mode">E-Ink 模式</string>
-    <string name="e_ink_mode_detail">去除动画,优化电纸书使用体验</string>
-    <string name="web_menu">Web服务</string>
-    <string name="web_port_title">web端口</string>
+    <string name="e_ink_mode_detail">去除动画,优化电纸书使用体验</string>
+    <string name="web_menu">Web 服务</string>
+    <string name="web_port_title">Web 端口</string>
     <string name="web_port_summary">当前端口 %s</string>
     <string name="web_port_summary">当前端口 %s</string>
     <string name="qr_share">二维码分享</string>
     <string name="qr_share">二维码分享</string>
     <string name="str_share">字符串分享</string>
     <string name="str_share">字符串分享</string>
-    <string name="wifi_share">wifi分享</string>
-    <string name="please_grant_storage_permission">请给于存储权限</string>
+    <string name="wifi_share">WiFi 分享</string>
+    <string name="please_grant_storage_permission">请给予存储权限</string>
     <string name="fast_rewind">减速</string>
     <string name="fast_rewind">减速</string>
     <string name="fast_forward">加速</string>
     <string name="fast_forward">加速</string>
     <string name="skip_previous">上一个</string>
     <string name="skip_previous">上一个</string>
@@ -551,8 +551,8 @@
     <string name="music">音乐</string>
     <string name="music">音乐</string>
     <string name="audio">音频</string>
     <string name="audio">音频</string>
     <string name="is_enable">启用</string>
     <string name="is_enable">启用</string>
-    <string name="enable_js">启用JS</string>
-    <string name="load_with_base_url">加载BaseUrl</string>
+    <string name="enable_js">启用 JavaScript</string>
+    <string name="load_with_base_url">加载 BaseUrl</string>
     <string name="all_source">全部书源</string>
     <string name="all_source">全部书源</string>
     <string name="cannot_empty">输入不能为空</string>
     <string name="cannot_empty">输入不能为空</string>
     <string name="clear_find_cache">清空发现缓存</string>
     <string name="clear_find_cache">清空发现缓存</string>
@@ -562,8 +562,8 @@
     <string name="my">我的</string>
     <string name="my">我的</string>
     <string name="reading">阅读</string>
     <string name="reading">阅读</string>
     <string name="battery_show">%d%%</string>
     <string name="battery_show">%d%%</string>
-    <string name="timer_m">%d分钟</string>
-    <string name="brightness_auto">自动亮度%s</string>
+    <string name="timer_m">%d 分钟</string>
+    <string name="brightness_auto">自动亮度 %s</string>
     <string name="read_aloud_by_page">按页朗读</string>
     <string name="read_aloud_by_page">按页朗读</string>
     <string name="speak_engine">朗读引擎</string>
     <string name="speak_engine">朗读引擎</string>
     <string name="bg_image">背景图片</string>
     <string name="bg_image">背景图片</string>
@@ -578,8 +578,8 @@
     <string name="remove_group">移除分组</string>
     <string name="remove_group">移除分组</string>
     <string name="add_replace_rule">新建替换</string>
     <string name="add_replace_rule">新建替换</string>
     <string name="group">分组</string>
     <string name="group">分组</string>
-    <string name="group_s">分组: %s</string>
-    <string name="toc_s">目录: %s</string>
+    <string name="group_s">分组:%s</string>
+    <string name="toc_s">目录:%s</string>
     <string name="enable_explore">启用发现</string>
     <string name="enable_explore">启用发现</string>
     <string name="disable_explore">禁用发现</string>
     <string name="disable_explore">禁用发现</string>
     <string name="enable_selection">启用所选</string>
     <string name="enable_selection">启用所选</string>
@@ -590,11 +590,11 @@
     <string name="load_info">加载详情页</string>
     <string name="load_info">加载详情页</string>
     <string name="tts">TTS</string>
     <string name="tts">TTS</string>
     <string name="web_dav_pw">WebDav 密码</string>
     <string name="web_dav_pw">WebDav 密码</string>
-    <string name="web_dav_pw_s">输入你的WebDav授权密码</string>
+    <string name="web_dav_pw_s">输入你的 WebDav 授权密码</string>
     <string name="web_dav_url_s">输入你的服务器地址</string>
     <string name="web_dav_url_s">输入你的服务器地址</string>
     <string name="web_dav_url">WebDav 服务器地址</string>
     <string name="web_dav_url">WebDav 服务器地址</string>
     <string name="web_dav_account">WebDav 账号</string>
     <string name="web_dav_account">WebDav 账号</string>
-    <string name="web_dav_account_s">输入你的WebDav账号</string>
+    <string name="web_dav_account_s">输入你的 WebDav 账号</string>
     <string name="rss_source">订阅源</string>
     <string name="rss_source">订阅源</string>
     <string name="rss_source_edit">编辑订阅源</string>
     <string name="rss_source_edit">编辑订阅源</string>
     <string name="screen">筛选</string>
     <string name="screen">筛选</string>
@@ -606,11 +606,11 @@
     <string name="file_chooser">文件选择</string>
     <string name="file_chooser">文件选择</string>
     <string name="folder_chooser">文件夹选择</string>
     <string name="folder_chooser">文件夹选择</string>
     <string name="bottom_line">我是有底线的</string>
     <string name="bottom_line">我是有底线的</string>
-    <string name="uri_to_path_fail">Uri转Path失败</string>
+    <string name="uri_to_path_fail">URI 转 Path 失败</string>
     <string name="refresh_cover">刷新封面</string>
     <string name="refresh_cover">刷新封面</string>
     <string name="change_cover_source">封面换源</string>
     <string name="change_cover_source">封面换源</string>
     <string name="select_local_image">选择本地图片</string>
     <string name="select_local_image">选择本地图片</string>
-    <string name="book_type">类型:</string>
+    <string name="book_type">类型:</string>
     <string name="to_backstage">后台</string>
     <string name="to_backstage">后台</string>
     <string name="importing">正在导入</string>
     <string name="importing">正在导入</string>
     <string name="exporting">正在导出</string>
     <string name="exporting">正在导出</string>
@@ -622,28 +622,28 @@
     <string name="prev_sentence">上一句</string>
     <string name="prev_sentence">上一句</string>
     <string name="next_sentence">下一句</string>
     <string name="next_sentence">下一句</string>
     <string name="other_folder">其它目录</string>
     <string name="other_folder">其它目录</string>
-    <string name="text_too_long_qr_error">文字太多,生成二维码失败</string>
-    <string name="share_rss_source">分享RSS源</string>
+    <string name="text_too_long_qr_error">文字太多,生成二维码失败</string>
+    <string name="share_rss_source">分享 RSS 源</string>
     <string name="share_book_source">分享书源</string>
     <string name="share_book_source">分享书源</string>
     <string name="auto_dark_mode">自动切换夜间模式</string>
     <string name="auto_dark_mode">自动切换夜间模式</string>
     <string name="auto_dark_mode_s">夜间模式跟随系统</string>
     <string name="auto_dark_mode_s">夜间模式跟随系统</string>
     <string name="go_back">上级</string>
     <string name="go_back">上级</string>
     <string name="tone_colour">在线朗读音色</string>
     <string name="tone_colour">在线朗读音色</string>
-    <string name="select_count">(%1$d/%2$d)</string>
+    <string name="select_count">(%1$d/%2$d)</string>
     <string name="show_rss">显示订阅</string>
     <string name="show_rss">显示订阅</string>
     <string name="service_stop">服务已停止</string>
     <string name="service_stop">服务已停止</string>
-    <string name="service_start">正在启动服务\n具体信息查看通知栏</string>
+    <string name="service_start">正在启动服务\n具体信息请查看通知栏</string>
     <string name="default_path">默认路径</string>
     <string name="default_path">默认路径</string>
     <string name="sys_folder_picker">系统文件夹选择器</string>
     <string name="sys_folder_picker">系统文件夹选择器</string>
     <string name="app_folder_picker">自带文件夹选择器</string>
     <string name="app_folder_picker">自带文件夹选择器</string>
     <string name="app_file_picker">自带文件选择器</string>
     <string name="app_file_picker">自带文件选择器</string>
-    <string name="a10_permission_toast">Android10以上因权限限制可能无法读写文件</string>
+    <string name="a10_permission_toast">Android 10 以上因系统权限限制可能无法读写文件</string>
     <string name="add_to_text_context_menu_s">长按文字在操作菜单中显示阅读·搜索</string>
     <string name="add_to_text_context_menu_s">长按文字在操作菜单中显示阅读·搜索</string>
     <string name="add_to_text_context_menu_t">文字操作显示搜索</string>
     <string name="add_to_text_context_menu_t">文字操作显示搜索</string>
     <string name="record_log">记录日志</string>
     <string name="record_log">记录日志</string>
     <string name="log">日志</string>
     <string name="log">日志</string>
     <string name="chinese_converter">中文简繁体转换</string>
     <string name="chinese_converter">中文简繁体转换</string>
-    <string name="change_icon_error">图标为矢量图标,Android8.0以前不支持</string>
+    <string name="change_icon_error">图标为矢量图标,Android 8.0 以前不支持</string>
     <string name="aloud_config">朗读设置</string>
     <string name="aloud_config">朗读设置</string>
     <string name="main_activity">主界面</string>
     <string name="main_activity">主界面</string>
     <string name="selectText">长按选择文本</string>
     <string name="selectText">长按选择文本</string>
@@ -675,11 +675,11 @@
     <string name="change_group">设置分组</string>
     <string name="change_group">设置分组</string>
     <string name="view_toc">查看目录</string>
     <string name="view_toc">查看目录</string>
     <string name="bar_elevation">导航栏阴影</string>
     <string name="bar_elevation">导航栏阴影</string>
-    <string name="bar_elevation_s">当前阴影大小(elevation): %s</string>
+    <string name="bar_elevation_s">当前阴影大小(elevation):%s</string>
     <string name="btn_default_s">默认</string>
     <string name="btn_default_s">默认</string>
     <string name="main_menu">主菜单</string>
     <string name="main_menu">主菜单</string>
     <string name="request_permission">点击授予权限</string>
     <string name="request_permission">点击授予权限</string>
-    <string name="tip_local_perm_request_storage">阅读需要访问存储卡权限,请点击下方的"授予权限"按钮,或前往“设置”—“应用权限”—打开所需权限。如果授予权限后仍然不正常,请点击右上角的“选择文件夹”,使用系统文件夹选择器。</string>
+    <string name="tip_local_perm_request_storage">阅读需要访问存储卡权限,请点击下方的“授予权限”按钮,或前往“设置”—“应用权限”,打开所需权限。如果授予权限后仍然不正常,请点击右上角的“选择文件夹”,使用系统文件夹选择器。</string>
     <string name="alouding_disable">全文朗读中不能朗读选中文字</string>
     <string name="alouding_disable">全文朗读中不能朗读选中文字</string>
     <string name="read_body_to_lh">扩展到刘海</string>
     <string name="read_body_to_lh">扩展到刘海</string>
     <string name="toc_updateing">更新目录中</string>
     <string name="toc_updateing">更新目录中</string>
@@ -693,7 +693,7 @@
     <string name="follow_official_account">关注公众号</string>
     <string name="follow_official_account">关注公众号</string>
     <string name="wechat">微信</string>
     <string name="wechat">微信</string>
     <string name="thanks">您的支持是我更新的动力</string>
     <string name="thanks">您的支持是我更新的动力</string>
-    <string name="about_official_account">公众号[开源阅读]</string>
+    <string name="about_official_account">公众号【开源阅读】</string>
     <string name="source_auto_changing">正在自动换源</string>
     <string name="source_auto_changing">正在自动换源</string>
     <string name="click_to_apply">点击加入</string>
     <string name="click_to_apply">点击加入</string>
     <string name="middle">中</string>
     <string name="middle">中</string>
@@ -723,27 +723,27 @@
     <string name="text_bottom_justify">文字底部对齐</string>
     <string name="text_bottom_justify">文字底部对齐</string>
     <string name="auto_page_speed">自动翻页速度</string>
     <string name="auto_page_speed">自动翻页速度</string>
     <string name="sort_by_url">地址排序</string>
     <string name="sort_by_url">地址排序</string>
-    <string name="backup_summary">本地和WebDav一起备份</string>
-    <string name="restore_summary">优先从WebDav恢复,长按从本地恢复</string>
+    <string name="backup_summary">本地和 WebDav 一起备份</string>
+    <string name="restore_summary">优先从 WebDav 恢复,长按从本地恢复</string>
     <string name="import_old_summary">选择旧版备份文件夹</string>
     <string name="import_old_summary">选择旧版备份文件夹</string>
     <string name="enabled">已启用</string>
     <string name="enabled">已启用</string>
     <string name="disabled">已禁用</string>
     <string name="disabled">已禁用</string>
     <string name="starting_download">正在启动下载</string>
     <string name="starting_download">正在启动下载</string>
     <string name="already_in_download">该书已在下载列表</string>
     <string name="already_in_download">该书已在下载列表</string>
     <string name="click_to_open">点击打开</string>
     <string name="click_to_open">点击打开</string>
-    <string name="follow_public_account_summary">关注[开源阅读]点击广告支持我</string>
+    <string name="follow_public_account_summary">关注【开源阅读】点击广告支持我</string>
     <string name="weChat_appreciation_code">微信赞赏码</string>
     <string name="weChat_appreciation_code">微信赞赏码</string>
     <string name="alipay">支付宝</string>
     <string name="alipay">支付宝</string>
     <string name="alipay_red_envelope_search_code">支付宝红包搜索码</string>
     <string name="alipay_red_envelope_search_code">支付宝红包搜索码</string>
     <string name="alipay_red_envelope_copy">537954522 点击复制</string>
     <string name="alipay_red_envelope_copy">537954522 点击复制</string>
     <string name="alipay_red_envelope_qr_code">支付宝红包二维码</string>
     <string name="alipay_red_envelope_qr_code">支付宝红包二维码</string>
     <string name="alipay_payment_qr_code">支付宝收款二维码</string>
     <string name="alipay_payment_qr_code">支付宝收款二维码</string>
-    <string name="qq_collection_qr_code">QQ收款二维码</string>
-    <string name="contributors_summary">gedoor,Invinciblelee,Xwite等,详情请在github中查看</string>
+    <string name="qq_collection_qr_code">QQ 收款二维码</string>
+    <string name="contributors_summary">gedoor、Invinciblelee 和 Xwite 等,详情请在 GitHub 中查看</string>
     <string name="clear_cache_summary">清除已下载书籍和字体缓存</string>
     <string name="clear_cache_summary">清除已下载书籍和字体缓存</string>
     <string name="default_cover">默认封面</string>
     <string name="default_cover">默认封面</string>
     <string name="restore_ignore">恢复忽略列表</string>
     <string name="restore_ignore">恢复忽略列表</string>
-    <string name="restore_ignore_summary">恢复时忽略一些内容不恢复,方便不同手机配置不同</string>
+    <string name="restore_ignore_summary">恢复时忽略一些内容不恢复,方便不同手机配置不同</string>
     <string name="read_config">阅读界面设置</string>
     <string name="read_config">阅读界面设置</string>
     <string name="group_name">分组名称</string>
     <string name="group_name">分组名称</string>
     <string name="note_content">备注内容</string>
     <string name="note_content">备注内容</string>
@@ -762,10 +762,10 @@
     <string name="language">语言</string>
     <string name="language">语言</string>
     <string name="import_rss_source">导入订阅源</string>
     <string name="import_rss_source">导入订阅源</string>
     <string name="donate_summary">您的支持是我更新的动力</string>
     <string name="donate_summary">您的支持是我更新的动力</string>
-    <string name="about_summary">公众号[开源阅读软件]</string>
+    <string name="about_summary">公众号【开源阅读软件】</string>
     <string name="read_record">阅读记录</string>
     <string name="read_record">阅读记录</string>
     <string name="read_record_summary">阅读时间记录</string>
     <string name="read_record_summary">阅读时间记录</string>
-    <string name="local_tts">本地TTS</string>
+    <string name="local_tts">本地 TTS</string>
     <string name="thread_count">线程数</string>
     <string name="thread_count">线程数</string>
     <string name="all_read_time">总阅读时间</string>
     <string name="all_read_time">总阅读时间</string>
     <string name="un_select_all">全不选</string>
     <string name="un_select_all">全不选</string>
@@ -775,25 +775,25 @@
     <string name="save_day_theme_summary">保存白天主题配置以供调用和分享</string>
     <string name="save_day_theme_summary">保存白天主题配置以供调用和分享</string>
     <string name="save_night_theme_summary">保存夜间主题配置以供调用和分享</string>
     <string name="save_night_theme_summary">保存夜间主题配置以供调用和分享</string>
     <string name="theme_list">主题列表</string>
     <string name="theme_list">主题列表</string>
-    <string name="theme_list_summary">使用保存主题,导入,分享主题</string>
+    <string name="theme_list_summary">使用、保存、导入或分享主题</string>
     <string name="select_theme">切换默认主题</string>
     <string name="select_theme">切换默认主题</string>
     <string name="sort_by_lastUpdateTime">更新时间排序</string>
     <string name="sort_by_lastUpdateTime">更新时间排序</string>
     <string name="search_content">全文搜索</string>
     <string name="search_content">全文搜索</string>
     <string name="search_content_size">搜索结果</string>
     <string name="search_content_size">搜索结果</string>
-    <string name="search_content_empty">搜索内容为空,检查净化/简繁设置</string>
-    <string name="rss_source_empty">Empty now!</string>
-    <string name="explore_empty">当前没有发现源!</string>
-    <string name="page_key_set_help">将焦点放到输入框按下物理按键会自动录入键值,多个按键会自动用英文逗号隔开.</string>
+    <string name="search_content_empty">搜索内容为空,请检查净化或简繁设置</string>
+    <string name="rss_source_empty">RSS 源目前为空!</string>
+    <string name="explore_empty">当前没有发现源!</string>
+    <string name="page_key_set_help">将焦点放到输入框按下物理按键会自动录入键值,多个按键会自动用英文逗号隔开。</string>
     <string name="theme_name">主题名称</string>
     <string name="theme_name">主题名称</string>
     <string name="auto_clear_expired">自动清除过期搜索数据</string>
     <string name="auto_clear_expired">自动清除过期搜索数据</string>
     <string name="auto_clear_expired_summary">超过一天的搜索数据</string>
     <string name="auto_clear_expired_summary">超过一天的搜索数据</string>
     <string name="re_segment">重新分段</string>
     <string name="re_segment">重新分段</string>
-    <string name="style_name">样式名称:</string>
-    <string name="empty_msg_import_book">点击右上角文件夹图标,选择文件夹</string>
+    <string name="style_name">样式名称:</string>
+    <string name="empty_msg_import_book">点击右上角文件夹图标,选择文件夹</string>
     <string name="scan_folder">智能扫描</string>
     <string name="scan_folder">智能扫描</string>
     <string name="import_file_name">导入文件名</string>
     <string name="import_file_name">导入文件名</string>
-    <string name="copy_book_url">拷贝书籍URL</string>
-    <string name="copy_toc_url">拷贝目录URL</string>
+    <string name="copy_book_url">拷贝书籍 URL</string>
+    <string name="copy_toc_url">拷贝目录 URL</string>
     <string name="no_book">没有书籍</string>
     <string name="no_book">没有书籍</string>
     <string name="keep_original_name">保留原名</string>
     <string name="keep_original_name">保留原名</string>
     <string name="click_regional_config">点击区域设置</string>
     <string name="click_regional_config">点击区域设置</string>
@@ -807,30 +807,30 @@
     <string name="rule_subscription">规则订阅</string>
     <string name="rule_subscription">规则订阅</string>
     <string name="rule_sub_empty_msg">添加大佬们提供的规则导入地址\n添加后点击可导入规则</string>
     <string name="rule_sub_empty_msg">添加大佬们提供的规则导入地址\n添加后点击可导入规则</string>
     <string name="get_book_progress">拉取云端进度</string>
     <string name="get_book_progress">拉取云端进度</string>
-    <string name="current_progress_exceeds_cloud">当前进度超过云端进度,是否同步?</string>
+    <string name="current_progress_exceeds_cloud">当前进度超过云端进度,是否同步?</string>
     <string name="sync_book_progress_t">同步阅读进度</string>
     <string name="sync_book_progress_t">同步阅读进度</string>
     <string name="sync_book_progress_s">进入退出阅读界面时同步阅读进度</string>
     <string name="sync_book_progress_s">进入退出阅读界面时同步阅读进度</string>
     <string name="create_bookmark_error">创建书签失败</string>
     <string name="create_bookmark_error">创建书签失败</string>
-    <string name="single_url">单URL</string>
+    <string name="single_url">单 URL</string>
     <string name="export_bookshelf">导出书单</string>
     <string name="export_bookshelf">导出书单</string>
     <string name="import_bookshelf">导入书单</string>
     <string name="import_bookshelf">导入书单</string>
     <string name="pre_download">预下载</string>
     <string name="pre_download">预下载</string>
-    <string name="pre_download_s">预先下载%s章正文</string>
+    <string name="pre_download_s">预先下载 %s 章正文</string>
     <string name="is_enabled">是否启用</string>
     <string name="is_enabled">是否启用</string>
     <string name="background_image">背景图片</string>
     <string name="background_image">背景图片</string>
     <string name="background_image_blurring">背景图片虚化</string>
     <string name="background_image_blurring">背景图片虚化</string>
     <string name="background_image_blurring_radius">虚化半径</string>
     <string name="background_image_blurring_radius">虚化半径</string>
-    <string name="background_image_hint">0为停用,启用范围1~25\n半径数值越大,虚化效果越高</string>
+    <string name="background_image_hint">0 为停用,启用范围 1~25\n半径数值越大,虚化效果越高</string>
     <string name="export_folder">导出文件夹</string>
     <string name="export_folder">导出文件夹</string>
     <string name="export_charset">导出编码</string>
     <string name="export_charset">导出编码</string>
-    <string name="export_no_chapter_name">TXT不导出章节名</string>
-    <string name="export_to_web_dav">导出到WebDav</string>
+    <string name="export_no_chapter_name">TXT 不导出章节名</string>
+    <string name="export_to_web_dav">导出到 WebDav</string>
     <string name="reverse_content">反转内容</string>
     <string name="reverse_content">反转内容</string>
     <string name="debug">调试</string>
     <string name="debug">调试</string>
     <string name="crash_log">崩溃日志</string>
     <string name="crash_log">崩溃日志</string>
     <string name="use_zh_layout">使用自定义中文分行</string>
     <string name="use_zh_layout">使用自定义中文分行</string>
     <string name="image_style">图片样式</string>
     <string name="image_style">图片样式</string>
-    <string name="system_tts">系统TTS</string>
+    <string name="system_tts">系统 TTS</string>
     <string name="export_type">导出格式</string>
     <string name="export_type">导出格式</string>
     <string name="checkAuthor">校验作者</string>
     <string name="checkAuthor">校验作者</string>
     <string name="search_src">搜索源码</string>
     <string name="search_src">搜索源码</string>
@@ -838,14 +838,14 @@
     <string name="toc_src">目录源码</string>
     <string name="toc_src">目录源码</string>
     <string name="content_src">正文源码</string>
     <string name="content_src">正文源码</string>
     <string name="list_src">列表源码</string>
     <string name="list_src">列表源码</string>
-    <string name="url_already">此url已订阅</string>
-    <string name="high_brush_title">高刷</string>
+    <string name="url_already">此 URL 已订阅</string>
+    <string name="high_brush_title">高刷新率</string>
     <string name="high_brush_summary">使用屏幕最高刷新率</string>
     <string name="high_brush_summary">使用屏幕最高刷新率</string>
     <string name="export_all">导出所有</string>
     <string name="export_all">导出所有</string>
     <string name="complete">完成</string>
     <string name="complete">完成</string>
     <string name="show_unread">显示未读标志</string>
     <string name="show_unread">显示未读标志</string>
     <string name="use_default_cover">总是使用默认封面</string>
     <string name="use_default_cover">总是使用默认封面</string>
-    <string name="use_default_cover_s">总是显示默认封面,不显示网络封面</string>
+    <string name="use_default_cover_s">总是显示默认封面(不显示网络封面)</string>
     <string name="title_font_size">字号</string>
     <string name="title_font_size">字号</string>
     <string name="title_margin_top">上边距</string>
     <string name="title_margin_top">上边距</string>
     <string name="title_margin_bottom">下边距</string>
     <string name="title_margin_bottom">下边距</string>
@@ -858,7 +858,7 @@
     <string name="group_style">分组样式</string>
     <string name="group_style">分组样式</string>
     <string name="export_file_name">导出文件名</string>
     <string name="export_file_name">导出文件名</string>
     <string name="reset">重置</string>
     <string name="reset">重置</string>
-    <string name="null_url">url为空</string>
+    <string name="null_url">URL 为空</string>
     <string name="dict">字典</string>
     <string name="dict">字典</string>
     <string name="unknown_error">未知错误</string>
     <string name="unknown_error">未知错误</string>
     <string name="autobackup_fail">自动备份失败\n%s</string>
     <string name="autobackup_fail">自动备份失败\n%s</string>
@@ -866,22 +866,22 @@
     <string name="custom_group_summary">关闭替换分组/开启添加分组</string>
     <string name="custom_group_summary">关闭替换分组/开启添加分组</string>
     <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
     <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
     <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
     <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
-    <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
+    <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
     <string name="check_source_show_debug_message">校验显示详细信息</string>
     <string name="check_source_show_debug_message">校验显示详细信息</string>
     <string name="check_source_show_debug_message_summary">书源校验时显示网络请求步骤和时间</string>
     <string name="check_source_show_debug_message_summary">书源校验时显示网络请求步骤和时间</string>
-    <string name="need_login">需登录</string>
-    <string name="pref_cronet_summary">使用Cronet网络组件</string>
+    <string name="need_login">需要登录</string>
+    <string name="pref_cronet_summary">使用 Cronet 网络组件</string>
     <string name="anti_alias">抗锯齿</string>
     <string name="anti_alias">抗锯齿</string>
     <string name="pref_anti_alias_summary">绘制图片时抗锯齿</string>
     <string name="pref_anti_alias_summary">绘制图片时抗锯齿</string>
-    <string name="upload_url">上传URL</string>
-    <string name="download_url_rule">下载URL规则</string>
+    <string name="upload_url">上传 URL</string>
+    <string name="download_url_rule">下载 URL 规则</string>
     <string name="sort_by_respondTime">响应时间排序</string>
     <string name="sort_by_respondTime">响应时间排序</string>
     <string name="export_success">导出成功</string>
     <string name="export_success">导出成功</string>
     <string name="path">路径</string>
     <string name="path">路径</string>
     <string name="direct_link_upload_rule">直链上传规则</string>
     <string name="direct_link_upload_rule">直链上传规则</string>
-    <string name="direct_link_upload_rule_summary">用于导出书源书单时生成直链url</string>
+    <string name="direct_link_upload_rule_summary">用于导出书源书单时生成直链 URL</string>
     <string name="direct_link_upload_config">直链上传配置</string>
     <string name="direct_link_upload_config">直链上传配置</string>
-    <string name="copy_play_url">拷贝播放Url</string>
+    <string name="copy_play_url">拷贝播放 URL</string>
     <string name="set_source_variable">设置源变量</string>
     <string name="set_source_variable">设置源变量</string>
     <string name="set_book_variable">设置书籍变量</string>
     <string name="set_book_variable">设置书籍变量</string>
     <string name="summary">注释</string>
     <string name="summary">注释</string>
@@ -903,20 +903,20 @@
     <string name="chapter_pay">购买</string>
     <string name="chapter_pay">购买</string>
     <string name="double_page_horizontal">平板/横屏双页</string>
     <string name="double_page_horizontal">平板/横屏双页</string>
     <string name="open_in_browser">浏览器打开</string>
     <string name="open_in_browser">浏览器打开</string>
-    <string name="copy_url">拷贝url</string>
+    <string name="copy_url">拷贝 URL</string>
     <string name="open_fun">打开方式</string>
     <string name="open_fun">打开方式</string>
-    <string name="use_browser_open">是否使用外部浏览器打开?</string>
+    <string name="use_browser_open">是否使用外部浏览器打开?</string>
     <string name="see">查看</string>
     <string name="see">查看</string>
     <string name="open">打开</string>
     <string name="open">打开</string>
     <string name="del_login_header">删除登录头</string>
     <string name="del_login_header">删除登录头</string>
     <string name="show_login_header">查看登录头</string>
     <string name="show_login_header">查看登录头</string>
     <string name="login_header">登录头</string>
     <string name="login_header">登录头</string>
     <string name="font_scale">字体大小</string>
     <string name="font_scale">字体大小</string>
-    <string name="font_scale_summary">当前字体大小:%.1f</string>
+    <string name="font_scale_summary">当前字体大小:%.1f</string>
     <string name="tts_speech_reduce">语速减</string>
     <string name="tts_speech_reduce">语速减</string>
     <string name="tts_speech_add">语速加</string>
     <string name="tts_speech_add">语速加</string>
-    <string name="open_sys_dir_picker_error">打开系统文件夹选择器出错,自动打开应用文件夹选择器</string>
-    <string name="open_sys_doc_picker_error">打开系统文件选择器出错,自动打开应用文件选择器</string>
+    <string name="open_sys_dir_picker_error">打开系统文件夹选择器出错,将自动打开应用文件夹选择器</string>
+    <string name="open_sys_doc_picker_error">打开系统文件选择器出错,将自动打开应用文件选择器</string>
     <string name="expand_text_menu">展开文本选择菜单</string>
     <string name="expand_text_menu">展开文本选择菜单</string>
     <string name="book_tree_uri_t">书籍保存位置</string>
     <string name="book_tree_uri_t">书籍保存位置</string>
     <string name="book_tree_uri_s">从其它应用打开的书籍保存位置</string>
     <string name="book_tree_uri_s">从其它应用打开的书籍保存位置</string>
@@ -927,19 +927,19 @@
     <!-- check source config string -->
     <!-- check source config string -->
     <string name="check_source_config">校验设置</string>
     <string name="check_source_config">校验设置</string>
     <string name="check_source_item">校验项目</string>
     <string name="check_source_item">校验项目</string>
-    <string name="check_source_timeout">单个书源校验超时(秒)</string>
+    <string name="check_source_timeout">单个书源校验超时(秒)</string>
     <string name="timeout">超时</string>
     <string name="timeout">超时</string>
     <string name="seconds">秒</string>
     <string name="seconds">秒</string>
     <string name="less_than">小于</string>
     <string name="less_than">小于</string>
-    <string name="check_source_config_summary">校验超时: %1$s秒\n校验项目:%2$s</string>
+    <string name="check_source_config_summary">校验超时:%1$s秒\n校验项目:%2$s</string>
     <string name="record_debug_log">记录调试日志</string>
     <string name="record_debug_log">记录调试日志</string>
     <string name="sub_dir">子文件夹</string>
     <string name="sub_dir">子文件夹</string>
     <string name="general">全局</string>
     <string name="general">全局</string>
     <string name="use_replace">使用替换</string>
     <string name="use_replace">使用替换</string>
     <string name="scope_title">作用于标题</string>
     <string name="scope_title">作用于标题</string>
     <string name="scope_content">作用于正文</string>
     <string name="scope_content">作用于正文</string>
-    <string name="join_qq_channel">加入QQ频道</string>
-    <string name="qq_channel_summary">点击加入阅读QQ频道</string>
+    <string name="join_qq_channel">加入 QQ 频道</string>
+    <string name="qq_channel_summary">点击加入阅读 QQ 频道</string>
     <string name="menu_refresh_dur">刷新当前章节</string>
     <string name="menu_refresh_dur">刷新当前章节</string>
     <string name="menu_refresh_after">刷新之后章节</string>
     <string name="menu_refresh_after">刷新之后章节</string>
     <string name="menu_refresh_all">刷新全部章节</string>
     <string name="menu_refresh_all">刷新全部章节</string>
@@ -961,14 +961,14 @@
     <string name="show_default_book_icon">显示默认书籍图标</string>
     <string name="show_default_book_icon">显示默认书籍图标</string>
     <string name="cache_export">缓存/导出</string>
     <string name="cache_export">缓存/导出</string>
     <string name="assists_key_config">辅助按键配置</string>
     <string name="assists_key_config">辅助按键配置</string>
-    <string name="url_option">Url参数</string>
-    <string name="only_wifi">仅WIFI</string>
-    <string name="only_wifi_summary">仅在wifi下加载网络封面</string>
+    <string name="url_option">URL 参数</string>
+    <string name="only_wifi">仅 WiFi</string>
+    <string name="only_wifi_summary">仅在 WiFi 下加载网络封面</string>
     <string name="cover_rule">封面规则</string>
     <string name="cover_rule">封面规则</string>
     <string name="cover_rule_summary">进入详情页时使用封面规则重新获取封面</string>
     <string name="cover_rule_summary">进入详情页时使用封面规则重新获取封面</string>
     <string name="scroll_to_dur_source">定位到当前书源</string>
     <string name="scroll_to_dur_source">定位到当前书源</string>
-    <string name="sys_tts_config">系统tts设置</string>
-    <string name="sys_tts_config_summary">打开系统tts设置界面</string>
+    <string name="sys_tts_config">系统 TTS 设置</string>
+    <string name="sys_tts_config_summary">打开系统 TTS 设置界面</string>
     <string name="cannot_timed_non_playback">非播放状态无法定时</string>
     <string name="cannot_timed_non_playback">非播放状态无法定时</string>
     <string name="all_bookmark">所有书签</string>
     <string name="all_bookmark">所有书签</string>
     <string name="change_source_batch">批量换源</string>
     <string name="change_source_batch">批量换源</string>
@@ -977,24 +977,25 @@
     <string name="input_verification_code">输入验证码</string>
     <string name="input_verification_code">输入验证码</string>
     <string name="verification_code">验证码</string>
     <string name="verification_code">验证码</string>
     <string name="timeout_millisecond">超时毫秒数</string>
     <string name="timeout_millisecond">超时毫秒数</string>
-    <string name="file_not_supported">文件%1$s 不受支持,是否继续打开?</string>
-    <string name="import_tts">导入TTS</string>
+    <string name="file_not_supported">文件 %1$s 不受支持,是否继续打开?</string>
+    <string name="import_tts">导入 TTS</string>
     <string name="import_theme">导入主题</string>
     <string name="import_theme">导入主题</string>
-    <string name="import_txt_toc_rule">导入txt目录规则</string>
+    <string name="import_txt_toc_rule">导入 TXT 目录规则</string>
     <string name="auto_save_cookie">CookieJar</string>
     <string name="auto_save_cookie">CookieJar</string>
     <string name="click_read_button_load">点击阅读加载目录</string>
     <string name="click_read_button_load">点击阅读加载目录</string>
-    <string name="cookie">清除cookie</string>
+    <string name="cookie">清除 Cookie</string>
     <string name="download_and_import_file">导入在线书籍文件</string>
     <string name="download_and_import_file">导入在线书籍文件</string>
-    <string name="upload_book_success">Upload Success</string>
-    <string name="upload_book_fail">Upload Fail</string>
-    <string name="download_book_success">Download Success</string>
-    <string name="download_book_fail">Download Fail</string>
-    <string name="upload_to_remote">上传WebDav</string>
-    <string name="add_remote_book">WebDav书籍</string>
+    <string name="upload_book_success">上传成功</string>
+    <string name="upload_book_fail">上传失败</string>
+    <string name="download_book_success">下载成功</string>
+    <string name="download_book_fail">下载失败</string>
+    <string name="upload_to_remote">上传 WebDav</string>
+    <string name="add_remote_book">WebDav 书籍</string>
     <string name="bitmap_cache_size_summary">当前最大缓存 %1$s MB</string>
     <string name="bitmap_cache_size_summary">当前最大缓存 %1$s MB</string>
     <string name="bitmap_cache_size">图片绘制缓存</string>
     <string name="bitmap_cache_size">图片绘制缓存</string>
-    <string name="export_pics_file">TXT导出图片</string>
+    <string name="export_pics_file">TXT 导出图片</string>
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">图片解码失败</string>
     <string name="error_decode_bitmap">图片解码失败</string>
     <string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
     <string name="error_image_url_empty">图片链接为空,检查替换净化规则</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>

+ 2 - 1
app/src/main/res/values/strings.xml

@@ -392,7 +392,7 @@
     <string name="source_group">源分组(sourceGroup)</string>
     <string name="source_group">源分组(sourceGroup)</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_source_group">自定义源分组</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
     <string name="diy_edit_source_group">输入自定义源分组名称</string>
-    <string name="source_concurrent_rate">并发率(concurrentRate)</string>
+    <string name="concurrent_rate">并发率(concurrentRate)</string>
     <string name="sort_url">分类Url(sortUrl)</string>
     <string name="sort_url">分类Url(sortUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_url">登录URL(loginUrl)</string>
     <string name="login_ui">Login UI(loginUi)</string>
     <string name="login_ui">Login UI(loginUi)</string>
@@ -998,4 +998,5 @@
     <!-- string end -->
     <!-- string end -->
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_decode_bitmap">Fail to decode bitmap</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
     <string name="error_image_url_empty">Image url is empty, check replacement rules</string>
+    <string name="variable_comment">变量说明(variableComment)</string>
 </resources>
 </resources>