Merge pull request #1645 from koodo-reader/dev

update to 2.4.5
This commit is contained in:
troyeguo authored and GitHub committed 2026-09-26 09:43:20 +08:00
commit b1106ecb79
165 files changed
+12070 -5144

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@
!macro customInstall
; Kill running Koodo Reader process before installation to prevent file locking
nsExec::ExecToLog 'taskkill /f /im "Koodo Reader.exe"'
nsExec::ExecToLog '"$SYSDIR\taskkill.exe" /f /im "Koodo Reader.exe"'
; Wait for the OS to release file handles after process termination
Sleep 3000
!macroend
+323 -1146
View File
File diff suppressed because it is too large. Load diff
+4 -2
View File
@@ -1,7 +1,7 @@
{
"name": "koodo-reader",
"main": "main.js",
"version": "2.4.4",
"version": "2.4.5",
"description": "Koodo Reader is a cross-platform ebook reader",
"author": {
"name": "App by Troye",
@@ -59,6 +59,7 @@
"sortablejs": "^1.15.6",
"sse.js": "^2.6.0",
"ssh2-sftp-client": "^11.0.0",
"tar-stream": "^3.2.1",
"underscore": "^1.13.7",
"uuid": "^11.0.5",
"webdav": "^5.7.1",
@@ -82,7 +83,7 @@
"concurrently": "^5.0.1",
"cross-env": "^6.0.3",
"electron": "^34.0.1",
"electron-builder": "^26.0.12",
"electron-builder": "^26.16.1",
"electron-rebuild": "^3.2.9",
"hard-source-webpack-plugin": "^0.13.1",
"html-react-parser": "^5.1.10",
@@ -129,6 +130,7 @@
"src/assets/lib/kookit-extra.min.mjs",
"src/utils/plugins/main/**/*.js",
"main.js",
"src/utils/main/**/*.js",
"preload.js",
"chat-preload.js"
],
+6
View File
@@ -23,6 +23,7 @@ const INVOKE_CHANNELS = new Set([
"clear-tts",
"select-path",
"select-file",
"select-import-file",
"encrypt-data",
"decrypt-data",
"check-cloud-url",
@@ -56,6 +57,7 @@ const INVOKE_CHANNELS = new Set([
"reload-tab",
"adjust-tab-size",
"exit-tab",
"exit-reader",
"enter-tab-fullscreen",
"exit-tab-fullscreen",
"enter-fullscreen",
@@ -71,6 +73,10 @@ const INVOKE_CHANNELS = new Set([
"crypto-file-md5",
"backup-path",
"restore-path",
"list-tar-file",
"untar-file",
"list-zip-file",
"unzip-file",
]);
const SEND_CHANNELS = new Set(["reader-close-ready", "tab-close-ready"]);
const SEND_SYNC_CHANNELS = new Set([
-332
View File
@@ -1,332 +0,0 @@
body,
.active-annotation-dialog-tab {
-webkit-tap-highlight-color: transparent;
background: rgba(47, 52, 55, 1);
color: rgba(235, 235, 235, 1);
}
a {
color: lightskyblue;
text-decoration: none;
}
.booklist-shelf-list,
.lang-setting-dropdown,
.delete-tag-container,
.setting-subtitle,
.more-option-text,
.book-subcontent-name,
.pin-keypad-title,
.add-source-card,
.pin-key {
color: rgba(235, 235, 235, 1);
}
.add-dialog-shelf-list-box,
.add-dialog-new-shelf-box,
.add-dialog-cancel,
.delete-dialog-cancel,
.edit-dialog-book-name-box,
.edit-dialog-book-author-box,
.edit-dialog-input,
.edit-dialog-textarea,
.edit-dialog-cancel,
.tag-list-item,
.token-dialog-cancel,
.voice-add-cancel,
.lang-setting-dropdown,
.tag-list-item-new,
.input-value,
.import-from-cloud,
.booklist-shelf-list,
.token-dialog-token-box,
.voice-add-content-box,
.token-dialog-username-box,
.feedback-dialog-content-box,
.token-dialog-url-box,
.token-dialog-username-box,
.account-login-option,
.font-featured-download-btn,
.token-dialog-password-box,
.general-setting-dropdown,
.delete-dialog-uncheck-icon,
.next-chapter,
.progress-slide-circle,
.setting-dialog-location-title,
.delete-dialog-uncheck-icon,
.previous-chapter,
.color-option,
.line-option,
.token-dialog-link-text,
.token-dialog-token-text,
.nav-search-page-item,
.add-source-card,
.pin-dot {
border: 1.5px solid rgba(235, 235, 235, 1);
}
.header-search-box,
.header-search-box::placeholder,
.feedback-dialog-content-box::placeholder,
.voice-add-content-box::placeholder,
.token-dialog-username-box::placeholder,
.token-dialog-token-box::placeholder,
.header-search-text,
.pin-key-cancel {
color: rgba(235, 235, 235, 0.8);
}
.delete-digest-button,
.add-dialog-confirm,
.font-featured-progress-bar,
.backup-page-backup-selector,
.delete-dialog-confirm,
.book-item-config,
.book-cover-item-config,
.download-desk-button,
.edit-dialog-confirm,
.change-location-button,
.token-dialog-confirm,
.add-dialog-shelf-list-option,
.voice-add-confirm,
.new-version-open,
.update-dialog-container-button,
.import-from-local,
.side-menu-selector-container,
.previous-chapter-single-container,
.next-chapter-single-container,
.book-bookmark-link,
.message-box-container,
.only-local-icon,
.voice-add-content-box,
.token-dialog-username-box,
.token-dialog-token-box,
.backup-source-dropdown,
.popup-close,
.pin-keypad-container,
.biometric-auth-container,
.biometric-auth-button {
background-color: rgba(71, 76, 80, 1);
color: rgba(235, 235, 235, 1);
}
.previous-chapter-single-container,
.next-chapter-single-container {
opacity: 0.7;
}
.pin-dot.pin-dot-filled {
background-color: rgba(235, 235, 235, 1);
color: rgba(47, 52, 55, 1);
}
.header-search-box,
#jumpPage,
#jumpChapter,
#newTag,
.pin-key {
background-color: rgba(235, 235, 235, 0.1);
}
.backup-page-close-icon:hover,
.sidebar-list-icon:hover,
.nav-close-icon:hover,
.setting-close-container:hover,
.side-menu-hover-container,
.side-menu-item.shelf-drop-target .side-menu-selector,
.setting-dialog-location-title,
.note-option:hover,
.digest-option:hover,
.translation-option:hover,
.speaker-option:hover,
.search-book-option:hover,
.dict-option:hover,
.wikipedia-option:hover,
.browser-option:hover,
.header-search-text:hover,
.reader-setting-icon-container:hover,
.setting-icon-container:hover,
.animation-mask,
.animation-mask-local,
.sort-by-category-list:hover,
.more-option-item:hover,
.sort-by-order-list:hover,
.backup-page-backup:hover,
.action-dialog-add:hover,
.action-dialog-delete:hover,
.annotation-dialog-tabs,
.action-dialog-edit:hover,
.backup-page-next:hover,
.book-manage-title:hover,
.backup-page-list-item:hover,
.restore-file:hover,
.copy-option:hover {
background-color: rgba(235, 235, 235, 0.035);
}
.drag-background {
background: hsla(0, 0%, 100%, 0.2);
}
.action-dialog-container,
.select-more-actions,
.add-dialog-container,
.backup-page-container,
.delete-dialog-container,
.download-desk-container,
.edit-dialog-container,
.loading-dialog,
.setting-dialog-container,
.feedback-dialog-container,
.token-dialog-container,
.new-version,
.sort-dialog-container,
.popup-menu-box,
.popup-color-box,
.popup-box-container,
.loading-page-cover,
.loading-page-cover,
.navigation-panel,
.book-operation-panel,
.progress-panel,
.input-value,
.tag-list-item-new,
.tag-list-item,
.more-options-dropdown,
.setting-panel-parent,
.protection-overlay {
background: rgba(47, 52, 55, 1);
box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.2);
}
.setting-dialog-sidebar {
border-right: 1px solid rgba(255, 255, 255, 0.07);
}
.setting-dialog-sidebar-item.active {
background: rgba(255, 255, 255, 0.1);
}
.plugin-tab-bar {
background: rgba(47, 52, 55, 1);
}
.plugin-tab-item-active {
background: rgba(255, 255, 255, 0.12);
}
.book-item-image,
.book-item-cover,
.book-cover,
.detail-cover,
.detail-cover-background-container,
.book-cover-item-cover {
background: rgba(235, 235, 235, 0.1);
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
.backup-page-backup-selector,
.message-box-container {
box-shadow: 0px 0px 12px rgba(75, 75, 75, 1);
}
.add-bookmark-button,
.exit-reading-button,
.add-bookmark-button,
.enter-fullscreen-button,
.navigation-header {
box-shadow: 0px 0px 5px rgba(30, 30, 30, 1);
}
.background-color-circle,
.background-box1,
.background-box2,
.background-box3 {
box-shadow: 0px 0px 2px rgba(235, 235, 235, 0.18);
}
.book-spine,
.background-box1,
.background-box2,
.background-box3 {
border: 1px solid rgba(191, 191, 191, 0.3);
}
.add-dialog-cancel,
.delete-dialog-cancel,
.edit-dialog-cancel,
.loading-dialog,
.lang-setting-dropdown,
.token-dialog-cancel,
.voice-add-cancel,
.new-version,
.popup-menu-box,
.popup-color-box,
.popup-box-container,
.general-setting-dropdown,
.card-list-item-card,
.import-from-cloud,
.only-local-slider,
.single-control-button,
.add-dialog-shelf-list-box,
.add-dialog-new-shelf-box,
.edit-dialog-book-name-box,
.edit-dialog-book-author-box,
.edit-dialog-input,
.edit-dialog-textarea,
.setting-dialog-pro-button,
.booklist-shelf-list,
.progress-slide-circle {
background: rgba(47, 52, 55, 1);
}
.single-control-switch,
::-webkit-scrollbar-thumb,
::-webkit-scrollbar-thumb:hover,
.active-tag,
.active-page,
.sk-chase-dot:before {
background-color: rgba(235, 235, 235, 0.5);
}
@-moz-document url-prefix() {
.single-control-switch {
border: 1.5px solid rgba(235, 235, 235, 0.3);
background-color: rgba(71, 76, 80, 1);
}
}
.exit-reading-text,
.add-bookmark-text,
.token-dialog-token-text,
.enter-fullscreen-text,
.image-operation,
.add-bookmark-icon,
.exit-reading-icon,
.message-box-icon,
.active-icon,
.active-selector,
.enter-fullscreen-icon,
.icon-popup,
.token-dialog-link-text,
.token-dialog-token-text,
.delete-dialog-uncheck-icon,
.book-bookmark-link,
.general-setting-dropdown,
.trans-lang-selector,
.original-lang-selector,
.editor-box,
#jumpPage,
#jumpChapter,
.add-dialog-shelf-list-box,
.add-dialog-new-shelf-box,
.edit-dialog-book-name-box,
.edit-dialog-book-author-box,
.edit-dialog-input,
.edit-dialog-textarea,
.card-list-item-show-more,
.cover-banner,
.book-more-action,
.reading-progress-icon,
.book-love-icon,
input,
.input-value {
color: rgba(235, 235, 235, 1);
}
.book-content-name,
.book-subcontent-name,
.book-content-header,
.book-bookmark-list,
.nav-search-list-item,
.sort-dialog-seperator {
border-bottom: 1px solid rgba(235, 235, 235, 0.1);
}
.card-list-item-card {
border: 1px solid rgba(235, 235, 235, 0.1);
}
.popup-menu-triangle-up,
.active-tag,
.active-page,
.popup-menu-triangle-down {
color: rgba(47, 52, 55, 1) !important;
}
-302
View File
@@ -1,302 +0,0 @@
body,
.active-annotation-dialog-tab {
-webkit-tap-highlight-color: transparent;
background: rgba(255, 255, 255, 1);
color: rgba(75, 75, 75, 1);
}
a {
color: blue;
text-decoration: none;
}
.delete-tag-container,
.setting-subtitle,
.book-more-action,
.reading-progress-icon,
.more-option-text,
.book-subcontent-name,
.pin-keypad-title,
.pin-key {
color: rgba(75, 75, 75, 1);
}
.book-love-icon,
.book-loved-icon,
.zoom-in-icon,
.zoom-out-icon,
.save-icon,
.clockwise-icon,
.counterclockwise-icon {
text-shadow: 0px 0px 5px rgba(75, 75, 75, 0.3);
}
.add-dialog-shelf-list-box,
.add-dialog-shelf-list-option,
.add-dialog-new-shelf-box,
.add-dialog-cancel,
.delete-dialog-cancel,
.edit-dialog-book-name-box,
.edit-dialog-book-author-box,
.edit-dialog-input,
.edit-dialog-textarea,
.edit-dialog-cancel,
.tag-list-item,
.token-dialog-cancel,
.voice-add-cancel,
.lang-setting-dropdown,
.tag-list-item-new,
.input-value,
.import-from-cloud,
.booklist-shelf-list,
.token-dialog-token-box,
.feedback-dialog-content-box,
.voice-add-content-box,
.token-dialog-url-box,
.token-dialog-username-box,
.account-login-option,
.font-featured-download-btn,
.token-dialog-password-box,
.general-setting-dropdown,
.delete-dialog-uncheck-icon,
.next-chapter,
.progress-slide-circle,
.setting-dialog-location-title,
.delete-dialog-uncheck-icon,
.previous-chapter,
.color-option,
.line-option,
.token-dialog-link-text,
.token-dialog-token-text,
.nav-search-page-item,
.pin-dot {
border: 2px solid rgba(75, 75, 75, 1);
}
.header-search-box,
.header-search-box::placeholder,
.feedback-dialog-content-box::placeholder,
.header-search-text,
.card-list-item-show-more,
.token-dialog-link-text,
.token-dialog-token-text,
.book-content-search-input,
.pin-key-cancel {
color: rgba(75, 75, 75, 0.8);
}
::-webkit-scrollbar-thumb,
::-webkit-scrollbar-thumb:hover {
background-color: rgba(75, 75, 75, 0.3);
}
.delete-digest-button,
.add-dialog-confirm,
.backup-page-backup-selector,
.delete-dialog-confirm,
.book-item-config,
.book-cover-item-config,
.download-desk-button,
.edit-dialog-confirm,
.change-location-button,
.token-dialog-confirm,
.voice-add-confirm,
.new-version-open,
.update-dialog-container-button,
.import-from-local,
.active-tag,
.single-control-switch,
.side-menu-selector-container,
.previous-chapter-single-container,
.next-chapter-single-container,
.book-bookmark-link,
.message-box-container,
.popup-close,
.only-local-icon,
.active-page,
.sk-chase-dot:before,
.biometric-auth-button,
.font-featured-progress-bar,
.pin-dot.pin-dot-filled {
background-color: rgba(75, 75, 75, 1) !important;
color: rgba(255, 255, 255, 1) !important;
}
.header-search-box,
#jumpPage,
#jumpChapter,
#newTag,
.pin-key {
background-color: rgba(75, 75, 75, 0.1);
}
.backup-page-close-icon:hover,
.sidebar-list-icon:hover,
.annotation-dialog-tabs,
.nav-close-icon:hover,
.setting-close-container:hover,
.side-menu-hover-container,
.side-menu-item.shelf-drop-target .side-menu-selector,
.setting-dialog-location-title,
.note-option:hover,
.digest-option:hover,
.translation-option:hover,
.speaker-option:hover,
.backup-page-backup:hover,
.search-book-option:hover,
.dict-option:hover,
.wikipedia-option:hover,
.browser-option:hover,
.header-search-text:hover,
.reader-setting-icon-container:hover,
.setting-icon-container:hover,
.animation-mask,
.animation-mask-local,
.sort-by-category-list:hover,
.more-option-item:hover,
.sort-by-order-list:hover,
.action-dialog-add:hover,
.action-dialog-delete:hover,
.action-dialog-edit:hover,
.backup-page-next:hover,
.backup-page-list-item:hover,
.restore-file:hover,
.book-manage-title:hover,
.copy-option:hover {
background-color: rgba(75, 75, 75, 0.05);
}
.drag-background {
background: hsla(0, 0%, 0%, 0.4);
}
.action-dialog-container,
.add-dialog-container,
.select-more-actions,
.backup-page-container,
.delete-dialog-container,
.download-desk-container,
.edit-dialog-container,
.loading-dialog,
.setting-dialog-container,
.feedback-dialog-container,
.token-dialog-container,
.new-version,
.sort-dialog-container,
.popup-menu-box,
.popup-color-box,
.popup-box-container,
.loading-page-cover,
.loading-page-cover,
.navigation-panel,
.book-operation-panel,
.progress-panel,
.setting-panel-parent,
.biometric-auth-container {
background: rgba(255, 255, 255, 1);
box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.2);
}
.protection-overlay {
background: #f5f5f5;
}
.setting-dialog-sidebar {
border-right: 1px solid rgba(0, 0, 0, 0.07);
}
.setting-dialog-sidebar-item.active {
background: rgba(75, 75, 75, 1);
}
.plugin-tab-bar,
.pin-keypad-container {
background: rgba(255, 255, 255, 1);
}
.plugin-tab-item-active {
background: rgba(0, 0, 0, 0.08);
}
.book-item-image,
.book-item-cover,
.book-cover,
.detail-cover,
.more-options-dropdown,
.detail-cover-background-container,
.book-cover-item-cover {
background: rgba(255, 255, 255, 1);
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
.book-item-image {
-webkit-user-drag: none;
}
.book-item-list {
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
.backup-page-backup-selector,
.message-box-container {
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.3);
}
.tag-list-item {
background-color: white;
}
.add-bookmark-button,
.exit-reading-button,
.add-bookmark-button,
.enter-fullscreen-button,
.navigation-header,
.book-cover {
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
.book-spine,
.background-box1,
.background-box2,
.background-box3 {
border: 1px solid rgba(191, 191, 191, 1);
}
.background-color-circle,
.background-box1,
.background-box2,
.background-box3 {
box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.18);
}
.add-dialog-cancel,
.delete-dialog-cancel,
.edit-dialog-cancel,
.loading-dialog,
.lang-setting-dropdown,
.token-dialog-cancel,
.voice-add-cancel,
.new-version,
.popup-menu-box,
.popup-color-box,
.popup-box-container,
.general-setting-dropdown,
.card-list-item-card,
.import-from-cloud,
.only-local-slider,
.single-control-button,
.setting-dialog-pro-button,
.progress-slide-circle {
background: rgba(255, 255, 255, 1);
}
.cover-banner,
.exit-reading-text,
.add-bookmark-text,
.enter-fullscreen-text,
.book-love-icon,
.image-operation,
.popup-menu-triangle-up,
.popup-menu-triangle-down,
.add-bookmark-icon,
.active-page,
.exit-reading-icon,
.message-box-icon,
.active-icon,
.active-selector,
.enter-fullscreen-icon,
.icon-popup,
.delete-dialog-uncheck-icon,
.setting-dialog-sidebar-item.active,
.book-bookmark-link {
color: rgba(255, 255, 255, 1);
}
.book-content-name,
.book-content-header,
.book-subcontent-name,
.book-bookmark-list,
.nav-search-list-item,
.sort-dialog-seperator {
border-bottom: 1px solid rgba(75, 75, 75, 0.1);
}
.card-list-item-card {
border: 2px solid rgba(75, 75, 75, 0.15);
}
+474
View File
@@ -0,0 +1,474 @@
:root {
--app-bg: rgba(255, 255, 255, 1);
--text-color: rgba(75, 75, 75, 1);
--text-weak: rgba(75, 75, 75, 0.8);
--link-color: blue;
--hover-bg: rgba(75, 75, 75, 0.05);
--input-bg: rgba(75, 75, 75, 0.1);
--scrollbar-bg: rgba(75, 75, 75, 0.3);
--control-bg: rgba(75, 75, 75, 1);
--on-control: rgba(255, 255, 255, 1);
--accent-bg: rgba(75, 75, 75, 1);
--filled-bg: rgba(75, 75, 75, 1);
--on-filled: rgba(255, 255, 255, 1);
--panel-bg: rgba(255, 255, 255, 1);
--cover-bg: rgba(255, 255, 255, 1);
--drag-bg: hsla(0, 0%, 0%, 0.4);
--sidebar-divider: rgba(0, 0, 0, 0.07);
--active-item-bg: rgba(75, 75, 75, 1);
--tab-active-bg: rgba(0, 0, 0, 0.08);
--float-shadow: 0px 0px 12px rgba(0, 0, 0, 0.3);
--header-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
--soft-shadow: 0px 0px 2px rgba(0, 0, 0, 0.18);
--spine-border: 1px solid rgba(191, 191, 191, 1);
--divider: rgba(75, 75, 75, 0.1);
--option-border: 2px solid rgba(75, 75, 75, 1);
--card-border: 2px solid rgba(75, 75, 75, 0.15);
}
:root[data-theme="dark"] {
--app-bg: rgba(47, 52, 55, 1);
--text-color: rgba(235, 235, 235, 1);
--text-weak: rgba(235, 235, 235, 0.8);
--link-color: lightskyblue;
--hover-bg: rgba(235, 235, 235, 0.035);
--input-bg: rgba(235, 235, 235, 0.1);
--scrollbar-bg: rgba(235, 235, 235, 0.5);
--control-bg: rgba(71, 76, 80, 1);
--on-control: rgba(235, 235, 235, 1);
--accent-bg: rgba(235, 235, 235, 0.5);
--filled-bg: rgba(235, 235, 235, 1);
--on-filled: rgba(47, 52, 55, 1);
--panel-bg: rgba(47, 52, 55, 1);
--cover-bg: rgba(235, 235, 235, 0.1);
--drag-bg: hsla(0, 0%, 100%, 0.2);
--sidebar-divider: rgba(255, 255, 255, 0.07);
--active-item-bg: rgba(255, 255, 255, 0.1);
--tab-active-bg: rgba(255, 255, 255, 0.12);
--float-shadow: 0px 0px 12px rgba(75, 75, 75, 1);
--header-shadow: 0px 0px 5px rgba(30, 30, 30, 1);
--soft-shadow: 0px 0px 2px rgba(235, 235, 235, 0.18);
--spine-border: 1px solid rgba(191, 191, 191, 0.3);
--divider: rgba(235, 235, 235, 0.1);
--option-border: 1.5px solid rgba(235, 235, 235, 1);
--card-border: 1px solid rgba(235, 235, 235, 0.1);
}
body,
.active-annotation-dialog-tab {
-webkit-tap-highlight-color: transparent;
background: var(--app-bg);
color: var(--text-color);
}
a {
color: var(--link-color);
text-decoration: none;
}
.booklist-shelf-list,
.lang-setting-dropdown,
.add-source-card,
.delete-tag-container,
.setting-subtitle,
.book-more-action,
.reading-progress-icon,
.more-option-text,
.book-subcontent-name,
.pin-keypad-title,
.pin-key {
color: var(--text-color);
}
.add-dialog-shelf-list-box,
.add-dialog-new-shelf-box,
.add-dialog-cancel,
.delete-dialog-cancel,
.edit-dialog-book-name-box,
.edit-dialog-book-author-box,
.edit-dialog-input,
.edit-dialog-textarea,
.edit-dialog-cancel,
.tag-list-item,
.token-dialog-cancel,
.voice-add-cancel,
.lang-setting-dropdown,
.tag-list-item-new,
.input-value,
.import-from-cloud,
.booklist-shelf-list,
.token-dialog-token-box,
.feedback-dialog-content-box,
.voice-add-content-box,
.token-dialog-url-box,
.token-dialog-username-box,
.account-login-option,
.font-featured-download-btn,
.token-dialog-password-box,
.general-setting-dropdown,
.delete-dialog-uncheck-icon,
.next-chapter,
.progress-slide-circle,
.setting-dialog-location-title,
.previous-chapter,
.color-option,
.line-option,
.token-dialog-link-text,
.token-dialog-token-text,
.nav-search-page-item,
.pin-dot {
border: var(--option-border);
}
.header-search-box,
.header-search-box::placeholder,
.feedback-dialog-content-box::placeholder,
.header-search-text,
.pin-key-cancel {
color: var(--text-weak);
}
::-webkit-scrollbar-thumb,
::-webkit-scrollbar-thumb:hover {
background-color: var(--scrollbar-bg);
}
.delete-digest-button,
.add-dialog-confirm,
.backup-page-backup-selector,
.delete-dialog-confirm,
.book-item-config,
.book-cover-item-config,
.download-desk-button,
.edit-dialog-confirm,
.change-location-button,
.token-dialog-confirm,
.voice-add-confirm,
.new-version-open,
.update-dialog-container-button,
.import-from-local,
.side-menu-selector-container,
.previous-chapter-single-container,
.next-chapter-single-container,
.book-bookmark-link,
.message-box-container,
.popup-close,
.only-local-icon,
.biometric-auth-button,
.font-featured-progress-bar {
background-color: var(--control-bg);
color: var(--on-control);
}
.active-tag {
background-color: var(--accent-bg);
color: var(--on-filled);
}
.single-control-switch {
background-color: var(--accent-bg);
}
.pin-dot.pin-dot-filled {
background-color: var(--filled-bg);
color: var(--on-filled);
}
.header-search-box,
#jumpPage,
#jumpChapter,
#newTag,
.pin-key {
background-color: var(--input-bg);
}
.backup-page-close-icon:hover,
.sidebar-list-icon:hover,
.annotation-dialog-tabs,
.nav-close-icon:hover,
.setting-close-container:hover,
.side-menu-hover-container,
.side-menu-item.shelf-drop-target .side-menu-selector,
.setting-dialog-location-title,
.note-option:hover,
.digest-option:hover,
.translation-option:hover,
.speaker-option:hover,
.backup-page-backup:hover,
.search-book-option:hover,
.dict-option:hover,
.wikipedia-option:hover,
.browser-option:hover,
.header-search-text:hover,
.reader-setting-icon-container:hover,
.setting-icon-container:hover,
.animation-mask,
.animation-mask-local,
.sort-by-category-list:hover,
.more-option-item:hover,
.sort-by-order-list:hover,
.action-dialog-add:hover,
.action-dialog-delete:hover,
.action-dialog-edit:hover,
.backup-page-next:hover,
.backup-page-list-item:hover,
.restore-file:hover,
.book-manage-title:hover,
.copy-option:hover {
background-color: var(--hover-bg);
}
.drag-background {
background: var(--drag-bg);
}
.action-dialog-container,
.add-dialog-container,
.select-more-actions,
.backup-page-container,
.delete-dialog-container,
.download-desk-container,
.edit-dialog-container,
.loading-dialog,
.setting-dialog-container,
.feedback-dialog-container,
.token-dialog-container,
.new-version,
.sort-dialog-container,
.popup-menu-box,
.popup-color-box,
.popup-box-container,
.loading-page-cover,
.navigation-panel,
.book-operation-panel,
.progress-panel,
.setting-panel-parent {
background: var(--panel-bg);
box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.2);
}
.setting-dialog-sidebar {
border-right: 1px solid var(--sidebar-divider);
}
.setting-dialog-sidebar-item.active {
background: var(--active-item-bg);
color: var(--on-control);
}
.plugin-tab-bar {
background: var(--panel-bg);
}
.plugin-tab-item-active {
background: var(--tab-active-bg);
}
.book-item-image,
.book-item-cover,
.book-cover,
.detail-cover,
.detail-cover-background-container,
.book-cover-item-cover {
background: var(--cover-bg);
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
.backup-page-backup-selector,
.message-box-container {
box-shadow: var(--float-shadow);
}
.add-bookmark-button,
.exit-reading-button,
.enter-fullscreen-button,
.navigation-header {
box-shadow: var(--header-shadow);
}
.background-color-circle,
.background-box1,
.background-box2,
.background-box3 {
box-shadow: var(--soft-shadow);
}
.book-spine,
.background-box1,
.background-box2,
.background-box3 {
border: var(--spine-border);
}
.add-dialog-cancel,
.delete-dialog-cancel,
.edit-dialog-cancel,
.loading-dialog,
.lang-setting-dropdown,
.token-dialog-cancel,
.voice-add-cancel,
.new-version,
.popup-menu-box,
.popup-color-box,
.popup-box-container,
.general-setting-dropdown,
.card-list-item-card,
.import-from-cloud,
.only-local-slider,
.single-control-button,
.setting-dialog-pro-button,
.progress-slide-circle {
background: var(--panel-bg);
}
.exit-reading-text,
.add-bookmark-text,
.enter-fullscreen-text,
.image-operation,
.add-bookmark-icon,
.exit-reading-icon,
.message-box-icon,
.active-icon,
.active-selector,
.enter-fullscreen-icon,
.icon-popup,
.cover-banner,
.book-love-icon {
color: var(--on-control);
}
.book-content-name,
.book-content-header,
.book-subcontent-name,
.book-bookmark-list,
.nav-search-list-item,
.sort-dialog-seperator {
border-bottom: 1px solid var(--divider);
}
.card-list-item-card {
border: var(--card-border);
}
[data-theme="light"] .book-love-icon,
[data-theme="light"] .book-loved-icon,
[data-theme="light"] .zoom-in-icon,
[data-theme="light"] .zoom-out-icon,
[data-theme="light"] .save-icon,
[data-theme="light"] .clockwise-icon,
[data-theme="light"] .counterclockwise-icon {
text-shadow: 0px 0px 5px rgba(75, 75, 75, 0.3);
}
[data-theme="light"] .add-dialog-shelf-list-option {
border: var(--option-border);
}
[data-theme="light"] .card-list-item-show-more,
[data-theme="light"] .token-dialog-link-text,
[data-theme="light"] .token-dialog-token-text,
[data-theme="light"] .book-content-search-input {
color: var(--text-weak);
}
[data-theme="light"] .book-item-image {
-webkit-user-drag: none;
}
[data-theme="light"] .book-item-list {
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
[data-theme="light"] .more-options-dropdown {
background: var(--cover-bg);
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.18);
}
[data-theme="light"] .biometric-auth-container {
background: var(--panel-bg);
box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.2);
}
[data-theme="light"] .pin-keypad-container {
background: var(--panel-bg);
}
[data-theme="light"] .single-control-switch {
color: var(--on-control);
}
[data-theme="light"] .protection-overlay {
background: #f5f5f5;
}
[data-theme="dark"] .add-source-card {
border: var(--option-border);
}
[data-theme="dark"] .voice-add-content-box::placeholder,
[data-theme="dark"] .token-dialog-username-box::placeholder,
[data-theme="dark"] .token-dialog-token-box::placeholder {
color: var(--text-weak);
}
[data-theme="dark"] .add-dialog-shelf-list-option,
[data-theme="dark"] .voice-add-content-box,
[data-theme="dark"] .token-dialog-username-box,
[data-theme="dark"] .token-dialog-token-box,
[data-theme="dark"] .backup-source-dropdown,
[data-theme="dark"] .pin-keypad-container,
[data-theme="dark"] .biometric-auth-container {
background-color: var(--control-bg);
color: var(--on-control);
}
[data-theme="dark"] .previous-chapter-single-container,
[data-theme="dark"] .next-chapter-single-container {
opacity: 0.7;
}
[data-theme="dark"] .input-value,
[data-theme="dark"] .tag-list-item-new,
[data-theme="dark"] .tag-list-item,
[data-theme="dark"] .more-options-dropdown,
[data-theme="dark"] .protection-overlay {
background: var(--panel-bg);
box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.2);
}
[data-theme="dark"] .add-dialog-shelf-list-box,
[data-theme="dark"] .add-dialog-new-shelf-box,
[data-theme="dark"] .edit-dialog-book-name-box,
[data-theme="dark"] .edit-dialog-book-author-box,
[data-theme="dark"] .edit-dialog-input,
[data-theme="dark"] .edit-dialog-textarea,
[data-theme="dark"] .booklist-shelf-list {
background: var(--panel-bg);
}
[data-theme="dark"] .token-dialog-link-text,
[data-theme="dark"] .token-dialog-token-text,
[data-theme="dark"] .general-setting-dropdown,
[data-theme="dark"] .trans-lang-selector,
[data-theme="dark"] .original-lang-selector,
[data-theme="dark"] .editor-box,
[data-theme="dark"] #jumpPage,
[data-theme="dark"] #jumpChapter,
[data-theme="dark"] .add-dialog-shelf-list-box,
[data-theme="dark"] .add-dialog-new-shelf-box,
[data-theme="dark"] .edit-dialog-book-name-box,
[data-theme="dark"] .edit-dialog-book-author-box,
[data-theme="dark"] .edit-dialog-input,
[data-theme="dark"] .edit-dialog-textarea,
[data-theme="dark"] .card-list-item-show-more,
[data-theme="dark"] input,
[data-theme="dark"] .input-value {
color: var(--text-color);
}
@-moz-document url-prefix() {
[data-theme="dark"] .single-control-switch {
border: 1.5px solid rgba(235, 235, 235, 0.3);
background-color: rgba(71, 76, 80, 1);
}
}
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
+1 -1
View File
File diff suppressed because one or more lines are too long.
+54 -4
View File
@@ -837,6 +837,7 @@
"Bilingual translation": "ሁለት ቋንቋ ትርጉም",
"Use AI to analyze books, with different characters reading aloud in different voices": "መጻሕፍትን ለመተንተን AI ይጠቀሙ፣ የተለያዩ ገጸ ባህሪያት በተለያዩ ድምጾች ጮክ ብለው ያነባሉ",
"Voice type": "የድምጽ አይነት",
"Please reselect voices for all roles": "እባክዎ የሁሉም ገጸ ባህሪያት ድምጾችን እንደገና ይምረጡ",
"System voice": "የስርዓት ድምጽ",
"Purchase the code": "ኮዱን ይግዙ",
"Please upgrade to Pro to use this feature": "ይህን ባህሪ ለመጠቀም እባክዎ ወደ Pro ያሻሽሉ",
@@ -1142,8 +1143,6 @@
"None": "የለም",
"Slide": "ስላይድ",
"Flip": "ገልብጥ",
"Custom voice plugins are not supported": "ብጁ የድምጽ ተሰኪዎች አይደገፉም",
"Custom voice plugins have been disabled": "ብጁ የድምጽ ተሰኪዎች ተሰናክለዋል",
"Paste voice list JSON": "የድምጽ ዝርዝር JSON ይለጥፉ",
"Invalid voice list JSON": "ልክ የሆኑ የድምጽ ውቅሮችን የያዘ ባዶ ያልሆነ የ JSON ድርድር ያስገቡ",
"Failed to load more": "ተጨማሪ መጫን አልተሳካም",
@@ -1288,7 +1287,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "ከ Pro ሲወጡ፣ አመሳሰልን እና ሌሎች ፕሪሚየም ባህሪያትን መጠቀም አይችሉም",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "ለወደፊቱ ተጨማሪ ለአባላት-ብቻ የሆኑ ባህሪያትን እናስተዋውቃለን፣ የንባብ ስታቲስቲክስ እና ማስታወሻዎች፣ ማጉላቶች፣ የንባብ ሂደት እና የቃላት ዝርዝሮችዎን ወደ Notion፣ Obsidian፣ Logseq፣ Anki እና ሌሎች መድረኮች ራስ-ሰር ማመሳሰልን ጨምሮ።",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "ተሻጋሪ-መድረክ የውሂብ አመሳሰል (ክላውድ ድራይቭ፣ WebDAV፣ Docker፣ የነገር ማጠራቀሚያ)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "መጻሕፍትን ከክላውድ ድራይቭ (Baidu Netdisk፣ Google Drive፣ WebDAV፣ FTP፣ SMB) አስመጣ",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "መጻሕፍትን ከክላውድ ድራይቭ (OneDrive፣ Google Drive፣ WebDAV፣ FTP፣ SMB) አስመጣ",
"Official translation in 90+ languages": "ኦፊሴላዊ ትርጉም በ90+ ቋንቋዎች",
"Official dictionary with definitions, examples & pronunciation": "ኦፊሴላዊ መዝገበ-ቃላት (ትርጓሜዎች፣ ምሳሌዎች እና አጠራር)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "የAI የንባብ እገዛዎች (የምዕራፍ ማጠቃለያ፣ መግለጫ፣ ባለብዙ-ገጸ-ባህሪ ትረካ)",
@@ -1319,5 +1318,56 @@
"Enter your Notion personal access token": "የ Notion የግል መዳረሻ ቶከንዎን ያስገቡ",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "እባክዎ በቅንብሮች ውስጥ ነባሪውን የማመሳሰል አማራጭ ወደ አካባቢ ያዘጋጁ፣ ወይም ከተጨማሪ የክላውድ ማከማቻ ጋር ለማመሳሰል ወደ Pro ያሻሽሉ",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "እባክዎ በአሳሹ የላይኛው ቀኝ ጥግ ላይ ያለውን የKoodo Reader ቅጥያ አዶ ይጫኑ፣ ለዚህ መጨረሻ-ነጥብ ያለውን ጥያቄ ያፍቅሩ እና እንደገና ይሞክሩ",
"How to sync library across devices": "ቤተ-መጻሕፍትን በመሳሪያዎች መካከል እንዴት ማመሳሰል እንደሚቻል"
"How to sync library across devices": "ቤተ-መጻሕፍትን በመሳሪያዎች መካከል እንዴት ማመሳሰል እንደሚቻል",
"Enable reading ruler": "የንባብ ማስመሪያን አንቃ",
"Reading ruler height (lines)": "የንባብ ማስመሪያ ቁመት (መስመሮች)",
"Reading ruler background opacity": "የንባብ ማስመሪያ ዳራ ግልጽነት",
"Enable speed reading": "ፈጣን ንባብን አንቃ",
"Reading speed (WPM)": "የንባብ ፍጥነት (WPM)",
"ISBN": "ISBN",
"Rating": "ደረጃ አሰጣጥ",
"Rating count": "የደረጃ አሰጣጥ ብዛት",
"Publish date": "የታተመበት ቀን",
"Categories": "ምድቦች",
"Member login": "የአባል መግቢያ",
"Register / Login": "ይመዝገቡ / ይግቡ",
"Start 7-day free trial": "የ7 ቀን ነፃ ሙከራ ጀምር",
"Scan for new books": "አዲስ መጻሕፍትን ስካን አድርግ",
"Recognize book title and author with AI on import": "በማስገባት ጊዜ የመጽሐፉን ርዕስና ደራሲ በAI ለይ",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "መጻሕፍትን ሲያስገቡ፣ ከመጽሐፉ ሜታዳታ የመጽሐፍ ርዕስ ካልተተረጎመ፣ ርዕሱንና ደራሲውን ለመለየት AI ይጠቀማል",
"No image found in archive": "በማህደሩ ውስጥ ምንም ምስል አልተገኘም",
"Extract cover failed": "ሽፋን ማውጣት አልተሳካም",
"Custom plugin security warning": "⚠️ <b>ከባድ የደህንነት ማስጠንቀቂያ</b><br><br>ብጁ ፕላጊኖች በኮምፒውተርዎ ላይ ሙሉ መዳረሻና ቁጥጥር አላቸው፣ በተለይም ብጁ የTTS ፕላጊኖች የዘፈቀደ ኮድ ማስኬድ ይችላሉ።<br>ይህ ማለት እነዚህን ማድረግ ይችላሉ ማለት ነው፦<br>• ፋይሎችዎን ማንበብ፣ መቀየር ወይም መሰረዝ<br>• መለያዎችን፣ የይለፍ ቃላትን እና የአሳሽ ውሂብን መስረቅ<br>• አደገኛ ፕሮግራሞችን መጫን<br>• መሳሪያዎን ከርቀት መቆጣጠር<br><br>ፕላጊን የሚጨምሩት ሙሉ በሙሉ እንደሚተማመኑበት እና ኮዱን በጥንቃቄ ካጠኑ በኋላ ብቻ ነው።<br>ከማይታወቁ ድረ-ገጾች፣ ከማይታወቁ ምንጮች ወይም ከመደበኛ ያልሆኑ መንገዶች የመጡ ፕላጊኖችን በጭራሽ አይጨምሩ።",
"Enable paragraph mode": "የአንቀጽ ሁነታን አንቃ",
"Import notes, highlights and dictionary history": "ማስታወሻዎችን፣ ድምቀቶችን እና የመዝገበ-ቃላት ታሪክን አስገባ",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "ቀደም ሲል የተላኩ CSV ወይም JSON ፋይሎችን ይምረጡ፣ ማስታወሻዎችን፣ ድምቀቶችን እና የመዝገበ-ቃላት ታሪክን ወደ ቤተ-መጽሐፍቱ ለማስገባት",
"Invalid data": "ልክ ያልሆነ ውሂብ",
"The book {{name}} is not found in the library, please import the original book before importing": "መጽሐፉ {{name}} በቤተ-መጽሐፍቱ ውስጥ አልተገኘም፣ እባክዎ ከማስገባትዎ በፊት ዋናውን መጽሐፍ ያስገቡ",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} መዝገቦች ተስገቡ፣ {{skipped}} ያሉ መዝገቦች ተዘለሉ",
"Download featured backgrounds": "የተመረጡ ዳራዎችን አውርድ",
"Official background": "ይፋዊ ዳራ",
"Recognize title with AI": "ርዕሱን በAI ለይ",
"Download open dictionaries": "ክፍት መዝገበ-ቃላትን አውርድ",
"Dictionary already downloaded": "መዝገበ-ቃላቱ አስቀድሞ ተወርዷል",
"Source": "ምንጭ",
"Word definitions and fast reading mode cannot be enabled at the same time": "የቃላት ትርጓሜዎች እና ፈጣን የንባብ ሁነታ በአንድ ጊዜ ሊነቁ አይችሉም",
"Reading ruler height": "የንባብ ማስመሪያ ቁመት",
"FAQ": "ተደጋጋሚ ጥያቄዎች",
"Auto scan and import books when starting the app or when clicking Scan": "መተግበሪያውን ሲጀምሩ ወይም ስካን ሲጫኑ መጻሕፍትን በራስ-ሰር ስካን አድርግ እና አስገባ",
"Please enter book name": "እባክዎ የመጽሐፉን ስም ያስገቡ",
"Waiting for download...": "ለማውረድ በመጠበቅ ላይ...",
"Pin to right": "ወደ ቀኝ ሰካ",
"Unpin": "ንቀል",
"Resize": "መጠን ቀይር",
"Limited free": "ጊዜያዊ ነፃ",
"7-day free trial upon registration, then billed $4.99 per Year": "ሲመዘገቡ የ7 ቀን ነፃ ሙከራ፣ ከዚያም በዓመት $4.99 ይከፈላል",
"Yearly": "ዓመታዊ",
"Year": "ዓመት",
"Limited offer": "የተወሰነ ጊዜ ቅናሽ",
"$4.99": "$4.99",
"Title recognized successfully": "ርዕሱ በተሳካ ሁኔታ ተለይቷል",
"Failed to recognize title": "ርዕሱን መለየት አልተሳካም",
"Show total page number (Experimental)": "ጠቅላላ የገጽ ቁጥር አሳይ (ሙከራዊ)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "ይህ የKoodo Reader ስሪት በጣም ያረጀ ነው። እባክዎ ወደ ቅንብር - ስለ - ዝማኔ ፈትሽ በመሄድ Koodo Reader ን ወደ መጨረሻው ስሪት አዘምነው እንደገና ይሞክሩ።",
"Background opacity": "የዳራ ግልጽነት"
}
+54 -4
View File
@@ -840,6 +840,7 @@
"Bilingual translation": "ترجمة ثنائية اللغة",
"Use AI to analyze books, with different characters reading aloud in different voices": "استخدام الذكاء الاصطناعي لتحليل الكتب، مع قراءة الشخصيات المختلفة بأصوات مختلفة",
"Voice type": "نوع الصوت",
"Please reselect voices for all roles": "يرجى إعادة تحديد الأصوات لجميع الأدوار",
"System voice": "صوت النظام",
"Purchase the code": "شراء الرمز",
"Please upgrade to Pro to use this feature": "يرجى الترقية إلى Pro لاستخدام هذه الميزة",
@@ -1145,8 +1146,6 @@
"None": "لا شيء",
"Slide": "انزلاق",
"Flip": "قلب",
"Custom voice plugins are not supported": "لا يتم دعم إضافات الصوت المخصصة",
"Custom voice plugins have been disabled": "تم تعطيل إضافات الصوت المخصصة",
"Paste voice list JSON": "لصق JSON قائمة الأصوات",
"Invalid voice list JSON": "أدخل مصفوفة JSON غير فارغة تحتوي على إعدادات صوتية صالحة",
"Failed to load more": "فشل تحميل المزيد",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "عند الخروج من الإصدار الاحترافي، لن تتمكن من استخدام المزامنة والميزات المميزة الأخرى",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "في المستقبل، سوف نقدم المزيد من الميزات الحصرية للأعضاء، بما في ذلك إحصائيات القراءة والمزامنة التلقائية لملاحظاتك وتمييزاتك وتقدم قراءتك وقوائم المفردات إلى منصات مثل Notion وObsidian وLogseq وAnki وغيرها.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "مزامنة البيانات عبر الأنظمة الأساسية (محركات الأقراص السحابية، WebDAV، Docker، تخزين الكائنات)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "استيراد الكتب من محركات الأقراص السحابية (Baidu Netdisk، Google Drive، WebDAV، FTP، SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "استيراد الكتب من محركات الأقراص السحابية (OneDrive، Google Drive، WebDAV، FTP، SMB)",
"Official translation in 90+ languages": "ترجمة رسمية بأكثر من 90 لغة",
"Official dictionary with definitions, examples & pronunciation": "قاموس رسمي (تعريفات وأمثلة ونطق)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "وسائل قراءة بالذكاء الاصطناعي (ملخصات الفصول، مخطط تفصيلي، سرد متعدد الأدوار)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "أدخل رمز الوصول الشخصي لـ Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "يرجى ضبط خيار المزامنة الافتراضي على محلي في الإعدادات، أو الترقية إلى الإصدار الاحترافي للمزامنة مع مساحة تخزين سحابية أكبر",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "يرجى النقر على أيقونة إضافة Koodo Reader في الزاوية اليمنى العلوية للمتصفح، والسماح بالطلب إلى هذه النقطة ثم المحاولة مرة أخرى",
"How to sync library across devices": "كيفية مزامنة المكتبة عبر الأجهزة"
"How to sync library across devices": "كيفية مزامنة المكتبة عبر الأجهزة",
"Enable reading ruler": "تفعيل مسطرة القراءة",
"Reading ruler height (lines)": "ارتفاع مسطرة القراءة (أسطر)",
"Reading ruler background opacity": "شفافية خلفية مسطرة القراءة",
"Enable speed reading": "تفعيل القراءة السريعة",
"Reading speed (WPM)": "سرعة القراءة (WPM)",
"ISBN": "ISBN",
"Rating": "التقييم",
"Rating count": "عدد التقييمات",
"Publish date": "تاريخ النشر",
"Categories": "الفئات",
"Member login": "تسجيل دخول الأعضاء",
"Register / Login": "التسجيل / تسجيل الدخول",
"Start 7-day free trial": "ابدأ تجربة مجانية لمدة 7 أيام",
"Scan for new books": "فحص الكتب الجديدة",
"Recognize book title and author with AI on import": "التعرف على عنوان الكتاب والمؤلف بالذكاء الاصطناعي عند الاستيراد",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "عند استيراد الكتب، إذا لم يتم استخراج عنوان الكتاب من بيانات الكتاب الوصفية، سيُستخدم الذكاء الاصطناعي للتعرف على عنوان الكتاب والمؤلف",
"No image found in archive": "لم يتم العثور على أي صورة في الأرشيف",
"Extract cover failed": "فشل استخراج الغلاف",
"Custom plugin security warning": "⚠️ <b>تحذير أمني خطير</b><br><br>تمتلك الإضافات المخصصة صلاحية الوصول الكامل إلى جهاز الكمبيوتر الخاص بك والتحكم فيه، لا سيما إضافات TTS المخصصة التي يمكنها تنفيذ تعليمات برمجية عشوائية.<br>وهذا يعني أنها قد:<br>• تقرأ ملفاتك أو تعدّلها أو تحذفها<br>• تسرق الحسابات وكلمات المرور وبيانات المتصفح<br>• تثبّت برامج ضارة<br>• تتحكم في جهازك عن بُعد<br><br>لا تُضِف أي إضافة إلا بعد أن تتأكد تمامًا من ثقتك بها ومراجعة كودها بالكامل بعناية.<br>لا تُضِف أبدًا إضافات من مواقع أو مصادر مجهولة أو قنوات غير رسمية.",
"Enable paragraph mode": "تفعيل وضع الفقرة",
"Import notes, highlights and dictionary history": "استيراد الملاحظات والتمييزات وسجل القاموس",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "اختر ملفات CSV أو JSON التي صدّرتها سابقًا لاستيراد الملاحظات والتمييزات وسجل القاموس مرة أخرى إلى المكتبة",
"Invalid data": "بيانات غير صالحة",
"The book {{name}} is not found in the library, please import the original book before importing": "لم يتم العثور على الكتاب {{name}} في المكتبة، يرجى استيراد الكتاب الأصلي قبل الاستيراد",
"Imported {{imported}} records, skipped {{skipped}} existing records": "تم استيراد {{imported}} سجلًا، وتخطي {{skipped}} سجلًا موجودًا",
"Download featured backgrounds": "تنزيل الخلفيات المميزة",
"Official background": "خلفية رسمية",
"Recognize title with AI": "التعرف على العنوان بالذكاء الاصطناعي",
"Download open dictionaries": "تنزيل القواميس المفتوحة",
"Dictionary already downloaded": "تم تنزيل القاموس بالفعل",
"Source": "المصدر",
"Word definitions and fast reading mode cannot be enabled at the same time": "لا يمكن تفعيل تعريفات الكلمات ووضع القراءة السريعة في الوقت نفسه",
"Reading ruler height": "ارتفاع مسطرة القراءة",
"FAQ": "الأسئلة الشائعة",
"Auto scan and import books when starting the app or when clicking Scan": "فحص الكتب واستيرادها تلقائيًا عند بدء التطبيق أو عند النقر على فحص",
"Please enter book name": "الرجاء إدخال اسم الكتاب",
"Waiting for download...": "في انتظار التنزيل...",
"Pin to right": "تثبيت إلى اليمين",
"Unpin": "إلغاء التثبيت",
"Resize": "تغيير الحجم",
"Limited free": "مجاني لفترة محدودة",
"7-day free trial upon registration, then billed $4.99 per Year": "تجربة مجانية لمدة 7 أيام عند التسجيل، ثم يتم تحصيل $4.99 سنويًا",
"Yearly": "سنوي",
"Year": "سنة",
"Limited offer": "عرض محدود",
"$4.99": "$4.99",
"Title recognized successfully": "تم التعرف على العنوان بنجاح",
"Failed to recognize title": "فشل التعرف على العنوان",
"Show total page number (Experimental)": "إظهار إجمالي عدد الصفحات (تجريبي)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "نسخة Koodo Reader هذه قديمة جدًا. يرجى الانتقال إلى الإعدادات - حول - التحقق من وجود تحديث لتحديث Koodo Reader إلى أحدث إصدار والمحاولة مرة أخرى.",
"Background opacity": "شفافية الخلفية"
}
+55 -5
View File
@@ -840,6 +840,7 @@
"Bilingual translation": "Двуезичен превод",
"Use AI to analyze books, with different characters reading aloud in different voices": "Използвайте AI за анализ на книги, като различни герои четат на глас с различни гласове",
"Voice type": "Тип глас",
"Please reselect voices for all roles": "Моля, изберете отново гласовете за всички роли",
"System voice": "Системен глас",
"Purchase the code": "Закупуване на кода",
"Please upgrade to Pro to use this feature": "Моля, надстройте до Pro, за да използвате тази функция",
@@ -1145,8 +1146,6 @@
"None": "Няма",
"Slide": "Плъзгане",
"Flip": "Прелистване",
"Custom voice plugins are not supported": "Персонализирани гласови добавки не се поддържат",
"Custom voice plugins have been disabled": "Персонализираните гласови добавки са деактивирани",
"Paste voice list JSON": "Поставете гласов списък JSON",
"Invalid voice list JSON": "Въведете непразен JSON масив, съдържащ валидни гласови конфигурации",
"Failed to load more": "Неуспешно зареждане на повече",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "След като излезете от Pro, незабавно ще загубите следните предимства за членове",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "В бъдеще ще въведем повече ексклузивни функции за членове, включително статистика за четене и автоматично синхронизиране на вашите бележки, акценти, напредък на четене и списъци с речник на платформи като Notion, Obsidian, Logseq, Anki и други.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Синхронизиране на данни между платформи (облачни устройства, WebDAV, Docker, съхранение на обекти)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Импортиране на книги от облачни устройства (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Импортиране на книги от облачни устройства (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Официален превод на повече от 90 езика",
"Official dictionary with definitions, examples & pronunciation": "Официален речник с дефиниции, примери и произношение",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI помощни средства за четене (обобщения на глави, контур, многоролеви разказ)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Въведете своя личен токен за достъп Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Моля, задайте опцията за синхронизиране по подразбиране на локално в настройките или надстройте до Pro, за да синхронизирате с повече облачно хранилище",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Моля, щракнете върху иконата на разширение Koodo Reader в горния десен ъгъл на браузъра, оторизирайте заявката до тази крайна точка и опитайте отново",
"How to sync library across devices": "Как да синхронизирате библиотека между устройства"
}
"How to sync library across devices": "Как да синхронизирате библиотека между устройства",
"Enable reading ruler": "Активиране на линийка за четене",
"Reading ruler height (lines)": "Височина на линийката за четене (линии)",
"Reading ruler background opacity": "Непрозрачност на фона на линийката за четене",
"Enable speed reading": "Активиране на бързо четене",
"Reading speed (WPM)": "Скорост на четене (WPM)",
"ISBN": "ISBN",
"Rating": "Оценка",
"Rating count": "Брой оценки",
"Publish date": "Дата на публикуване",
"Categories": "Категории",
"Member login": "Влизане в профила",
"Register / Login": "Регистрация / Влизане",
"Start 7-day free trial": "Започнете 7-дневен безплатен пробен период",
"Scan for new books": "Сканиране за нови книги",
"Recognize book title and author with AI on import": "Разпознаване на заглавието и автора на книгата с AI при импортиране",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "При импортиране на книги, ако заглавието не бъде разпознато от метаданните на книгата, ще бъде използван AI за разпознаване на заглавието и автора",
"No image found in archive": "Не е намерено изображение в архива",
"Extract cover failed": "Извличането на корицата е неуспешно",
"Custom plugin security warning": "⚠️ <b>Сериозно предупреждение за сигурност</b><br><br>Персонализираните плъгини имат пълен достъп до вашия компютър и контрол над него, особено персонализираните TTS плъгини, които могат да изпълняват произволен код.<br>Това означава, че биха могли да:<br>• четат, променят или изтриват вашите файлове<br>• откраднат акаунти, пароли и данни от браузъра<br>• инсталират зловреден софтуер<br>• дистанционно контролират устройството ви<br><br>Добавяйте плъгин само след като сте сигурни, че му се доверявате напълно и внимателно сте прегледали целия му код.<br>Никога не добавяйте плъгини от непознати уебсайтове, неизвестни източници или неофициални канали.",
"Enable paragraph mode": "Активиране на режим на абзаците",
"Import notes, highlights and dictionary history": "Импортиране на бележки, акценти и история на речника",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Изберете предишно изнесени CSV или JSON файлове, за да импортирате бележки, акценти и история на речника обратно в библиотеката",
"Invalid data": "Невалидни данни",
"The book {{name}} is not found in the library, please import the original book before importing": "Книгата {{name}} не е намерена в библиотеката, моля, импортирайте оригиналната книга преди импортирането",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Импортирани {{imported}} записа, пропуснати {{skipped}} съществуващи записа",
"Download featured backgrounds": "Изтегляне на препоръчани фонове",
"Official background": "Официален фон",
"Recognize title with AI": "Разпознаване на заглавието с AI",
"Download open dictionaries": "Изтегляне на отворени речници",
"Dictionary already downloaded": "Речникът вече е изтеглен",
"Source": "Източник",
"Word definitions and fast reading mode cannot be enabled at the same time": "Дефинициите на думи и режимът за бързо четене не могат да бъдат активирани едновременно",
"Reading ruler height": "Височина на линийката за четене",
"FAQ": "Често задавани въпроси",
"Auto scan and import books when starting the app or when clicking Scan": "Автоматично сканиране и импортиране на книги при стартиране на приложението или при натискане на „Сканиране“",
"Please enter book name": "Моля, въведете име на книгата",
"Waiting for download...": "Изчакване на изтегляне...",
"Pin to right": "Закачване вдясно",
"Unpin": "Откачане",
"Resize": "Преоразмеряване",
"Limited free": "Ограничено безплатно",
"7-day free trial upon registration, then billed $4.99 per Year": "7-дневен безплатен пробен период при регистрация, след което се таксува $4.99 годишно",
"Yearly": "Годишно",
"Year": "Година",
"Limited offer": "Ограничена оферта",
"$4.99": "$4.99",
"Title recognized successfully": "Заглавието е разпознато успешно",
"Failed to recognize title": "Неуспешно разпознаване на заглавието",
"Show total page number (Experimental)": "Показване на общия брой страници (експериментално)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Тази версия на Koodo Reader е твърде стара. Отидете в Настройки - Относно - Проверка за актуализация, за да актуализирате Koodo Reader до най-новата версия и опитайте отново.",
"Background opacity": "Непрозрачност на фона"
}
+54 -4
View File
@@ -840,6 +840,7 @@
"Bilingual translation": "দ্বিভাষিক অনুবাদ",
"Use AI to analyze books, with different characters reading aloud in different voices": "AI দিয়ে বই বিশ্লেষণ করুন, বিভিন্ন চরিত্র বিভিন্ন কণ্ঠে পড়বে",
"Voice type": "কণ্ঠের ধরন",
"Please reselect voices for all roles": "অনুগ্রহ করে সব চরিত্রের জন্য কণ্ঠস্বর আবার নির্বাচন করুন",
"System voice": "সিস্টেম ভয়েস",
"Purchase the code": "কোড কিনুন",
"Please upgrade to Pro to use this feature": "এই বৈশিষ্ট্য ব্যবহার করতে Pro-তে আপগ্রেড করুন",
@@ -1145,8 +1146,6 @@
"None": "কিছুই না",
"Slide": "স্লাইড",
"Flip": "উল্টান",
"Custom voice plugins are not supported": "কাস্টম ভয়েস প্লাগইন সমর্থিত নয়",
"Custom voice plugins have been disabled": "কাস্টম ভয়েস প্লাগইন বন্ধ করা হয়েছে",
"Paste voice list JSON": "ভয়েস তালিকার JSON পেস্ট করুন",
"Invalid voice list JSON": "সঠিক ভয়েস কনফিগারেশনসহ একটি খালি নয় এমন JSON অ্যারে লিখুন",
"Failed to load more": "আরও লোড করা ব্যর্থ হয়েছে",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro থেকে প্রস্থান করলে, আপনি আর সিঙ্ক্রোনাইজেশন ও অন্যান্য প্রিমিয়াম ফিচার ব্যবহার করতে পারবেন না",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "ভবিষ্যতে আমরা আরও সদস্য-এক্সক্লুসিভ ফিচার চালু করব, যার মধ্যে পড়ার পরিসংখ্যান এবং আপনার নোট, হাইলাইট, পড়ার অগ্রগতি ও শব্দতালিকা Notion, Obsidian, Logseq, Anki ইত্যাদি প্ল্যাটফর্মে স্বয়ংক্রিয় সিঙ্ক অন্তর্ভুক্ত।",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "ক্রস-প্ল্যাটফর্ম ডেটা সিঙ্ক (ক্লাউড ড্রাইভ, WebDAV, Docker, অবজেক্ট স্টোরেজ)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "ক্লাউড ড্রাইভ (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB) থেকে বই আমদানি করুন",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "ক্লাউড ড্রাইভ (OneDrive, Google Drive, WebDAV, FTP, SMB) থেকে বই আমদানি করুন",
"Official translation in 90+ languages": "90+ ভাষায় অফিসিয়াল অনুবাদ",
"Official dictionary with definitions, examples & pronunciation": "অফিসিয়াল অভিধান (সংজ্ঞা, উদাহরণ ও উচ্চারণ)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI রিডিং সহায়ক (অধ্যায়ের সারাংশ, রূপরেখা, বহু-চরিত্র বর্ণনা)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "আপনার Notion ব্যক্তিগত অ্যাক্সেস টোকেন লিখুন",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "সেটিংসে ডিফল্ট সিঙ্ক বিকল্পটি লোকালে সেট করুন, অথবা আরও ক্লাউড স্টোরেজের সাথে সিঙ্ক করতে Pro-তে আপগ্রেড করুন",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "ব্রাউজারের উপরের ডান কোণায় Koodo Reader এক্সটেনশন আইকনে ক্লিক করুন, এই এন্ডপয়েন্টে অনুরোধ অনুমোদন করুন এবং আবার চেষ্টা করুন",
"How to sync library across devices": "কীভাবে ডিভাইস জুড়ে লাইব্রেরি সিঙ্ক করবেন"
"How to sync library across devices": "কীভাবে ডিভাইস জুড়ে লাইব্রেরি সিঙ্ক করবেন",
"Enable reading ruler": "পঠন রুলার সক্রিয় করুন",
"Reading ruler height (lines)": "পঠন রুলারের উচ্চতা (লাইন)",
"Reading ruler background opacity": "পঠন রুলারের পটভূমির অস্বচ্ছতা",
"Enable speed reading": "দ্রুত পাঠ সক্রিয় করুন",
"Reading speed (WPM)": "পঠন গতি (WPM)",
"ISBN": "ISBN",
"Rating": "রেটিং",
"Rating count": "রেটিং সংখ্যা",
"Publish date": "প্রকাশনার তারিখ",
"Categories": "বিভাগসমূহ",
"Member login": "সদস্য লগইন",
"Register / Login": "নিবন্ধন / লগইন",
"Start 7-day free trial": "৭ দিনের বিনামূল্যে ট্রায়াল শুরু করুন",
"Scan for new books": "নতুন বই স্ক্যান করুন",
"Recognize book title and author with AI on import": "আমদানি করার সময় AI দিয়ে বইয়ের শিরোনাম ও লেখক শনাক্ত করুন",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "বই আমদানি করার সময়, যদি বইয়ের মেটাডেটা থেকে শিরোনাম পাওয়া না যায়, তাহলে শিরোনাম ও লেখক শনাক্ত করতে AI ব্যবহার করা হবে",
"No image found in archive": "আর্কাইভে কোনো ছবি পাওয়া যায়নি",
"Extract cover failed": "কভার বের করা ব্যর্থ হয়েছে",
"Custom plugin security warning": "⚠️ <b>গুরুতর নিরাপত্তা সতর্কতা</b><br><br>কাস্টম প্লাগইনের আপনার কম্পিউটারের উপর সম্পূর্ণ অ্যাক্সেস ও নিয়ন্ত্রণ থাকে, বিশেষত কাস্টম TTS প্লাগইন, যা যেকোনো কোড চালাতে পারে।<br>এর মানে তারা পারবে:<br>• আপনার ফাইল পড়তে, পরিবর্তন করতে বা মুছতে<br>• অ্যাকাউন্ট, পাসওয়ার্ড ও ব্রাউজার ডেটা চুরি করতে<br>• ম্যালওয়্যার ইনস্টল করতে<br>• দূর থেকে আপনার ডিভাইস নিয়ন্ত্রণ করতে<br><br>কোনো প্লাগইন তখনই যোগ করুন যখন আপনি নিশ্চিত যে আপনি এটিকে সম্পূর্ণ বিশ্বাস করেন এবং এর সমস্ত কোড সতর্কভাবে পর্যালোচনা করেছেন।<br>অজানা ওয়েবসাইট, অজানা সূত্র বা অনুপযুক্ত চ্যানেল থেকে কখনোই প্লাগইন যোগ করবেন না।",
"Enable paragraph mode": "অনুচ্ছেদ মোড সক্রিয় করুন",
"Import notes, highlights and dictionary history": "নোট, হাইলাইট ও অভিধান ইতিহাস আমদানি করুন",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "আগে এক্সপোর্ট করা CSV বা JSON ফাইল নির্বাচন করে নোট, হাইলাইট ও অভিধান ইতিহাস আবার লাইব্রেরিতে আমদানি করুন",
"Invalid data": "অবৈধ ডেটা",
"The book {{name}} is not found in the library, please import the original book before importing": "লাইব্রেরিতে {{name}} বইটি পাওয়া যায়নি, আমদানি করার আগে অনুগ্রহ করে মূল বইটি আমদানি করুন",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}}টি রেকর্ড আমদানি হয়েছে, {{skipped}}টি বিদ্যমান রেকর্ড বাদ দেওয়া হয়েছে",
"Download featured backgrounds": "ফিচার্ড পটভূমি ডাউনলোড করুন",
"Official background": "অফিসিয়াল পটভূমি",
"Recognize title with AI": "AI দিয়ে শিরোনাম শনাক্ত করুন",
"Download open dictionaries": "মুক্ত অভিধান ডাউনলোড করুন",
"Dictionary already downloaded": "অভিধান ইতিমধ্যে ডাউনলোড করা হয়েছে",
"Source": "সূত্র",
"Word definitions and fast reading mode cannot be enabled at the same time": "শব্দের সংজ্ঞা ও দ্রুত পাঠ মোড একসাথে সক্রিয় করা যায় না",
"Reading ruler height": "পঠন রুলারের উচ্চতা",
"FAQ": "সাধারণ প্রশ্ন",
"Auto scan and import books when starting the app or when clicking Scan": "অ্যাপ চালু করার সময় বা স্ক্যান ক্লিক করলে স্বয়ংক্রিয়ভাবে বই স্ক্যান ও আমদানি করুন",
"Please enter book name": "অনুগ্রহ করে বইয়ের নাম লিখুন",
"Waiting for download...": "ডাউনলোডের জন্য অপেক্ষা করা হচ্ছে...",
"Pin to right": "ডানদিকে পিন করুন",
"Unpin": "আনপিন করুন",
"Resize": "আকার পরিবর্তন করুন",
"Limited free": "সীমিত সময়ের জন্য ফ্রি",
"7-day free trial upon registration, then billed $4.99 per Year": "নিবন্ধনের সাথে ৭ দিনের বিনামূল্যে ট্রায়াল, এরপর প্রতি বছর $4.99 চার্জ",
"Yearly": "বার্ষিক",
"Year": "বছর",
"Limited offer": "সীমিত অফার",
"$4.99": "$4.99",
"Title recognized successfully": "শিরোনাম সফলভাবে শনাক্ত হয়েছে",
"Failed to recognize title": "শিরোনাম শনাক্ত করা যায়নি",
"Show total page number (Experimental)": "মোট পৃষ্ঠা সংখ্যা দেখান (পরীক্ষামূলক)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Koodo Reader-এর এই সংস্করণটি অনেক পুরনো। অনুগ্রহ করে সেটিং - সম্পর্কে - আপডেটের জন্য পরীক্ষা করুন এই অপশনে গিয়ে Koodo Reader-কে সর্বশেষ সংস্করণে আপডেট করে আবার চেষ্টা করুন।",
"Background opacity": "পটভূমির অস্বচ্ছতা"
}
+54 -4
View File
@@ -839,6 +839,7 @@
"Bilingual translation": "སྐད་རིགས་གཉིས་ཀྱི་བསྒྱུར་བ།",
"Use AI to analyze books, with different characters reading aloud in different voices": "AI བེད་སྤྱད་དེ་དཔེ་དེབ་དཔྱད། མི་སྣ་མི་འདྲ་བས་སྐད་མི་འདྲ་བས་གསལ་སྒྲོག་བྱེད།",
"Voice type": "སྐད་རིགས།",
"Please reselect voices for all roles": "འཁྲབ་མི་ཚུ་ཆ་མཉམ་གྱི་སྐད་ཡིག་ཡང་བསྐྱར་གདམ་གསེས་བྱེད་རོགས།",
"System voice": "མ་ལག་སྐད།",
"Purchase the code": "ཨང་ཉོས།",
"Please upgrade to Pro to use this feature": "བྱེད་ནུས་འདི་བེད་སྤྱོད་བྱེད་པར་Pro ལ་གསར་བསྒྱུར་རོགས།",
@@ -1144,8 +1145,6 @@
"None": "གང་ཡང་མེད།",
"Slide": "སྐྱིད་ཤོག། (Slide)",
"Flip": "གཡས་གཡོན་བསྐོར།",
"Custom voice plugins are not supported": "ཁྱད་ཇུས་ཀྱི་སྒྲ་རྩིས་ཚར་སྦྱོར་མི་རྒྱབ།",
"Custom voice plugins have been disabled": "ཁྱད་ཇུས་ཀྱི་སྒྲ་རྩིས་ཚར་སྦྱོར་དབྱུང་མེད་བཟོ་འདུག།",
"Paste voice list JSON": "སྒྲ་ཐོའི་ JSON ཚར་ཤོར།",
"Invalid voice list JSON": "ཁེངས་པའི་སྒྲ་ཡི་གཞི་སྒྲིག་ཡོད་པའི་སྟོང་མིན་གྱི་ JSON ཐོ་ཁང་འཇུག་རོགས།",
"Failed to load more": "དེ་ཡན་མང་ངུ་མ་ཐོན།",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro ནས་ཕྱིར་འདོང་དུས། ཁྱེད་ཀྱིས་སྙོམ་སྒྲིག་དང་གཞན་པའི་གཙོ་བོའི་ནུས་པ་རྣམས་ཡང་བེད་སྤྱོད་བྱེད་ཐུབ་མི་ཉན།",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "མ་འོངས་པར་ང་ཚོས་རྒྱུད་མཐའ་ཁོ་ནར་གཏོགས་པའི་ནུས་པ་གཞན་ཡང་འདྲེན་འོང་། དེ་དག་ནང་དུ་ཀློག་གི་གྲངས་སྟངས་དང་། ཁྱེད་ཀྱི་བསྟན་བྱང་། གསལ་སྟོན། ཀློག་མཐོང་གི་མདུན་སྐྱོད། ཚིག་གཞིའི་ཐོ་ཡོད། Notion, Obsidian, Logseq, Anki སོགས་ཀྱི་རྟེན་ཁང་ལ་རང་འབྲེལ་སྙོམ་སྒྲིག་བྱེད་པ།",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "ཐད་ཀ་འཛིན་གྱི་གཞི་གྲངས་སྙོམ་སྒྲིག (སྤྲིན་གྱི་ཡིག་མཛོད།, WebDAV, Docker, ཡུལ་རྟགས་གཞི་མཛོད།)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "སྤྲིན་གྱི་ཡིག་མཛོད་ནས་དཔེ་དེབ་ཁ་འདྲེན། (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "སྤྲིན་གྱི་ཡིག་མཛོད་ནས་དཔེ་དེབ་ཁ་འདྲེན། (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "ཆ་ཤོད 90+ ནང་གི་གཞུང་གི་ཡིག་སྒྱུར།",
"Official dictionary with definitions, examples & pronunciation": "གཞུང་གི་ཚིག་མཛོད། (མཚན་བཤད།, དཔེ་གཞི།, སྐད་སྒྲ།)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI ཀློག་ཡོ་ཆས། (ལེའུ་མདོ་བསྡུས།, འགོ་ཁྲིད།, མི་སྣ་མང་པོའི་གཏམ་བཤད།)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Khyed rang gi Notion སྒེར་གྱི་ཐོག་དོན་ཤོག་སྣེའི་མཐའ་ཡིག་ཨང་འཇུག་རོགས།",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "ཁྱད་སྒྲིག་ནང་གི་སྟངས་འཛིན་སྙོམ་སྒྲིག་གི་གདམ་ཤོག་ས་གནས་སུ་བཞག་དགོས། ཡང་ན་སྤྲིན་མཛོད་མང་བར་སྙོམ་སྒྲིག་བྱེད་པར་Proལ་སྤར་ཤོག",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "བྲཱུ་ཟར་གྱི་སྟེང་གཡས་མཐེག་ནང་གི་Koodo Reader ཁྱབ་སྣོན་ཤོག་སྣེའི་རྟགས་ལ་སྣུན། འདི་གའི་མཇུག་ཐོག་ལ་གདམ་སྤྱོད་བྱས་ནས་ཡང་བསྐྱར་ཚོད་ལྟ།",
"How to sync library across devices": "འཕྲུལ་ཆས་བར་དཔེ་མཛོད་ཇི་ལྟར་སྙོམ་སྒྲིག་བྱེད་དགོས།"
"How to sync library across devices": "འཕྲུལ་ཆས་བར་དཔེ་མཛོད་ཇི་ལྟར་སྙོམ་སྒྲིག་བྱེད་དགོས།",
"Enable reading ruler": "ཀློག་པའི་ཐིག་ཤིང་སྤྱོད།",
"Reading ruler height (lines)": "ཀློག་པའི་ཐིག་ཤིང་གི་མཐོ་ཚད། (ཕྲེང་བ)",
"Reading ruler background opacity": "ཀློག་པའི་ཐིག་ཤིང་གི་རྒྱབ་ལྗོངས་ཀྱི་གསལ་རྨང།",
"Enable speed reading": "མྱུར་ཀློག་སྤྱོད།",
"Reading speed (WPM)": "ཀློག་པའི་མྱུར་ཚད། (WPM)",
"ISBN": "ISBN",
"Rating": "སྐར་མ།",
"Rating count": "སྐར་མའི་གྲངས།",
"Publish date": "པར་སྐྲུན་ཚེས་གྲངས།",
"Categories": "སྡེ་ཚན།",
"Member login": "ཚོགས་མིའི་ནང་འཛུལ།",
"Register / Login": "ཐོ་འགོད། / ནང་འཛུལ།",
"Start 7-day free trial": "ཉིན་7 ཐེབས་མེད་ཚོད་ལྟ་འགོ་བཙུགས།",
"Scan for new books": "དཔེ་དེབ་གསར་པ་བརྟག་ཞིབ་བྱེད།",
"Recognize book title and author with AI on import": "དཔེ་དེབ་ནང་འདྲེན་སྐབས AI ཀྱིས་དཔེ་དེབ་ཀྱི་མིང་དང་རྩོམ་མཁན་ངོས་འཛིན་བྱེད།",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "དཔེ་དེབ་ནང་འདྲེན་སྐབས། དཔེ་དེབ་ཀྱི་གཞི་གྲངས་ལས་དཔེ་དེབ་ཀྱི་མིང་ཐོན་མ་བྱུང་ན། AI ཀྱིས་དཔེ་དེབ་ཀྱི་མིང་དང་རྩོམ་མཁན་ངོས་འཛིན་བྱེད་ངེས།",
"No image found in archive": "བསྡམས་ཡིག་ནང་པར་རིས་མ་རྙེད།",
"Extract cover failed": "འགྲེམས་ངོས་ཕྱིར་འདོན་བྱས་མ་ཐུབ།",
"Custom plugin security warning": "⚠️ <b>ཚབས་ཆེན་བདེ་འཇགས་ཉེན་བརྡ།</b><br><br>རང་བཟོ་པ་ལག་ཨིན་ལ་ཁྱེད་ཀྱི་གློག་ཀླད་ལ་ཡོངས་སུ་འཛུལ་སྤྱོད་དང་ཚོད་འཛིན་གྱི་དབང་ཆ་ཡོད། ལྷག་པར་དུ་རང་བཟོ་ TTS པ་ལག་ཨིན་ལ་གང་འདོད་ཀྱི་ཀོཌ་ལག་བསྟར་བྱེད་ཐུབ།<br>དེས་གོ་བ་ནི་ཁོང་ཚོས་འདི་ལྟར་བྱེད་ཐུབ།<br>• ཁྱེད་ཀྱི་ཡིག་ཆ་ཀློག་པ། བསྒྱུར་བ། བསུབ་པ།<br>• ཐོ་གཞུང་། གསང་ཚིག དྲ་ལམ་གྱི་གཞི་གྲངས་རྐུ་བ།<br>• ངན་པའི་མཉེན་ཆས་བཙུགས་པ།<br>• ཁྱེད་ཀྱི་འཕྲུལ་ཆས་ལ་རྒྱང་ནས་ཚོད་འཛིན་བྱེད་པ།<br><br>པ་ལག་ཨིན་ཞིག་བསྣན་པའི་སྔོན་དུ་ཁྱེད་ཀྱིས་དེ་ལ་ཡིད་ཆེས་ཡོངས་སུ་བྱེད་པ་དང་དེའི་ཀོཌ་ཚང་མ་ཞིབ་ཚགས་བྱས་ཟིན་པར་གཏན་འབེབས་བྱེད་དགོས།<br>མི་ཤེས་པའི་དྲ་ཚིགས། མི་ཤེས་པའི་ཁུངས། ཡང་ན་གཞུང་མིན་གྱི་ཐོག་ནས་པ་ལག་ཨིན་ནམ་ཡང་མི་བསྣན།",
"Enable paragraph mode": "ཚན་པའི་རྣམ་པ་སྤྱོད།",
"Import notes, highlights and dictionary history": "ཟིན་བྲིས། རྟགས་བཀོད། ཚིག་མཛོད་ལོ་རྒྱུས་བཅས་ནང་འདྲེན་བྱེད།",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "སྔར་ཕྱིར་འདོན་བྱས་པའི་ CSV ཡང་ན་ JSON ཡིག་ཆ་འདེམས་ནས་ཟིན་བྲིས། རྟགས་བཀོད། ཚིག་མཛོད་ལོ་རྒྱུས་བཅས་དཔེ་མཛོད་ནང་ལོག་ནང་འདྲེན་བྱེད།",
"Invalid data": "གཞི་གྲངས་ནོར་བ།",
"The book {{name}} is not found in the library, please import the original book before importing": "དཔེ་མཛོད་ནང་དཔེ་དེབ {{name}} མ་རྙེད། ནང་འདྲེན་མ་བྱས་གོང་དཔེ་དེབ་དངོས་པོ་ནང་འདྲེན་བྱེད་རོགས།",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} ནང་འདྲེན་བྱས་ཟིན། {{skipped}} ཡོད་ཟིན་པ་མཆོངས།",
"Download featured backgrounds": "དམིགས་བསལ་རྒྱབ་ལྗོངས་ཕབ་ལེན།",
"Official background": "གཞུང་གི་རྒྱབ་ལྗོངས།",
"Recognize title with AI": "AI ཀྱིས་མིང་ངོས་འཛིན་བྱེད།",
"Download open dictionaries": "ཁ་ཕྱེ་བའི་ཚིག་མཛོད་ཕབ་ལེན།",
"Dictionary already downloaded": "ཚིག་མཛོད་ཕབ་ལེན་བྱས་ཟིན།",
"Source": "ཁུངས།",
"Word definitions and fast reading mode cannot be enabled at the same time": "ཚིག་གི་ངོས་འཛིན་དང་མྱུར་ཀློག་རྣམ་པ་གཅིག་དུ་སྤྱོད་མི་ཆོག",
"Reading ruler height": "ཀློག་པའི་ཐིག་ཤིང་གི་མཐོ་ཚད།",
"FAQ": "རྒྱུན་དྲིས་དྲི་བ།",
"Auto scan and import books when starting the app or when clicking Scan": "མཉེན་ཆས་འགོ་བཙུགས་སྐབས་སམ་བརྟག་ཞིབ་མནན་སྐབས་རང་འགུལ་དུ་དཔེ་དེབ་བརྟག་ཞིབ་དང་ནང་འདྲེན་བྱེད།",
"Please enter book name": "དཔེ་དེབ་ཀྱི་མིང་འཇུག་རོགས།",
"Waiting for download...": "ཕབ་ལེན་སྒུག་བཞིན་པ།...",
"Pin to right": "གཡས་སུ་བསྣན།",
"Unpin": "བསྣན་པ་ཕྱིར་ལེན།",
"Resize": "ཆེ་ཆུང་བསྒྱུར།",
"Limited free": "དུས་ཚོད་ཚད་ཡོད་ཐེབས་མེད།",
"7-day free trial upon registration, then billed $4.99 per Year": "ཐོ་འགོད་བྱས་ནས་ཉིན་7 གི་ཐེབས་མེད་ཚོད་ལྟ། དེ་ནས་ལོ་རེར་ $4.99 སྤྲོད་དགོས།",
"Yearly": "ལོ་རེ།",
"Year": "ལོ།",
"Limited offer": "དུས་ཚོད་ཚད་ཡོད་ཁེ་གཅོད།",
"$4.99": "$4.99",
"Title recognized successfully": "མིང་ངོས་འཛིན་ལེགས་སྒྲུབ།",
"Failed to recognize title": "མིང་ངོས་འཛིན་མ་ལེགས།",
"Show total page number (Experimental)": "ཤོག་ངོས་ཁྱོན་ཡོངས་ཀྱི་གྲངས་བསྟན། (ཚོད་ལྟའི་རང་བཞིན།)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Koodo Reader གི་པར་གཞི་འདི་ཧ་ཅང་རྙིང་པོ་ཡིན། སྒྲིག་བཀོད་ - སྐོར། - གསར་པར་ལྟ་ལ་སོང་ནས་ Koodo Reader གསར་ཤོས་ཀྱི་པར་གཞིར་གསར་བསྒྱུར་བྱས་རྗེས་བསྐྱར་དུ་ཚོད་ལྟ་བྱེད་རོགས།",
"Background opacity": "རྒྱབ་ལྗོངས་ཀྱི་གསལ་རྨང།"
}
+57 -7
View File
@@ -839,6 +839,7 @@
"Bilingual translation": "Dvojjazyčný překlad",
"Use AI to analyze books, with different characters reading aloud in different voices": "Použít AI k analýze knih, přičemž různé postavy čtou nahlas různými hlasy",
"Voice type": "Typ hlasu",
"Please reselect voices for all roles": "Vyberte prosím hlasy pro všechny role znovu",
"System voice": "Systémový hlas",
"Purchase the code": "Zakoupit kód",
"Please upgrade to Pro to use this feature": "Pro použití této funkce přejděte na Pro",
@@ -865,7 +866,7 @@
"Please upgrade to Pro to unlock more daily free quota or wait until the quota resets. You can also use other TTS voices instead.": "Pro odemknutí větší denní bezplatné kvóty přejděte na Pro nebo počkejte na obnovení kvóty. Můžete také použít jiné TTS hlasy.",
"Minimize to tray on close": "Minimalizovat do systémové lišty při zavření",
"When closing the window, the app will minimize to the system tray instead of quitting": "Při zavření okna se aplikace minimalizuje do systémové lišty namísto ukončení",
"Data": "Data",
"Data": "Údaje",
"View": "Zobrazení",
"Select format": "Vybrat formát",
"Enable Discord Rich Presence": "Povolit Discord Rich Presence",
@@ -990,7 +991,7 @@
"When you look up a word, it will be automatically added to an Anki deck via AnkiConnect (must be running locally)": "Když si vyhledáte slovo, bude automaticky přidáno do Anki balíčku přes AnkiConnect (musí být spuštěno lokálně)",
"Host": "Hostitel",
"e.g. 127.0.0.1": "např. 127.0.0.1",
"Port": "Port",
"Port": "Číslo portu",
"e.g. 8765": "např. 8765",
"Key": "Klíč",
"Api key": "API klíč",
@@ -1144,8 +1145,6 @@
"None": "Žádné",
"Slide": "Posunutí",
"Flip": "Přetočení",
"Custom voice plugins are not supported": "Vlastní hlasové pluginy nejsou podporovány",
"Custom voice plugins have been disabled": "Vlastní hlasové pluginy byly zakázány",
"Paste voice list JSON": "Vložte seznam hlasů JSON",
"Invalid voice list JSON": "Zadejte neprázdné pole JSON obsahující platné hlasové konfigurace",
"Failed to load more": "Nepodařilo se načíst další",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Jakmile opustíte Pro, okamžitě ztratíte následující členské výhody",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "V budoucnu zavedeme více funkcí exkluzivních pro členy, včetně statistik čtení a automatické synchronizace vašich poznámek, zvýraznění, průběhu čtení a seznamů slovní zásoby na platformy jako Notion, Obsidian, Logseq, Anki a další.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Synchronizace dat mezi platformami (cloudové jednotky, WebDAV, Docker, úložiště objektů)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Import knih z cloudových disků (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Import knih z cloudových disků (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Oficiální překlad do 90+ jazyků",
"Official dictionary with definitions, examples & pronunciation": "Oficiální slovník s definicemi, příklady a výslovností",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI pomůcky ke čtení (souhrny kapitol, osnova, vyprávění ve více rolích)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Zadejte svůj osobní přístupový token Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Nastavte prosím výchozí možnost synchronizace na místní v nastavení nebo upgradujte na verzi Pro a synchronizujte s větším cloudovým úložištěm",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Klikněte prosím na ikonu rozšíření Koodo Reader v pravém horním rohu prohlížeče, autorizujte požadavek na tento koncový bod a zkuste to znovu",
"How to sync library across devices": "Jak synchronizovat knihovnu mezi zařízeními"
}
"How to sync library across devices": "Jak synchronizovat knihovnu mezi zařízeními",
"Enable reading ruler": "Povolit čtecí pravítko",
"Reading ruler height (lines)": "Výška čtecího pravítka (řádky)",
"Reading ruler background opacity": "Neprůhlednost pozadí čtecího pravítka",
"Enable speed reading": "Povolit rychlé čtení",
"Reading speed (WPM)": "Rychlost čtení (WPM)",
"ISBN": "ISBN",
"Rating": "Hodnocení",
"Rating count": "Počet hodnocení",
"Publish date": "Datum vydání",
"Categories": "Kategorie",
"Member login": "Přihlášení k účtu",
"Register / Login": "Registrovat se / Přihlásit se",
"Start 7-day free trial": "Zahájit 7denní zkušební verzi zdarma",
"Scan for new books": "Skenovat nové knihy",
"Recognize book title and author with AI on import": "Při importu rozpoznat název a autora knihy pomocí AI",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Pokud při importu knih nebude z metadat knihy rozpoznán název, bude k rozpoznání názvu a autora použita AI",
"No image found in archive": "V archivu nebyl nalezen žádný obrázek",
"Extract cover failed": "Extrakce titulu se nezdařila",
"Custom plugin security warning": "⚠️ <b>Vážné bezpečnostní varování</b><br><br>Vlastní pluginy mají plný přístup k vašemu počítači a kontrolu nad ním, zejména vlastní TTS pluginy, které mohou spouštět libovolný kód.<br>To znamená, že by mohly:<br>• číst, upravovat nebo mazat vaše soubory<br>• krást účty, hesla a data prohlížeče<br>• instalovat škodlivý software<br>• na dálku ovládat vaše zařízení<br><br>Plugin přidejte až poté, co si budete jisti, že mu plně důvěřujete a pečlivě jste si prohlédli veškerý jeho kód.<br>Nikdy nepřidávejte pluginy z neznámých webových stránek, neznámých zdrojů nebo neoficiálních kanálů.",
"Enable paragraph mode": "Povolit režim odstavců",
"Import notes, highlights and dictionary history": "Importovat poznámky, zvýraznění a historii slovníku",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Vyberte dříve exportované soubory CSV nebo JSON pro import poznámek, zvýraznění a historie slovníku zpět do knihovny",
"Invalid data": "Neplatná data",
"The book {{name}} is not found in the library, please import the original book before importing": "Kniha {{name}} nebyla v knihovně nalezena, před importem prosím importujte původní knihu",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Importováno {{imported}} záznamů, přeskočeno {{skipped}} existujících záznamů",
"Download featured backgrounds": "Stáhnout doporučená pozadí",
"Official background": "Oficiální pozadí",
"Recognize title with AI": "Rozpoznat název pomocí AI",
"Download open dictionaries": "Stáhnout otevřené slovníky",
"Dictionary already downloaded": "Slovník je již stažen",
"Source": "Zdroj",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definice slov a režim rychlého čtení nelze povolit současně",
"Reading ruler height": "Výška čtecího pravítka",
"FAQ": "Časté dotazy",
"Auto scan and import books when starting the app or when clicking Scan": "Automaticky skenovat a importovat knihy při spuštění aplikace nebo kliknutí na Skenovat",
"Please enter book name": "Zadejte název knihy",
"Waiting for download...": "Čekání na stažení...",
"Pin to right": "Připnout vpravo",
"Unpin": "Odepnout",
"Resize": "Změnit velikost",
"Limited free": "Časově omezeno zdarma",
"7-day free trial upon registration, then billed $4.99 per Year": "7denní zkušební verze zdarma při registraci, poté účtováno $4.99 ročně",
"Yearly": "Ročně",
"Year": "Rok",
"Limited offer": "Časově omezená nabídka",
"$4.99": "$4.99",
"Title recognized successfully": "Název byl úspěšně rozpoznán",
"Failed to recognize title": "Rozpoznání názvu se nezdařilo",
"Show total page number (Experimental)": "Zobrazit celkový počet stránek (experimentální)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Tato verze Koodo Readeru je příliš stará. Přejděte do Nastavení - O aplikaci - Zkontrolovat aktualizace, aktualizujte Koodo Reader na nejnovější verzi a zkuste to znovu.",
"Background opacity": "Neprůhlednost pozadí"
}
+60 -10
View File
@@ -308,7 +308,7 @@
"Auto Update relies on GitHub Release for package hosting, if your internet doesn't have stable connection to GitHub, we highly recommend you to turn off this option": "Autoopdatering bruger GitHub Release til pakker. Hvis din forbindelse til GitHub er ustabil, anbefaler vi at slå denne indstilling fra",
"Take effect at next startup": "Træder i kraft ved næste opstart",
"View mode": "Visningstilstand",
"Prototype": "Prototype",
"Prototype": "Grundform",
"Download desktop version": "Download desktopversion",
"No favorite books": "Ingen favoritbøger",
"Right click on any book and click Add to favorite to add it to your favorite books": "Højreklik på en bog og vælg Føj til favoritter for at tilføje den",
@@ -394,7 +394,7 @@
"Upload attachments": "Upload vedhæftninger",
"File size is larger than 20MB": "Filstørrelsen er større end 20 MB",
"Learn more": "Læs mere",
"Format": "Format",
"Format": "Filformat",
"Duplicate book in trash bin": "Duplikér bog i papirkurven",
"Subject can't be empty": "Emnet må ikke være tomt",
"Full screen": "Fuldskærm",
@@ -842,6 +842,7 @@
"Bilingual translation": "Tosproget oversættelse",
"Use AI to analyze books, with different characters reading aloud in different voices": "Brug AI til at analysere bøger, hvor forskellige karakterer læser højt med forskellige stemmer",
"Voice type": "Stemmetype",
"Please reselect voices for all roles": "Vælg venligst stemmerne for alle roller igen",
"System voice": "Systemstemme",
"Purchase the code": "Køb koden",
"Please upgrade to Pro to use this feature": "Opgrader til Pro for at bruge denne funktion",
@@ -860,7 +861,7 @@
"Orange": "Orange",
"Pink": "Lyserød",
"Yellow": "Gul",
"Violet": "Violet",
"Violet": "Fiolett",
"Sky": "Himmelblå",
"Slate": "Skifer",
"Show page border": "Vis sidekant",
@@ -993,7 +994,7 @@
"When you look up a word, it will be automatically added to an Anki deck via AnkiConnect (must be running locally)": "Når du slår et ord op, tilføjes det automatisk til et Anki-dæk via AnkiConnect (skal køre lokalt)",
"Host": "Vært",
"e.g. 127.0.0.1": "f.eks. 127.0.0.1",
"Port": "Port",
"Port": "Portnummer",
"e.g. 8765": "f.eks. 8765",
"Key": "Nøgle",
"Api key": "API-nøgle",
@@ -1147,8 +1148,6 @@
"None": "Ingen",
"Slide": "Glid",
"Flip": "Bladr",
"Custom voice plugins are not supported": "Brugerdefinerede stemme-plugins understøttes ikke",
"Custom voice plugins have been disabled": "Tilpassede stemme-plugins er blevet deaktiveret",
"Paste voice list JSON": "Indsæt stemmeliste JSON",
"Invalid voice list JSON": "Indtast et ikke-tomt JSON-array, der indeholder gyldige stemmekonfigurationer",
"Failed to load more": "Kunne ikke indlæse flere",
@@ -1282,7 +1281,7 @@
"Shape width": "Form bredde",
"Rect": "Rektangel",
"Circle": "Cirkel",
"Ellipse": "Ellipse",
"Ellipse": "Oval",
"Line": "Linje",
"Arrow": "Pil",
"Text": "Tekst",
@@ -1293,7 +1292,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Når du forlader Pro, mister du straks følgende medlemsfordele",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "I fremtiden vil vi introducere flere medlemseksklusive funktioner, herunder læsestatistikker og automatisk synkronisering af dine noter, fremhævelser, læsefremskridt og ordforrådslister til platforme som Notion, Obsidian, Logseq, Anki og mere.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Datasynkronisering på tværs af platforme (cloud-drev, WebDAV, Docker, objektlagring)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importer bøger fra cloud-drev (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importer bøger fra cloud-drev (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Officiel oversættelse på mere end 90 sprog",
"Official dictionary with definitions, examples & pronunciation": "Officiel ordbog med definitioner, eksempler og udtale",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI læsehjælpemidler (kapitelresuméer, disposition, multi-rolle fortælling)",
@@ -1324,5 +1323,56 @@
"Enter your Notion personal access token": "Indtast din Notion personlige adgangstoken",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Indstil standardsynkroniseringsindstillingen til lokal i indstillingerne, eller opgrader til Pro for at synkronisere med mere skylager",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Klik venligst på Koodo Reader-udvidelsesikonet i øverste højre hjørne af browseren, godkend anmodningen til dette slutpunkt, og prøv igen",
"How to sync library across devices": "Sådan synkroniseres bibliotek på tværs af enheder"
}
"How to sync library across devices": "Sådan synkroniseres bibliotek på tværs af enheder",
"Enable reading ruler": "Aktivér læselineal",
"Reading ruler height (lines)": "Læselinealens højde (linjer)",
"Reading ruler background opacity": "Læselinealens baggrundsopacitet",
"Enable speed reading": "Aktivér hurtiglæsning",
"Reading speed (WPM)": "Læsehastighed (WPM)",
"ISBN": "ISBN",
"Rating": "Bedømmelse",
"Rating count": "Antal bedømmelser",
"Publish date": "Udgivelsesdato",
"Categories": "Kategorier",
"Member login": "Medlemslogin",
"Register / Login": "Registrer / Log ind",
"Start 7-day free trial": "Start 7 dages gratis prøveperiode",
"Scan for new books": "Scan efter nye bøger",
"Recognize book title and author with AI on import": "Genkend bogtitel og forfatter med AI ved import",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Hvis der ikke kan udledes en bogtitel fra bogens metadata ved import, bruges AI til at genkende titel og forfatter",
"No image found in archive": "Ingen billeder fundet i arkivet",
"Extract cover failed": "Kunne ikke udtrække omslaget",
"Custom plugin security warning": "⚠️ <b>Alvorlig sikkerhedsadvarsel</b><br><br>Brugerdefinerede plugins har fuld adgang til og kontrol over din computer, især brugerdefinerede TTS-plugins, som kan udføre vilkårlig kode.<br>Det betyder, at de kan:<br>• læse, ændre eller slette dine filer<br>• stjæle konti, adgangskoder og browserdata<br>• installere malware<br>• fjernstyre din enhed<br><br>Tilføj først en plugin, når du er sikker på, at du fuldt ud stoler på den og omhyggeligt har gennemgået hele dens kode.<br>Tilføj aldrig plugins fra ukendte websteder, ukendte kilder eller uofficielle kanaler.",
"Enable paragraph mode": "Aktivér afsnitstilstand",
"Import notes, highlights and dictionary history": "Importér noter, markeringer og ordbogshistorik",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Vælg tidligere eksporterede CSV- eller JSON-filer for at importere noter, markeringer og ordbogshistorik tilbage til biblioteket",
"Invalid data": "Ugyldige data",
"The book {{name}} is not found in the library, please import the original book before importing": "Bogen {{name}} blev ikke fundet i biblioteket. Importér den originale bog først",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} poster importeret, {{skipped}} eksisterende poster sprunget over",
"Download featured backgrounds": "Download udvalgte baggrunde",
"Official background": "Officiel baggrund",
"Recognize title with AI": "Genkend titel med AI",
"Download open dictionaries": "Download åbne ordbøger",
"Dictionary already downloaded": "Ordbogen er allerede downloadet",
"Source": "Kilde",
"Word definitions and fast reading mode cannot be enabled at the same time": "Orddefinitioner og hurtiglæsning kan ikke aktiveres samtidig",
"Reading ruler height": "Læselinealens højde",
"FAQ": "Ofte stillede spørgsmål",
"Auto scan and import books when starting the app or when clicking Scan": "Scan og importér bøger automatisk, når appen starter, eller når der klikkes på Scan",
"Please enter book name": "Indtast bogens navn",
"Waiting for download...": "Venter på download...",
"Pin to right": "Fastgør til højre",
"Unpin": "Frigør",
"Resize": "Tilpas størrelse",
"Limited free": "Tidsbegrænset gratis",
"7-day free trial upon registration, then billed $4.99 per Year": "7 dages gratis prøveperiode ved registrering, derefter $4.99 om året",
"Yearly": "Årligt",
"Year": "År",
"Limited offer": "Tidsbegrænset tilbud",
"$4.99": "$4.99",
"Title recognized successfully": "Titlen blev genkendt",
"Failed to recognize title": "Kunne ikke genkende titlen",
"Show total page number (Experimental)": "Vis samlet sidetal (eksperimentel)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Denne version af Koodo Reader er for gammel. Gå til Indstillinger - Om - Søg efter opdateringer for at opdatere Koodo Reader til den nyeste version, og prøv igen.",
"Background opacity": "Baggrundens opacitet"
}
+62 -12
View File
@@ -88,7 +88,7 @@
"Sort by Date": "Hinzufügedatum",
"Descend": "Absteigend",
"Ascend": "Aufsteigend",
"Token": "Token",
"Token": "Zugriffstoken",
"Book not exists": "Buch existiert nicht",
"Please authorize your account, and fill the following box with the token": "Bitte autorisieren Sie Ihr Konto und geben Sie den Token in das folgende Feld ein",
"Copy link": "Link kopieren",
@@ -481,7 +481,7 @@
"Please add data source in the setting": "Bitte fügen Sie in den Einstellungen eine Datenquelle hinzu",
"Don't automatically pre-cache books for mobile version after import": "Bücher nach dem Import nicht automatisch für die mobile Version vorcachen",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "Beim Import werden Bücher automatisch vorab gecacht, sodass sie in der mobilen Version nahtlos verfügbar sind. Dieser Vorgang kann jedoch zusätzlichen Speicherplatz verbrauchen und die Importdauer verlängern. Das Vorcachen kann weiterhin manuell durchgeführt werden",
"Test": "Test",
"Test": "Testen",
"Get error log": "Fehlerprotokoll abrufen",
"Account type": "Kontotyp",
"Trial user": "Testnutzer",
@@ -557,7 +557,7 @@
"Redeem successful": "Einlösen erfolgreich",
"Redeem failed, error code": "Einlösen fehlgeschlagen, Fehlercode",
"Verifying...": "Wird verifiziert...",
"Optional": "Optional",
"Optional": "Wahlweise",
"Required": "Erforderlich",
"Supported email providers": "Unterstützte E-Mail-Anbieter",
"Log in": "Anmelden",
@@ -570,7 +570,7 @@
"The Koodo Reader Docker version does not support the data source feature by default. You need to modify the configuration parameters during deployment to manually enable it. Also due to browser's security restrictions, the Docker service must be accessed via HTTPS protocol when you're visiting Koodo Reader via HTTPS protocol.": "Die Docker-Version von Koodo Reader unterstützt die Datenquellen-Funktion standardmäßig nicht. Während der Bereitstellung müssen die Konfigurationsparameter angepasst werden, um sie manuell zu aktivieren. Außerdem muss der Docker-Dienst aufgrund von Sicherheitseinschränkungen des Browsers über HTTPS erreichbar sein, wenn Koodo Reader über HTTPS aufgerufen wird",
"Select server region": "Serverregion auswählen",
"Server region": "Serverregion",
"Global": "Global",
"Global": "Weltweit",
"China": "China",
"Some login options and data sources are not available in your selected server region": "Einige Login-Optionen und Datenquellen sind in der ausgewählten Serverregion nicht verfügbar",
"Grant access to local folder to save your data and reduce the risk of data loss": "Zugriff auf lokalen Ordner gewähren, um Ihre Daten zu speichern und das Risiko von Datenverlust zu reduzieren",
@@ -798,7 +798,7 @@
"No AI models added yet": "Noch keine KI-Modelle hinzugefügt",
"Add new model": "Neues Modell hinzufügen",
"Text orientation": "Textausrichtung",
"Horizontal": "Horizontal",
"Horizontal": "Waagerecht",
"Vertical": "Vertikal",
"Default font family": "Standardschriftfamilie",
"Delete original file when permanently deleting books": "Originaldatei beim endgültigen Löschen von Büchern löschen",
@@ -839,6 +839,7 @@
"Bilingual translation": "Zweisprachige Übersetzung",
"Use AI to analyze books, with different characters reading aloud in different voices": "KI verwenden, um Bücher zu analysieren, wobei verschiedene Charaktere mit unterschiedlichen Stimmen vorlesen",
"Voice type": "Stimmtyp",
"Please reselect voices for all roles": "Bitte wählen Sie die Stimmen für alle Rollen neu aus",
"System voice": "Systemstimme",
"Purchase the code": "Code kaufen",
"Please upgrade to Pro to use this feature": "Bitte upgraden Sie auf Pro, um diese Funktion zu nutzen",
@@ -1132,7 +1133,7 @@
"Black": "Schwarz",
"ExtraBold": "Extrafett",
"ExtraLight": "Extrafein",
"Mono": "Mono",
"Mono": "Monospace",
"Backup library": "Bibliothek sichern",
"Restore library": "Bibliothek wiederherstellen",
"Hide sync progress bar when syncing": "Synchronisierungsbalken beim Synchronisieren ausblenden",
@@ -1144,8 +1145,6 @@
"None": "Keine",
"Slide": "Schieben",
"Flip": "Umblättern",
"Custom voice plugins are not supported": "Benutzerdefinierte Sprach-Plugins werden nicht unterstützt",
"Custom voice plugins have been disabled": "Benutzerdefinierte Sprach-Plugins wurden deaktiviert",
"Paste voice list JSON": "Sprachlisten-JSON einfügen",
"Invalid voice list JSON": "Geben Sie ein nicht leeres JSON-Array mit gültigen Sprachkonfigurationen ein",
"Failed to load more": "Weitere Elemente konnten nicht geladen werden",
@@ -1279,10 +1278,10 @@
"Shape width": "Formbreite",
"Rect": "Rechteck",
"Circle": "Kreis",
"Ellipse": "Ellipse",
"Ellipse": "Oval",
"Line": "Linie",
"Arrow": "Pfeil",
"Text": "Text",
"Text": "Textfeld",
"Text size": "Textgröße",
"Text font": "Textschrift",
"Still refuse": "Trotzdem ablehnen",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Sobald Sie die Pro-Version verlassen, verlieren Sie sofort die folgenden Mitgliedsvorteile",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "In der Zukunft werden wir weitere exklusive Mitgliederfunktionen einführen, darunter Lesestatistiken und die automatische Synchronisierung Ihrer Notizen, Markierungen, Lesefortschritte und Vokabellisten mit Plattformen wie Notion, Obsidian, Logseq, Anki und weiteren.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Plattformübergreifende Datensynchronisierung (Cloud-Laufwerke, WebDAV, Docker, Objektspeicher)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Bücher aus Cloud-Laufwerken importieren (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Bücher aus Cloud-Laufwerken importieren (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Offizielle Übersetzung in über 90 Sprachen",
"Official dictionary with definitions, examples & pronunciation": "Offizielles Wörterbuch mit Definitionen, Beispielen und Aussprache",
"AI reading aids (chapter summaries, outline, multi-role narration)": "KI-Lesehilfen (Kapitelzusammenfassungen, Gliederung, Mehrrollen-Erzählung)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Geben Sie Ihr persönliches Notion-Zugriffstoken ein",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Bitte setzen Sie die Standard-Synchronisationsoption in den Einstellungen auf Lokal, oder upgraden Sie auf Pro, um mit mehr Cloud-Speichern zu synchronisieren",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Bitte klicken Sie auf das Koodo Reader-Erweiterungssymbol in der oberen rechten Ecke des Browsers, autorisieren Sie die Anfrage an diesen Endpunkt und versuchen Sie es erneut",
"How to sync library across devices": "So synchronisieren Sie die Bibliothek zwischen Geräten"
"How to sync library across devices": "So synchronisieren Sie die Bibliothek zwischen Geräten",
"Enable reading ruler": "Leselineal aktivieren",
"Reading ruler height (lines)": "Höhe des Leselineals (Zeilen)",
"Reading ruler background opacity": "Hintergrunddeckkraft des Leselineals",
"Enable speed reading": "Schnelllesen aktivieren",
"Reading speed (WPM)": "Lesegeschwindigkeit (WPM)",
"ISBN": "ISBN",
"Rating": "Bewertung",
"Rating count": "Anzahl der Bewertungen",
"Publish date": "Veröffentlichungsdatum",
"Categories": "Kategorien",
"Member login": "Mitglieder-Anmeldung",
"Register / Login": "Registrieren / Anmelden",
"Start 7-day free trial": "7 Tage kostenlos testen",
"Scan for new books": "Nach neuen Büchern suchen",
"Recognize book title and author with AI on import": "Beim Import Titel und Autor mit AI erkennen",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Wenn beim Import kein Buchtitel aus den Metadaten des Buches gelesen werden kann, werden Titel und Autor mit AI erkannt",
"No image found in archive": "Kein Bild im Archiv gefunden",
"Extract cover failed": "Extrahieren des Covers fehlgeschlagen",
"Custom plugin security warning": "⚠️ <b>Schwere Sicherheitswarnung</b><br><br>Benutzerdefinierte Erweiterungen haben vollständigen Zugriff auf Ihren Computer und können ihn steuern, insbesondere benutzerdefinierte TTS-Erweiterungen, die beliebigen Code ausführen können.<br>Das bedeutet, sie könnten:<br>• Ihre Dateien lesen, ändern oder löschen<br>• Konten, Passwörter und Browserdaten stehlen<br>• Schadsoftware installieren<br>• Ihr Gerät aus der Ferne steuern<br><br>Fügen Sie eine Erweiterung erst hinzu, wenn Sie sicher sind, dass Sie ihr vollständig vertrauen und ihren gesamten Code sorgfältig geprüft haben.<br>Fügen Sie niemals Erweiterungen von unbekannten Websites, unbekannten Quellen oder nicht offiziellen Kanälen hinzu.",
"Enable paragraph mode": "Absatzmodus aktivieren",
"Import notes, highlights and dictionary history": "Notizen, Hervorhebungen und Wörterbuchverlauf importieren",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Wählen Sie zuvor exportierte CSV- oder JSON-Dateien, um Notizen, Hervorhebungen und Wörterbuchverlauf zurück in die Bibliothek zu importieren",
"Invalid data": "Ungültige Daten",
"The book {{name}} is not found in the library, please import the original book before importing": "Das Buch {{name}} wurde in der Bibliothek nicht gefunden. Bitte importieren Sie zuerst das Originalbuch",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} Datensätze importiert, {{skipped}} vorhandene Datensätze übersprungen",
"Download featured backgrounds": "Ausgewählte Hintergründe herunterladen",
"Official background": "Offizieller Hintergrund",
"Recognize title with AI": "Titel mit AI erkennen",
"Download open dictionaries": "Offene Wörterbücher herunterladen",
"Dictionary already downloaded": "Wörterbuch bereits heruntergeladen",
"Source": "Quelle",
"Word definitions and fast reading mode cannot be enabled at the same time": "Wortdefinitionen und Schnelllesen können nicht gleichzeitig aktiviert werden",
"Reading ruler height": "Höhe des Leselineals",
"FAQ": "Häufige Fragen",
"Auto scan and import books when starting the app or when clicking Scan": "Bücher beim Start der App oder beim Klick auf Scannen automatisch suchen und importieren",
"Please enter book name": "Bitte Buchnamen eingeben",
"Waiting for download...": "Warte auf Download...",
"Pin to right": "Rechts anheften",
"Unpin": "Loslösen",
"Resize": "Größe ändern",
"Limited free": "Zeitlich gratis",
"7-day free trial upon registration, then billed $4.99 per Year": "Nach der Registrierung 7 Tage kostenlos testen, danach $4.99 pro Jahr",
"Yearly": "Jährlich",
"Year": "Jahr",
"Limited offer": "Zeitlich begrenztes Angebot",
"$4.99": "$4.99",
"Title recognized successfully": "Titel erfolgreich erkannt",
"Failed to recognize title": "Titel konnte nicht erkannt werden",
"Show total page number (Experimental)": "Gesamtseitenzahl anzeigen (experimentell)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Diese Version von Koodo Reader ist zu alt. Bitte gehen Sie zu Einstellungen - Über - Nach Updates suchen, um Koodo Reader auf die neueste Version zu aktualisieren, und versuchen Sie es erneut.",
"Background opacity": "Hintergrunddeckkraft"
}
+55 -5
View File
@@ -840,6 +840,7 @@
"Bilingual translation": "Δίγλωσση μετάφραση",
"Use AI to analyze books, with different characters reading aloud in different voices": "Χρήση AI για ανάλυση βιβλίων, με διαφορετικούς χαρακτήρες να διαβάζουν δυνατά με διαφορετικές φωνές",
"Voice type": "Τύπος φωνής",
"Please reselect voices for all roles": "Επιλέξτε ξανά τις φωνές για όλους τους ρόλους",
"System voice": "Φωνή συστήματος",
"Purchase the code": "Αγορά κωδικού",
"Please upgrade to Pro to use this feature": "Αναβαθμίστε στο Pro για να χρησιμοποιήσετε αυτή τη δυνατότητα",
@@ -1145,8 +1146,6 @@
"None": "Κανένα",
"Slide": "Ολίσθηση",
"Flip": "Αναστροφή",
"Custom voice plugins are not supported": "Δεν υποστηρίζονται προσαρμοσμένες φωνητικές προσθήκες",
"Custom voice plugins have been disabled": "Οι προσαρμοσμένες προσθήκες φωνής έχουν απενεργοποιηθεί",
"Paste voice list JSON": "Επικόλληση φωνητικής λίστας JSON",
"Invalid voice list JSON": "Εισαγάγετε έναν μη κενό πίνακα JSON που περιέχει έγκυρες διαμορφώσεις φωνής",
"Failed to load more": "Αποτυχία φόρτωσης περισσότερων",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Μόλις βγείτε από το Pro, θα χάσετε αμέσως τα ακόλουθα προνόμια μέλους",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Στο μέλλον, θα εισαγάγουμε περισσότερες αποκλειστικές λειτουργίες για μέλη, όπως η ανάγνωση στατιστικών στοιχείων και ο αυτόματος συγχρονισμός των σημειώσεων, των επισημάνσεων, της προόδου ανάγνωσης και των λιστών λεξιλογίου σε πλατφόρμες όπως οι Notion, Obsidian, Logseq, Anki και άλλες.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Συγχρονισμός δεδομένων μεταξύ πλατφορμών (μονάδες δίσκου cloud, WebDAV, Docker, αποθήκευση αντικειμένων)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Εισαγωγή βιβλίων από μονάδες cloud (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Εισαγωγή βιβλίων από μονάδες cloud (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Επίσημη μετάφραση σε 90+ γλώσσες",
"Official dictionary with definitions, examples & pronunciation": "Επίσημο λεξικό με ορισμούς, παραδείγματα & προφορά",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Βοηθήματα ανάγνωσης AI (περιλήψεις κεφαλαίων, περίγραμμα, αφήγηση πολλαπλών ρόλων)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Εισαγάγετε το προσωπικό σας διακριτικό πρόσβασης Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Ορίστε την προεπιλεγμένη επιλογή συγχρονισμού σε τοπική στις ρυθμίσεις ή πραγματοποιήστε αναβάθμιση σε Pro για συγχρονισμό με περισσότερο χώρο αποθήκευσης στο cloud",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Κάντε κλικ στο εικονίδιο επέκτασης Koodo Reader στην επάνω δεξιά γωνία του προγράμματος περιήγησης, εξουσιοδοτήστε το αίτημα σε αυτό το τελικό σημείο και δοκιμάστε ξανά",
"How to sync library across devices": "Πώς να συγχρονίσετε τη βιβλιοθήκη μεταξύ συσκευών"
}
"How to sync library across devices": "Πώς να συγχρονίσετε τη βιβλιοθήκη μεταξύ συσκευών",
"Enable reading ruler": "Ενεργοποίηση χάρακα ανάγνωσης",
"Reading ruler height (lines)": "Ύψος χάρακα ανάγνωσης (γραμμές)",
"Reading ruler background opacity": "Αδιαφάνεια φόντου χάρακα ανάγνωσης",
"Enable speed reading": "Ενεργοποίηση γρήγορης ανάγνωσης",
"Reading speed (WPM)": "Ταχύτητα ανάγνωσης (WPM)",
"ISBN": "ISBN",
"Rating": "Βαθμολογία",
"Rating count": "Αριθμός βαθμολογιών",
"Publish date": "Ημερομηνία έκδοσης",
"Categories": "Κατηγορίες",
"Member login": "Σύνδεση μέλους",
"Register / Login": "Εγγραφή / Σύνδεση",
"Start 7-day free trial": "Έναρξη δωρεάν δοκιμής 7 ημερών",
"Scan for new books": "Σάρωση για νέα βιβλία",
"Recognize book title and author with AI on import": "Αναγνώριση τίτλου και συγγραφέα βιβλίου με AI κατά την εισαγωγή",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Κατά την εισαγωγή βιβλίων, αν δεν εξαχθεί τίτλος από τα μεταδεδομένα του βιβλίου, θα χρησιμοποιηθεί AI για την αναγνώριση του τίτλου και του συγγραφέα",
"No image found in archive": "Δεν βρέθηκε εικόνα στο αρχείο",
"Extract cover failed": "Αποτυχία εξαγωγής εξωφύλλου",
"Custom plugin security warning": "⚠️ <b>Σοβαρή προειδοποίηση ασφαλείας</b><br><br>Τα προσαρμοσμένα πρόσθετα έχουν πλήρη πρόσβαση και έλεγχο του υπολογιστή σας, ειδικά τα προσαρμοσμένα πρόσθετα TTS, τα οποία μπορούν να εκτελέσουν αυθαίρετο κώδικα.<br>Αυτό σημαίνει ότι θα μπορούσαν να:<br>• Διαβάσουν, τροποποιήσουν ή διαγράψουν τα αρχεία σας<br>• Κλέψουν λογαριασμούς, κωδικούς πρόσβασης και δεδομένα περιήγησης<br>• Εγκαταστήσουν κακόβουλο λογισμικό<br>• Ελέγξουν απομακρυσμένα τη συσκευή σας<br><br>Προσθέστε ένα πρόσθετο μόνο αφού βεβαιωθείτε ότι το εμπιστεύεστε πλήρως και έχετε ελέγξει προσεκτικά όλο τον κώδικά του.<br>Μην προσθέτετε ποτέ πρόσθετα από άγνωστους ιστότοπους, άγνωστες πηγές ή ανεπίσημα κανάλια.",
"Enable paragraph mode": "Ενεργοποίηση λειτουργίας παραγράφου",
"Import notes, highlights and dictionary history": "Εισαγωγή σημειώσεων, επισημάνσεων και ιστορικού λεξικού",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Επιλέξτε αρχεία CSV ή JSON που έχετε εξαγάγει προηγουμένως, για να εισαγάγετε σημειώσεις, επισημάνσεις και ιστορικό λεξικού πίσω στη βιβλιοθήκη",
"Invalid data": "Μη έγκυρα δεδομένα",
"The book {{name}} is not found in the library, please import the original book before importing": "Το βιβλίο «{{name}}» δεν βρέθηκε στη βιβλιοθήκη. Εισαγάγετε το αρχικό βιβλίο πριν συνεχίσετε την εισαγωγή",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Εισήχθησαν {{imported}} εγγραφές, παραλείφθηκαν {{skipped}} υπάρχουσες εγγραφές",
"Download featured backgrounds": "Λήψη επιλεγμένων φόντων",
"Official background": "Επίσημο φόντο",
"Recognize title with AI": "Αναγνώριση τίτλου με AI",
"Download open dictionaries": "Λήψη ανοιχτών λεξικών",
"Dictionary already downloaded": "Το λεξικό έχει ήδη ληφθεί",
"Source": "Πηγή",
"Word definitions and fast reading mode cannot be enabled at the same time": "Οι ορισμοί λέξεων και η γρήγορη ανάγνωση δεν μπορούν να ενεργοποιηθούν ταυτόχρονα",
"Reading ruler height": "Ύψος χάρακα ανάγνωσης",
"FAQ": "Συχνές ερωτήσεις",
"Auto scan and import books when starting the app or when clicking Scan": "Αυτόματη σάρωση και εισαγωγή βιβλίων κατά την εκκίνηση της εφαρμογής ή όταν πατάτε «Σάρωση»",
"Please enter book name": "Εισαγάγετε όνομα βιβλίου",
"Waiting for download...": "Αναμονή λήψης...",
"Pin to right": "Καρφίτσωμα δεξιά",
"Unpin": "Ξεκαρφίτσωμα",
"Resize": "Αλλαγή μεγέθους",
"Limited free": "Δωρεάν για περιορισμένο διάστημα",
"7-day free trial upon registration, then billed $4.99 per Year": "Δωρεάν δοκιμή 7 ημερών κατά την εγγραφή, στη συνέχεια χρέωση $4.99 ανά έτος",
"Yearly": "Ετησίως",
"Year": "Έτος",
"Limited offer": "Περιορισμένη προσφορά",
"$4.99": "$4.99",
"Title recognized successfully": "Ο τίτλος αναγνωρίστηκε με επιτυχία",
"Failed to recognize title": "Αποτυχία αναγνώρισης τίτλου",
"Show total page number (Experimental)": "Εμφάνιση συνολικού αριθμού σελίδων (Πειραματικό)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Αυτή η έκδοση του Koodo Reader είναι πολύ παλιά. Μεταβείτε στις Ρυθμίσεις - Σχετικά - Έλεγχος για ενημερώσεις, ενημερώστε το Koodo Reader στην τελευταία έκδοση και δοκιμάστε ξανά.",
"Background opacity": "Αδιαφάνεια φόντου"
}
+52 -4
View File
@@ -103,6 +103,11 @@
"Cancellation successful": "Cancellation successful",
"Only supported by desktop version": "Only supported with the desktop version",
"Hide mimical background": "Hide mimical background",
"Enable reading ruler": "Enable reading ruler",
"Reading ruler height (lines)": "Reading ruler height (lines)",
"Reading ruler background opacity": "Reading ruler background opacity",
"Enable speed reading": "Enable speed reading",
"Reading speed (WPM)": "Reading speed (WPM)",
"Auto hide cursor when reading": "Auto-hide cursor when reading",
"Disable update notification": "Disable update notifications",
"Roadmap": "Roadmap",
@@ -321,6 +326,11 @@
"Export": "Export",
"Restore": "Restore",
"Publisher": "Publisher",
"ISBN": "ISBN",
"Rating": "Rating",
"Rating count": "Rating count",
"Publish date": "Publish date",
"Categories": "Categories",
"Added on": "Added on",
"Margin": "Margin",
"Do you want to open this link in browser": "Do you want to open this link in a browser",
@@ -515,8 +525,6 @@
"Paste the code of the plugin here, check out document to learn how to get more plugins": "Paste the code of the plugin here, check out document to learn how to get more plugins",
"Add new voice": "Add new voice",
"Plugin verification failed": "Plugin verification failed",
"Custom voice plugins are not supported": "Custom voice plugins are not supported",
"Custom voice plugins have been disabled": "Custom voice plugins have been disabled",
"Paste voice list JSON": "Paste voice list JSON",
"Invalid voice list JSON": "Enter a non-empty JSON array containing valid voice configurations",
"Add new plugin": "Add new plugin",
@@ -537,6 +545,9 @@
"Valid until": "Valid until {{label}}",
"Failed to get sync state": "Failed to get sync state",
"Pro version": "Pro version",
"Member login": "Member login",
"Register / Login": "Register / Login",
"Start 7-day free trial": "Start 7-day free trial",
"Please add data source in the setting": "Please add data source in the setting",
"Don't automatically pre-cache books for mobile version after import": "Don't automatically pre-cache books for mobile version after import",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually",
@@ -793,6 +804,8 @@
"Download in Browser": "Download in Browser",
"Shelf location": "Shelf location",
"Use file name as book title": "Use file name as book title",
"Recognize book title and author with AI on import": "Recognize book title and author with AI on import",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author",
"With the integration of popular cloud storage services, WebDAV, FTP, SFTP, SMB, Docker, and object storage, all your data remains securely in your control": "With the integration of popular cloud storage services, WebDAV, FTP, SFTP, SMB, Docker, and object storage, all your data remains securely in your control",
"Only recommended for VIP users": "Only recommended for VIP users",
"The 115 cloud is only recommended for VIP users, as it is nearly unusable for free users. Additionally, due to API issues with 115 cloud, synchronization can be very slow. If you insist on using 115 cloud storage for syncing, it is recommended to enable Koodo Sync simultaneously, which will significantly improve the synchronization speed.": "The 115 cloud is only recommended for VIP users, as it is nearly unusable for free users. Additionally, due to API issues with 115 cloud, synchronization can be very slow. If you insist on using 115 cloud storage for syncing, it is recommended to enable Koodo Sync simultaneously, which will significantly improve the synchronization speed.",
@@ -803,6 +816,8 @@
"Failed to read file, please refresh and grant directory access again": "Failed to read file, please refresh and grant directory access again",
"OneDrive (full access)": "OneDrive (full access)",
"Import folder": "Import folder",
"No image found in archive": "No image found in archive",
"Extract cover failed": "Extract cover failed",
"Error scanning folder": "Error scanning folder",
"No files found in this folder": "No files found in this folder",
"Scanning folder": "Scanning folder",
@@ -884,11 +899,13 @@
"Not installed": "Not installed",
"Install": "Install",
"Add custom plugin": "Add custom plugin",
"Custom plugin security warning": "⚠️ <b>Severe Security Warning</b><br><br>Custom plugins have full access to and control over your computer, especially custom TTS plugins, which can execute arbitrary code.<br>This means they could:<br>• Read, modify, or delete your files<br>• Steal accounts, passwords, and browser data<br>• Install malware<br>• Remotely control your device<br><br>Only add a plugin after you are certain you fully trust it and have carefully reviewed all of its code.<br>Never add plugins from unknown websites, unknown sources, or unofficial channels.",
"How to custom plugin": "How to custom plugin",
"Plugin market": "Plugin market",
"Bookmark already exists": "Bookmark already exists",
"Visit online version": "Visit online version",
"Enable hyphenation": "Enable hyphenation",
"Enable paragraph mode": "Enable paragraph mode",
"Shortcuts": "Shortcuts",
"Go to the next page while reading": "Go to the next page while reading",
"Go to the previous page while reading": "Go to the previous page while reading",
@@ -961,6 +978,7 @@
"Bilingual translation": "Bilingual translation",
"Use AI to analyze books, with different characters reading aloud in different voices": "Use AI to analyze books, with different characters reading aloud in different voices",
"Voice type": "Voice type",
"Please reselect voices for all roles": "Please reselect voices for all roles",
"System voice": "System voice",
"Purchase the code": "Purchase the code",
"Please upgrade to Pro to use this feature": "Please upgrade to Pro to use this feature",
@@ -1044,6 +1062,11 @@
"Failed to parse model configuration": "Failed to parse model configuration",
"Background": "Background",
"Import successful": "Import successful",
"Import notes, highlights and dictionary history": "Import notes, highlights and dictionary history",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library",
"Invalid data": "Invalid data",
"The book {{name}} is not found in the library, please import the original book before importing": "The book {{name}} is not found in the library, please import the original book before importing",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Imported {{imported}} records, skipped {{skipped}} existing records",
"Clear app background": "Clear app background",
"Set as app background": "Set as app background",
"Clear book background": "Clear book background",
@@ -1054,6 +1077,8 @@
"Clear book font": "Clear book font",
"No background images added yet": "No background images added yet",
"Import local image": "Import local image",
"Download featured backgrounds": "Download featured backgrounds",
"Official background": "Official background",
"Action after selecting text": "Action after selecting text",
"Trial quota": "Trial quota",
"Clear all style": "Clear all style",
@@ -1080,6 +1105,7 @@
"Unpin from top": "Unpin from top",
"Unsupported language for word definition, currently only Chinese, Japanese and English are supported": "Unsupported language for word definition, currently only Chinese, Japanese and English are supported",
"Get metadata": "Get metadata",
"Recognize title with AI": "Recognize title with AI",
"Data source": "Data source",
"Search": "Search",
"Search chapters...": "Search chapters...",
@@ -1108,6 +1134,9 @@
"Api key": "Api key",
"Deck Name": "Deck Name",
"Import dictionary": "Import dictionary",
"Download open dictionaries": "Download open dictionaries",
"Dictionary already downloaded": "Dictionary already downloaded",
"Source": "Source",
"Local dictionary": "Local dictionary",
"e.g. Vocabulary": "e.g. Vocabulary",
"Auto sync new words to MaiMemo": "Auto sync new words to MaiMemo",
@@ -1290,7 +1319,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Once you exit Pro, you will immediately lose the following member benefits",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Official translation in 90+ languages",
"Official dictionary with definitions, examples & pronunciation": "Official dictionary with definitions, examples & pronunciation",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI reading aids (chapter summaries, outline, multi-role narration)",
@@ -1321,5 +1350,24 @@
"Enter your Notion personal access token": "Enter your Notion personal access token",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again",
"How to sync library across devices": "How to sync library across devices"
"How to sync library across devices": "How to sync library across devices",
"Reading ruler height": "Reading ruler height",
"FAQ": "FAQ",
"Auto scan and import books when starting the app or when clicking Scan": "Auto scan and import books when starting the app or when clicking Scan",
"Please enter book name": "Please enter book name",
"Waiting for download...": "Waiting for download...",
"Pin to right": "Pin to right",
"Unpin": "Unpin",
"Resize": "Resize",
"Limited free": "Limited free",
"7-day free trial upon registration, then billed $4.99 per Year": "7-day free trial upon registration, then billed $4.99 per Year",
"Yearly": "Yearly",
"Year": "Year",
"Limited offer": "Limited offer",
"$4.99": "$4.99",
"Title recognized successfully": "Title recognized successfully",
"Failed to recognize title": "Failed to recognize title",
"Show total page number (Experimental)": "Show total page number (Experimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.",
"Background opacity": "Background opacity"
}
+63 -13
View File
@@ -839,6 +839,7 @@
"Bilingual translation": "Traducción bilingüe",
"Use AI to analyze books, with different characters reading aloud in different voices": "Usar IA para analizar libros, con diferentes personajes leyendo en voz alta con diferentes voces",
"Voice type": "Tipo de voz",
"Please reselect voices for all roles": "Vuelva a seleccionar las voces para todos los roles",
"System voice": "Voz del sistema",
"Purchase the code": "Comprar el código",
"Please upgrade to Pro to use this feature": "Por favor, actualiza a Pro para usar esta función",
@@ -1124,15 +1125,15 @@
"Font file not found": "Archivo de fuente no encontrado",
"Font already downloaded": "Fuente ya descargada",
"Font already exists": "La fuente ya existe",
"Regular": "Regular",
"Light": "Light",
"Thin": "Thin",
"SemiBold": "SemiBold",
"Heavy": "Heavy",
"Black": "Black",
"ExtraBold": "ExtraBold",
"ExtraLight": "ExtraLight",
"Mono": "Mono",
"Regular": "Normal",
"Light": "Fina",
"Thin": "Muy fina",
"SemiBold": "Seminegrita",
"Heavy": "Gruesa",
"Black": "Negra",
"ExtraBold": "Extranegrita",
"ExtraLight": "Extrafina",
"Mono": "Monoespaciada",
"Backup library": "Copia de seguridad de la biblioteca",
"Restore library": "Restaurar biblioteca",
"Hide sync progress bar when syncing": "Ocultar barra de progreso de sincronización durante la sincronización",
@@ -1144,8 +1145,6 @@
"None": "Ninguna",
"Slide": "Deslizar",
"Flip": "Voltear",
"Custom voice plugins are not supported": "Los complementos de voz personalizados no son compatibles",
"Custom voice plugins have been disabled": "Los complementos de voz personalizados han sido desactivados",
"Paste voice list JSON": "Pegar lista de voz JSON",
"Invalid voice list JSON": "Ingrese un array JSON no vacío con configuraciones de voz válidas",
"Failed to load more": "Error al cargar más",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Una vez que salgas de la versión Pro, ya no podrás usar la sincronización y otras funciones premium",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "En el futuro, introduciremos más funciones exclusivas para miembros, incluyendo estadísticas de lectura y sincronización automática de tus notas, resaltados, progreso de lectura y listas de vocabulario a plataformas como Notion, Obsidian, Logseq, Anki y más.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sincronización de datos entre plataformas (unidades en la nube, WebDAV, Docker, almacenamiento de objetos)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importar libros desde unidades en la nube (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importar libros desde unidades en la nube (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Traducción oficial en más de 90 idiomas",
"Official dictionary with definitions, examples & pronunciation": "Diccionario oficial con definiciones, ejemplos y pronunciación",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Ayudas de lectura con IA (resúmenes de capítulos, esquemas, narración con múltiples roles)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Ingresa tu token de acceso personal de Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Por favor establezca la opción de sincronización predeterminada como local en la configuración, o actualice a Pro para sincronizar con más almacenamiento en la nube",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Por favor haga clic en el ícono de la extensión de Koodo Reader en la esquina superior derecha del navegador, autorice la solicitud a este endpoint, e inténtelo de nuevo",
"How to sync library across devices": "Cómo sincronizar la biblioteca entre dispositivos"
"How to sync library across devices": "Cómo sincronizar la biblioteca entre dispositivos",
"Enable reading ruler": "Activar la regla de lectura",
"Reading ruler height (lines)": "Altura de la regla de lectura (líneas)",
"Reading ruler background opacity": "Opacidad del fondo de la regla de lectura",
"Enable speed reading": "Activar la lectura rápida",
"Reading speed (WPM)": "Velocidad de lectura (WPM)",
"ISBN": "ISBN",
"Rating": "Valoración",
"Rating count": "Número de valoraciones",
"Publish date": "Fecha de publicación",
"Categories": "Categorías",
"Member login": "Acceso para miembros",
"Register / Login": "Registrarse / Iniciar sesión",
"Start 7-day free trial": "Comenzar la prueba gratuita de 7 días",
"Scan for new books": "Escanear nuevos libros",
"Recognize book title and author with AI on import": "Reconocer el título y el autor con IA al importar",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Al importar libros, si no se extrae ningún título de los metadatos del libro, se usará la IA para reconocer el título y el autor",
"No image found in archive": "No se encontró ninguna imagen en el archivo",
"Extract cover failed": "Error al extraer la portada",
"Custom plugin security warning": "⚠️ <b>Advertencia de seguridad grave</b><br><br>Los plugins personalizados tienen acceso completo y control total sobre tu ordenador, especialmente los plugins TTS personalizados, que pueden ejecutar código arbitrario.<br>Esto significa que podrían:<br>• Leer, modificar o eliminar tus archivos<br>• Robar cuentas, contraseñas y datos del navegador<br>• Instalar software malicioso<br>• Controlar tu dispositivo de forma remota<br><br>Añade un plugin solo cuando estés seguro de confiar plenamente en él y hayas revisado cuidadosamente todo su código.<br>Nunca añadas plugins de sitios web desconocidos, fuentes desconocidas o canales no oficiales.",
"Enable paragraph mode": "Activar el modo párrafo",
"Import notes, highlights and dictionary history": "Importar notas, resaltados e historial del diccionario",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Selecciona los archivos CSV o JSON exportados anteriormente para importar notas, resaltados e historial del diccionario a la biblioteca",
"Invalid data": "Datos no válidos",
"The book {{name}} is not found in the library, please import the original book before importing": "El libro {{name}} no se encuentra en la biblioteca; importa el libro original antes de continuar",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Se importaron {{imported}} registros y se omitieron {{skipped}} registros existentes",
"Download featured backgrounds": "Descargar fondos destacados",
"Official background": "Fondo oficial",
"Recognize title with AI": "Reconocer el título con IA",
"Download open dictionaries": "Descargar diccionarios abiertos",
"Dictionary already downloaded": "Diccionario ya descargado",
"Source": "Fuente",
"Word definitions and fast reading mode cannot be enabled at the same time": "Las definiciones de palabras y el modo de lectura rápida no se pueden activar al mismo tiempo",
"Reading ruler height": "Altura de la regla de lectura",
"FAQ": "Preguntas frecuentes",
"Auto scan and import books when starting the app or when clicking Scan": "Escanear e importar libros automáticamente al iniciar la aplicación o al hacer clic en Escanear",
"Please enter book name": "Introduce el nombre del libro",
"Waiting for download...": "Esperando la descarga...",
"Pin to right": "Fijar a la derecha",
"Unpin": "Desfijar",
"Resize": "Redimensionar",
"Limited free": "Gratis por tiempo limitado",
"7-day free trial upon registration, then billed $4.99 per Year": "Prueba gratuita de 7 días al registrarse, luego se cobra $4.99 por año",
"Yearly": "Anual",
"Year": "Año",
"Limited offer": "Oferta limitada",
"$4.99": "$4.99",
"Title recognized successfully": "Título reconocido correctamente",
"Failed to recognize title": "Error al reconocer el título",
"Show total page number (Experimental)": "Mostrar el número total de páginas (experimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Esta versión de Koodo Reader es demasiado antigua. Ve a Ajustes - Acerca de - Buscar actualizaciones para actualizar Koodo Reader a la última versión y vuelve a intentarlo.",
"Background opacity": "Opacidad del fondo"
}
+54 -4
View File
@@ -839,6 +839,7 @@
"Bilingual translation": "ترجمه دو زبانه",
"Use AI to analyze books, with different characters reading aloud in different voices": "استفاده از هوش مصنوعی برای تحلیل کتاب‌ها، با شخصیت‌های مختلف که با صداهای متفاوت می‌خوانند",
"Voice type": "نوع صدا",
"Please reselect voices for all roles": "لطفاً صداهای همه نقش‌ها را دوباره انتخاب کنید",
"System voice": "صدای سیستم",
"Purchase the code": "خرید کد",
"Please upgrade to Pro to use this feature": "لطفاً برای استفاده از این ویژگی به Pro ارتقا دهید",
@@ -1144,8 +1145,6 @@
"None": "هیچ‌کدام",
"Slide": "اسلاید",
"Flip": "چرخش",
"Custom voice plugins are not supported": "افزونه‌های صوتی سفارشی پشتیبانی نمی‌شوند",
"Custom voice plugins have been disabled": "افزونه‌های صوتی سفارشی غیرفعال شده‌اند",
"Paste voice list JSON": "چسباندن JSON فهرست صداها",
"Invalid voice list JSON": "یک آرایه JSON غیرخالی حاوی پیکربندی‌های صوتی معتبر وارد کنید",
"Failed to load more": "بارگذاری بیشتر ناموفق بود",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "پس از خروج از Pro، دیگر نمی‌توانید از همگام‌سازی و سایر ویژگی‌های پریمیوم استفاده کنید",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "در آینده ویژگی‌های اختصاصی بیشتری برای اعضا معرفی خواهیم کرد، از جمله آمار مطالعه و همگام‌سازی خودکار یادداشت‌ها، هایلایت‌ها، پیشرفت مطالعه و فهرست واژگان شما به پلتفرم‌هایی مانند Notion، Obsidian، Logseq، Anki و موارد دیگر.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "همگام‌سازی داده بین‌پلتفرمی (درایوهای ابری، WebDAV، Docker، ذخیره‌سازی اشیاء)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "واردکردن کتاب از درایوهای ابری (Baidu Netdisk، Google Drive، WebDAV، FTP، SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "واردکردن کتاب از درایوهای ابری (OneDrive، Google Drive، WebDAV، FTP، SMB)",
"Official translation in 90+ languages": "ترجمه رسمی به ۹۰+ زبان",
"Official dictionary with definitions, examples & pronunciation": "فرهنگ لغت رسمی (تعاریف، مثال‌ها و تلفظ)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "کمک‌های مطالعه با هوش مصنوعی (خلاصه فصل، طرح کلی، روایت چندنقشه)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "توکن دسترسی شخصی Notion خود را وارد کنید",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "لطفاً گزینه همگام‌سازی پیش‌فرض را در تنظیمات روی «محلی» قرار دهید، یا برای همگام‌سازی با فضای ابری بیشتر به Pro ارتقا دهید",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "لطفاً روی آیکون افزونه Koodo Reader در گوشه بالا سمت راست مرورگر کلیک کنید، درخواست به این endpoint را مجاز کنید و دوباره تلاش کنید",
"How to sync library across devices": "نحوه همگام‌سازی کتابخانه بین دستگاه‌ها"
"How to sync library across devices": "نحوه همگام‌سازی کتابخانه بین دستگاه‌ها",
"Enable reading ruler": "فعال‌سازی خط‌کش مطالعه",
"Reading ruler height (lines)": "ارتفاع خط‌کش مطالعه (خط)",
"Reading ruler background opacity": "شفافیت پس‌زمینه خط‌کش مطالعه",
"Enable speed reading": "فعال‌سازی مطالعه سریع",
"Reading speed (WPM)": "سرعت مطالعه (WPM)",
"ISBN": "ISBN",
"Rating": "امتیاز",
"Rating count": "تعداد امتیاز",
"Publish date": "تاریخ انتشار",
"Categories": "دسته‌بندی‌ها",
"Member login": "ورود اعضا",
"Register / Login": "ثبت‌نام / ورود",
"Start 7-day free trial": "شروع دوره آزمایشی رایگان ۷ روزه",
"Scan for new books": "اسکن کتاب‌های جدید",
"Recognize book title and author with AI on import": "تشخیص عنوان و نویسنده کتاب با هوش مصنوعی هنگام وارد کردن",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "هنگام وارد کردن کتاب‌ها، اگر عنوان کتاب از فراداده کتاب استخراج نشود، از هوش مصنوعی برای تشخیص عنوان و نویسنده کتاب استفاده می‌شود",
"No image found in archive": "هیچ تصویری در آرشیو یافت نشد",
"Extract cover failed": "استخراج جلد ناموفق بود",
"Custom plugin security warning": "⚠️ <b>هشدار امنیتی جدی</b><br><br>افزونه‌های سفارشی دسترسی و کنترل کامل روی رایانه شما دارند، به‌ویژه افزونه‌های TTS سفارشی که می‌توانند کد دلخواه اجرا کنند.<br>این یعنی آن‌ها می‌توانند:<br>• فایل‌های شما را بخوانند، تغییر دهند یا حذف کنند<br>• حساب‌ها، رمزهای عبور و داده‌های مرورگر را بدزدند<br>• بدافزار نصب کنند<br>• دستگاه شما را از راه دور کنترل کنند<br><br>تنها پس از آن‌که کاملاً به افزونه اعتماد داشتید و تمام کد آن را با دقت بررسی کردید، آن را اضافه کنید.<br>هرگز افزونه‌هایی از وب‌سایت‌های ناشناس، منابع ناشناس یا کانال‌های غیررسمی اضافه نکنید.",
"Enable paragraph mode": "فعال‌سازی حالت پاراگراف",
"Import notes, highlights and dictionary history": "وارد کردن یادداشت‌ها، نکات برجسته و تاریخچه فرهنگ لغت",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "فایل‌های CSV یا JSON که قبلاً صادر کرده‌اید را انتخاب کنید تا یادداشت‌ها، نکات برجسته و تاریخچه فرهنگ لغت دوباره به کتابخانه وارد شوند",
"Invalid data": "داده نامعتبر",
"The book {{name}} is not found in the library, please import the original book before importing": "کتاب {{name}} در کتابخانه یافت نشد، لطفاً پیش از وارد کردن، کتاب اصلی را وارد کنید",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} رکورد وارد شد، {{skipped}} رکورد موجود نادیده گرفته شد",
"Download featured backgrounds": "دانلود پس‌زمینه‌های ویژه",
"Official background": "پس‌زمینه رسمی",
"Recognize title with AI": "تشخیص عنوان با هوش مصنوعی",
"Download open dictionaries": "دانلود فرهنگ‌های لغت باز",
"Dictionary already downloaded": "فرهنگ لغت قبلاً دانلود شده است",
"Source": "منبع",
"Word definitions and fast reading mode cannot be enabled at the same time": "تعاریف کلمات و حالت مطالعه سریع را نمی‌توان همزمان فعال کرد",
"Reading ruler height": "ارتفاع خط‌کش مطالعه",
"FAQ": "سؤالات متداول",
"Auto scan and import books when starting the app or when clicking Scan": "اسکن و وارد کردن خودکار کتاب‌ها هنگام راه‌اندازی برنامه یا کلیک روی اسکن",
"Please enter book name": "لطفاً نام کتاب را وارد کنید",
"Waiting for download...": "در انتظار دانلود...",
"Pin to right": "سنجاق به راست",
"Unpin": "برداشتن سنجاق",
"Resize": "تغییر اندازه",
"Limited free": "رایگان محدود",
"7-day free trial upon registration, then billed $4.99 per Year": "۷ روز آزمایش رایگان هنگام ثبت‌نام، سپس سالانه $4.99 دریافت می‌شود",
"Yearly": "سالانه",
"Year": "سال",
"Limited offer": "پیشنهاد محدود",
"$4.99": "$4.99",
"Title recognized successfully": "عنوان با موفقیت تشخیص داده شد",
"Failed to recognize title": "تشخیص عنوان ناموفق بود",
"Show total page number (Experimental)": "نمایش تعداد کل صفحات (آزمایشی)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "این نسخه از Koodo Reader بسیار قدیمی است. لطفاً به تنظیمات - درباره - بررسی به‌روزرسانی بروید و Koodo Reader را به آخرین نسخه به‌روزرسانی کنید و دوباره تلاش کنید.",
"Background opacity": "شفافیت پس‌زمینه"
}
+55 -5
View File
@@ -846,6 +846,7 @@
"Bilingual translation": "Kaksikielinen käännös",
"Use AI to analyze books, with different characters reading aloud in different voices": "Käytä tekoälyä kirjojen analysointiin, eri hahmot lukevat ääneen eri äänillä",
"Voice type": "Äänityyppi",
"Please reselect voices for all roles": "Valitse hahmojen äänet uudelleen",
"System voice": "Järjestelmäääni",
"Purchase the code": "Osta koodi",
"Please upgrade to Pro to use this feature": "Päivitä Pro-käyttöön käyttääksesi tätä ominaisuutta",
@@ -1151,8 +1152,6 @@
"None": "Ei mitään",
"Slide": "Liuku",
"Flip": "Käännä",
"Custom voice plugins are not supported": "Mukautettuja äänilaajennuksia ei tueta",
"Custom voice plugins have been disabled": "Mukautetut äänilaajennukset on poistettu käytöstä",
"Paste voice list JSON": "Liitä ääniluettelo JSON",
"Invalid voice list JSON": "Syötä ei-tyhjä JSON-taulukko, joka sisältää kelvolliset äänimääritykset",
"Failed to load more": "Enemmän lataus epäonnistui",
@@ -1297,7 +1296,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Kun poistut Prosta, menetät välittömästi seuraavat jäsenedut",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Tulevaisuudessa esittelemme enemmän jäsenille tarkoitettuja ominaisuuksia, kuten lukutilastojen ja muistiinpanojesi, kohokohtiesi, lukemisen edistymisen ja sanastoluetteloiden automaattisen synkronoinnin alustoihin, kuten Notion, Obsidian, Logseq, Anki ja muihin.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Eri alustojen tietojen synkronointi (pilviasemat, WebDAV, Docker, objektin tallennus)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Tuo kirjoja pilviasemista (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Tuo kirjoja pilviasemista (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Virallinen käännös yli 90 kielelle",
"Official dictionary with definitions, examples & pronunciation": "Virallinen sanakirja, jossa on määritelmiä, esimerkkejä ja ääntäminen",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI lukuapuvälineet (lukujen yhteenvedot, hahmotelma, monirooliselostus)",
@@ -1328,5 +1327,56 @@
"Enter your Notion personal access token": "Syötä henkilökohtainen Notion-käyttötunnuksesi",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Aseta oletussynkronointiasetukseksi paikallinen asetuksissa tai päivitä Pro-versioon synkronoidaksesi lisää pilvitallennustilaa",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Napsauta Koodo Reader-laajennuskuvaketta selaimen oikeassa yläkulmassa, hyväksy pyyntö tähän päätepisteeseen ja yritä uudelleen",
"How to sync library across devices": "Kuinka synkronoida kirjasto laitteiden välillä"
}
"How to sync library across devices": "Kuinka synkronoida kirjasto laitteiden välillä",
"Enable reading ruler": "Ota lukuviivain käyttöön",
"Reading ruler height (lines)": "Lukuviivaimen korkeus (riviä)",
"Reading ruler background opacity": "Lukuviivaimen taustan peittävyys",
"Enable speed reading": "Ota nopeusluku käyttöön",
"Reading speed (WPM)": "Lukunopeus (WPM)",
"ISBN": "ISBN",
"Rating": "Arvosana",
"Rating count": "Arvosanojen määrä",
"Publish date": "Julkaisupäivä",
"Categories": "Luokat",
"Member login": "Jäsenen kirjautuminen",
"Register / Login": "Rekisteröidy / Kirjaudu",
"Start 7-day free trial": "Aloita 7 päivän ilmainen kokeilu",
"Scan for new books": "Skannaa uudet kirjat",
"Recognize book title and author with AI on import": "Tunnista kirjan nimi ja tekijä tekoälyllä tuonnin yhteydessä",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Kun tuot kirjoja, jos kirjan metatiedoista ei voida jäsentää kirjan nimeä, tekoälyä käytetään kirjan nimen ja tekijän tunnistamiseen",
"No image found in archive": "Arkistosta ei löytynyt kuvaa",
"Extract cover failed": "Kannen poiminta epäonnistui",
"Custom plugin security warning": "⚠️ <b>Vakava tietoturvavaroitus</b><br><br>Mukautetuilla laajennuksilla on täysi pääsy tietokoneeseesi ja täysi hallinta siihen, erityisesti mukautetut TTS-laajennukset voivat suorittaa mielivaltaista koodia.<br>Tämä tarkoittaa, että ne voivat:<br>• Lukea, muuttaa tai poistaa tiedostojasi<br>• Varastaa tilejä, salasanoja ja selaimen tietoja<br>• Asentaa haittaohjelmia<br>• Hallita laitettasi etänä<br><br>Lisää laajennus vasta, kun olet varma, että luotat siihen täysin ja olet käynyt huolellisesti läpi sen koko koodin.<br>Älä koskaan lisää laajennuksia tuntemattomilta verkkosivustoilta, tuntemattomista lähteistä tai epävirallisista kanavista.",
"Enable paragraph mode": "Ota kappaletila käyttöön",
"Import notes, highlights and dictionary history": "Tuo muistiinpanot, korostukset ja sanakirjahistoria",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Valitse aiemmin viedyt CSV- tai JSON-tiedostot ja tuo muistiinpanot, korostukset ja sanakirjahistoria takaisin kirjastoon",
"Invalid data": "Virheelliset tiedot",
"The book {{name}} is not found in the library, please import the original book before importing": "Kirjaa {{name}} ei löytynyt kirjastosta, tuo alkuperäinen kirja ennen tuontia",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Tuotiin {{imported}} tietuetta, ohitettiin {{skipped}} olemassa olevaa tietuetta",
"Download featured backgrounds": "Lataa suositellut taustakuvat",
"Official background": "Virallinen tausta",
"Recognize title with AI": "Tunnista nimi tekoälyllä",
"Download open dictionaries": "Lataa avoimet sanakirjat",
"Dictionary already downloaded": "Sanakirja on jo ladattu",
"Source": "Lähde",
"Word definitions and fast reading mode cannot be enabled at the same time": "Sanamääritelmiä ja nopeuslukua ei voi ottaa käyttöön samanaikaisesti",
"Reading ruler height": "Lukuviivaimen korkeus (riviä)",
"FAQ": "UKK",
"Auto scan and import books when starting the app or when clicking Scan": "Skannaa ja tuo kirjat automaattisesti sovelluksen käynnistyessä tai Skannaa-painiketta napsautettaessa",
"Please enter book name": "Syötä kirjan nimi",
"Waiting for download...": "Odotetaan latausta...",
"Pin to right": "Kiinnitä oikealle",
"Unpin": "Irrota",
"Resize": "Muuta kokoa",
"Limited free": "Rajoitetusti ilmainen",
"7-day free trial upon registration, then billed $4.99 per Year": "7 päivän ilmainen kokeilu rekisteröitymisen jälkeen, sen jälkeen laskutus $4.99 vuodessa",
"Yearly": "Vuosittain",
"Year": "Vuosi",
"Limited offer": "Rajoitettu tarjous",
"$4.99": "$4.99",
"Title recognized successfully": "Nimi tunnistettu onnistuneesti",
"Failed to recognize title": "Nimen tunnistus epäonnistui",
"Show total page number (Experimental)": "Näytä sivujen kokonaismäärä (kokeellinen)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Tämä Koodo Reader -versio on liian vanha. Siirry kohtaan Asetukset - Tietoja - Tarkista päivitys, päivitä Koodo Reader uusimpaan versioon ja yritä uudelleen.",
"Background opacity": "Taustan peittävyys"
}
+61 -11
View File
@@ -3,7 +3,7 @@
"Recent": "Récents",
"Bookmarks": "Signets",
"Favorites": "Favoris",
"Notes": "Notes",
"Notes": "Mes notes",
"Highlights": "Annotations",
"Shelf": "Étagère",
"Left": "Gauche",
@@ -52,7 +52,7 @@
"Speed": "Vitesse",
"Bookmark": "Signet",
"Single": "Simple",
"Double": "Double",
"Double": "Double page",
"Background color": "Couleur de fond",
"Font size": "Taille de la police",
"Font family": "Famille de police",
@@ -199,7 +199,7 @@
"Collapse sidebar": "Masquer la barre latérale",
"Show sidebar": "Afficher la barre latérale",
"Sync": "Synchronisation",
"Document": "Document",
"Document": "Documentation",
"Feedback": "Commentaires",
"GitHub repository": "Dépôt GitHub",
"Speak the text": "Dicter le texte",
@@ -480,7 +480,7 @@
"Please add data source in the setting": "Veuillez ajouter une source de données dans les paramètres",
"Don't automatically pre-cache books for mobile version after import": "Ne pas précharger automatiquement les livres pour la version mobile après importation",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "Lors de l’importation, les livres seront automatiquement préchargés pour un accès fluide dans la version mobile. Cependant, ce processus peut consommer plus d’espace et prolonger la durée d’importation. Vous pouvez également le faire manuellement",
"Test": "Test",
"Test": "Tester",
"Get error log": "Obtenir le journal des erreurs",
"Account type": "Type de compte",
"Trial user": "Utilisateur d’essai",
@@ -838,6 +838,7 @@
"Bilingual translation": "Traduction bilingue",
"Use AI to analyze books, with different characters reading aloud in different voices": "Utiliser l'IA pour analyser les livres, avec différents personnages lisant à voix haute avec différentes voix",
"Voice type": "Type de voix",
"Please reselect voices for all roles": "Veuillez resélectionner les voix pour tous les rôles",
"System voice": "Voix système",
"Purchase the code": "Acheter le code",
"Please upgrade to Pro to use this feature": "Veuillez passer à Pro pour utiliser cette fonctionnalité",
@@ -1131,7 +1132,7 @@
"Black": "Noir",
"ExtraBold": "Extra gras",
"ExtraLight": "Extra fin",
"Mono": "Mono",
"Mono": "Monospace",
"Backup library": "Sauvegarder la bibliothèque",
"Restore library": "Restaurer la bibliothèque",
"Hide sync progress bar when syncing": "Masquer la barre de progression lors de la synchronisation",
@@ -1143,8 +1144,6 @@
"None": "Aucun",
"Slide": "Glissement",
"Flip": "Retournement",
"Custom voice plugins are not supported": "Les plugins de voix personnalisés ne sont pas pris en charge",
"Custom voice plugins have been disabled": "Les plugins de voix personnalisés ont été désactivés",
"Paste voice list JSON": "Collez le JSON de la liste des voix",
"Invalid voice list JSON": "Entrez une liste JSON non vide contenant des configurations vocales valides",
"Failed to load more": "Échec du chargement supplémentaire",
@@ -1276,7 +1275,7 @@
"Shape type": "Type de forme",
"Shape color": "Couleur de la forme",
"Shape width": "Largeur de la forme",
"Rect": "Rect",
"Rect": "Rectangle",
"Circle": "Cercle",
"Ellipse": "Ellipse",
"Line": "Ligne",
@@ -1289,7 +1288,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Une fois que vous quittez la version Pro, vous perdez immédiatement les avantages suivants",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "À l'avenir, nous introduirons davantage de fonctionnalités exclusives aux membres, notamment des statistiques de lecture et la synchronisation automatique de vos notes, surlignages, progression de lecture et listes de vocabulaire vers des plateformes telles que Notion, Obsidian, Logseq, Anki, etc.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Synchronisation de données multiplateforme (disques cloud, WebDAV, Docker, stockage objet)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importer des livres depuis des disques cloud (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importer des livres depuis des disques cloud (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Traduction officielle dans plus de 90 langues",
"Official dictionary with definitions, examples & pronunciation": "Dictionnaire officiel avec définitions, exemples et prononciation",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Aides à la lecture IA (résumés de chapitre, plan, narration multi-rôles)",
@@ -1311,7 +1310,7 @@
"Please make sure the KoodoReader folder is created in the root directory of your Jianguoyun account, not in the My Jianguoyun folder.": "Veuillez vous assurer que le dossier KoodoReader est créé dans le répertoire racine de votre compte Jianguoyun, et non dans le dossier My Jianguoyun.",
"Move": "Déplacer",
"Local folder": "Dossier local",
"Auto": "Auto",
"Auto": "Automatique",
"Sort": "Trier",
"Clear chat history": "Effacer l'historique de chat",
"Export chat history": "Exporter l'historique de chat",
@@ -1320,5 +1319,56 @@
"Enter your Notion personal access token": "Entrez votre jeton d'accès personnel Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Veuillez définir l'option de synchronisation par défaut sur local dans les paramètres, ou passez à Pro pour synchroniser avec plus de stockage cloud",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Cliquez sur l'icône de l'extension Koodo Reader en haut à droite du navigateur, autorisez la requête vers ce point de terminaison, puis réessayez",
"How to sync library across devices": "Comment synchroniser la bibliothèque entre les appareils"
"How to sync library across devices": "Comment synchroniser la bibliothèque entre les appareils",
"Enable reading ruler": "Activer la règle de lecture",
"Reading ruler height (lines)": "Hauteur de la règle de lecture (lignes)",
"Reading ruler background opacity": "Opacité de l’arrière-plan de la règle de lecture",
"Enable speed reading": "Activer la lecture rapide",
"Reading speed (WPM)": "Vitesse de lecture (WPM)",
"ISBN": "ISBN",
"Rating": "Évaluation",
"Rating count": "Nombre d’évaluations",
"Publish date": "Date de publication",
"Categories": "Catégories",
"Member login": "Connexion membre",
"Register / Login": "S’inscrire / Se connecter",
"Start 7-day free trial": "Commencer l’essai gratuit de 7 jours",
"Scan for new books": "Analyser de nouveaux livres",
"Recognize book title and author with AI on import": "Reconnaître le titre et l’auteur avec l’IA lors de l’importation",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Lors de l’importation, si aucun titre n’est extrait des métadonnées du livre, l’IA sera utilisée pour reconnaître le titre et l’auteur",
"No image found in archive": "Aucune image trouvée dans l’archive",
"Extract cover failed": "Échec de l’extraction de la couverture",
"Custom plugin security warning": "⚠️ <b>Avertissement de sécurité grave</b><br><br>Les plugins personnalisés disposent d’un accès complet et d’un contrôle total sur votre ordinateur, en particulier les plugins TTS personnalisés, qui peuvent exécuter du code arbitraire.<br>Cela signifie qu’ils pourraient :<br>• Lire, modifier ou supprimer vos fichiers<br>• Voler des comptes, des mots de passe et des données de navigateur<br>• Installer des logiciels malveillants<br>• Contrôler votre appareil à distance<br><br>N’ajoutez un plugin qu’après être certain de lui faire entièrement confiance et d’avoir examiné attentivement l’intégralité de son code.<br>N’ajoutez jamais de plugins provenant de sites web inconnus, de sources inconnues ou de canaux non officiels.",
"Enable paragraph mode": "Activer le mode paragraphe",
"Import notes, highlights and dictionary history": "Importer les notes, surlignages et l’historique du dictionnaire",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Sélectionnez les fichiers CSV ou JSON exportés précédemment pour réimporter les notes, surlignages et l’historique du dictionnaire dans la bibliothèque",
"Invalid data": "Données non valides",
"The book {{name}} is not found in the library, please import the original book before importing": "Le livre {{name}} est introuvable dans la bibliothèque ; veuillez importer le livre original avant de continuer",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} enregistrements importés, {{skipped}} enregistrements existants ignorés",
"Download featured backgrounds": "Télécharger les arrière-plans en vedette",
"Official background": "Arrière-plan officiel",
"Recognize title with AI": "Reconnaître le titre avec l’IA",
"Download open dictionaries": "Télécharger des dictionnaires ouverts",
"Dictionary already downloaded": "Dictionnaire déjà téléchargé",
"Source": "Source",
"Word definitions and fast reading mode cannot be enabled at the same time": "Les définitions de mots et le mode de lecture rapide ne peuvent pas être activés en même temps",
"Reading ruler height": "Hauteur de la règle de lecture",
"FAQ": "FAQ",
"Auto scan and import books when starting the app or when clicking Scan": "Analyser et importer automatiquement les livres au démarrage de l’application ou en cliquant sur Analyser",
"Please enter book name": "Veuillez saisir le nom du livre",
"Waiting for download...": "En attente du téléchargement...",
"Pin to right": "Épingler à droite",
"Unpin": "Détacher",
"Resize": "Redimensionner",
"Limited free": "Gratuit pour une durée limitée",
"7-day free trial upon registration, then billed $4.99 per Year": "Essai gratuit de 7 jours à l’inscription, puis facturé $4.99 par an",
"Yearly": "Annuel",
"Year": "An",
"Limited offer": "Offre limitée",
"$4.99": "$4.99",
"Title recognized successfully": "Titre reconnu avec succès",
"Failed to recognize title": "Échec de la reconnaissance du titre",
"Show total page number (Experimental)": "Afficher le nombre total de pages (expérimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Cette version de Koodo Reader est trop ancienne. Veuillez aller dans Paramètres - À propos - Vérifier les mises à jour pour mettre Koodo Reader à jour vers la dernière version, puis réessayer.",
"Background opacity": "Opacité de l’arrière-plan"
}
+55 -5
View File
@@ -837,6 +837,7 @@
"Bilingual translation": "Aistriúchán dátheangach",
"Use AI to analyze books, with different characters reading aloud in different voices": "Úsáid AI chun leabhair a anailísiú, le carachtair éagsúla ag léamh amach i nguthanna éagsúla",
"Voice type": "Cineál gutha",
"Please reselect voices for all roles": "Le do thoil, roghnaigh na guthanna do gach ról arís",
"System voice": "Guth córais",
"Purchase the code": "Ceannaigh an cód",
"Please upgrade to Pro to use this feature": "Uasghrádaigh go Pro le do thoil chun an ghné seo a úsáid",
@@ -1142,8 +1143,6 @@
"None": "Dada",
"Slide": "Sleamhnán",
"Flip": "Smeach",
"Custom voice plugins are not supported": "Ní thacaítear le breiseáin gutha saincheaptha",
"Custom voice plugins have been disabled": "Díchumasaíodh forlíontáin gutha saincheaptha",
"Paste voice list JSON": "Greamaigh liosta gutha JSON",
"Invalid voice list JSON": "Cuir isteach eagar JSON neamhfholam le cumraíochtaí gutha bailí",
"Failed to load more": "Theip ar lódáil níos mó",
@@ -1288,7 +1287,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Nuair a fhágfaidh tú Pro, caillfidh tú na sochair bhall seo a leanas láithreach",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Sa todhchaí, tabharfaimid isteach níos mó gnéithe eisiacha do bhaill, lena n-áirítear staitisticí léitheoireachta agus sioncrónú uathoibríoch ar do nótaí, buaicphointí, dul chun cinn léitheoireachta, agus liostaí stór focal chuig ardáin mar Notion, Obsidian, Logseq, Anki, agus níos mó.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sioncronú sonraí tras-ardáin (tiomántáin scamall, WebDAV, Docker, stóráil réad)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Iompórtáil leabhair ó thiomáineann néil (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Iompórtáil leabhair ó thiomáineann néil (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Aistriúchán oifigiúil i 90+ teanga",
"Official dictionary with definitions, examples & pronunciation": "Foclóir oifigiúil le sainmhínithe, samplaí & fuaimniú",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Áiseanna léitheoireachta AI (achoimrí caibidle, breac-chuntas, insint ilróil)",
@@ -1319,5 +1318,56 @@
"Enter your Notion personal access token": "Cuir isteach do chomhartha rochtana pearsanta Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Socraigh an rogha sioncronaithe réamhshocraithe go logánta sna socruithe, nó uasghrádaigh go Pro chun sioncronú le tuilleadh stórála néil",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Cliceáil ar an deilbhín iarmhír Koodo Reader sa chúinne uachtarach ar dheis den bhrabhsálaí, ceadaigh an t-iarratas chuig an gcríochphointe seo agus bain triail eile as",
"How to sync library across devices": "Conas leabharlann a shioncronú thar ghléasanna"
}
"How to sync library across devices": "Conas leabharlann a shioncronú thar ghléasanna",
"Enable reading ruler": "Cumasaigh rialóir léitheoireachta",
"Reading ruler height (lines)": "Airde an rialóra léitheoireachta (línte)",
"Reading ruler background opacity": "Teimhneacht chúlra an rialóra léitheoireachta",
"Enable speed reading": "Cumasaigh léitheoireacht thapa",
"Reading speed (WPM)": "Luas léitheoireachta (WPM)",
"ISBN": "ISBN",
"Rating": "Rátáil",
"Rating count": "Líon na rátálacha",
"Publish date": "Dáta foilsithe",
"Categories": "Catagóirí",
"Member login": "Logáil isteach ball",
"Register / Login": "Cláraigh / Logáil isteach",
"Start 7-day free trial": "Tosaigh triail saor in aisce 7 lá",
"Scan for new books": "Scanáil le haghaidh leabhar nua",
"Recognize book title and author with AI on import": "Aithin teideal agus údar an leabhair le AI agus á iompórtáil",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Agus leabhair á n-iompórtáil, mura ndíorthaítear teideal an leabhair ó mheiteashonraí an leabhair, úsáidfear AI chun teideal agus údar an leabhair a aithint",
"No image found in archive": "Ní bhfuarthas aon íomhá san chartlann",
"Extract cover failed": "Theip ar an gclúdach a bhaint",
"Custom plugin security warning": "⚠️ <b>Rabhadh Tromchúiseach Slándála</b><br><br>Tá rochtain iomlán agus smacht iomlán ag breiseáin shaincheaptha ar do ríomhaire, go háirithe breiseáin TTS shaincheaptha, ar féidir leo cód treallach a rith.<br>Ciallaíonn sé seo go bhféadfaidís:<br>• Do chuid comhad a léamh, a athrú nó a scriosadh<br>• Cuntais, pasfhocail agus sonraí brabhsálaí a ghoid<br>• Bogearraí mailíseacha a shuiteáil<br>• Do ghléas a rialú go cianda<br><br>Ná cuir breiseán leis ach amháin tar éis duit a bheith cinnte go bhfuil muinín iomlán agat as agus tar éis duit a chód ar fad a scrúdú go cúramach.<br>Ná cuir breiseáin ó shuíomhanna anaithnide, ó fhoinsí anaithnide ná ó bhealaí neamhoifigiúla leis riamh.",
"Enable paragraph mode": "Cumasaigh mód paragraf",
"Import notes, highlights and dictionary history": "Iompórtáil nótaí, buaicphointí agus stair foclóra",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Roghnaigh comhaid CSV nó JSON a easpórtáladh roimhe seo chun nótaí, buaicphointí agus stair foclóra a iompórtáil ar ais chuig an leabharlann",
"Invalid data": "Sonraí neamhbhailí",
"The book {{name}} is not found in the library, please import the original book before importing": "Ní bhfuarthas an leabhar {{name}} sa leabharlann, iompórtáil an bunleabhar sula n-iompórtálann tú",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Iompórtáladh {{imported}} taifead, scipeáladh {{skipped}} taifead atá ann cheana",
"Download featured backgrounds": "Íosluchtaigh cúlraí faoi thrácht",
"Official background": "Cúlra oifigiúil",
"Recognize title with AI": "Aithin an teideal le AI",
"Download open dictionaries": "Íosluchtaigh foclóirí oscailte",
"Dictionary already downloaded": "Foclóir íoslódáilte cheana féin",
"Source": "Foinse",
"Word definitions and fast reading mode cannot be enabled at the same time": "Ní féidir sainmhínithe focal agus mód léitheoireachta tapa a chumasú ag an am céanna",
"Reading ruler height": "Airde an rialóra léitheoireachta",
"FAQ": "Ceisteanna Coitianta",
"Auto scan and import books when starting the app or when clicking Scan": "Scanáil agus iompórtáil leabhair go huathoibríoch nuair a thosaíonn an aip nó nuair a chliceálann tú Scan",
"Please enter book name": "Iontráil ainm an leabhair le do thoil",
"Waiting for download...": "Ag fanacht le híoslódáil...",
"Pin to right": "Pionnáil ar dheis",
"Unpin": "Díphionnáil",
"Resize": "Athraigh an méid",
"Limited free": "Saor in aisce go sealadach",
"7-day free trial upon registration, then billed $4.99 per Year": "Triail saor in aisce 7 lá ar chlárú, ansin gearrfar $4.99 in aghaidh na bliana",
"Yearly": "Bliantúil",
"Year": "Bliain",
"Limited offer": "Tairiscint theoranta",
"$4.99": "$4.99",
"Title recognized successfully": "Aithníodh an teideal go rathúil",
"Failed to recognize title": "Theip ar an teideal a aithint",
"Show total page number (Experimental)": "Taispeáin líon iomlán na leathanach (Trialach)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Tá an leagan seo de Koodo Reader róshean. Téigh go Socruithe - Maidir - Seiceáil le haghaidh nuashonraithe chun Koodo Reader a nuashonrú go dtí an leagan is déanaí agus bain triail eile as.",
"Background opacity": "Teimhneacht an chúlra"
}
+54 -4
View File
@@ -837,6 +837,7 @@
"Bilingual translation": "द्विभाषी अनुवाद",
"Use AI to analyze books, with different characters reading aloud in different voices": "पुस्तकों का विश्लेषण करने के लिए AI का उपयोग करें, विभिन्न पात्र अलग-अलग आवाज़ों में पढ़ते हैं",
"Voice type": "आवाज़ का प्रकार",
"Please reselect voices for all roles": "कृपया सभी भूमिकाओं के लिए आवाज़ें फिर से चुनें",
"System voice": "सिस्टम आवाज़",
"Purchase the code": "कोड खरीदें",
"Please upgrade to Pro to use this feature": "कृपया इस सुविधा का उपयोग करने के लिए Pro में अपग्रेड करें",
@@ -1142,8 +1143,6 @@
"None": "कोई नहीं",
"Slide": "स्लाइड",
"Flip": "पलटें",
"Custom voice plugins are not supported": "कस्टम वॉइस प्लगइन समर्थित नहीं हैं",
"Custom voice plugins have been disabled": "कस्टम वॉइस प्लगइन अक्षम कर दिए गए हैं",
"Paste voice list JSON": "वॉइस सूची JSON चिपकाएँ",
"Invalid voice list JSON": "मान्य वॉइस कॉन्फ़िगरेशन वाला गैर-रिक्त JSON एरे दर्ज करें",
"Failed to load more": "और लोड करने में विफल",
@@ -1288,7 +1287,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro से बाहर निकलने के बाद, आप सिंक्रोनाइज़ेशन और अन्य प्रीमियम सुविधाएँ नहीं उपयोग कर पाएंगे",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "भविष्य में हम और सदस्य-विशेष सुविधाएँ पेश करेंगे, जिनमें पठन आँकड़े और आपके नोट्स, हाइलाइट्स, पठन प्रगति तथा शब्द सूचियों का Notion, Obsidian, Logseq, Anki जैसे प्लेटफ़ॉर्म पर स्वचालित सिंक शामिल है।",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "क्रॉस-प्लेटफ़ॉर्म डेटा सिंक (क्लाउड ड्राइव, WebDAV, Docker, ऑब्जेक्ट स्टोरेज)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "क्लाउड ड्राइव (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB) से पुस्तकें आयात करें",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "क्लाउड ड्राइव (OneDrive, Google Drive, WebDAV, FTP, SMB) से पुस्तकें आयात करें",
"Official translation in 90+ languages": "90+ भाषाओं में आधिकारिक अनुवाद",
"Official dictionary with definitions, examples & pronunciation": "आधिकारिक शब्दकोश (परिभाषाएँ, उदाहरण और उच्चारण)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI पठन सहायता (अध्याय सारांश, रूपरेखा, बहु-भूमिका वाचन)",
@@ -1319,5 +1318,56 @@
"Enter your Notion personal access token": "अपना Notion व्यक्तिगत एक्सेस टोकन दर्ज करें",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "कृपया सेटिंग्स में डिफ़ॉल्ट सिंक विकल्प को स्थानीय पर सेट करें, या अधिक क्लाउड स्टोरेज के साथ सिंक करने के लिए Pro में अपग्रेड करें",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "कृपया ब्राउज़र के ऊपरी दाएँ कोने में Koodo Reader एक्सटेंशन आइकन पर क्लिक करें, इस एंडपॉइंट पर अनुरोध को अधिकृत करें और पुनः प्रयास करें",
"How to sync library across devices": "उपकरणों के बीच लाइब्रेरी कैसे सिंक करें"
"How to sync library across devices": "उपकरणों के बीच लाइब्रेरी कैसे सिंक करें",
"Enable reading ruler": "पठन रूलर सक्षम करें",
"Reading ruler height (lines)": "पठन रूलर की ऊँचाई (पंक्तियाँ)",
"Reading ruler background opacity": "पठन रूलर की पृष्ठभूमि अपारदर्शिता",
"Enable speed reading": "तेज़ पठन सक्षम करें",
"Reading speed (WPM)": "पठन गति (WPM)",
"ISBN": "ISBN",
"Rating": "रेटिंग",
"Rating count": "रेटिंग संख्या",
"Publish date": "प्रकाशन दिनांक",
"Categories": "श्रेणियाँ",
"Member login": "सदस्य लॉगिन",
"Register / Login": "पंजीकरण / लॉगिन",
"Start 7-day free trial": "7 दिन का नि:शुल्क परीक्षण शुरू करें",
"Scan for new books": "नई पुस्तकें स्कैन करें",
"Recognize book title and author with AI on import": "आयात करते समय AI से पुस्तक का शीर्षक और लेखक पहचानें",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "पुस्तकें आयात करते समय, यदि पुस्तक मेटाडेटा से शीर्षक नहीं निकाला जा सकता, तो शीर्षक और लेखक पहचानने के लिए AI का उपयोग किया जाएगा",
"No image found in archive": "आर्काइव में कोई छवि नहीं मिली",
"Extract cover failed": "कवर निकालना विफल रहा",
"Custom plugin security warning": "⚠️ <b>गंभीर सुरक्षा चेतावनी</b><br><br>कस्टम प्लगइन को आपके कंप्यूटर पर पूरी पहुँच और नियंत्रण होता है, विशेष रूप से कस्टम TTS प्लगइन, जो मनमाना कोड निष्पादित कर सकते हैं।<br>इसका मतलब है कि वे यह कर सकते हैं:<br>• आपकी फ़ाइलें पढ़ना, बदलना या मिटाना<br>• खाते, पासवर्ड और ब्राउज़र डेटा चुराना<br>• मैलवेयर इंस्टॉल करना<br>• आपके डिवाइस को दूर से नियंत्रित करना<br><br>किसी प्लगइन को तभी जोड़ें जब आप पूरी तरह निश्चित हों कि आप उस पर भरोसा करते हैं और उसके पूरे कोड की सावधानी से समीक्षा कर चुके हैं।<br>अज्ञात वेबसाइटों, अज्ञात स्रोतों या अनधिकृत चैनलों से कोई प्लगइन कभी न जोड़ें।",
"Enable paragraph mode": "अनुच्छेद मोड सक्षम करें",
"Import notes, highlights and dictionary history": "नोट्स, हाईलाइट्स और शब्दकोश इतिहास आयात करें",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "पहले निर्यात की गई CSV या JSON फ़ाइलें चुनें और नोट्स, हाईलाइट्स तथा शब्दकोश इतिहास को वापस लाइब्रेरी में आयात करें",
"Invalid data": "अमान्य डेटा",
"The book {{name}} is not found in the library, please import the original book before importing": "लाइब्रेरी में पुस्तक {{name}} नहीं मिली, कृपया आयात करने से पहले मूल पुस्तक आयात करें",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} रिकॉर्ड आयात किए गए, {{skipped}} मौजूदा रिकॉर्ड छोड़े गए",
"Download featured backgrounds": "विशेष पृष्ठभूमियाँ डाउनलोड करें",
"Official background": "आधिकारिक पृष्ठभूमि",
"Recognize title with AI": "AI से शीर्षक पहचानें",
"Download open dictionaries": "मुक्त शब्दकोश डाउनलोड करें",
"Dictionary already downloaded": "शब्दकोश पहले ही डाउनलोड हो चुका है",
"Source": "स्रोत",
"Word definitions and fast reading mode cannot be enabled at the same time": "शब्द परिभाषाएँ और तेज़ पठन मोड एक साथ सक्षम नहीं किए जा सकते",
"Reading ruler height": "पठन रूलर की ऊँचाई",
"FAQ": "सामान्य प्रश्न",
"Auto scan and import books when starting the app or when clicking Scan": "ऐप शुरू करने या स्कैन पर क्लिक करने पर पुस्तकों को स्वतः स्कैन और आयात करें",
"Please enter book name": "कृपया पुस्तक का नाम दर्ज करें",
"Waiting for download...": "डाउनलोड की प्रतीक्षा हो रही है...",
"Pin to right": "दाईं ओर पिन करें",
"Unpin": "अनपिन करें",
"Resize": "आकार बदलें",
"Limited free": "सीमित समय नि:शुल्क",
"7-day free trial upon registration, then billed $4.99 per Year": "पंजीकरण पर 7 दिन का नि:शुल्क परीक्षण, फिर प्रति वर्ष $4.99 का शुल्क",
"Yearly": "वार्षिक",
"Year": "वर्ष",
"Limited offer": "सीमित ऑफ़र",
"$4.99": "$4.99",
"Title recognized successfully": "शीर्षक सफलतापूर्वक पहचाना गया",
"Failed to recognize title": "शीर्षक पहचानने में विफल",
"Show total page number (Experimental)": "कुल पृष्ठ संख्या दिखाएँ (प्रयोगात्मक)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Koodo Reader का यह संस्करण बहुत पुराना है। कृपया सेटिंग्स - बारे में - अपडेट की जांच करें पर जाकर Koodo Reader को नवीनतम संस्करण में अपडेट करें और पुनः प्रयास करें।",
"Background opacity": "पृष्ठभूमि अपारदर्शिता"
}
+55 -5
View File
@@ -837,6 +837,7 @@
"Bilingual translation": "Kétnyelvű fordítás",
"Use AI to analyze books, with different characters reading aloud in different voices": "AI használata a könyvek elemzésére, a különböző szereplők különböző hangokkal olvasnak fel",
"Voice type": "Hang típusa",
"Please reselect voices for all roles": "Válassza újra az összes szerep hangját",
"System voice": "Rendszerhang",
"Purchase the code": "Kód vásárlása",
"Please upgrade to Pro to use this feature": "Kérjük, frissítsen Pro verzióra a funkció használatához",
@@ -1142,8 +1143,6 @@
"None": "Nincs",
"Slide": "Csúsztatás",
"Flip": "Lapozás",
"Custom voice plugins are not supported": "Az egyéni hangbeépülő modulok nem támogatottak",
"Custom voice plugins have been disabled": "Az egyéni hangbeépülő modulok le vannak tiltva",
"Paste voice list JSON": "Hanglista beillesztése JSON",
"Invalid voice list JSON": "Adjon meg egy nem üres JSON tömböt, amely érvényes hangkonfigurációkat tartalmaz",
"Failed to load more": "Nem sikerült többet betölteni",
@@ -1288,7 +1287,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Ha kilép a Pro-ból, azonnal elveszíti a következő tagsági előnyöket",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "A jövőben további, a tagok számára kizárólagos funkciókat vezetünk be, beleértve az olvasási statisztikákat, valamint a jegyzetek, kiemelések, olvasási folyamat és szókincslisták automatikus szinkronizálását olyan platformokon, mint a Notion, Obsidian, Logseq, Anki stb.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Platformok közötti adatszinkronizálás (felhőmeghajtók, WebDAV, Docker, objektumtárolás)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Könyvek importálása felhőmeghajtókról (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Könyvek importálása felhőmeghajtókról (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Hivatalos fordítás több mint 90 nyelven",
"Official dictionary with definitions, examples & pronunciation": "Hivatalos szótár definíciókkal, példákkal és kiejtéssel",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI olvasási segédletek (fejezetösszefoglalók, vázlat, többszereplős elbeszélés)",
@@ -1319,5 +1318,56 @@
"Enter your Notion personal access token": "Adja meg a Notion személyes hozzáférési tokenjét",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Kérjük, állítsa az alapértelmezett szinkronizálási beállítást helyi értékre a beállításokban, vagy frissítsen Pro-ra, hogy több felhőtárhellyel szinkronizálhasson",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Kattintson a Koodo Reader bővítmény ikonjára a böngésző jobb felső sarkában, engedélyezze a kérést ehhez a végponthoz, és próbálja újra",
"How to sync library across devices": "A könyvtár szinkronizálása az eszközök között"
}
"How to sync library across devices": "A könyvtár szinkronizálása az eszközök között",
"Enable reading ruler": "Olvasóvonalzó engedélyezése",
"Reading ruler height (lines)": "Olvasóvonalzó magassága (sor)",
"Reading ruler background opacity": "Olvasóvonalzó hátterének átlátszatlansága",
"Enable speed reading": "Gyorsolvasás engedélyezése",
"Reading speed (WPM)": "Olvasási sebesség (WPM)",
"ISBN": "ISBN",
"Rating": "Értékelés",
"Rating count": "Értékelések száma",
"Publish date": "Kiadás dátuma",
"Categories": "Kategóriák",
"Member login": "Tagsági bejelentkezés",
"Register / Login": "Regisztráció / Bejelentkezés",
"Start 7-day free trial": "7 napos ingyenes próba indítása",
"Scan for new books": "Új könyvek beolvasása",
"Recognize book title and author with AI on import": "Könyvcím és szerző felismerése AI segítségével importáláskor",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Könyvek importálásakor, ha a könyv metaadataiból nem nyerhető ki a könyv címe, az AI segítségével ismerjük fel a könyv címét és szerzőjét",
"No image found in archive": "Nem található kép az archívumban",
"Extract cover failed": "A borító kinyerése sikertelen",
"Custom plugin security warning": "⚠️ <b>Súlyos biztonsági figyelmeztetés</b><br><br>Az egyéni bővítmények teljes hozzáféréssel és irányítással rendelkeznek a számítógépe felett, különösen az egyéni TTS-bővítmények, amelyek tetszőleges kódot futtathatnak.<br>Ez azt jelenti, hogy:<br>• Olvashatják, módosíthatják vagy törölhetik a fájljait<br>• Ellophatják a fiókokat, jelszavakat és a böngésző adatait<br>• Kártevőket telepíthetnek<br>• Távolról irányíthatják az eszközét<br><br>Csak akkor adjon hozzá bővítményt, ha biztos benne, hogy teljesen megbízik benne, és gondosan átnézte a teljes kódját.<br>Soha ne adjon hozzá bővítményeket ismeretlen webhelyekről, ismeretlen forrásokból vagy nem hivatalos csatornákról.",
"Enable paragraph mode": "Bekezdésmód engedélyezése",
"Import notes, highlights and dictionary history": "Jegyzetek, kiemelések és szótár-előzmények importálása",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Válassza ki a korábban exportált CSV- vagy JSON-fájlokat, hogy visszaimportálja a jegyzeteket, kiemeléseket és szótár-előzményeket a könyvtárba",
"Invalid data": "Érvénytelen adatok",
"The book {{name}} is not found in the library, please import the original book before importing": "A(z) {{name}} könyv nem található a könyvtárban, az importálás előtt importálja az eredeti könyvet",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} rekord importálva, {{skipped}} meglévő rekord kihagyva",
"Download featured backgrounds": "Kiemelt háttérképek letöltése",
"Official background": "Hivatalos háttérkép",
"Recognize title with AI": "Cím felismerése AI segítségével",
"Download open dictionaries": "Nyílt szótárak letöltése",
"Dictionary already downloaded": "A szótár már le van töltve",
"Source": "Forrás",
"Word definitions and fast reading mode cannot be enabled at the same time": "A szómeghatározások és a gyorsolvasás nem engedélyezhető egyszerre",
"Reading ruler height": "Olvasóvonalzó magassága (sor)",
"FAQ": "GYIK",
"Auto scan and import books when starting the app or when clicking Scan": "Könyvek automatikus beolvasása és importálása az alkalmazás indításakor vagy a Beolvasás gombra kattintva",
"Please enter book name": "Adja meg a könyv nevét",
"Waiting for download...": "Várakozás a letöltésre...",
"Pin to right": "Rögzítés jobbra",
"Unpin": "Rögzítés feloldása",
"Resize": "Átméretezés",
"Limited free": "Korlátozottan ingyenes",
"7-day free trial upon registration, then billed $4.99 per Year": "7 napos ingyenes próba regisztrációkor, utána évi $4.99 számlázás",
"Yearly": "Évente",
"Year": "Év",
"Limited offer": "Korlátozott ajánlat",
"$4.99": "$4.99",
"Title recognized successfully": "A cím felismerése sikeres",
"Failed to recognize title": "A cím felismerése sikertelen",
"Show total page number (Experimental)": "Oldalak teljes számának megjelenítése (kísérleti)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "A Koodo Reader ezen verziója túl régi. Lépjen a Beállítások - Névjegy - Frissítés keresése menüpontra, frissítse a Koodo Readert a legújabb verzióra, majd próbálja újra.",
"Background opacity": "Háttér átlátszatlansága"
}
+54 -4
View File
@@ -840,6 +840,7 @@
"Bilingual translation": "Երկլեզու թարգմանություն",
"Use AI to analyze books, with different characters reading aloud in different voices": "Օգտագործել AI-ն գրքերը վերլուծելու համար, տարբեր կերպարներ ընթերցում են տարբեր ձայներով",
"Voice type": "Ձայնի տեսակ",
"Please reselect voices for all roles": "Խնդրում ենք նորից ընտրել ձայները բոլոր դերերի համար",
"System voice": "Համակարգային ձայն",
"Purchase the code": "Գնել կոդը",
"Please upgrade to Pro to use this feature": "Խնդրում ենք թարմացնել Pro տարբերակին՝ այս գործառույթն օգտագործելու համար",
@@ -1145,8 +1146,6 @@
"None": "Ոչինչ",
"Slide": "Սլայդ",
"Flip": "Շրջել",
"Custom voice plugins are not supported": "Անհատական ձայնային հավելումները չեն աջակցվում",
"Custom voice plugins have been disabled": "Անհատական ձայնային հավելումներն անջատվել են",
"Paste voice list JSON": "Տեղադրել ձայների ցուցակի JSON-ը",
"Invalid voice list JSON": "Մուտքագրեք ոչ դատարկ JSON զանգված՝ վավեր ձայնային կոնֆիգուրացիաներով",
"Failed to load more": "Չհաջողվեց բեռնել ավելին",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro ռեժիմից դուրս գալուց հետո այլևս չեք կարողանա օգտագործել համաժամեցումը և այլ պրեմիում հնարավորություններ",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Ապագայում մենք կներկայացնենք անդամների բացառիկ ավելի շատ հնարավորություններ, ներառյալ ընթերցման վիճակագրությունը և ձեր գրառումների, ընդգծումների, ընթերցման առաջընթացի և բառապաշարի ցուցակների ավտոմատ համաժամեցումը այնպիսի հարթակների հետ, ինչպիսիք են Notion-ը, Obsidian-ը, Logseq-ը, Anki-ն և այլն:",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Միջհարթակային տվյալների համաժամեցում (ամպային սկավառակներ, WebDAV, Docker, օբյեկտային պահեստ)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Ներմուծել գրքեր ամպային սկավառակներից (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Ներմուծել գրքեր ամպային սկավառակներից (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Պաշտոնական թարգմանություն 90+ լեզուներով",
"Official dictionary with definitions, examples & pronunciation": "Պաշտոնական բառարան (սահմանումներ, օրինակներ և արտասանություն)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI ընթերցման օժանդակ գործիքներ (գլուխների ամփոփումներ, ուրվագիծ, բազմադեր ասմունք)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Մուտքագրեք ձեր Notion անձնական մուտքի թոկենը",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Խնդրում ենք կարգավորումներում լռելյայն համաժամեցման տարբերակը դնել «տեղական», կամ թարմացնել Pro-ի՝ ավելի շատ ամպային պահեստների հետ համաժամեցելու համար",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Խնդրում ենք կտտացնել Koodo Reader ընդլայնման պատկերակին բրաուզերի վերևի աջ անկյունում, թույլատրել դեպի այս endpoint ուղարկվող հարցումը և նորից փորձել",
"How to sync library across devices": "Ինչպես համաժամեցնել գրադարանը սարքերի միջև"
"How to sync library across devices": "Ինչպես համաժամեցնել գրադարանը սարքերի միջև",
"Enable reading ruler": "Միացնել ընթերցման քանոնը",
"Reading ruler height (lines)": "Ընթերցման քանոնի բարձրությունը (տող)",
"Reading ruler background opacity": "Ընթերցման քանոնի ֆոնի անթափանցիկությունը",
"Enable speed reading": "Միացնել արագ ընթերցումը",
"Reading speed (WPM)": "Ընթերցման արագություն (WPM)",
"ISBN": "ISBN",
"Rating": "Վարկանիշ",
"Rating count": "Վարկանիշների քանակը",
"Publish date": "Հրատարակման ամսաթիվ",
"Categories": "Կատեգորիաներ",
"Member login": "Անդամի մուտք",
"Register / Login": "Գրանցում / Մուտք",
"Start 7-day free trial": "Սկսել 7-օրյա անվճար փորձաշրջանը",
"Scan for new books": "Սկանավորել նոր գրքեր",
"Recognize book title and author with AI on import": "Ներմուծելիս AI-ի միջոցով ճանաչել գրքի վերնագիրն ու հեղինակին",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Գրքերը ներմուծելիս, եթե գրքի մետատվյալներից վերնագիր չի ստացվում, վերնագիրն ու հեղինակին ճանաչելու համար կօգտագործվի AI",
"No image found in archive": "Արխիվում պատկեր չի գտնվել",
"Extract cover failed": "Չհաջողվեց դուրս բերել շապիկը",
"Custom plugin security warning": "⚠️ <b>Լուրջ անվտանգության նախազգուշացում</b><br><br>Հատուկ հավելումները լիարժեք հասանելիություն և վերահսկողություն ունեն ձեր համակարգչի նկատմամբ, հատկապես հատուկ TTS հավելումները, որոնք կարող են կատարել կամայական կոդ։<br>Սա նշանակում է, որ դրանք կարող են՝<br>• Կարդալ, փոփոխել կամ ջնջել ձեր ֆայլերը<br>• Գողանալ հաշիվներ, գաղտնաբառեր և դիտարկչի տվյալներ<br>• Տեղադրել վնասակար ծրագրեր<br>• Հեռակա կառավարել ձեր սարքը<br><br>Հավելում ավելացրեք միայն այն բանից հետո, երբ համոզված եք, որ լիովին վստահում եք դրան և ուշադիր ստուգել եք դրա ամբողջ կոդը։<br>Երբեք հավելումներ մի ավելացրեք անհայտ կայքերից, անհայտ աղբյուրներից կամ ոչ պաշտոնական ուղիներից։",
"Enable paragraph mode": "Միացնել պարբերության ռեժիմը",
"Import notes, highlights and dictionary history": "Ներմուծել նշումները, ընդգծումները և բառարանային պատմությունը",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Ընտրեք նախկինում արտահանված CSV կամ JSON ֆայլերը՝ նշումները, ընդգծումները և բառարանային պատմությունը գրադարան վերադարձնելու համար",
"Invalid data": "Անվավեր տվյալներ",
"The book {{name}} is not found in the library, please import the original book before importing": "«{{name}}» գիրքը չի գտնվել գրադարանում։ Ներմուծումը շարունակելուց առաջ ներմուծեք բնօրինակ գիրքը",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Ներմուծվեց {{imported}} գրառում, բաց թողնվեց {{skipped}} գոյություն ունեցող գրառում",
"Download featured backgrounds": "Ներբեռնել ընտրված ֆոները",
"Official background": "Պաշտոնական ֆոն",
"Recognize title with AI": "Ճանաչել վերնագիրը AI-ի միջոցով",
"Download open dictionaries": "Ներբեռնել բաց բառարաններ",
"Dictionary already downloaded": "Բառարանն արդեն ներբեռնված է",
"Source": "Աղբյուր",
"Word definitions and fast reading mode cannot be enabled at the same time": "Բառերի սահմանումները և արագ ընթերցման ռեժիմը չեն կարող միացվել միաժամանակ",
"Reading ruler height": "Ընթերցման քանոնի բարձրությունը",
"FAQ": "Հաճախ տրվող հարցեր",
"Auto scan and import books when starting the app or when clicking Scan": "Ավտոմատ սկանավորել և ներմուծել գրքերը հավելվածը գործարկելիս կամ «Սկանավորել» սեղմելիս",
"Please enter book name": "Մուտքագրեք գրքի անվանումը",
"Waiting for download...": "Սպասում ենք ներբեռնմանը...",
"Pin to right": "Ամրացնել աջ կողմում",
"Unpin": "Ապամրացնել",
"Resize": "Փոխել չափը",
"Limited free": "Սահմանափակ ժամանակով անվճար",
"7-day free trial upon registration, then billed $4.99 per Year": "Գրանցվելիս՝ 7-օրյա անվճար փորձաշրջան, այնուհետև՝ $4.99 տարեկան",
"Yearly": "Տարեկան",
"Year": "Տարի",
"Limited offer": "Սահմանափակ առաջարկ",
"$4.99": "$4.99",
"Title recognized successfully": "Վերնագիրը հաջողությամբ ճանաչվեց",
"Failed to recognize title": "Չհաջողվեց ճանաչել վերնագիրը",
"Show total page number (Experimental)": "Ցուցադրել էջերի ընդհանուր քանակը (փորձնական)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Koodo Reader-ի այս տարբերակը չափազանց հին է։ Անցեք Կարգավորումներ - Ծրագրի մասին - Ստուգել թարմացումները, թարմացրեք Koodo Reader-ը մինչև վերջին տարբերակը և կրկին փորձեք։",
"Background opacity": "Ֆոնի անթափանցիկությունը"
}
+56 -6
View File
@@ -813,7 +813,7 @@
"No AI models added yet": "Belum ada model AI yang ditambahkan",
"Add new model": "Tambah model baru",
"Text orientation": "Orientasi teks",
"Horizontal": "Horizontal",
"Horizontal": "Mendatar",
"Vertical": "Vertikal",
"Default font family": "Font family default",
"Delete original file when permanently deleting books": "Hapus file asli saat menghapus buku secara permanen",
@@ -854,6 +854,7 @@
"Bilingual translation": "Terjemahan bilingual",
"Use AI to analyze books, with different characters reading aloud in different voices": "Gunakan AI untuk menganalisis buku, dengan karakter berbeda membaca dengan suara berbeda",
"Voice type": "Jenis suara",
"Please reselect voices for all roles": "Silakan pilih ulang suara untuk semua peran",
"System voice": "Suara sistem",
"Purchase the code": "Beli kode",
"Please upgrade to Pro to use this feature": "Silakan upgrade ke Pro untuk menggunakan fitur ini",
@@ -1159,8 +1160,6 @@
"None": "Tidak ada",
"Slide": "Geser",
"Flip": "Balik",
"Custom voice plugins are not supported": "Plugin suara kustom tidak didukung",
"Custom voice plugins have been disabled": "Plugin suara kustom telah dinonaktifkan",
"Paste voice list JSON": "Tempel JSON daftar suara",
"Invalid voice list JSON": "Masukkan larik JSON tidak kosong yang berisi konfigurasi suara yang valid",
"Failed to load more": "Gagal memuat lebih banyak",
@@ -1226,7 +1225,7 @@
"Search bookmarks...": "Cari penanda...",
"Search notes...": "Cari catatan...",
"Search highlights...": "Cari sorotan...",
"Total": "Total",
"Total": "Jumlah",
"No results found": "Tidak ada hasil ditemukan",
"Auto sync new words to MaiMemo": "Sinkronkan kata baru otomatis ke MaiMemo",
"When you look up a word, it will be automatically synced to your MaiMemo notepad": "Saat Anda mencari kata, kata tersebut akan otomatis disinkronkan ke buku catatan MaiMemo Anda",
@@ -1305,7 +1304,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Setelah keluar dari Pro, Anda tidak lagi dapat menggunakan sinkronisasi dan fitur premium lainnya",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Di masa mendatang, kami akan memperkenalkan lebih banyak fitur eksklusif anggota, termasuk statistik membaca dan sinkronisasi otomatis catatan, penyorotan, progres membaca, dan daftar kosakata Anda ke platform seperti Notion, Obsidian, Logseq, Anki, dan lainnya.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sinkronisasi data lintas platform (cloud drive, WebDAV, Docker, penyimpanan objek)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Impor buku dari cloud drive (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Impor buku dari cloud drive (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Terjemahan resmi dalam 90+ bahasa",
"Official dictionary with definitions, examples & pronunciation": "Kamus resmi (definisi, contoh, dan pelafalan)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Bantuan baca AI (ringkasan bab, kerangka, narasi multi-peran)",
@@ -1336,5 +1335,56 @@
"Enter your Notion personal access token": "Masukkan token akses pribadi Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Silakan atur opsi sinkronisasi default ke lokal di pengaturan, atau tingkatkan ke Pro untuk menyinkronkan dengan lebih banyak penyimpanan cloud",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Silakan klik ikon ekstensi Koodo Reader di pojok kanan atas browser, beri izin permintaan ke endpoint ini, lalu coba lagi",
"How to sync library across devices": "Cara menyinkronkan pustaka di seluruh perangkat"
"How to sync library across devices": "Cara menyinkronkan pustaka di seluruh perangkat",
"Enable reading ruler": "Aktifkan penggaris baca",
"Reading ruler height (lines)": "Tinggi penggaris baca (baris)",
"Reading ruler background opacity": "Opasitas latar belakang penggaris baca",
"Enable speed reading": "Aktifkan membaca cepat",
"Reading speed (WPM)": "Kecepatan membaca (WPM)",
"ISBN": "ISBN",
"Rating": "Penilaian",
"Rating count": "Jumlah penilaian",
"Publish date": "Tanggal terbit",
"Categories": "Kategori",
"Member login": "Login anggota",
"Register / Login": "Daftar / Masuk",
"Start 7-day free trial": "Mulai uji coba gratis 7 hari",
"Scan for new books": "Pindai buku baru",
"Recognize book title and author with AI on import": "Kenali judul dan penulis buku dengan AI saat mengimpor",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Saat mengimpor buku, jika tidak ada judul buku yang dapat diurai dari metadata buku, AI akan digunakan untuk mengenali judul dan penulis buku",
"No image found in archive": "Tidak ada gambar yang ditemukan di arsip",
"Extract cover failed": "Gagal mengekstrak sampul",
"Custom plugin security warning": "⚠️ <b>Peringatan Keamanan Serius</b><br><br>Plugin kustom memiliki akses dan kendali penuh atas komputer Anda, terutama plugin TTS kustom, yang dapat menjalankan kode arbitrer.<br>Artinya, plugin tersebut dapat:<br>• Membaca, mengubah, atau menghapus file Anda<br>• Mencuri akun, kata sandi, dan data browser<br>• Memasang malware<br>• Mengendalikan perangkat Anda dari jarak jauh<br><br>Tambahkan plugin hanya setelah Anda yakin sepenuhnya mempercayainya dan telah meninjau seluruh kodenya dengan saksama.<br>Jangan pernah menambahkan plugin dari situs web yang tidak dikenal, sumber yang tidak dikenal, atau saluran tidak resmi.",
"Enable paragraph mode": "Aktifkan mode paragraf",
"Import notes, highlights and dictionary history": "Impor catatan, sorotan, dan riwayat kamus",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Pilih file CSV atau JSON yang diekspor sebelumnya untuk mengimpor kembali catatan, sorotan, dan riwayat kamus ke perpustakaan",
"Invalid data": "Data tidak valid",
"The book {{name}} is not found in the library, please import the original book before importing": "Buku {{name}} tidak ditemukan di perpustakaan, silakan impor buku aslinya terlebih dahulu sebelum mengimpor",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Berhasil mengimpor {{imported}} data, melewati {{skipped}} data yang sudah ada",
"Download featured backgrounds": "Unduh latar unggulan",
"Official background": "Latar resmi",
"Recognize title with AI": "Kenali judul dengan AI",
"Download open dictionaries": "Unduh kamus terbuka",
"Dictionary already downloaded": "Kamus sudah diunduh",
"Source": "Sumber",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definisi kata dan mode membaca cepat tidak dapat diaktifkan secara bersamaan",
"Reading ruler height": "Tinggi penggaris baca (baris)",
"FAQ": "Tanya Jawab",
"Auto scan and import books when starting the app or when clicking Scan": "Pindai dan impor buku secara otomatis saat memulai aplikasi atau saat mengklik Pindai",
"Please enter book name": "Silakan masukkan nama buku",
"Waiting for download...": "Menunggu unduhan...",
"Pin to right": "Sematkan ke kanan",
"Unpin": "Lepas sematan",
"Resize": "Ubah ukuran",
"Limited free": "Gratis terbatas",
"7-day free trial upon registration, then billed $4.99 per Year": "Uji coba gratis 7 hari setelah pendaftaran, lalu ditagih $4.99 per tahun",
"Yearly": "Tahunan",
"Year": "Tahun",
"Limited offer": "Penawaran terbatas",
"$4.99": "$4.99",
"Title recognized successfully": "Judul berhasil dikenali",
"Failed to recognize title": "Gagal mengenali judul",
"Show total page number (Experimental)": "Tampilkan jumlah total halaman (Eksperimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Versi Koodo Reader ini terlalu lama. Silakan buka Pengaturan - Tentang - Periksa pembaruan untuk memperbarui Koodo Reader ke versi terbaru, lalu coba lagi.",
"Background opacity": "Opasitas latar belakang"
}
+60 -10
View File
@@ -559,7 +559,7 @@
"Redeem successful": "Redemtion successosimen",
"Redeem failed, error code": "Redemtion ne successat, cod de errore",
"Verifying...": "Verificant...",
"Optional": "Optional",
"Optional": "Facultativ",
"Required": "Requisit",
"Supported email providers": "Supportat e-post providers",
"Log in": "In-logar",
@@ -572,7 +572,7 @@
"The Koodo Reader Docker version does not support the data source feature by default. You need to modify the configuration parameters during deployment to manually enable it. Also due to browser's security restrictions, the Docker service must be accessed via HTTPS protocol when you're visiting Koodo Reader via HTTPS protocol.": "Li Docker version de Koodo Reader ne supporta li data-fonte function per defaulte. Vu deve modificar li configuration parametres durant deployment por activar it manualmen. Pro li securitá del navigator, li Docker servicie deve esser accessat per HTTPS quande vu usa Koodo Reader per HTTPS.",
"Select server region": "Selecter server region",
"Server region": "Servitor region",
"Global": "Global",
"Global": "Mundial",
"China": "China",
"Some login options and data sources are not available in your selected server region": "Quelc login optiones e data-fontes ne es disponibil in vor selectet servitor region",
"Grant access to local folder to save your data and reduce the risk of data loss": "Donar access al local dossier por salvar vor data e reducer li risca de data perdita",
@@ -841,6 +841,7 @@
"Bilingual translation": "Bilingue translation",
"Use AI to analyze books, with different characters reading aloud in different voices": "User AI por analisar libres, con diferent personages leet alta con diferent voces",
"Voice type": "Tipe de voce",
"Please reselect voices for all roles": "Ple reselecter li voces por omni roles",
"System voice": "Sistem voce",
"Purchase the code": "Compra li code",
"Please upgrade to Pro to use this feature": "Ples upgrade a Pro por usar ti function",
@@ -863,7 +864,7 @@
"Sky": "Ciel",
"Slate": "Ardesie",
"Show page border": "Monstra págine borde",
"Custom": "Custom",
"Custom": "Personalisat",
"Please upgrade to Pro to unlock more daily free quota or wait until the quota resets. You can also use other TTS voices instead.": "Ples upgrade a Pro por desblocar plu quotidian gratuit quota o atender til li quota restitue se. Tu posse usar altri voces TTS in vice.",
"Minimize to tray on close": "Minimisar al platte al clude",
"When closing the window, the app will minimize to the system tray instead of quitting": "Ye cluder li fenestre, li app va minimisar al sistema platte in vice de exir",
@@ -897,7 +898,7 @@
"Current version": "Actual version",
"About": "Pri",
"AI service": "AI servicie",
"Provider": "Provider",
"Provider": "Fornitor",
"Enter your API Key": "Intra tui API Key",
"Loading...": "Cargante...",
"Fetch models": "Recuperar models",
@@ -1146,8 +1147,6 @@
"None": "Null",
"Slide": "Glissar",
"Flip": "Reverter",
"Custom voice plugins are not supported": "Plugines de voces personal ne es supportat",
"Custom voice plugins have been disabled": "Plugines de voces personal ha esset desactivat",
"Paste voice list JSON": "Incolar li liste JSON de voces",
"Invalid voice list JSON": "Insi inserter un liste JSON non-vacui con configurationes de voces valid",
"Failed to load more": "Ne successat cargar plu",
@@ -1234,7 +1233,7 @@
"Match type": "Tip de correspondentie",
"Regular expression": "Expression regular",
"Plain text": "Textu simplic",
"Scope": "Scope",
"Scope": "Portata",
"All books": "Omni libres",
"Specific book": "Libre specific",
"Select book": "Selecter un libre",
@@ -1292,7 +1291,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Un vez surtit del version Pro, vu ne va plu posser usar sincronisation e altri premium functiones",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "In li future, noi va introducter plu functiones exclusiv por membres, includente statisticas de lectura e automatic sincronisation de vor notes, emfases, lectura-progresso e vocabularies a platformes quam Notion, Obsidian, Logseq, Anki e plu.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sincronisation de data inter-platformes (nube-drives, WebDAV, Docker, object-stocage)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importar libres de nube-drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importar libres de nube-drives (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Traduction oficial in plu quam 90 lingues",
"Official dictionary with definitions, examples & pronunciation": "Oficial dictionarium con definitiones, exemplos e pronunciation",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI lectura-auxiliaries (summaries de capitules, contu, narration multi-rol)",
@@ -1323,5 +1322,56 @@
"Enter your Notion personal access token": "Inserter vor personal access-jeton de Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Ples setar li defaulte sync-option a local in li parametres, o actualisar a Pro por sincronisar con plu nube-stocage",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Ples cliccar li extension-icone de Koodo Reader in li superior dextri angul del navigator, autorisar li requeste a ti endpoint, e provar denov",
"How to sync library across devices": "Quam sincronisar li biblioteca inter aparates"
}
"How to sync library across devices": "Quam sincronisar li biblioteca inter aparates",
"Enable reading ruler": "Activar li regula de lectura",
"Reading ruler height (lines)": "Altore del regula de lectura (lineas)",
"Reading ruler background opacity": "Opacitá del funde del regula de lectura",
"Enable speed reading": "Activar rapid lectura",
"Reading speed (WPM)": "Velocitá de lectura (WPM)",
"ISBN": "ISBN",
"Rating": "Evaluation",
"Rating count": "Númere de evaluationes",
"Publish date": "Date de publication",
"Categories": "Categorias",
"Member login": "Login de membre",
"Register / Login": "Registrar / Login",
"Start 7-day free trial": "Comenzar li triale gratuit de 7 dies",
"Scan for new books": "Scanear por nov libres",
"Recognize book title and author with AI on import": "Reconosser li titul e autor del libre con IA al importation",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Quande importar libres, si null titul de libre es extraet del metadata del libre, IA va esser usat por reconosser li titul e autor del libre",
"No image found in archive": "Null image trovat in li archive",
"Extract cover failed": "Extraction del covriment ne successat",
"Custom plugin security warning": "⚠️ <b>Severi avise de securitá</b><br><br>Personalisat plugines have plen accesse e control sur vor computator, specialmen personalisat plugines de TTS, quel posse executar code arbitrari.<br>To significa que ili posse:<br>• Leer, modificar o deleter vor files<br>• Furtar contos, contrasignes e data de navigator<br>• Installar malwares<br>• Controlar vor aparate de lontan<br><br>Adjunter un plugin solmen pos que vu es cert que vu fida totalmen it e ha revidet atentivmen omni su code.<br>Jamais adjunter plugines de sitos ínconosset, fontes ínconosset o canales ínoficial.",
"Enable paragraph mode": "Activar li mode de paragraf",
"Import notes, highlights and dictionary history": "Importar notas, emfases e historie de dictionarium",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Selecter files CSV o JSON exportat antey por importar notas, emfases e historie de dictionarium retro al biblioteca",
"Invalid data": "Ínvalid data",
"The book {{name}} is not found in the library, please import the original book before importing": "Li libre {{name}} ne es trovat in li biblioteca, ples importar li original libre ante importar",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} registros importat, {{skipped}} registros existent omisset",
"Download featured backgrounds": "Descargar fundes recomandat",
"Official background": "Oficial funde",
"Recognize title with AI": "Reconosser li titul con IA",
"Download open dictionaries": "Descargar apert dictionariums",
"Dictionary already downloaded": "Dictionarium ja descargat",
"Source": "Fonte",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definitiones de parol e li mode de rapid lectura ne posse esser activat samtempan",
"Reading ruler height": "Altore del regula de lectura",
"FAQ": "Questiones frequent",
"Auto scan and import books when starting the app or when clicking Scan": "Auto-scanear e importar libres quande comensar li app o quande cliccar sur Scan",
"Please enter book name": "Ples inserter li nómine del libre",
"Waiting for download...": "Atendente li descargation...",
"Pin to right": "Fixar a dextri",
"Unpin": "Defixar",
"Resize": "Redimensionar",
"Limited free": "Gratuit limitat",
"7-day free trial upon registration, then billed $4.99 per Year": "Triale gratuit de 7 dies al registration, pos facturat $4.99 per annu",
"Yearly": "Anual",
"Year": "Annu",
"Limited offer": "Oferta limitat",
"$4.99": "$4.99",
"Title recognized successfully": "Titul reconosset successosimen",
"Failed to recognize title": "Reconossement del titul ne successat",
"Show total page number (Experimental)": "Monstrar li total númere de págines (Experimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Ti version de Koodo Reader es tro old. Ples ear a Configuration - Pri - Verificar por actualisation por actualisar Koodo Reader al ultim version e provar denov.",
"Background opacity": "Opacitá del funde"
}
+56 -6
View File
@@ -197,7 +197,7 @@
"Show sidebar": "Mostra barra laterale",
"Sync": "Sincronizza",
"Document": "Documento",
"Feedback": "Feedback",
"Feedback": "Commenti",
"GitHub repository": "Repository GitHub",
"Speak the text": "Pronuncia il testo",
"Search on the Internet": "Cerca su internet",
@@ -482,7 +482,7 @@
"Please add data source in the setting": "Aggiungi la fonte dati nelle impostazioni",
"Don't automatically pre-cache books for mobile version after import": "Non pre-cache automaticamente i libri per la versione mobile dopo l'importazione",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "All'importazione, i libri verranno pre-cache automaticamente, consentendo un accesso senza interruzioni nella versione mobile. Tuttavia, questo processo può consumare spazio di archiviazione aggiuntivo e allungare i tempi di importazione. Puoi comunque farlo manualmente",
"Test": "Test",
"Test": "Prova",
"Get error log": "Ottieni log degli errori",
"Account type": "Tipo di account",
"Trial user": "Utente di prova",
@@ -840,6 +840,7 @@
"Bilingual translation": "Traduzione bilingue",
"Use AI to analyze books, with different characters reading aloud in different voices": "Usa l'IA per analizzare i libri, con diversi personaggi che leggono ad alta voce con voci diverse",
"Voice type": "Tipo di voce",
"Please reselect voices for all roles": "Seleziona di nuovo le voci per tutti i ruoli",
"System voice": "Voce di sistema",
"Purchase the code": "Acquista il codice",
"Please upgrade to Pro to use this feature": "Passa a Pro per usare questa funzionalità",
@@ -1145,8 +1146,6 @@
"None": "Nessuna",
"Slide": "Scorrimento",
"Flip": "Sfoglia",
"Custom voice plugins are not supported": "I plugin vocali personalizzati non sono supportati",
"Custom voice plugins have been disabled": "I plugin vocali personalizzati sono stati disabilitati",
"Paste voice list JSON": "Incolla il JSON dell'elenco delle voci",
"Invalid voice list JSON": "Inserisci un array JSON non vuoto contenente configurazioni vocali valide",
"Failed to load more": "Impossibile caricare altri elementi",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Dopo aver abbandonato la versione Pro, non potrai più usare la sincronizzazione e le altre funzioni premium",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "In futuro introdurremo altre funzioni esclusive per i membri, tra cui statistiche di lettura e sincronizzazione automatica di note, evidenziazioni, progressi di lettura ed elenchi di vocaboli con piattaforme come Notion, Obsidian, Logseq, Anki e altre.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sincronizzazione dei dati multipiattaforma (unità cloud, WebDAV, Docker, archiviazione a oggetti)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importa libri da unità cloud (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importa libri da unità cloud (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Traduzione ufficiale in oltre 90 lingue",
"Official dictionary with definitions, examples & pronunciation": "Dizionario ufficiale con definizioni, esempi e pronuncia",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Strumenti di lettura AI (riassunti dei capitoli, scaletta, narrazione multi-ruolo)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Inserisci il tuo token di accesso personale Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Imposta l'opzione di sincronizzazione predefinita su locale nelle impostazioni oppure passa a Pro per sincronizzare con più servizi di archiviazione cloud",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Fai clic sull'icona dell'estensione Koodo Reader nell'angolo in alto a destra del browser, autorizza la richiesta a questo endpoint e riprova",
"How to sync library across devices": "Come sincronizzare la libreria tra dispositivi"
"How to sync library across devices": "Come sincronizzare la libreria tra dispositivi",
"Enable reading ruler": "Attiva il righello di lettura",
"Reading ruler height (lines)": "Altezza del righello di lettura (righe)",
"Reading ruler background opacity": "Opacità dello sfondo del righello di lettura",
"Enable speed reading": "Attiva la lettura rapida",
"Reading speed (WPM)": "Velocità di lettura (WPM)",
"ISBN": "ISBN",
"Rating": "Valutazione",
"Rating count": "Numero di valutazioni",
"Publish date": "Data di pubblicazione",
"Categories": "Categorie",
"Member login": "Accesso membri",
"Register / Login": "Registrati / Accedi",
"Start 7-day free trial": "Inizia la prova gratuita di 7 giorni",
"Scan for new books": "Scansiona nuovi libri",
"Recognize book title and author with AI on import": "Riconosci il titolo e l’autore con l’IA durante l’importazione",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Durante l’importazione, se non viene ricavato alcun titolo dai metadati del libro, l’IA verrà usata per riconoscere il titolo e l’autore",
"No image found in archive": "Nessuna immagine trovata nell’archivio",
"Extract cover failed": "Estrazione della copertina non riuscita",
"Custom plugin security warning": "⚠️ <b>Avviso di sicurezza grave</b><br><br>I plugin personalizzati hanno accesso completo e pieno controllo sul tuo computer, in particolare i plugin TTS personalizzati, che possono eseguire codice arbitrario.<br>Ciò significa che potrebbero:<br>• Leggere, modificare o eliminare i tuoi file<br>• Rubare account, password e dati del browser<br>• Installare malware<br>• Controllare il tuo dispositivo da remoto<br><br>Aggiungi un plugin solo dopo essere certo di fidarti completamente di esso e averne esaminato attentamente tutto il codice.<br>Non aggiungere mai plugin provenienti da siti web sconosciuti, fonti sconosciute o canali non ufficiali.",
"Enable paragraph mode": "Attiva la modalità paragrafo",
"Import notes, highlights and dictionary history": "Importa note, evidenziazioni e cronologia del dizionario",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Seleziona i file CSV o JSON esportati in precedenza per importare note, evidenziazioni e cronologia del dizionario nella libreria",
"Invalid data": "Dati non validi",
"The book {{name}} is not found in the library, please import the original book before importing": "Il libro {{name}} non è presente nella libreria; importa il libro originale prima di procedere",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Importati {{imported}} record, ignorati {{skipped}} record esistenti",
"Download featured backgrounds": "Scarica gli sfondi in evidenza",
"Official background": "Sfondo ufficiale",
"Recognize title with AI": "Riconosci il titolo con l’IA",
"Download open dictionaries": "Scarica dizionari aperti",
"Dictionary already downloaded": "Dizionario già scaricato",
"Source": "Fonte",
"Word definitions and fast reading mode cannot be enabled at the same time": "Le definizioni delle parole e la modalità di lettura rapida non possono essere attivate contemporaneamente",
"Reading ruler height": "Altezza del righello di lettura",
"FAQ": "Domande frequenti",
"Auto scan and import books when starting the app or when clicking Scan": "Scansiona e importa automaticamente i libri all’avvio dell’app o quando si fa clic su Scansiona",
"Please enter book name": "Inserisci il nome del libro",
"Waiting for download...": "In attesa dello scaricamento...",
"Pin to right": "Fissa a destra",
"Unpin": "Rimuovi fissaggio",
"Resize": "Ridimensiona",
"Limited free": "Gratis a tempo limitato",
"7-day free trial upon registration, then billed $4.99 per Year": "Prova gratuita di 7 giorni alla registrazione, poi $4.99 all’anno",
"Yearly": "Annuale",
"Year": "Anno",
"Limited offer": "Offerta limitata",
"$4.99": "$4.99",
"Title recognized successfully": "Titolo riconosciuto correttamente",
"Failed to recognize title": "Riconoscimento del titolo non riuscito",
"Show total page number (Experimental)": "Mostra il numero totale di pagine (sperimentale)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Questa versione di Koodo Reader è troppo vecchia. Vai su Impostazioni - Informazioni - Controlla aggiornamenti per aggiornare Koodo Reader all’ultima versione e riprova.",
"Background opacity": "Opacità dello sfondo"
}
+54 -4
View File
@@ -850,6 +850,7 @@
"Bilingual translation": "バイリンガル対訳",
"Use AI to analyze books, with different characters reading aloud in different voices": "AIを使用して書籍を分析し、異なるキャラクターを異なる声で読み上げる",
"Voice type": "音声タイプ",
"Please reselect voices for all roles": "すべてのロールの音声を再選択してください",
"System voice": "システム音声",
"Purchase the code": "コードを購入",
"Please upgrade to Pro to use this feature": "この機能を使用するにはProにアップグレードしてください",
@@ -1155,8 +1156,6 @@
"None": "なし",
"Slide": "スライド",
"Flip": "フリップ",
"Custom voice plugins are not supported": "カスタム音声プラグインはサポートされていません",
"Custom voice plugins have been disabled": "カスタム音声プラグインは無効化されています",
"Paste voice list JSON": "音声リストの JSON を貼り付け",
"Invalid voice list JSON": "有効な音声設定を含む空でない JSON 配列を入力してください",
"Failed to load more": "追加の読み込みに失敗しました",
@@ -1301,7 +1300,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro から退会すると、同期などのプレミアム機能を使用できなくなります",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "今後、購読者限定の機能をさらに追加する予定です。読書統計や、メモ・ハイライト・読書進捗・単語リストを Notion、Obsidian、Logseq、Anki などのプラットフォームへ自動同期する機能などを含みます。",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "クロスプラットフォームのデータ同期(クラウドドライブ、WebDAV、Docker、オブジェクトストレージ)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "クラウドドライブ(百度网盘、Google Drive、WebDAV、FTP、SMB)から書籍をインポート",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "クラウドドライブ(OneDrive、Google Drive、WebDAV、FTP、SMB)から書籍をインポート",
"Official translation in 90+ languages": "公式翻訳(90以上の言語)",
"Official dictionary with definitions, examples & pronunciation": "公式辞書(定義、例文、発音)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI 読み上げ補助(章の要約、あらすじ、マルチロールナレーション対応)",
@@ -1332,5 +1331,56 @@
"Enter your Notion personal access token": "Notion のパーソナルアクセストークンを入力してください",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "設定でデフォルトの同期先をローカルに設定してください。または Pro にアップグレードするとより多くのクラウドストレージと同期できます",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "ブラウザ右上の Koodo Reader 拡張機能アイコンをクリックしてこのエンドポイントへのリクエストを承認し、もう一度お試しください",
"How to sync library across devices": "デバイス間でライブラリを同期する方法"
"How to sync library across devices": "デバイス間でライブラリを同期する方法",
"Enable reading ruler": "読書定規を有効にする",
"Reading ruler height (lines)": "読書定規の高さ(行)",
"Reading ruler background opacity": "読書定規の背景の不透明度",
"Enable speed reading": "速読モードを有効にする",
"Reading speed (WPM)": "読書速度 (WPM)",
"ISBN": "ISBN",
"Rating": "評価",
"Rating count": "評価数",
"Publish date": "出版日",
"Categories": "カテゴリ",
"Member login": "会員ログイン",
"Register / Login": "登録 / ログイン",
"Start 7-day free trial": "7日間の無料トライアルを開始",
"Scan for new books": "新しい書籍をスキャン",
"Recognize book title and author with AI on import": "インポート時にAIで書名と著者を認識",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "書籍のインポート時、書籍のメタデータから書名を解析できない場合、AIを使用して書名と著者を認識します",
"No image found in archive": "アーカイブに画像が見つかりません",
"Extract cover failed": "表紙の抽出に失敗しました",
"Custom plugin security warning": "⚠️ <b>重大なセキュリティ警告</b><br><br>カスタムプラグインはお使いのコンピューターへの完全なアクセス権と制御権限を持ち、特にカスタムTTSプラグインは任意のコードを実行できます。<br>つまり、以下のことが可能です:<br>• ファイルの読み取り、変更、削除<br>• アカウント、パスワード、ブラウザデータの窃取<br>• マルウェアのインストール<br>• デバイスの遠隔操作<br><br>完全に信頼でき、すべてのコードを慎重に確認したと確信できる場合にのみ、プラグインを追加してください。<br>不明なウェブサイト、不明な提供元、非公式チャンネルのプラグインは絶対に追加しないでください。",
"Enable paragraph mode": "段落モードを有効にする",
"Import notes, highlights and dictionary history": "メモ、ハイライト、辞書履歴をインポート",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "以前にエクスポートしたCSVまたはJSONファイルを選択して、メモ、ハイライト、辞書履歴をライブラリにインポートします",
"Invalid data": "無効なデータ",
"The book {{name}} is not found in the library, please import the original book before importing": "ライブラリに「{{name}}」が見つかりません。先に元の書籍をインポートしてから再試行してください",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} 件のデータをインポートし、既存の {{skipped}} 件をスキップしました",
"Download featured backgrounds": "おすすめの背景をダウンロード",
"Official background": "公式背景",
"Recognize title with AI": "AIで書名を認識",
"Download open dictionaries": "オープン辞書をダウンロード",
"Dictionary already downloaded": "辞書はダウンロード済みです",
"Source": "ソース",
"Word definitions and fast reading mode cannot be enabled at the same time": "単語の意味表示と速読モードは同時に有効にできません",
"Reading ruler height": "読書定規の高さ(行)",
"FAQ": "よくある質問",
"Auto scan and import books when starting the app or when clicking Scan": "アプリの起動時またはスキャンをクリックしたときに、書籍を自動的にスキャンしてインポートします",
"Please enter book name": "書籍名を入力してください",
"Waiting for download...": "ダウンロードを待機中...",
"Pin to right": "右側に固定",
"Unpin": "固定を解除",
"Resize": "サイズ変更",
"Limited free": "期間限定無料",
"7-day free trial upon registration, then billed $4.99 per Year": "登録すると7日間の無料トライアルが始まり、その後は年間 $4.99 が請求されます",
"Yearly": "年額",
"Year": "年",
"Limited offer": "期間限定オファー",
"$4.99": "$4.99",
"Title recognized successfully": "書名を認識しました",
"Failed to recognize title": "書名の認識に失敗しました",
"Show total page number (Experimental)": "総ページ数を表示(実験的機能)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "このバージョンの Koodo Reader は古すぎます。設定 - について - アップデートを確認 から Koodo Reader を最新バージョンに更新して、もう一度お試しください。",
"Background opacity": "背景の不透明度"
}
+54 -4
View File
@@ -839,6 +839,7 @@
"Bilingual translation": "이중 언어 번역",
"Use AI to analyze books, with different characters reading aloud in different voices": "AI를 사용하여 책을 분석하고, 다른 캐릭터가 다른 목소리로 읽어줍니다",
"Voice type": "음성 유형",
"Please reselect voices for all roles": "모든 역할의 음성을 다시 선택해 주세요",
"System voice": "시스템 음성",
"Purchase the code": "코드 구매",
"Please upgrade to Pro to use this feature": "이 기능을 사용하려면 Pro로 업그레이드하세요",
@@ -1144,8 +1145,6 @@
"None": "없음",
"Slide": "슬라이드",
"Flip": "플립",
"Custom voice plugins are not supported": "사용자 지정 음성 플러그인을 지원하지 않습니다",
"Custom voice plugins have been disabled": "사용자 지정 음성 플러그인이 비활성화되었습니다",
"Paste voice list JSON": "음성 목록 JSON 붙여넣기",
"Invalid voice list JSON": "유효한 음성 구성을 포함한 비어 있지 않은 JSON 배열을 입력하세요",
"Failed to load more": "추가 로드에 실패했습니다",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro에서 나가면 동기화 및 기타 프리미엄 기능을 더 이상 사용할 수 없습니다",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "향후 읽기 통계, 메모·하이라이트·읽기 진행률·단어 목록을 Notion, Obsidian, Logseq, Anki 등 플랫폼에 자동 동기화하는 기능 등 더 많은 멤버 전용 기능을 도입할 예정입니다.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "크로스 플랫폼 데이터 동기화(클라우드 드라이브, WebDAV, Docker, 객체 스토리지)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "클라우드 드라이브(바이두 클라우드, Google Drive, WebDAV, FTP, SMB)에서 책 가져오기",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "클라우드 드라이브(OneDrive, Google Drive, WebDAV, FTP, SMB)에서 책 가져오기",
"Official translation in 90+ languages": "공식 번역(90+ 언어)",
"Official dictionary with definitions, examples & pronunciation": "공식 사전(정의, 예문, 발음)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI 읽기 보조(장요약, 개요, 다중 역할 낭독)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Notion 개인 액세스 토큰을 입력하세요",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "설정에서 기본 동기화 대상을 로컬로 설정하거나 Pro로 업그레이드하여 더 많은 클라우드 스토리지와 동기화하세요",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "브라우저 오른쪽 위의 Koodo Reader 확장 프로그램 아이콘을 클릭해 이 엔드포인트에 대한 요청을 승인한 후 다시 시도하세요",
"How to sync library across devices": "기기 간 라이브러리 동기화 방법"
"How to sync library across devices": "기기 간 라이브러리 동기화 방법",
"Enable reading ruler": "읽기 눈금자 사용",
"Reading ruler height (lines)": "읽기 눈금자 높이(줄)",
"Reading ruler background opacity": "읽기 눈금자 배경 불투명도",
"Enable speed reading": "속독 모드 사용",
"Reading speed (WPM)": "읽기 속도(WPM)",
"ISBN": "ISBN",
"Rating": "평점",
"Rating count": "평점 수",
"Publish date": "출간일",
"Categories": "카테고리",
"Member login": "회원 로그인",
"Register / Login": "회원가입 / 로그인",
"Start 7-day free trial": "7일 무료 체험 시작",
"Scan for new books": "새 책 스캔",
"Recognize book title and author with AI on import": "가져올 때 AI로 책 제목과 저자 인식",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "책을 가져올 때 책 메타데이터에서 제목을 분석하지 못하면 AI를 사용하여 책 제목과 저자를 인식합니다",
"No image found in archive": "압축 파일에서 이미지를 찾을 수 없습니다",
"Extract cover failed": "표지 추출 실패",
"Custom plugin security warning": "⚠️ <b>심각한 보안 경고</b><br><br>사용자 정의 플러그인은 컴퓨터에 대한 완전한 접근 권한과 제어 권한을 가지며, 특히 사용자 정의 TTS 플러그인은 임의의 코드를 실행할 수 있습니다.<br>즉, 다음과 같은 일이 가능합니다:<br>• 파일 읽기, 수정 또는 삭제<br>• 계정, 비밀번호, 브라우저 데이터 탈취<br>• 악성 프로그램 설치<br>• 기기 원격 제어<br><br>플러그인을 완전히 신뢰하고 모든 코드를 주의 깊게 검토했다고 확신할 때만 추가하세요.<br>알 수 없는 웹사이트, 출처를 알 수 없는 곳, 비공식 채널의 플러그인은 절대 추가하지 마세요.",
"Enable paragraph mode": "단락 모드 사용",
"Import notes, highlights and dictionary history": "노트, 하이라이트, 사전 기록 가져오기",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "이전에 내보낸 CSV 또는 JSON 파일을 선택하여 노트, 하이라이트, 사전 기록을 라이브러리로 다시 가져옵니다",
"Invalid data": "잘못된 데이터",
"The book {{name}} is not found in the library, please import the original book before importing": "라이브러리에서 《{{name}}》 책을 찾을 수 없습니다. 먼저 원본 책을 가져온 후 다시 시도하세요",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}}개 기록을 가져왔고 기존 {{skipped}}개는 건너뛰었습니다",
"Download featured backgrounds": "추천 배경 다운로드",
"Official background": "공식 배경",
"Recognize title with AI": "AI로 제목 인식",
"Download open dictionaries": "오픈 사전 다운로드",
"Dictionary already downloaded": "사전이 이미 다운로드되었습니다",
"Source": "출처",
"Word definitions and fast reading mode cannot be enabled at the same time": "단어 뜻과 속독 모드는 동시에 사용할 수 없습니다",
"Reading ruler height": "읽기 눈금자 높이(줄)",
"FAQ": "자주 묻는 질문",
"Auto scan and import books when starting the app or when clicking Scan": "앱을 시작하거나 스캔을 클릭할 때 책을 자동으로 스캔하여 가져옵니다",
"Please enter book name": "책 제목을 입력하세요",
"Waiting for download...": "다운로드 대기 중...",
"Pin to right": "오른쪽에 고정",
"Unpin": "고정 해제",
"Resize": "크기 조정",
"Limited free": "기간 한정 무료",
"7-day free trial upon registration, then billed $4.99 per Year": "등록 시 7일 무료 체험을 시작하고, 이후 매년 $4.99가 청구됩니다",
"Yearly": "연간",
"Year": "년",
"Limited offer": "한정 혜택",
"$4.99": "$4.99",
"Title recognized successfully": "제목 인식 성공",
"Failed to recognize title": "제목 인식 실패",
"Show total page number (Experimental)": "전체 페이지 수 표시(실험적 기능)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "이 버전의 Koodo Reader는 너무 오래되었습니다. 설정 - 정보 - 업데이트 확인에서 Koodo Reader를 최신 버전으로 업데이트한 후 다시 시도하세요.",
"Background opacity": "배경 불투명도"
}
+57 -7
View File
@@ -372,7 +372,7 @@
"Remove from favorite": "Verwijderen uit favorieten",
"Details": "Detailinformatie",
"Multiple selection": "Meervoudige selectie",
"Prototype": "Prototype",
"Prototype": "Grondvorm",
"Right click on any book and click Add to favorite to add it to your favorite books": "Klik met de rechtermuisknop op een boek en kies Toevoegen aan favorieten om het aan je favoriete boeken toe te voegen",
"This action will permanently delete the selected books, together with their notes, bookmarks and digests": "Deze actie verwijdert de geselecteerde boeken definitief, samen met hun notities, bladwijzers en samenvattingen",
"Server Path": "Serverpad",
@@ -482,7 +482,7 @@
"Please add data source in the setting": "Voeg een databron toe in de instellingen",
"Don't automatically pre-cache books for mobile version after import": "Boeken na import niet automatisch vooraf cachen voor de mobiele versie",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "Bij import worden boeken automatisch vooraf gecachet, zodat ze naadloos beschikbaar zijn in de mobiele versie. Dit kan extra opslag gebruiken en de importduur verlengen. Je kunt het ook handmatig doen",
"Test": "Test",
"Test": "Testen",
"Get error log": "Foutlog ophalen",
"Account type": "Accounttype",
"Trial user": "Proefgebruiker",
@@ -806,7 +806,7 @@
"Allow Javascript in the books": "JavaScript in boeken toestaan",
"Configuration": "Configuratie",
"Features": "Functies",
"Website": "Website",
"Website": "Officiële website",
"Installed": "Geïnstalleerd",
"AI Encyclopedia": "AI-encyclopedie",
"Not installed": "Niet geïnstalleerd",
@@ -840,6 +840,7 @@
"Bilingual translation": "Tweetalige vertaling",
"Use AI to analyze books, with different characters reading aloud in different voices": "Gebruik AI om boeken te analyseren, met verschillende personages die in verschillende stemmen voorlezen",
"Voice type": "Stemtype",
"Please reselect voices for all roles": "Selecteer de stemmen voor alle rollen opnieuw",
"System voice": "Systeemstem",
"Purchase the code": "Code kopen",
"Please upgrade to Pro to use this feature": "Upgrade naar Pro om deze functie te gebruiken",
@@ -1145,8 +1146,6 @@
"None": "Geen",
"Slide": "Schuiven",
"Flip": "Omslaan",
"Custom voice plugins are not supported": "Aangepaste spraakplugins worden niet ondersteund",
"Custom voice plugins have been disabled": "Aangepaste spraakplugins zijn uitgeschakeld",
"Paste voice list JSON": "Spraaklijst-JSON plakken",
"Invalid voice list JSON": "Voer een niet-lege JSON-array in met geldige spraakconfiguraties",
"Failed to load more": "Laden van meer mislukt",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Zodra u de Pro-versie afsluit, verliest u direct de volgende lidmaatschapsvoordelen",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "In de toekomst introduceren we meer leden-exclusieve functies, waaronder leesstatistieken en automatische synchronisatie van uw aantekeningen, markeringen, leesvoortgang en woordenlijsten naar platforms zoals Notion, Obsidian, Logseq, Anki en meer.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Cross-platform gegevenssynchronisatie (cloudopslag, WebDAV, Docker, objectopslag)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Boeken importeren vanuit cloudopslag (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Boeken importeren vanuit cloudopslag (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Officiële vertaling in 90+ talen",
"Official dictionary with definitions, examples & pronunciation": "Officieel woordenboek met definities, voorbeelden en uitspraak",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI-leeshulpmiddelen (hoofdstukoverzichten, inhoudsopgave, meerrollenvertelling)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Voer uw Notion persoonlijk toegangstoken in",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Stel de standaard synchronisatieoptie in op lokaal in de instellingen, of upgrade naar Pro om met meer cloudopslag te synchroniseren",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Klik op het Koodo Reader-extensiepictogram in de rechterbovenhoek van de browser, autoriseer het verzoek naar dit eindpunt en probeer opnieuw",
"How to sync library across devices": "Hoe u uw bibliotheek tussen apparaten synchroniseert"
"How to sync library across devices": "Hoe u uw bibliotheek tussen apparaten synchroniseert",
"Enable reading ruler": "Leesliniaal inschakelen",
"Reading ruler height (lines)": "Hoogte van de leesliniaal (regels)",
"Reading ruler background opacity": "Achtergronddekking van de leesliniaal",
"Enable speed reading": "Snellezen inschakelen",
"Reading speed (WPM)": "Leessnelheid (WPM)",
"ISBN": "ISBN",
"Rating": "Beoordeling",
"Rating count": "Aantal beoordelingen",
"Publish date": "Publicatiedatum",
"Categories": "Categorieën",
"Member login": "Ledenlogin",
"Register / Login": "Registreren / Inloggen",
"Start 7-day free trial": "Start gratis proefperiode van 7 dagen",
"Scan for new books": "Scannen naar nieuwe boeken",
"Recognize book title and author with AI on import": "Titel en auteur bij import met AI herkennen",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Als bij het importeren geen boektitel uit de metagegevens van het boek kan worden gehaald, worden titel en auteur met AI herkend",
"No image found in archive": "Geen afbeelding gevonden in het archief",
"Extract cover failed": "Omslag extraheren mislukt",
"Custom plugin security warning": "⚠️ <b>Ernstige beveiligingswaarschuwing</b><br><br>Aangepaste plug-ins hebben volledige toegang tot en controle over je computer, vooral aangepaste TTS-plug-ins, die willekeurige code kunnen uitvoeren.<br>Dit betekent dat ze:<br>• je bestanden kunnen lezen, wijzigen of verwijderen<br>• accounts, wachtwoorden en browsergegevens kunnen stelen<br>• malware kunnen installeren<br>• je apparaat op afstand kunnen besturen<br><br>Voeg een plug-in pas toe als je zeker weet dat je deze volledig vertrouwt en alle code zorgvuldig hebt gecontroleerd.<br>Voeg nooit plug-ins toe van onbekende websites, onbekende bronnen of niet-officiële kanalen.",
"Enable paragraph mode": "Alineamodus inschakelen",
"Import notes, highlights and dictionary history": "Aantekeningen, markeringen en woordenboekgeschiedenis importeren",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Selecteer eerder geëxporteerde CSV- of JSON-bestanden om aantekeningen, markeringen en woordenboekgeschiedenis terug te importeren in de bibliotheek",
"Invalid data": "Ongeldige gegevens",
"The book {{name}} is not found in the library, please import the original book before importing": "Het boek {{name}} is niet gevonden in de bibliotheek. Importeer eerst het originele boek",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} records geïmporteerd, {{skipped}} bestaande records overgeslagen",
"Download featured backgrounds": "Uitgelichte achtergronden downloaden",
"Official background": "Officiële achtergrond",
"Recognize title with AI": "Titel herkennen met AI",
"Download open dictionaries": "Open woordenboeken downloaden",
"Dictionary already downloaded": "Woordenboek al gedownload",
"Source": "Bron",
"Word definitions and fast reading mode cannot be enabled at the same time": "Woorddefinities en snellezen kunnen niet tegelijk worden ingeschakeld",
"Reading ruler height": "Hoogte van de leesliniaal",
"FAQ": "Veelgestelde vragen",
"Auto scan and import books when starting the app or when clicking Scan": "Boeken automatisch scannen en importeren bij het starten van de app of bij het klikken op Scannen",
"Please enter book name": "Voer een boeknaam in",
"Waiting for download...": "Wachten op download...",
"Pin to right": "Rechts vastmaken",
"Unpin": "Losmaken",
"Resize": "Formaat wijzigen",
"Limited free": "Tijdelijk gratis",
"7-day free trial upon registration, then billed $4.99 per Year": "Na registratie 7 dagen gratis proberen, daarna $4.99 per jaar",
"Yearly": "Jaarlijks",
"Year": "Jaar",
"Limited offer": "Tijdelijke aanbieding",
"$4.99": "$4.99",
"Title recognized successfully": "Titel herkend",
"Failed to recognize title": "Titel herkennen mislukt",
"Show total page number (Experimental)": "Totaal aantal pagina's tonen (experimenteel)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Deze versie van Koodo Reader is te oud. Ga naar Instellingen - Over - Controleren op updates om Koodo Reader bij te werken naar de nieuwste versie en probeer het opnieuw.",
"Background opacity": "Achtergronddekking"
}
+59 -9
View File
@@ -88,7 +88,7 @@
"Sort by Date": "Daty dodania",
"Descend": "Malejąco",
"Ascend": "Rosnąco",
"Token": "Token",
"Token": "Token dostępu",
"Book not exists": "Książka nie istnieje",
"Please authorize your account, and fill the following box with the token": "Autoryzuj swoje konto i wypełnij poniższe pole tokenem",
"Copy link": "Kopiuj link",
@@ -392,7 +392,7 @@
"Upload attachments": "Przesyłanie załączników",
"File size is larger than 20MB": "Rozmiar pliku jest większy niż 20 MB",
"Learn more": "Dowiedz się więcej",
"Format": "Format",
"Format": "Format pliku",
"Duplicate book in trash bin": "Duplikat książki w koszu na śmieci",
"Subject can't be empty": "Temat nie może być pusty",
"Full screen": "Pełny ekran",
@@ -481,7 +481,7 @@
"Please add data source in the setting": "Dodaj źródło danych w ustawieniach",
"Don't automatically pre-cache books for mobile version after import": "Nie buforuj automatycznie książek dla wersji mobilnej po zaimportowaniu",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "Po zaimportowaniu książki zostaną automatycznie wstępnie zbuforowane, umożliwiając płynny dostęp w wersji mobilnej. Proces ten może jednak zająć dodatkową przestrzeń dyskową i wydłużyć czas importu. Nadal można to zrobić ręcznie",
"Test": "Test",
"Test": "Testuj",
"Get error log": "Pobierz dziennik błędów",
"Account type": "Typ konta",
"Trial user": "Testowy użytkownik",
@@ -839,6 +839,7 @@
"Bilingual translation": "Tłumaczenie dwujęzyczne",
"Use AI to analyze books, with different characters reading aloud in different voices": "Użyj AI do analizowania książek, z różnymi postaciami czytającymi na głos różnymi głosami",
"Voice type": "Typ głosu",
"Please reselect voices for all roles": "Wybierz ponownie głosy dla wszystkich ról",
"System voice": "Głos systemowy",
"Purchase the code": "Zakup kodu",
"Please upgrade to Pro to use this feature": "Aby móc korzystać z tej funkcji, przejdź do wersji Pro",
@@ -988,9 +989,9 @@
"Language code, e.g. en / fr / de / es": "Kod języka, np. en / fr / de / es",
"Auto sync new words to AnkiConnect": "Auto synchronizuj nowe słowa z AnkiConnect",
"When you look up a word, it will be automatically added to an Anki deck via AnkiConnect (must be running locally)": "Gdy sprawdzisz słowo, zostanie automatycznie dodane do talii Anki przez AnkiConnect (musi być uruchomione lokalnie)",
"Host": "Host",
"Host": "Serwer",
"e.g. 127.0.0.1": "np. 127.0.0.1",
"Port": "Port",
"Port": "Numer portu",
"e.g. 8765": "np. 8765",
"Key": "Klucz",
"Api key": "Klucz API",
@@ -1144,8 +1145,6 @@
"None": "Brak",
"Slide": "Przesuwanie",
"Flip": "Przerzucanie",
"Custom voice plugins are not supported": "Niestandardowe wtyczki głosowe nie są obsługiwane",
"Custom voice plugins have been disabled": "Niestandardowe wtyczki głosowe zostały wyłączone",
"Paste voice list JSON": "Wklej JSON listy głosów",
"Invalid voice list JSON": "Wprowadź niepustą tablicę JSON zawierającą prawidłowe konfiguracje głosów",
"Failed to load more": "Nie udało się załadować więcej",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Po wyjściu z wersji Pro natychmiast stracisz następujące korzyści członkowskie",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "W przyszłości wprowadzimy więcej funkcji dostępnych wyłącznie dla członków, w tym statystyki czytania oraz automatyczną synchronizację notatek, podświetleń, postępów w czytaniu i list słownictwa z platformami takimi jak Notion, Obsidian, Logseq, Anki i innymi.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Synchronizacja danych między platformami (dyski w chmurze, WebDAV, Docker, przechowywanie obiektów)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importuj książki z dysków w chmurze (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importuj książki z dysków w chmurze (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Oficjalne tłumaczenie na ponad 90 języków",
"Official dictionary with definitions, examples & pronunciation": "Oficjalny słownik z definicjami, przykładami i wymową",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Pomoce do czytania AI (streszczenia rozdziałów, konspekt, narracja wieloosobowa)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Wprowadź swój osobisty token dostępu Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Ustaw domyślną opcję synchronizacji na lokalną w ustawieniach lub przejdź do wersji Pro, aby synchronizować z większą liczbą dysków w chmurze",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Kliknij ikonę rozszerzenia Koodo Reader w prawym górnym rogu przeglądarki, autoryzuj żądanie do tego punktu końcowego i spróbuj ponownie",
"How to sync library across devices": "Jak synchronizować bibliotekę między urządzeniami"
"How to sync library across devices": "Jak synchronizować bibliotekę między urządzeniami",
"Enable reading ruler": "Włącz linijkę do czytania",
"Reading ruler height (lines)": "Wysokość linijki do czytania (wiersze)",
"Reading ruler background opacity": "Nieprzezroczystość tła linijki do czytania",
"Enable speed reading": "Włącz szybkie czytanie",
"Reading speed (WPM)": "Szybkość czytania (WPM)",
"ISBN": "ISBN",
"Rating": "Ocena",
"Rating count": "Liczba ocen",
"Publish date": "Data publikacji",
"Categories": "Kategorie",
"Member login": "Logowanie do konta",
"Register / Login": "Zarejestruj się / Zaloguj się",
"Start 7-day free trial": "Rozpocznij 7-dniowy bezpłatny okres próbny",
"Scan for new books": "Skanuj nowe książki",
"Recognize book title and author with AI on import": "Rozpoznawaj tytuł i autora książki za pomocą AI podczas importu",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Podczas importowania książek, jeśli nie uda się odczytać tytułu z metadanych książki, do rozpoznania tytułu i autora zostanie użyte AI",
"No image found in archive": "Nie znaleziono obrazu w archiwum",
"Extract cover failed": "Nie udało się wyodrębnić okładki",
"Custom plugin security warning": "⚠️ <b>Poważne ostrzeżenie bezpieczeństwa</b><br><br>Wtyczki niestandardowe mają pełny dostęp do Twojego komputera i kontrolę nad nim, zwłaszcza niestandardowe wtyczki TTS, które mogą wykonywać dowolny kod.<br>Oznacza to, że mogą:<br>• czytać, modyfikować lub usuwać Twoje pliki<br>• wykradać konta, hasła i dane przeglądarki<br>• instalować złośliwe oprogramowanie<br>• zdalnie kontrolować Twoje urządzenie<br><br>Dodaj wtyczkę tylko wtedy, gdy masz pewność, że w pełni jej ufasz i dokładnie przejrzałeś cały jej kod.<br>Nigdy nie dodawaj wtyczek z nieznanych stron internetowych, nieznanych źródeł ani nieoficjalnych kanałów.",
"Enable paragraph mode": "Włącz tryb akapitowy",
"Import notes, highlights and dictionary history": "Importuj notatki, zaznaczenia i historię słownika",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Wybierz uprzednio wyeksportowane pliki CSV lub JSON, aby zaimportować notatki, zaznaczenia i historię słownika z powrotem do biblioteki",
"Invalid data": "Nieprawidłowe dane",
"The book {{name}} is not found in the library, please import the original book before importing": "Nie znaleziono książki {{name}} w bibliotece, przed importem najpierw zaimportuj oryginalną książkę",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Zaimportowano {{imported}} rekordów, pominięto {{skipped}} istniejących rekordów",
"Download featured backgrounds": "Pobierz wyróżnione tła",
"Official background": "Oficjalne tło",
"Recognize title with AI": "Rozpoznaj tytuł za pomocą AI",
"Download open dictionaries": "Pobierz otwarte słowniki",
"Dictionary already downloaded": "Słownik już pobrany",
"Source": "Źródło",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definicje słów i tryb szybkiego czytania nie mogą być włączone jednocześnie",
"Reading ruler height": "Wysokość linijki do czytania",
"FAQ": "Często zadawane pytania",
"Auto scan and import books when starting the app or when clicking Scan": "Automatycznie skanuj i importuj książki przy uruchomieniu aplikacji lub kliknięciu przycisku Skanuj",
"Please enter book name": "Wprowadź nazwę książki",
"Waiting for download...": "Oczekiwanie na pobranie...",
"Pin to right": "Przypnij do prawej",
"Unpin": "Odepnij",
"Resize": "Zmień rozmiar",
"Limited free": "Czasowo bezpłatne",
"7-day free trial upon registration, then billed $4.99 per Year": "7-dniowy bezpłatny okres próbny po rejestracji, następnie opłata $4.99 rocznie",
"Yearly": "Rocznie",
"Year": "Rok",
"Limited offer": "Oferta limitowana",
"$4.99": "$4.99",
"Title recognized successfully": "Tytuł rozpoznany pomyślnie",
"Failed to recognize title": "Nie udało się rozpoznać tytułu",
"Show total page number (Experimental)": "Pokaż łączną liczbę stron (funkcja eksperymentalna)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Ta wersja Koodo Reader jest zbyt stara. Przejdź do Ustawienia - O programie - Sprawdź aktualizacje, aby zaktualizować Koodo Reader do najnowszej wersji i spróbować ponownie.",
"Background opacity": "Nieprzezroczystość tła"
}
+55 -5
View File
@@ -838,6 +838,7 @@
"Bilingual translation": "Tradução bilíngue",
"Use AI to analyze books, with different characters reading aloud in different voices": "Usar AI para analisar livros, com diferentes personagens lendo em voz alta com vozes diferentes",
"Voice type": "Tipo de voz",
"Please reselect voices for all roles": "Selecione novamente as vozes para todas as funções",
"System voice": "Voz do sistema",
"Purchase the code": "Comprar o código",
"Please upgrade to Pro to use this feature": "Por favor, atualize para Pro para usar esta funcionalidade",
@@ -1123,7 +1124,7 @@
"Font file not found": "Arquivo de fonte não encontrado",
"Font already downloaded": "Fonte já baixada",
"Font already exists": "Fonte já existe",
"Regular": "Regular",
"Regular": "Normal",
"Light": "Fina",
"Thin": "Superfina",
"SemiBold": "Seminegrito",
@@ -1143,8 +1144,6 @@
"None": "Nenhum",
"Slide": "Deslizar",
"Flip": "Virar",
"Custom voice plugins are not supported": "Plugins de voz personalizados não são suportados",
"Custom voice plugins have been disabled": "Plugins de voz personalizados foram desativados",
"Paste voice list JSON": "Cole o JSON da lista de vozes",
"Invalid voice list JSON": "Insira uma matriz JSON não vazia contendo configurações de voz válidas",
"Failed to load more": "Falha ao carregar mais",
@@ -1289,7 +1288,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Ao sair da versão Pro, você perderá imediatamente os seguintes benefícios de membro",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "No futuro, apresentaremos mais recursos exclusivos para membros, incluindo estatísticas de leitura e sincronização automática de suas notas, destaques, progresso de leitura e listas de vocabulário para plataformas como Notion, Obsidian, Logseq, Anki e outras.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sincronização de dados entre plataformas (armazenamentos em nuvem, WebDAV, Docker, armazenamento de objetos)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importar livros de armazenamentos em nuvem (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importar livros de armazenamentos em nuvem (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Tradução oficial em 90+ idiomas",
"Official dictionary with definitions, examples & pronunciation": "Dicionário oficial com definições, exemplos e pronúncia",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Recursos de leitura com IA (resumos de capítulos, esboço, narração em múltiplos papéis)",
@@ -1320,5 +1319,56 @@
"Enter your Notion personal access token": "Insira seu token de acesso pessoal do Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Defina a opção de sincronização padrão como local nas configurações, ou atualize para o Pro para sincronizar com mais armazenamentos em nuvem",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Clique no ícone da extensão do Koodo Reader no canto superior direito do navegador, autorize a solicitação para este endpoint e tente novamente",
"How to sync library across devices": "Como sincronizar a biblioteca entre dispositivos"
"How to sync library across devices": "Como sincronizar a biblioteca entre dispositivos",
"Enable reading ruler": "Ativar a régua de leitura",
"Reading ruler height (lines)": "Altura da régua de leitura (linhas)",
"Reading ruler background opacity": "Opacidade do fundo da régua de leitura",
"Enable speed reading": "Ativar a leitura rápida",
"Reading speed (WPM)": "Velocidade de leitura (WPM)",
"ISBN": "ISBN",
"Rating": "Avaliação",
"Rating count": "Número de avaliações",
"Publish date": "Data de publicação",
"Categories": "Categorias",
"Member login": "Login de membro",
"Register / Login": "Registrar / Entrar",
"Start 7-day free trial": "Começar o teste grátis de 7 dias",
"Scan for new books": "Escanear novos livros",
"Recognize book title and author with AI on import": "Reconhecer título e autor com IA ao importar",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Ao importar livros, se nenhum título for extraído dos metadados do livro, a IA será usada para reconhecer o título e o autor",
"No image found in archive": "Nenhuma imagem encontrada no arquivo",
"Extract cover failed": "Falha ao extrair a capa",
"Custom plugin security warning": "⚠️ <b>Aviso grave de segurança</b><br><br>Os plugins personalizados têm acesso total e controle total sobre o seu computador, especialmente os plugins TTS personalizados, que podem executar código arbitrário.<br>Isso significa que eles poderiam:<br>• Ler, modificar ou excluir seus arquivos<br>• Roubar contas, senhas e dados do navegador<br>• Instalar software malicioso<br>• Controlar seu dispositivo remotamente<br><br>Só adicione um plugin depois de ter certeza de que confia totalmente nele e de ter revisado cuidadosamente todo o seu código.<br>Nunca adicione plugins de sites desconhecidos, de fontes desconhecidas ou de canais não oficiais.",
"Enable paragraph mode": "Ativar o modo de parágrafo",
"Import notes, highlights and dictionary history": "Importar notas, destaques e histórico do dicionário",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Selecione arquivos CSV ou JSON exportados anteriormente para importar notas, destaques e histórico do dicionário de volta para a biblioteca",
"Invalid data": "Dados inválidos",
"The book {{name}} is not found in the library, please import the original book before importing": "O livro {{name}} não foi encontrado na biblioteca; importe o livro original antes de continuar",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Importados {{imported}} registros, ignorados {{skipped}} registros existentes",
"Download featured backgrounds": "Baixar fundos em destaque",
"Official background": "Fundo oficial",
"Recognize title with AI": "Reconhecer título com IA",
"Download open dictionaries": "Baixar dicionários abertos",
"Dictionary already downloaded": "Dicionário já baixado",
"Source": "Fonte",
"Word definitions and fast reading mode cannot be enabled at the same time": "As definições de palavras e o modo de leitura rápida não podem ser ativados ao mesmo tempo",
"Reading ruler height": "Altura da régua de leitura",
"FAQ": "Perguntas frequentes",
"Auto scan and import books when starting the app or when clicking Scan": "Escanear e importar livros automaticamente ao iniciar o aplicativo ou ao clicar em Escanear",
"Please enter book name": "Digite o nome do livro",
"Waiting for download...": "Aguardando o download...",
"Pin to right": "Fixar à direita",
"Unpin": "Desafixar",
"Resize": "Redimensionar",
"Limited free": "Grátis por tempo limitado",
"7-day free trial upon registration, then billed $4.99 per Year": "Teste grátis de 7 dias ao se registrar, depois $4.99 por ano",
"Yearly": "Anual",
"Year": "Ano",
"Limited offer": "Oferta limitada",
"$4.99": "$4.99",
"Title recognized successfully": "Título reconhecido com sucesso",
"Failed to recognize title": "Falha ao reconhecer o título",
"Show total page number (Experimental)": "Mostrar o número total de páginas (experimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Esta versão do Koodo Reader é muito antiga. Acesse Configurações - Sobre - Verificar atualizações para atualizar o Koodo Reader para a versão mais recente e tente novamente.",
"Background opacity": "Opacidade do fundo"
}
+54 -4
View File
@@ -846,6 +846,7 @@
"Bilingual translation": "Tradução bilíngue",
"Use AI to analyze books, with different characters reading aloud in different voices": "Usar AI para analisar livros, com diferentes personagens a ler em voz alta com vozes diferentes",
"Voice type": "Tipo de voz",
"Please reselect voices for all roles": "Selecione novamente as vozes para todos os papéis",
"System voice": "Voz do sistema",
"Purchase the code": "Comprar o código",
"Please upgrade to Pro to use this feature": "Por favor, atualize para Pro para usar esta funcionalidade",
@@ -1151,8 +1152,6 @@
"None": "Nenhum",
"Slide": "Deslizar",
"Flip": "Virar",
"Custom voice plugins are not supported": "Os plugins de voz personalizados não são suportados",
"Custom voice plugins have been disabled": "Os plugins de voz personalizados foram desativados",
"Paste voice list JSON": "Cole o JSON da lista de vozes",
"Invalid voice list JSON": "Insira uma matriz JSON não vazia contendo configurações de voz válidas",
"Failed to load more": "Falha ao carregar mais",
@@ -1297,7 +1296,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Ao sair do Pro, perderá imediatamente os seguintes benefícios de membro",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "No futuro, apresentaremos mais funcionalidades exclusivas para membros, incluindo estatísticas de leitura e sincronização automática das suas notas, destaques, progresso de leitura e listas de vocabulário para plataformas como Notion, Obsidian, Logseq, Anki e outras.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sincronização de dados multiplataforma (cloud drives, WebDAV, Docker, armazenamento de objetos)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importar livros de cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importar livros de cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Tradução oficial em mais de 90 idiomas",
"Official dictionary with definitions, examples & pronunciation": "Dicionário oficial com definições, exemplos e pronúncia",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Auxílios de leitura AI (resumos de capítulos, esquema, narração multi-papel)",
@@ -1328,5 +1327,56 @@
"Enter your Notion personal access token": "Insira o seu token de acesso pessoal do Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Por favor, defina a opção de sincronização predefinida para local nas definições, ou atualize para Pro para sincronizar com mais armazenamento cloud",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Por favor, clique no ícone da extensão do Koodo Reader no canto superior direito do navegador, autorize o pedido a este endpoint e tente novamente",
"How to sync library across devices": "Como sincronizar a biblioteca entre dispositivos"
"How to sync library across devices": "Como sincronizar a biblioteca entre dispositivos",
"Enable reading ruler": "Ativar a régua de leitura",
"Reading ruler height (lines)": "Altura da régua de leitura (linhas)",
"Reading ruler background opacity": "Opacidade do fundo da régua de leitura",
"Enable speed reading": "Ativar a leitura rápida",
"Reading speed (WPM)": "Velocidade de leitura (WPM)",
"ISBN": "ISBN",
"Rating": "Avaliação",
"Rating count": "Número de avaliações",
"Publish date": "Data de publicação",
"Categories": "Categorias",
"Member login": "Início de sessão de membro",
"Register / Login": "Registar / Iniciar sessão",
"Start 7-day free trial": "Começar o teste gratuito de 7 dias",
"Scan for new books": "Analisar novos livros",
"Recognize book title and author with AI on import": "Reconhecer o título e o autor com IA ao importar",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Ao importar livros, se não for extraído nenhum título dos metadados do livro, será usada a IA para reconhecer o título e o autor",
"No image found in archive": "Nenhuma imagem encontrada no arquivo",
"Extract cover failed": "Falha ao extrair a capa",
"Custom plugin security warning": "⚠️ <b>Aviso de segurança grave</b><br><br>Os plugins personalizados têm acesso completo e controlo total sobre o seu computador, especialmente os plugins TTS personalizados, que podem executar código arbitrário.<br>Isto significa que poderiam:<br>• Ler, modificar ou eliminar os seus ficheiros<br>• Roubar contas, palavras-passe e dados do navegador<br>• Instalar software malicioso<br>• Controlar o seu dispositivo remotamente<br><br>Só adicione um plugin depois de ter a certeza de que confia totalmente nele e de ter revisto cuidadosamente todo o seu código.<br>Nunca adicione plugins de sites desconhecidos, de fontes desconhecidas ou de canais não oficiais.",
"Enable paragraph mode": "Ativar o modo de parágrafo",
"Import notes, highlights and dictionary history": "Importar notas, destaques e histórico do dicionário",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Selecione ficheiros CSV ou JSON exportados anteriormente para importar notas, destaques e histórico do dicionário de volta para a biblioteca",
"Invalid data": "Dados inválidos",
"The book {{name}} is not found in the library, please import the original book before importing": "O livro {{name}} não foi encontrado na biblioteca; importe o livro original antes de continuar",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Importados {{imported}} registos, ignorados {{skipped}} registos existentes",
"Download featured backgrounds": "Transferir fundos em destaque",
"Official background": "Fundo oficial",
"Recognize title with AI": "Reconhecer o título com IA",
"Download open dictionaries": "Transferir dicionários abertos",
"Dictionary already downloaded": "Dicionário já transferido",
"Source": "Fonte",
"Word definitions and fast reading mode cannot be enabled at the same time": "As definições de palavras e o modo de leitura rápida não podem ser ativados ao mesmo tempo",
"Reading ruler height": "Altura da régua de leitura",
"FAQ": "Perguntas frequentes",
"Auto scan and import books when starting the app or when clicking Scan": "Analisar e importar livros automaticamente ao iniciar a aplicação ou ao clicar em Analisar",
"Please enter book name": "Introduza o nome do livro",
"Waiting for download...": "A aguardar a transferência...",
"Pin to right": "Fixar à direita",
"Unpin": "Desafixar",
"Resize": "Redimensionar",
"Limited free": "Grátis por tempo limitado",
"7-day free trial upon registration, then billed $4.99 per Year": "Teste gratuito de 7 dias no registo, depois $4.99 por ano",
"Yearly": "Anual",
"Year": "Ano",
"Limited offer": "Oferta limitada",
"$4.99": "$4.99",
"Title recognized successfully": "Título reconhecido com êxito",
"Failed to recognize title": "Falha ao reconhecer o título",
"Show total page number (Experimental)": "Mostrar o número total de páginas (experimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Esta versão do Koodo Reader é demasiado antiga. Aceda a Definições - Acerca de - Procurar atualizações para atualizar o Koodo Reader para a versão mais recente e tente novamente.",
"Background opacity": "Opacidade do fundo"
}
+59 -9
View File
@@ -392,7 +392,7 @@
"Upload attachments": "Încarcă atașamente",
"File size is larger than 20MB": "Dimensiunea fișierului este mai mare de 20MB",
"Learn more": "Află mai multe",
"Format": "Format",
"Format": "Format fișier",
"Duplicate book in trash bin": "Duplică cartea în coșul de gunoi",
"Subject can't be empty": "Subiectul nu poate fi gol",
"Full screen": "Ecran complet",
@@ -481,7 +481,7 @@
"Please add data source in the setting": "Adaugă sursa de date în setări",
"Don't automatically pre-cache books for mobile version after import": "Nu pre-cache automat cărțile pentru versiunea mobilă după import",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "La import, cărțile vor fi pre-cache automat pentru acces facil în versiunea mobilă. Totuși, acest proces poate consuma spațiu suplimentar și poate prelungi importul. Poți face și manual",
"Test": "Test",
"Test": "Testați",
"Get error log": "Obține jurnalul de erori",
"Account type": "Tip cont",
"Trial user": "Utilizator de probă",
@@ -839,6 +839,7 @@
"Bilingual translation": "Traducere bilingvă",
"Use AI to analyze books, with different characters reading aloud in different voices": "Utilizați AI pentru a analiza cărți, cu diferite personaje citind cu voci diferite",
"Voice type": "Tip voce",
"Please reselect voices for all roles": "Vă rugăm să selectați din nou vocile pentru toate rolurile",
"System voice": "Voce de sistem",
"Purchase the code": "Cumpărați codul",
"Please upgrade to Pro to use this feature": "Faceți upgrade la Pro pentru a utiliza această funcție",
@@ -990,7 +991,7 @@
"When you look up a word, it will be automatically added to an Anki deck via AnkiConnect (must be running locally)": "Când căutați un cuvânt, acesta va fi adăugat automat la un pachet Anki prin AnkiConnect (trebuie să ruleze local).",
"Host": "Gazdă",
"e.g. 127.0.0.1": "ex.: 127.0.0.1",
"Port": "Port",
"Port": "Număr port",
"e.g. 8765": "ex.: 8765",
"Key": "Cheie",
"Api key": "Cheie API",
@@ -1052,7 +1053,7 @@
"PINs do not match, please try again": "PIN-urile nu coincid, încercați din nou",
"Incorrect password": "Parolă incorectă",
"Incorrect PIN": "PIN incorect",
"Biometric": "Biometric",
"Biometric": "Biometrie",
"Select protection method": "Selectați metoda de protecție",
"Enter your current password": "Introduceți parola curentă",
"Enter new password": "Introduceți parola nouă",
@@ -1144,8 +1145,6 @@
"None": "Niciuna",
"Slide": "Glisare",
"Flip": "Răsfoire",
"Custom voice plugins are not supported": "Pluginurile vocale personalizate nu sunt acceptate",
"Custom voice plugins have been disabled": "Pluginurile vocale personalizate au fost dezactivate",
"Paste voice list JSON": "Lipiți lista de voci JSON",
"Invalid voice list JSON": "Introduceți o matrice JSON nevidă care conține configurații de voce valide",
"Failed to load more": "Nu s-au încărcat mai multe",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Odată ce părăsiți Pro, veți pierde imediat următoarele beneficii pentru membri",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "În viitor, vom introduce mai multe funcții exclusive pentru membri, inclusiv statistici de citire și sincronizare automată a notelor, evidențierilor, progresului citirii și listelor de vocabular pe platforme precum Notion, Obsidian, Logseq, Anki și multe altele.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sincronizarea datelor pe mai multe platforme (unități în cloud, WebDAV, Docker, stocare obiecte)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importați cărți de pe unități cloud (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importați cărți de pe unități cloud (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Traducere oficială în peste 90 de limbi",
"Official dictionary with definitions, examples & pronunciation": "Dicționar oficial cu definiții, exemple și pronunție",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI mijloace de citire (rezumate ale capitolelor, schiță, narațiune cu mai multe roluri)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "Introduceți jetonul dvs. de acces personal Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Setați opțiunea de sincronizare implicită la local în setări sau faceți upgrade la Pro pentru a sincroniza cu mai mult spațiu de stocare în cloud",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Faceți clic pe pictograma extensiei Koodo Reader din colțul din dreapta sus al browserului, autorizați solicitarea către acest punct final și încercați din nou",
"How to sync library across devices": "Cum să sincronizați biblioteca pe dispozitive"
}
"How to sync library across devices": "Cum să sincronizați biblioteca pe dispozitive",
"Enable reading ruler": "Activați rigla de citire",
"Reading ruler height (lines)": "Înălțimea riglei de citire (linii)",
"Reading ruler background opacity": "Opacitatea fundalului riglei de citire",
"Enable speed reading": "Activați citirea rapidă",
"Reading speed (WPM)": "Viteza de citire (WPM)",
"ISBN": "ISBN",
"Rating": "Evaluare",
"Rating count": "Număr de evaluări",
"Publish date": "Data publicării",
"Categories": "Categorii",
"Member login": "Autentificare în cont",
"Register / Login": "Înregistrare / Autentificare",
"Start 7-day free trial": "Începeți perioada de probă gratuită de 7 zile",
"Scan for new books": "Scanați cărți noi",
"Recognize book title and author with AI on import": "Recunoașteți titlul și autorul cărții cu AI la import",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "La importarea cărților, dacă nu se extrage titlul din metadatele cărții, AI va fi folosit pentru a recunoaște titlul și autorul",
"No image found in archive": "Nu s-a găsit nicio imagine în arhivă",
"Extract cover failed": "Extragerea copertei a eșuat",
"Custom plugin security warning": "⚠️ <b>Avertisment sever de securitate</b><br><br>Pluginurile personalizate au acces complet la computerul dumneavoastră și control asupra acestuia, în special pluginurile TTS personalizate, care pot executa cod arbitrar.<br>Aceasta înseamnă că ar putea:<br>• să citească, să modifice sau să șteargă fișierele dumneavoastră<br>• să fure conturi, parole și date din browser<br>• să instaleze programe rău intenționate<br>• să vă controleze dispozitivul de la distanță<br><br>Adăugați un plugin numai după ce sunteți sigur că aveți deplină încredere în el și ați examinat cu atenție întregul său cod.<br>Nu adăugați niciodată pluginuri de pe site-uri necunoscute, din surse necunoscute sau din canale neoficiale.",
"Enable paragraph mode": "Activați modul paragraf",
"Import notes, highlights and dictionary history": "Importați notițe, evidențieri și istoricul dicționarului",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Selectați fișierele CSV sau JSON exportate anterior pentru a importa notițe, evidențieri și istoricul dicționarului înapoi în bibliotecă",
"Invalid data": "Date nevalide",
"The book {{name}} is not found in the library, please import the original book before importing": "Cartea {{name}} nu a fost găsită în bibliotecă, importați cartea originală înainte de import",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} înregistrări importate, {{skipped}} înregistrări existente omise",
"Download featured backgrounds": "Descărcați fundaluri recomandate",
"Official background": "Fundal oficial",
"Recognize title with AI": "Recunoașteți titlul cu AI",
"Download open dictionaries": "Descărcați dicționare deschise",
"Dictionary already downloaded": "Dicționar deja descărcat",
"Source": "Sursă",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definițiile cuvintelor și modul de citire rapidă nu pot fi activate în același timp",
"Reading ruler height": "Înălțimea riglei de citire",
"FAQ": "Întrebări frecvente",
"Auto scan and import books when starting the app or when clicking Scan": "Scanați și importați automat cărți la pornirea aplicației sau la apăsarea butonului Scanare",
"Please enter book name": "Introduceți numele cărții",
"Waiting for download...": "Se așteaptă descărcarea...",
"Pin to right": "Fixați în dreapta",
"Unpin": "Defixați",
"Resize": "Redimensionați",
"Limited free": "Gratuit limitat",
"7-day free trial upon registration, then billed $4.99 per Year": "Perioadă de probă gratuită de 7 zile la înregistrare, apoi facturare $4.99 pe an",
"Yearly": "Anual",
"Year": "An",
"Limited offer": "Ofertă limitată",
"$4.99": "$4.99",
"Title recognized successfully": "Titlul a fost recunoscut cu succes",
"Failed to recognize title": "Recunoașterea titlului a eșuat",
"Show total page number (Experimental)": "Afișați numărul total de pagini (experimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Această versiune de Koodo Reader este prea veche. Accesați Setări - Despre - Verificați actualizări pentru a actualiza Koodo Reader la cea mai recentă versiune și încercați din nou.",
"Background opacity": "Opacitatea fundalului"
}
+54 -4
View File
@@ -840,6 +840,7 @@
"Bilingual translation": "Двуязычный перевод",
"Use AI to analyze books, with different characters reading aloud in different voices": "Использовать AI для анализа книг, с чтением разных персонажей разными голосами",
"Voice type": "Тип голоса",
"Please reselect voices for all roles": "Пожалуйста, выберите заново голоса для всех ролей",
"System voice": "Системный голос",
"Purchase the code": "Купить код",
"Please upgrade to Pro to use this feature": "Пожалуйста, обновитесь до Pro, чтобы использовать эту функцию",
@@ -1145,8 +1146,6 @@
"None": "Нет",
"Slide": "Плавно",
"Flip": "С переворотом",
"Custom voice plugins are not supported": "Пользовательские голосовые плагины не поддерживаются",
"Custom voice plugins have been disabled": "Пользовательские голосовые плагины отключены",
"Paste voice list JSON": "Вставить JSON списка голосов",
"Invalid voice list JSON": "Введите непустой массив JSON с корректными настройками голосов",
"Failed to load more": "Не удалось загрузить ещё",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "После выхода из Pro-версии вы сразу же потеряете следующие преимущества подписки",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "В будущем мы добавим ещё больше функций только для подписчиков, включая статистику чтения и автоматическую синхронизацию ваших заметок, выделений, прогресса чтения и списков слов с такими платформами, как Notion, Obsidian, Logseq, Anki и другими.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Кроссплатформенная синхронизация данных (облачные диски, WebDAV, Docker, объектное хранилище)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Импорт книг из облачных дисков (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Импорт книг из облачных дисков (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Официальный перевод на 90+ языков",
"Official dictionary with definitions, examples & pronunciation": "Официальный словарь с определениями, примерами и произношением",
"AI reading aids (chapter summaries, outline, multi-role narration)": "ИИ-помощники для чтения (краткое содержание глав, план, озвучивание в несколько ролей)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Введите ваш персональный токен доступа Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Установите в настройках синхронизацию по умолчанию на локальную или перейдите на Pro, чтобы синхронизировать с большим числом облачных хранилищ",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Пожалуйста, нажмите на значок расширения Koodo Reader в правом верхнем углу браузера, разрешите запрос к этому адресу и попробуйте ещё раз",
"How to sync library across devices": "Как синхронизировать библиотеку между устройствами"
"How to sync library across devices": "Как синхронизировать библиотеку между устройствами",
"Enable reading ruler": "Включить линейку для чтения",
"Reading ruler height (lines)": "Высота линейки для чтения (строк)",
"Reading ruler background opacity": "Непрозрачность фона линейки для чтения",
"Enable speed reading": "Включить скорочтение",
"Reading speed (WPM)": "Скорость чтения (WPM)",
"ISBN": "ISBN",
"Rating": "Рейтинг",
"Rating count": "Число оценок",
"Publish date": "Дата публикации",
"Categories": "Категории",
"Member login": "Вход для участников",
"Register / Login": "Регистрация / Вход",
"Start 7-day free trial": "Начать бесплатно на 7 дней",
"Scan for new books": "Сканировать новые книги",
"Recognize book title and author with AI on import": "Распознавать название и автора книги с помощью AI при импорте",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "При импорте книг, если из метаданных книги не удалось извлечь название, для распознавания названия и автора будет использоваться AI",
"No image found in archive": "В архиве не найдено изображений",
"Extract cover failed": "Не удалось извлечь обложку",
"Custom plugin security warning": "⚠️ <b>Серьёзное предупреждение о безопасности</b><br><br>Пользовательские плагины имеют полный доступ к вашему компьютеру и контроль над ним, особенно пользовательские плагины TTS, которые могут выполнять произвольный код.<br>Это означает, что они могут:<br>• Читать, изменять или удалять ваши файлы<br>• Красть аккаунты, пароли и данные браузера<br>• Устанавливать вредоносные программы<br>• Удалённо управлять вашим устройством<br><br>Добавляйте плагин только после того, как убедитесь, что полностью ему доверяете и внимательно изучили весь его код.<br>Никогда не добавляйте плагины с незнакомых сайтов, из неизвестных источников или неофициальных каналов.",
"Enable paragraph mode": "Включить режим абзацев",
"Import notes, highlights and dictionary history": "Импортировать заметки, дайджесты и историю словаря",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Выберите ранее экспортированные файлы CSV или JSON, чтобы импортировать заметки, дайджесты и историю словаря обратно в библиотеку",
"Invalid data": "Некорректные данные",
"The book {{name}} is not found in the library, please import the original book before importing": "Книга «{{name}}» не найдена в библиотеке. Импортируйте оригинальную книгу, прежде чем продолжить импорт",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Импортировано записей: {{imported}}, пропущено существующих: {{skipped}}",
"Download featured backgrounds": "Скачать избранные фоны",
"Official background": "Официальный фон",
"Recognize title with AI": "Распознать название с помощью AI",
"Download open dictionaries": "Скачать открытые словари",
"Dictionary already downloaded": "Словарь уже скачан",
"Source": "Источник",
"Word definitions and fast reading mode cannot be enabled at the same time": "Определения слов и режим скорочтения нельзя включить одновременно",
"Reading ruler height": "Высота линейки для чтения",
"FAQ": "Частые вопросы",
"Auto scan and import books when starting the app or when clicking Scan": "Автоматически сканировать и импортировать книги при запуске приложения или нажатии «Сканировать»",
"Please enter book name": "Введите название книги",
"Waiting for download...": "Ожидание загрузки...",
"Pin to right": "Закрепить справа",
"Unpin": "Открепить",
"Resize": "Изменить размер",
"Limited free": "Временно бесплатно",
"7-day free trial upon registration, then billed $4.99 per Year": "7-дневный бесплатный пробный период при регистрации, затем оплата $4.99 в год",
"Yearly": "Ежегодно",
"Year": "Год",
"Limited offer": "Ограниченное предложение",
"$4.99": "$4.99",
"Title recognized successfully": "Название успешно распознано",
"Failed to recognize title": "Не удалось распознать название",
"Show total page number (Experimental)": "Показывать общее число страниц (экспериментально)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Эта версия Koodo Reader слишком старая. Перейдите в «Настройки — О программе — Проверить обновления», обновите Koodo Reader до последней версии и повторите попытку.",
"Background opacity": "Непрозрачность фона"
}
+56 -6
View File
@@ -159,7 +159,7 @@
"Font family": "Družina pisav",
"Font size": "Velikost pisave",
"For better user experience, please visit this site on a computer": "Za boljšo uporabniško izkušnjo obiščite to stran z računalnikom",
"Format": "Format",
"Format": "Format datoteke",
"Frequency limit reached": "Frekvenčna omejitev je dosežena",
"From": "Od",
"Full screen": "Cel zaslon",
@@ -837,6 +837,7 @@
"Bilingual translation": "Dvojezično prevajanje",
"Use AI to analyze books, with different characters reading aloud in different voices": "Uporabi AI za analizo knjig, pri čemer različni liki berejo naglas z različnimi glasovi",
"Voice type": "Vrsta glasu",
"Please reselect voices for all roles": "Znova izberite glasove za vse vloge",
"System voice": "Sistemski glas",
"Purchase the code": "Kupite kodo",
"Please upgrade to Pro to use this feature": "Prosimo, nadgradite na Pro za uporabo te funkcije",
@@ -1142,8 +1143,6 @@
"None": "Brez",
"Slide": "Drsenje",
"Flip": "Listanje",
"Custom voice plugins are not supported": "Glasovni vtičniki po meri niso podprti",
"Custom voice plugins have been disabled": "Glasovni vtičniki po meri so bili onemogočeni",
"Paste voice list JSON": "Prilepite glasovni seznam JSON",
"Invalid voice list JSON": "Vnesite neprazen niz JSON, ki vsebuje veljavne glasovne konfiguracije",
"Failed to load more": "Več ni bilo mogoče naložiti",
@@ -1288,7 +1287,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Ko zapustite Pro, boste takoj izgubili naslednje članske ugodnosti",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "V prihodnosti bomo uvedli več ekskluzivnih funkcij za člane, vključno s statistiko branja in samodejno sinhronizacijo vaših zapiskov, poudarkov, napredka pri branju in seznamov besedišča na platformah, kot so Notion, Obsidian, Logseq, Anki in druge.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sinhronizacija podatkov med platformami (pogoni v oblaku, WebDAV, Docker, shranjevanje predmetov)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Uvoz knjig iz diskov v oblaku (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Uvoz knjig iz diskov v oblaku (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Uradni prevod v več kot 90 jezikov",
"Official dictionary with definitions, examples & pronunciation": "Uradni slovar z definicijami, primeri in izgovorjavo",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI bralni pripomočki (povzetki poglavij, oris, pripovedovanje v več vlogah)",
@@ -1319,5 +1318,56 @@
"Enter your Notion personal access token": "Vnesite svoj osebni dostopni žeton Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "V nastavitvah nastavite privzeto možnost sinhronizacije na lokalno ali nadgradite na Pro za sinhronizacijo z več prostora za shranjevanje v oblaku",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Kliknite ikono razširitve Koodo Reader v zgornjem desnem kotu brskalnika, odobrite zahtevo tej končni točki in poskusite znova",
"How to sync library across devices": "Kako sinhronizirati knjižnico med napravami"
}
"How to sync library across devices": "Kako sinhronizirati knjižnico med napravami",
"Enable reading ruler": "Omogoči bralno ravnilo",
"Reading ruler height (lines)": "Višina bralnega ravnila (vrstic)",
"Reading ruler background opacity": "Motnost ozadja bralnega ravnila",
"Enable speed reading": "Omogoči hitro branje",
"Reading speed (WPM)": "Hitrost branja (WPM)",
"ISBN": "ISBN",
"Rating": "Ocena",
"Rating count": "Število ocen",
"Publish date": "Datum izdaje",
"Categories": "Kategorije",
"Member login": "Prijava v račun",
"Register / Login": "Registracija / Prijava",
"Start 7-day free trial": "Začni 7-dnevni brezplačni preizkus",
"Scan for new books": "Skeniraj nove knjige",
"Recognize book title and author with AI on import": "Ob uvozu prepoznaj naslov in avtorja knjige z AI",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Če pri uvozu knjig iz metapodatkov knjige ni mogoče razbrati naslova, bo AI uporabljena za prepoznavanje naslova in avtorja",
"No image found in archive": "V arhivu ni najdene slike",
"Extract cover failed": "Pridobivanje naslovnice ni uspelo",
"Custom plugin security warning": "⚠️ <b>Resno varnostno opozorilo</b><br><br>Vtičniki po meri imajo popoln dostop do vašega računalnika in nadzor nad njim, zlasti vtičniki TTS po meri, ki lahko izvajajo poljubno kodo.<br>To pomeni, da bi lahko:<br>• brali, spreminjali ali brisali vaše datoteke<br>• ukradli račune, gesla in podatke brskalnika<br>• namestili zlonamerno programsko opremo<br>• na daljavo nadzorovali vašo napravo<br><br>Vtičnik dodajte šele, ko ste prepričani, da mu popolnoma zaupate in ste natančno pregledali vso njegovo kodo.<br>Nikoli ne dodajajte vtičnikov z neznanih spletnih strani, neznanih virov ali neuradnih kanalov.",
"Enable paragraph mode": "Omogoči način odstavkov",
"Import notes, highlights and dictionary history": "Uvozi opombe, poudarke in zgodovino slovarja",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Izberite predhodno izvožene datoteke CSV ali JSON za uvoz opomb, poudarkov in zgodovine slovarja nazaj v knjižnico",
"Invalid data": "Neveljavni podatki",
"The book {{name}} is not found in the library, please import the original book before importing": "Knjiga {{name}} ni najdena v knjižnici, pred uvozom uvozite izvirno knjigo",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Uvoženih {{imported}} zapisov, preskočenih {{skipped}} obstoječih zapisov",
"Download featured backgrounds": "Prenesi izbrana ozadja",
"Official background": "Uradno ozadje",
"Recognize title with AI": "Prepoznaj naslov z AI",
"Download open dictionaries": "Prenesi odprte slovarje",
"Dictionary already downloaded": "Slovar je že prenesen",
"Source": "Vir",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definicije besed in način hitrega branja ne morejo biti omogočeni hkrati",
"Reading ruler height": "Višina bralnega ravnila",
"FAQ": "Pogosta vprašanja",
"Auto scan and import books when starting the app or when clicking Scan": "Samodejno skeniraj in uvozi knjige ob zagonu aplikacije ali kliku na Skeniraj",
"Please enter book name": "Vnesite ime knjige",
"Waiting for download...": "Čakanje na prenos...",
"Pin to right": "Pripni desno",
"Unpin": "Odpni",
"Resize": "Spremeni velikost",
"Limited free": "Časovno omejeno brezplačno",
"7-day free trial upon registration, then billed $4.99 per Year": "7-dnevni brezplačni preizkus ob registraciji, nato obračun $4.99 letno",
"Yearly": "Letno",
"Year": "Leto",
"Limited offer": "Časovno omejena ponudba",
"$4.99": "$4.99",
"Title recognized successfully": "Naslov je bil uspešno prepoznan",
"Failed to recognize title": "Prepoznavanje naslova ni uspelo",
"Show total page number (Experimental)": "Pokaži skupno število strani (eksperimentalno)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Ta različica Koodo Reader je prestara. Pojdite v Nastavitve - O programu - Preveri posodobitve, posodobite Koodo Reader na najnovejšo različico in poskusite znova.",
"Background opacity": "Motnost ozadja"
}
+60 -10
View File
@@ -139,7 +139,7 @@
"Sort by Date": "Sortiraj po datumu",
"Descend": "Silazno",
"Ascend": "Uzlazno",
"Token": "Token",
"Token": "Pristupni token",
"Book not exists": "Knjiga ne postoji",
"Please authorize your account, and fill the following box with the token": "Autorizujte svoj nalog i unesite token u polje ispod",
"Copy link": "Kopiraj link",
@@ -476,7 +476,7 @@
"Please add data source in the setting": "Molimo dodajte izvor podataka u podešavanjima",
"Don't automatically pre-cache books for mobile version after import": "Nemoj automatski pred-cache-ovati knjige za mobilnu verziju nakon uvoza",
"Upon importing, books will be automatically pre-cached, enabling seamless access in the mobile version. However, this process may consume additional storage space and extend the import duration. You can still do it manually": "Nakon uvoza, knjige će biti automatski pred-cache-ovane, omogućavajući nesmetan pristup u mobilnoj verziji. Međutim, ovaj proces može zauzeti dodatni prostor za skladištenje i produžiti trajanje uvoza. I dalje to možete uraditi ručno",
"Test": "Test",
"Test": "Testiraj",
"Minute": "Minut",
"Get error log": "Preuzmite log greške",
"Account type": "Tip naloga",
@@ -838,6 +838,7 @@
"Bilingual translation": "Dvojezični prevod",
"Use AI to analyze books, with different characters reading aloud in different voices": "Koristi AI za analizu knjiga, sa različitim likovima koji čitaju naglas različitim glasovima",
"Voice type": "Tip glasa",
"Please reselect voices for all roles": "Izaberite ponovo glasove za sve uloge",
"System voice": "Sistemski glas",
"Purchase the code": "Kupite kod",
"Please upgrade to Pro to use this feature": "Molimo nadogradite na Pro da biste koristili ovu funkciju",
@@ -987,9 +988,9 @@
"Language code, e.g. en / fr / de / es": "Kod jezika, npr.: en / fr / de / es",
"Auto sync new words to AnkiConnect": "Automatski sinhronizuj nove reči sa AnkiConnect",
"When you look up a word, it will be automatically added to an Anki deck via AnkiConnect (must be running locally)": "Kada potražite reč, ona će biti automatski dodata u Anki špil putem AnkiConnect (mora biti pokrenut lokalno).",
"Host": "Host",
"Host": "Server",
"e.g. 127.0.0.1": "npr.: 127.0.0.1",
"Port": "Port",
"Port": "Broj porta",
"e.g. 8765": "npr.: 8765",
"Key": "Ključ",
"Api key": "API ključ",
@@ -1023,7 +1024,7 @@
"Chinese words level": "Nivo kineskih reči",
"English words level": "Nivo engleskih reči",
"Japanese words level": "Nivo japanskih reči",
"TXT parser": "TXT parser",
"TXT parser": "TXT analizator",
"Default parser": "Podrazumevani parser",
"Add new parser": "Dodaj novi parser",
"Suitable for most txt files": "Pogodno za većinu txt datoteka",
@@ -1143,8 +1144,6 @@
"None": "Nijedan",
"Slide": "Slajd",
"Flip": "Okreni",
"Custom voice plugins are not supported": "Prilagođeni glasovni dodaci nisu podržani",
"Custom voice plugins have been disabled": "Prilagođeni glasovni dodaci su onemogućeni",
"Paste voice list JSON": "Nalepite glasovnu listu ZZPROT0ZZ",
"Invalid voice list JSON": "Unesite neprazan JSON niz sa važećim konfiguracijama glasova",
"Failed to load more": "Učitavanje više nije uspelo",
@@ -1289,7 +1288,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Kada izađete iz Pro, odmah ćete izgubiti sledeće pogodnosti za članove",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "U budućnosti ćemo uvesti više ekskluzivnih funkcija za članove, uključujući statistiku čitanja i automatsku sinhronizaciju vaših beleški, istaknutih delova, napretka čitanja i lista rečnika na platformama kao što su ZZPROT0ZZ, ZZPROT1ZZ, ZZPROT2ZZ, ZZPROT3ZZ i još mnogo toga.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sinhronizacija podataka na više platformi (klaud diskovi, ZZPROT0ZZ, ZZPROT1ZZ, skladištenje objekata)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Uvezite knjige sa klaud diskova (Baidu Netdisk, ZZPROT0ZZ, ZZPROT1ZZ, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Uvezite knjige sa klaud diskova (OneDrive, ZZPROT0ZZ, ZZPROT1ZZ, FTP, SMB)",
"Official translation in 90+ languages": "Zvanični prevod na više od 90 jezika",
"Official dictionary with definitions, examples & pronunciation": "Zvanični rečnik sa definicijama, primerima i izgovorom",
"AI reading aids (chapter summaries, outline, multi-role narration)": "ZZPROT0ZZ pomagala za čitanje (sažeci poglavlja, nacrt, naracija sa više uloga)",
@@ -1320,5 +1319,56 @@
"Enter your Notion personal access token": "Unesite svoj ZZPROT0ZZ lični token za pristup",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Podesite podrazumevanu opciju sinhronizacije na lokalnu u podešavanjima ili nadogradite na Pro da biste sinhronizovali sa više skladišta u oblaku",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Kliknite na ikonu ekstenzije ZZPROT0ZZ u gornjem desnom uglu pregledača, autorizujte zahtev ovoj krajnjoj tački i pokušajte ponovo",
"How to sync library across devices": "Kako da sinhronizujete biblioteku na različitim uređajima"
}
"How to sync library across devices": "Kako da sinhronizujete biblioteku na različitim uređajima",
"Enable reading ruler": "Omogući lenjir za čitanje",
"Reading ruler height (lines)": "Visina lenjira za čitanje (redova)",
"Reading ruler background opacity": "Neprozirnost pozadine lenjira za čitanje",
"Enable speed reading": "Omogući brzo čitanje",
"Reading speed (WPM)": "Brzina čitanja (WPM)",
"ISBN": "ISBN",
"Rating": "Ocena",
"Rating count": "Broj ocena",
"Publish date": "Datum objavljivanja",
"Categories": "Kategorije",
"Member login": "Prijava na nalog",
"Register / Login": "Registruj se / Prijavi se",
"Start 7-day free trial": "Započni 7-dnevnu besplatnu probu",
"Scan for new books": "Skeniraj nove knjige",
"Recognize book title and author with AI on import": "Prepoznaj naslov i autora knjige pomoću AI pri uvozu",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Ako se pri uvozu knjiga naslov ne prepozna iz metapodataka knjige, AI će se koristiti za prepoznavanje naslova i autora",
"No image found in archive": "Nije pronađena nijedna slika u arhivi",
"Extract cover failed": "Izdvajanje naslovne strane nije uspelo",
"Custom plugin security warning": "⚠️ <b>Ozbiljno bezbednosno upozorenje</b><br><br>Prilagođeni dodaci imaju potpun pristup vašem računaru i kontrolu nad njim, posebno prilagođeni TTS dodaci, koji mogu izvršavati proizvoljan kod.<br>To znači da bi mogli da:<br>• čitaju, menjaju ili brišu vaše datoteke<br>• ukradu naloge, lozinke i podatke pregledača<br>• instaliraju zlonamerni softver<br>• daljinski kontrolišu vaš uređaj<br><br>Dodatak dodajte tek kada ste sigurni da mu potpuno verujete i da ste pažljivo pregledali ceo njegov kod.<br>Nikada ne dodajte dodatke sa nepoznatih veb lokacija, nepoznatih izvora ili nezvaničnih kanala.",
"Enable paragraph mode": "Omogući režim pasusa",
"Import notes, highlights and dictionary history": "Uvezi beleške, istaknuto i istoriju rečnika",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Izaberite prethodno izvezene CSV ili JSON datoteke da uvezete beleške, istaknuto i istoriju rečnika nazad u biblioteku",
"Invalid data": "Nevažeći podaci",
"The book {{name}} is not found in the library, please import the original book before importing": "Knjiga {{name}} nije pronađena u biblioteci, uvezite originalnu knjigu pre uvoza",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Uvezeno {{imported}} zapisa, preskočeno {{skipped}} postojećih zapisa",
"Download featured backgrounds": "Preuzmi istaknute pozadine",
"Official background": "Zvanična pozadina",
"Recognize title with AI": "Prepoznaj naslov pomoću AI",
"Download open dictionaries": "Preuzmi otvorene rečnike",
"Dictionary already downloaded": "Rečnik je već preuzet",
"Source": "Izvor",
"Word definitions and fast reading mode cannot be enabled at the same time": "Definicije reči i režim brzog čitanja ne mogu se omogućiti istovremeno",
"Reading ruler height": "Visina lenjira za čitanje",
"FAQ": "Često postavljana pitanja",
"Auto scan and import books when starting the app or when clicking Scan": "Automatski skeniraj i uvezi knjige pri pokretanju aplikacije ili klikom na Skeniraj",
"Please enter book name": "Unesite naziv knjige",
"Waiting for download...": "Čekanje na preuzimanje...",
"Pin to right": "Zakači desno",
"Unpin": "Otkači",
"Resize": "Promeni veličinu",
"Limited free": "Ograničeno besplatno",
"7-day free trial upon registration, then billed $4.99 per Year": "7-dnevna besplatna proba po registraciji, zatim naplata $4.99 godišnje",
"Yearly": "Godišnje",
"Year": "Godina",
"Limited offer": "Ograničena ponuda",
"$4.99": "$4.99",
"Title recognized successfully": "Naslov je uspešno prepoznat",
"Failed to recognize title": "Prepoznavanje naslova nije uspelo",
"Show total page number (Experimental)": "Prikaži ukupan broj stranica (eksperimentalno)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Ova verzija Koodo Reader-a je prestara. Idite na Podešavanja - O programu - Proveri ažuriranja da ažurirate Koodo Reader na najnoviju verziju i pokušajte ponovo.",
"Background opacity": "Neprozirnost pozadine"
}
+57 -7
View File
@@ -844,6 +844,7 @@
"Bilingual translation": "Tvåspråkig översättning",
"Use AI to analyze books, with different characters reading aloud in different voices": "Använd AI för att analysera böcker, där olika karaktärer läser högt med olika röster",
"Voice type": "Rösttyp",
"Please reselect voices for all roles": "Välj om rösterna för alla roller",
"System voice": "Systemröst",
"Purchase the code": "Köp koden",
"Please upgrade to Pro to use this feature": "Uppgradera till Pro för att använda denna funktion",
@@ -995,7 +996,7 @@
"When you look up a word, it will be automatically added to an Anki deck via AnkiConnect (must be running locally)": "När du slår upp ett ord läggs det automatiskt till i en Anki-lek via AnkiConnect (måste köras lokalt)",
"Host": "Värd",
"e.g. 127.0.0.1": "t.ex. 127.0.0.1",
"Port": "Port",
"Port": "Portnummer",
"e.g. 8765": "t.ex. 8765",
"Key": "Nyckel",
"Api key": "API-nyckel",
@@ -1149,8 +1150,6 @@
"None": "Ingen",
"Slide": "Glid",
"Flip": "Vänd",
"Custom voice plugins are not supported": "Anpassade röstinsticksprogram stöds inte",
"Custom voice plugins have been disabled": "Anpassade röstinsticksprogram har inaktiverats",
"Paste voice list JSON": "Klistra in röstlistan JSON",
"Invalid voice list JSON": "Ange en icke-tom JSON-array som innehåller giltiga röstkonfigurationer",
"Failed to load more": "Det gick inte att ladda fler",
@@ -1287,7 +1286,7 @@
"Ellipse": "Ellips",
"Line": "Linje",
"Arrow": "Pil",
"Text": "Text",
"Text": "Textruta",
"Text size": "Textstorlek",
"Text font": "Teckensnitt",
"Still refuse": "Vägra fortfarande",
@@ -1295,7 +1294,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "När du avslutar Pro kommer du omedelbart att förlora följande medlemsförmåner",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "I framtiden kommer vi att introducera fler medlemsexklusiva funktioner, inklusive lässtatistik och automatisk synkronisering av dina anteckningar, höjdpunkter, läsförlopp och ordförrådslistor till plattformar som Notion, Obsidian, Logseq, Anki och mer.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Platsöverskridande datasynkronisering (molnenheter, WebDAV, Docker, objektlagring)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Importera böcker från molnenheter (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Importera böcker från molnenheter (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Officiell översättning på 90+ språk",
"Official dictionary with definitions, examples & pronunciation": "Officiell ordbok med definitioner, exempel och uttal",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI läshjälpmedel (kapitelsammanfattningar, disposition, berättande med flera roller)",
@@ -1326,5 +1325,56 @@
"Enter your Notion personal access token": "Ange din Notion personliga åtkomsttoken",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Ställ in standardsynkroniseringsalternativet till lokalt i inställningarna, eller uppgradera till Pro för att synkronisera med mer molnlagring",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Klicka på tilläggsikonen Koodo Reader i det övre högra hörnet av webbläsaren, auktorisera begäran till denna slutpunkt och försök igen",
"How to sync library across devices": "Hur man synkroniserar bibliotek mellan enheter"
}
"How to sync library across devices": "Hur man synkroniserar bibliotek mellan enheter",
"Enable reading ruler": "Aktivera läslinjal",
"Reading ruler height (lines)": "Läslinjalens höjd (rader)",
"Reading ruler background opacity": "Läslinjalens bakgrundsopacitet",
"Enable speed reading": "Aktivera snabbläsning",
"Reading speed (WPM)": "Läshastighet (WPM)",
"ISBN": "ISBN",
"Rating": "Betyg",
"Rating count": "Antal betyg",
"Publish date": "Publiceringsdatum",
"Categories": "Kategorier",
"Member login": "Medlemsinloggning",
"Register / Login": "Registrera / Logga in",
"Start 7-day free trial": "Starta 7 dagars gratis provperiod",
"Scan for new books": "Sök efter nya böcker",
"Recognize book title and author with AI on import": "Känn igen boktitel och författare med AI vid import",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Om ingen boktitel kan läsas ut från bokens metadata vid import används AI för att känna igen titel och författare",
"No image found in archive": "Ingen bild hittades i arkivet",
"Extract cover failed": "Kunde inte extrahera omslaget",
"Custom plugin security warning": "⚠️ <b>Allvarlig säkerhetsvarning</b><br><br>Anpassade pluginer har full åtkomst till och kontroll över din dator, särskilt anpassade TTS-pluginer, som kan köra godtycklig kod.<br>Det innebär att de kan:<br>• läsa, ändra eller radera dina filer<br>• stjäla konton, lösenord och webbläsardata<br>• installera skadlig programvara<br>• fjärrstyra din enhet<br><br>Lägg bara till en plugin när du är säker på att du litar helt på den och noggrant har granskat all dess kod.<br>Lägg aldrig till pluginer från okända webbplatser, okända källor eller inofficiella kanaler.",
"Enable paragraph mode": "Aktivera styckeläge",
"Import notes, highlights and dictionary history": "Importera anteckningar, markeringar och ordlistehistorik",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Välj tidigare exporterade CSV- eller JSON-filer för att importera anteckningar, markeringar och ordlistehistorik tillbaka till biblioteket",
"Invalid data": "Ogiltiga data",
"The book {{name}} is not found in the library, please import the original book before importing": "Boken {{name}} hittades inte i biblioteket. Importera originalboken först",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} poster importerade, {{skipped}} befintliga poster hoppades över",
"Download featured backgrounds": "Ladda ner utvalda bakgrunder",
"Official background": "Officiell bakgrund",
"Recognize title with AI": "Känn igen titel med AI",
"Download open dictionaries": "Ladda ner öppna ordlistor",
"Dictionary already downloaded": "Ordlistan har redan laddats ner",
"Source": "Källa",
"Word definitions and fast reading mode cannot be enabled at the same time": "Orddefinitioner och snabbläsning kan inte aktiveras samtidigt",
"Reading ruler height": "Läslinjalens höjd",
"FAQ": "Vanliga frågor",
"Auto scan and import books when starting the app or when clicking Scan": "Skanna och importera böcker automatiskt när appen startar eller när du klickar på Skanna",
"Please enter book name": "Ange bokens namn",
"Waiting for download...": "Väntar på nedladdning...",
"Pin to right": "Fäst till höger",
"Unpin": "Lossa",
"Resize": "Ändra storlek",
"Limited free": "Tillfälligt gratis",
"7-day free trial upon registration, then billed $4.99 per Year": "7 dagars gratis provperiod vid registrering, därefter $4.99 per år",
"Yearly": "Årligen",
"Year": "År",
"Limited offer": "Tidsbegränsat erbjudande",
"$4.99": "$4.99",
"Title recognized successfully": "Titeln kändes igen",
"Failed to recognize title": "Kunde inte känna igen titeln",
"Show total page number (Experimental)": "Visa totalt sidantal (experimentell)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Den här versionen av Koodo Reader är för gammal. Gå till Inställningar - Om - Sök efter uppdateringar för att uppdatera Koodo Reader till den senaste versionen och försök igen.",
"Background opacity": "Bakgrundens opacitet"
}
+54 -4
View File
@@ -838,6 +838,7 @@
"Bilingual translation": "இருமொழி மொழிபெயர்ப்பு",
"Use AI to analyze books, with different characters reading aloud in different voices": "புத்தகங்களை பகுப்பாய்வு செய்ய AI ஐப் பயன்படுத்தவும், வெவ்வேறு கதாபாத்திரங்கள் வெவ்வேறு குரல்களில் சத்தமாக வாசிக்கும்",
"Voice type": "குரல் வகை",
"Please reselect voices for all roles": "தயவுசெய்து அனைத்து பாத்திரங்களுக்கும் குரல்களை மீண்டும் தேர்ந்தெடுங்கள்",
"System voice": "கணினி குரல்",
"Purchase the code": "குறியீட்டை வாங்க",
"Please upgrade to Pro to use this feature": "இந்த அம்சத்தைப் பயன்படுத்த Pro ஆக மேம்படுத்தவும்",
@@ -1143,8 +1144,6 @@
"None": "எதுவும் இல்லை",
"Slide": "ஸ்லைடு",
"Flip": "புரட்டு",
"Custom voice plugins are not supported": "தனிப்பயன் குரல் பிளக்க-இன்கள் ஆதரிக்கப்படவில்லை",
"Custom voice plugins have been disabled": "தனிப்பயன் குரல் பிளக்க-இன்கள் முடக்கப்பட்டுள்ளன",
"Paste voice list JSON": "குரல் பட்டியல் JSON-ஐ ஒட்டவும்",
"Invalid voice list JSON": "சரியான குரல் கட்டமைப்புகளைக் கொண்ட காலியற்ற JSON அணியை உள்ளிடவும்",
"Failed to load more": "மேலும் ஏற்ற முடியவில்லை",
@@ -1289,7 +1288,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro-இல் இருந்து வெளியேறியவுடன், ஒத்திசைவு மற்றும் பிற பிரீமியம் அம்சங்களைப் பயன்படுத்த முடியாது",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "எதிர்காலத்தில், வாசிப்பு புள்ளிவிவரங்கள் மற்றும் உங்கள் குறிப்புகள், உயர்த்திகாட்டுகள், வாசிப்பு முன்னேற்றம் மற்றும் சொல்லகராதி பட்டியல்களை Notion, Obsidian, Logseq, Anki போன்ற தளங்களுக்கு தானியங்கி ஒத்திசைத்தல் உள்ளிட்ட மேலும் உறுப்பினர்-மட்டும் அம்சங்களை அறிமுகப்படுத்துவோம்.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "கிராஸ்-ப்ளாட்ஃபார்ம் தரவு ஒத்திசைவு (கிளவுட் டிரைவ்கள், WebDAV, Docker, ஆப்ஜெக்ட் ஸ்டோரேஜ்)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "கிளவுட் டிரைவ்களில் (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB) இருந்து புத்தகங்களை இறக்குமதி செய்",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "கிளவுட் டிரைவ்களில் (OneDrive, Google Drive, WebDAV, FTP, SMB) இருந்து புத்தகங்களை இறக்குமதி செய்",
"Official translation in 90+ languages": "90+ மொழிகளில் அதிகாரப்பூர்வ மொழிபெயர்ப்பு",
"Official dictionary with definitions, examples & pronunciation": "அதிகாரப்பூர்வ அகராதி (வரையறைகள், எடுத்துக்காட்டுகள் & உச்சரிப்பு)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI வாசிப்பு உதவிகள் (அத்தியாயச் சுருக்கங்கள், குறிப்பெடுப்பு, பல-பாத்திர விவரிப்பு)",
@@ -1320,5 +1319,56 @@
"Enter your Notion personal access token": "உங்கள் Notion தனிப்பட்ட அணுகல் டோக்கனை உள்ளிடவும்",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "அமைப்புகளில் இயல்புநிலை ஒத்திசைவு விருப்பத்தை உள்ளூர் என அமைக்கவும், அல்லது அதிக கிளவுட் ஸ்டோரேஜுடன் ஒத்திசைக்க Pro-க்கு மேம்படுத்தவும்",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "உலாவியின் மேல் வலது மூலையில் உள்ள Koodo Reader நீட்டிப்பு ஐகானைக் கிளிக் செய்து, இந்த எண்ட்பாயிண்டிற்கான கோரிக்கையை அங்கீகரித்து, மீண்டும் முயற்சிக்கவும்",
"How to sync library across devices": "சாதனங்களுக்கிடையே நூலகத்தை எவ்வாறு ஒத்திசைப்பது"
"How to sync library across devices": "சாதனங்களுக்கிடையே நூலகத்தை எவ்வாறு ஒத்திசைப்பது",
"Enable reading ruler": "வாசிப்பு அளவுகோலை இயக்கு",
"Reading ruler height (lines)": "வாசிப்பு அளவுகோல் உயரம் (வரிகள்)",
"Reading ruler background opacity": "வாசிப்பு அளவுகோல் பின்னணி ஒளிபுகாமை",
"Enable speed reading": "விரைவு வாசிப்பை இயக்கு",
"Reading speed (WPM)": "வாசிப்பு வேகம் (WPM)",
"ISBN": "ISBN",
"Rating": "மதிப்பீடு",
"Rating count": "மதிப்பீடுகளின் எண்ணிக்கை",
"Publish date": "வெளியீட்டு தேதி",
"Categories": "வகைகள்",
"Member login": "உறுப்பினர் உள்நுழைவு",
"Register / Login": "பதிவு / உள்நுழைவு",
"Start 7-day free trial": "7 நாள் இலவச சோதனையைத் தொடங்கு",
"Scan for new books": "புதிய புத்தகங்களை ஸ்கேன் செய்",
"Recognize book title and author with AI on import": "இறக்குமதி செய்யும்போது AI மூலம் புத்தக தலைப்பு மற்றும் ஆசிரியரை அடையாளம் காண்",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "புத்தகங்களை இறக்குமதி செய்யும்போது, புத்தக மெட்டாடேட்டாவில் இருந்து தலைப்பு கண்டறியப்படவில்லை என்றால், தலைப்பு மற்றும் ஆசிரியரை அடையாளம் காண AI பயன்படுத்தப்படும்",
"No image found in archive": "காப்பகத்தில் படம் எதுவும் கிடைக்கவில்லை",
"Extract cover failed": "அட்டையைப் பிரித்தெடுக்க முடியவில்லை",
"Custom plugin security warning": "⚠️ <b>தீவிர பாதுகாப்பு எச்சரிக்கை</b><br><br>தனிப்பயன் செருகுநிரல்களுக்கு உங்கள் கணினியின் மீது முழு அணுகல் மற்றும் கட்டுப்பாடு உள்ளது, குறிப்பாக தனிப்பயன் TTS செருகுநிரல்கள், அவை தன்னிச்சையான குறியீட்டை இயக்கக்கூடும்.<br>இதன் பொருள் அவை:<br>• உங்கள் கோப்புகளைப் படிக்கவோ, மாற்றவோ, நீக்கவோ முடியும்<br>• கணக்குகள், கடவுச்சொற்கள், உலாவி தரவுகளைத் திருடலாம்<br>• தீங்கிழைக்கும் மென்பொருளை நிறுவலாம்<br>• உங்கள் சாதனத்தை தொலைவிலிருந்து கட்டுப்படுத்தலாம்<br><br>ஒரு செருகுநிரலை நீங்கள் முழுமையாக நம்புகிறீர்கள் என்று உறுதியாக நம்பி, அதன் முழு குறியீட்டையும் கவனமாக மதிப்பாய்வு செய்த பின்பே சேர்க்கவும்.<br>அறியப்படாத இணையதளங்கள், அறியப்படாத ஆதாரங்கள் அல்லது அதிகாரப்பூர்வமற்ற சேனல்களில் இருந்து ஒருபோதும் செருகுநிரல்களைச் சேர்க்க வேண்டாம்.",
"Enable paragraph mode": "பத்தி முறையை இயக்கு",
"Import notes, highlights and dictionary history": "குறிப்புகள், சிறப்பம்சங்கள் மற்றும் அகராதி வரலாற்றை இறக்குமதி செய்",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "முன்பு ஏற்றுமதி செய்த CSV அல்லது JSON கோப்புகளைத் தேர்ந்தெடுத்து, குறிப்புகள், சிறப்பம்சங்கள் மற்றும் அகராதி வரலாற்றை மீண்டும் நூலகத்திற்கு இறக்குமதி செய்",
"Invalid data": "தவறான தரவு",
"The book {{name}} is not found in the library, please import the original book before importing": "நூலகத்தில் {{name}} என்ற புத்தகம் கண்டறியப்படவில்லை, இறக்குமதி செய்வதற்கு முன் அசல் புத்தகத்தை இறக்குமதி செய்யவும்",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} பதிவுகள் இறக்குமதி செய்யப்பட்டன, {{skipped}} ஏற்கனவே உள்ள பதிவுகள் தவிர்க்கப்பட்டன",
"Download featured backgrounds": "சிறப்பு பின்னணிகளை பதிவிறக்கு",
"Official background": "அதிகாரப்பூர்வ பின்னணி",
"Recognize title with AI": "AI மூலம் தலைப்பை அடையாளம் காண்",
"Download open dictionaries": "திறந்த அகராதிகளை பதிவிறக்கு",
"Dictionary already downloaded": "அகராதி ஏற்கனவே பதிவிறக்கப்பட்டுள்ளது",
"Source": "மூலம்",
"Word definitions and fast reading mode cannot be enabled at the same time": "சொல் வரையறைகள் மற்றும் விரைவு வாசிப்பு முறையை ஒரே நேரத்தில் இயக்க முடியாது",
"Reading ruler height": "வாசிப்பு அளவுகோல் உயரம்",
"FAQ": "அடிக்கடி கேட்கப்படும் கேள்விகள்",
"Auto scan and import books when starting the app or when clicking Scan": "செயலியைத் தொடங்கும்போது அல்லது ஸ்கேனைக் கிளிக் செய்யும்போது புத்தகங்களைத் தானாக ஸ்கேன் செய்து இறக்குமதி செய்",
"Please enter book name": "புத்தகத்தின் பெயரை உள்ளிடவும்",
"Waiting for download...": "பதிவிறக்கத்திற்காக காத்திருக்கிறது...",
"Pin to right": "வலதுபுறம் பின் செய்",
"Unpin": "பின் நீக்கு",
"Resize": "அளவை மாற்று",
"Limited free": "குறிப்பிட்ட காலம் இலவசம்",
"7-day free trial upon registration, then billed $4.99 per Year": "பதிவு செய்தவுடன் 7 நாள் இலவச சோதனை, பின்னர் ஆண்டுக்கு $4.99 கட்டணம்",
"Yearly": "ஆண்டுதோறும்",
"Year": "ஆண்டு",
"Limited offer": "வரம்புக்குட்பட்ட சலுகை",
"$4.99": "$4.99",
"Title recognized successfully": "தலைப்பு வெற்றிகரமாக அடையாளம் காணப்பட்டது",
"Failed to recognize title": "தலைப்பை அடையாளம் காண முடியவில்லை",
"Show total page number (Experimental)": "மொத்த பக்க எண்ணிக்கையைக் காட்டு (சோதனை)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "இந்த Koodo Reader பதிப்பு மிகவும் பழையது. அமைப்புகள் - பற்றி - புதுப்பிப்பைச் சரிபார் என்பதற்குச் சென்று Koodo Reader-ஐ சமீபத்திய பதிப்பிற்குப் புதுப்பித்து மீண்டும் முயற்சிக்கவும்.",
"Background opacity": "பின்னணி ஒளிபுகாமை"
}
+54 -4
View File
@@ -839,6 +839,7 @@
"Bilingual translation": "แปลสองภาษา",
"Use AI to analyze books, with different characters reading aloud in different voices": "ใช้ AI วิเคราะห์หนังสือ โดยให้ตัวละครต่างกันอ่านออกเสียงด้วยเสียงต่างกัน",
"Voice type": "ประเภทเสียง",
"Please reselect voices for all roles": "โปรดเลือกเสียงสำหรับบทบาททั้งหมดอีกครั้ง",
"System voice": "เสียงระบบ",
"Purchase the code": "ซื้อรหัส",
"Please upgrade to Pro to use this feature": "โปรดอัปเกรดเป็น Pro เพื่อใช้ฟีเจอร์นี้",
@@ -1144,8 +1145,6 @@
"None": "ไม่มี",
"Slide": "เลื่อน",
"Flip": "พลิก",
"Custom voice plugins are not supported": "ไม่รองรับปลั๊กอินเสียงที่กำหนดเอง",
"Custom voice plugins have been disabled": "ปลั๊กอินเสียงที่กำหนดเองถูกปิดใช้งานแล้ว",
"Paste voice list JSON": "วาง JSON รายการเสียง",
"Invalid voice list JSON": "กรอก JSON อาร์เรย์ที่ไม่ว่างซึ่งมีคอนฟิกเสียงที่ถูกต้อง",
"Failed to load more": "โหลดเพิ่มเติมล้มเหลว",
@@ -1290,7 +1289,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "เมื่อคุณออกจาก Pro จะไม่สามารถใช้การซิงค์และฟีเจอร์พรีเมียมอื่นๆ ได้อีกต่อไป",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "ในอนาคต เราจะเปิดตัวฟีเจอร์เฉพาะสมาชิกเพิ่มเติม เช่น สถิติการอ่าน และการซิงค์บันทึก ส่วนที่เน้นข้อความ ความคืบหน้าการอ่าน และรายการคำศัพท์ของคุณไปยังแพลตฟอร์มอย่าง Notion, Obsidian, Logseq, Anki และอื่นๆ โดยอัตโนมัติ",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "การซิงค์ข้อมูลข้ามแพลตฟอร์ม (คลาวด์ไดรฟ์, WebDAV, Docker, Object Storage)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "นำเข้าหนังสือจากคลาวด์ไดรฟ์ (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "นำเข้าหนังสือจากคลาวด์ไดรฟ์ (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "คำแปลอย่างเป็นทางการใน 90+ ภาษา",
"Official dictionary with definitions, examples & pronunciation": "พจนานุกรมอย่างเป็นทางการ (คำนิยาม, ตัวอย่าง และการออกเสียง)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "เครื่องช่วยอ่านด้วย AI (สรุปบท, โครงเรื่อง, เล่าแบบหลายตัวละคร)",
@@ -1321,5 +1320,56 @@
"Enter your Notion personal access token": "กรอก Personal Access Token ของ Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "โปรดตั้งค่าตัวเลือกการซิงค์เริ่มต้นเป็นเครื่องในเครื่องในการตั้งค่า หรืออัปเกรดเป็น Pro เพื่อซิงค์กับที่เก็บคลาวด์อื่นๆ",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "กรุณาคลิกไอคอนส่วนขยาย Koodo Reader ที่มุมบนขวาของเบราว์เซอร์ อนุญาตคำขอนี้ไปยัง endpoint และลองอีกครั้ง",
"How to sync library across devices": "วิธีซิงค์คลังหนังสือข้ามอุปกรณ์"
"How to sync library across devices": "วิธีซิงค์คลังหนังสือข้ามอุปกรณ์",
"Enable reading ruler": "เปิดใช้งานไม้บรรทัดอ่านหนังสือ",
"Reading ruler height (lines)": "ความสูงของไม้บรรทัดอ่านหนังสือ (บรรทัด)",
"Reading ruler background opacity": "ความทึบของพื้นหลังไม้บรรทัดอ่านหนังสือ",
"Enable speed reading": "เปิดใช้งานการอ่านเร็ว",
"Reading speed (WPM)": "ความเร็วในการอ่าน (WPM)",
"ISBN": "ISBN",
"Rating": "คะแนน",
"Rating count": "จำนวนผู้ให้คะแนน",
"Publish date": "วันที่เผยแพร่",
"Categories": "หมวดหมู่",
"Member login": "เข้าสู่ระบบสมาชิก",
"Register / Login": "สมัคร / เข้าสู่ระบบ",
"Start 7-day free trial": "เริ่มทดลองใช้ฟรี 7 วัน",
"Scan for new books": "สแกนหาหนังสือใหม่",
"Recognize book title and author with AI on import": "ใช้ AI จดจำชื่อหนังสือและผู้แต่งเมื่อนำเข้า",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "เมื่อนำเข้าหนังสือ หากไม่สามารถแยกชื่อหนังสือจากข้อมูลเมตาของหนังสือได้ ระบบจะใช้ AI จดจำชื่อหนังสือและผู้แต่ง",
"No image found in archive": "ไม่พบรูปภาพในไฟล์บีบอัด",
"Extract cover failed": "แยกปกไม่สำเร็จ",
"Custom plugin security warning": "⚠️ <b>คำเตือนด้านความปลอดภัยร้ายแรง</b><br><br>ปลั๊กอินที่กำหนดเองมีสิทธิ์เข้าถึงและควบคุมคอมพิวเตอร์ของคุณได้เต็มรูปแบบ โดยเฉพาะปลั๊กอิน TTS ที่กำหนดเองซึ่งสามารถเรียกใช้โค้ดใดก็ได้<br>ซึ่งหมายความว่าปลั๊กอินเหล่านี้อาจ:<br>• อ่าน แก้ไข หรือลบไฟล์ของคุณ<br>• ขโมยบัญชี รหัสผ่าน และข้อมูลเบราว์เซอร์<br>• ติดตั้งมัลแวร์<br>• ควบคุมอุปกรณ์ของคุณจากระยะไกล<br><br>เพิ่มปลั๊กอินหลังจากที่คุณแน่ใจว่าคุณเชื่อถือได้อย่างเต็มที่และได้ตรวจสอบโค้ดทั้งหมดอย่างรอบคอบแล้วเท่านั้น<br>ห้ามเพิ่มปลั๊กอินจากเว็บไซต์ที่ไม่รู้จัก แหล่งที่มาไม่ทราบแน่ชัด หรือช่องทางที่ไม่เป็นทางการโดยเด็ดขาด",
"Enable paragraph mode": "เปิดใช้งานโหมดย่อหน้า",
"Import notes, highlights and dictionary history": "นำเข้าบันทึกย่อ ไฮไลต์ และประวัติพจนานุกรม",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "เลือกไฟล์ CSV หรือ JSON ที่ส่งออกไว้ก่อนหน้า เพื่อนำเข้าบันทึกย่อ ไฮไลต์ และประวัติพจนานุกรมกลับเข้าคลังหนังสือ",
"Invalid data": "ข้อมูลไม่ถูกต้อง",
"The book {{name}} is not found in the library, please import the original book before importing": "ไม่พบหนังสือ {{name}} ในคลังหนังสือ โปรดนำเข้าหนังสือต้นฉบับก่อนจึงจะนำเข้าได้",
"Imported {{imported}} records, skipped {{skipped}} existing records": "นำเข้าแล้ว {{imported}} รายการ ข้าม {{skipped}} รายการที่มีอยู่แล้ว",
"Download featured backgrounds": "ดาวน์โหลดภาพพื้นหลังเด่น",
"Official background": "ภาพพื้นหลังอย่างเป็นทางการ",
"Recognize title with AI": "จดจำชื่อเรื่องด้วย AI",
"Download open dictionaries": "ดาวน์โหลดพจนานุกรมโอเพนซอร์ส",
"Dictionary already downloaded": "ดาวน์โหลดพจนานุกรมแล้ว",
"Source": "แหล่งที่มา",
"Word definitions and fast reading mode cannot be enabled at the same time": "ไม่สามารถเปิดใช้งานคำจำกัดความของคำและการอ่านเร็วพร้อมกันได้",
"Reading ruler height": "ความสูงของไม้บรรทัดอ่านหนังสือ",
"FAQ": "คำถามที่พบบ่อย",
"Auto scan and import books when starting the app or when clicking Scan": "สแกนและนำเข้าหนังสืออัตโนมัติเมื่อเปิดแอปหรือเมื่อคลิกสแกน",
"Please enter book name": "โปรดป้อนชื่อหนังสือ",
"Waiting for download...": "กำลังรอการดาวน์โหลด...",
"Pin to right": "ปักหมุดไว้ด้านขวา",
"Unpin": "เลิกปักหมุด",
"Resize": "ปรับขนาด",
"Limited free": "ฟรีจำกัดเวลา",
"7-day free trial upon registration, then billed $4.99 per Year": "ทดลองใช้ฟรี 7 วันเมื่อสมัคร จากนั้นคิดค่าบริการ $4.99 ต่อปี",
"Yearly": "รายปี",
"Year": "ปี",
"Limited offer": "ข้อเสนอจำกัดเวลา",
"$4.99": "$4.99",
"Title recognized successfully": "จดจำชื่อเรื่องสำเร็จ",
"Failed to recognize title": "จดจำชื่อเรื่องไม่สำเร็จ",
"Show total page number (Experimental)": "แสดงจำนวนหน้าทั้งหมด (ทดลอง)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Koodo Reader เวอร์ชันนี้เก่าเกินไป โปรดไปที่ การตั้งค่า - เกี่ยวกับ - ตรวจสอบอัปเดต เพื่ออัปเดต Koodo Reader เป็นเวอร์ชันล่าสุดแล้วลองอีกครั้ง",
"Background opacity": "ความทึบของภาพพื้นหลัง"
}
+59 -9
View File
@@ -803,7 +803,7 @@
"Allow Javascript in the books": "Payagan ang Javascript sa mga aklat",
"Configuration": "Konfigurasyon",
"Features": "Mga Feature",
"Website": "Website",
"Website": "Websayt",
"Installed": "Naka-install",
"AI Encyclopedia": "Ensayklopedyang AI",
"Not installed": "Hindi naka-install",
@@ -837,6 +837,7 @@
"Bilingual translation": "Pagsasalin ng bilingual",
"Use AI to analyze books, with different characters reading aloud in different voices": "Gumamit ng AI upang suriin ang mga aklat, na may iba't ibang karakter na nagbabasa nang malakas sa iba't ibang boses",
"Voice type": "Uri ng boses",
"Please reselect voices for all roles": "Muling piliin ang mga boses para sa lahat ng role",
"System voice": "Boses ng sistema",
"Purchase the code": "Bumili ng code",
"Please upgrade to Pro to use this feature": "Mangyaring mag-upgrade sa Pro upang gamitin ang feature na ito",
@@ -857,7 +858,7 @@
"Yellow": "Dilaw",
"Violet": "Lila",
"Sky": "Asul na langit",
"Slate": "Slate",
"Slate": "Abong asul",
"Show page border": "Ipakita ang border ng pahina",
"Custom": "Pasadya",
"Please upgrade to Pro to unlock more daily free quota or wait until the quota resets. You can also use other TTS voices instead.": "Mangyaring mag-upgrade sa Pro upang i-unlock ang mas maraming pang-araw-araw na libreng quota o maghintay hanggang ma-reset ang quota. Maaari ka ring gumamit ng ibang mga boses TTS.",
@@ -1142,8 +1143,6 @@
"None": "Wala",
"Slide": "I-slide",
"Flip": "I-flip",
"Custom voice plugins are not supported": "Hindi sinusuportahan ang mga custom na voice plugin",
"Custom voice plugins have been disabled": "Na-disable na ang mga custom na voice plugin",
"Paste voice list JSON": "I-paste ang JSON ng listahan ng boses",
"Invalid voice list JSON": "Maglagay ng hindi-bakanteng JSON array na naglalaman ng wastong mga config ng boses",
"Failed to load more": "Nabigo ang pag-load ng karagdagan",
@@ -1266,11 +1265,11 @@
"Annotation": "Anotasyon",
"Brush color": "Kulay ng brush",
"Brush width": "Kapal ng brush",
"Brush": "Brush",
"Highlighter": "Highlighter",
"Brush": "Pinsel",
"Highlighter": "Pang-highlight",
"Highlighter color": "Kulay ng highlighter",
"Highlighter width": "Kapal ng highlighter",
"Opacity": "Opacity",
"Opacity": "Opasidad",
"Shape": "Hugis",
"Shape type": "Uri ng hugis",
"Shape color": "Kulay ng hugis",
@@ -1288,7 +1287,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Kapag umalis ka sa Pro, hindi mo na magagamit ang pag-sync at iba pang premium na feature",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Sa hinaharap, magpapakilala kami ng mas maraming eksklusibong tampok para sa mga miyembro, kabilang ang mga istatistika sa pagbasa at awtomatikong pag-sync ng iyong mga tala, highlights, progreso sa pagbasa, at mga listahan ng bokabularyo sa mga platform tulad ng Notion, Obsidian, Logseq, Anki, at iba pa.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Sync ng data sa iba't ibang platform (cloud drives, WebDAV, Docker, object storage)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Mag-import ng mga aklat mula sa cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Mag-import ng mga aklat mula sa cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Opisyal na pagsasalin sa 90+ wika",
"Official dictionary with definitions, examples & pronunciation": "Opisyal na diksyunaryo (mga depinisyon, halimbawa at pagbigkas)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Tulong sa pagbasa gamit ang AI (buod ng kabanata, balangkas, pagsasalaysay ng maraming tauhan)",
@@ -1319,5 +1318,56 @@
"Enter your Notion personal access token": "Ilagay ang iyong Notion personal access token",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Mangyaring itakda ang default na opsyon sa pag-sync sa lokal sa mga setting, o mag-upgrade sa Pro para mag-sync sa mas maraming cloud storage",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Mangyaring i-click ang icon ng Koodo Reader extension sa kanang itaas na sulok ng browser, bigyan ng awtorisasyon ang kahilingan sa endpoint na ito, at subukang muli",
"How to sync library across devices": "Paano mag-sync ng library sa iba't ibang device"
"How to sync library across devices": "Paano mag-sync ng library sa iba't ibang device",
"Enable reading ruler": "Paganahin ang panukat sa pagbasa",
"Reading ruler height (lines)": "Taas ng panukat sa pagbasa (mga linya)",
"Reading ruler background opacity": "Opasidad ng background ng panukat sa pagbasa",
"Enable speed reading": "Paganahin ang mabilis na pagbasa",
"Reading speed (WPM)": "Bilis ng pagbasa (WPM)",
"ISBN": "ISBN",
"Rating": "Reyting",
"Rating count": "Bilang ng reyting",
"Publish date": "Petsa ng paglalathala",
"Categories": "Mga Kategorya",
"Member login": "Pag-login ng miyembro",
"Register / Login": "Magrehistro / Mag-login",
"Start 7-day free trial": "Simulan ang 7-araw na libreng pagsubok",
"Scan for new books": "I-scan ang mga bagong libro",
"Recognize book title and author with AI on import": "Kilalanin ang pamagat at may-akda ng libro gamit ang AI sa pag-import",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Kapag nag-import ng mga libro, kung walang pamagat ng libro na ma-parse mula sa metadata ng libro, gagamitin ang AI para kilalanin ang pamagat at may-akda ng libro",
"No image found in archive": "Walang larawan na natagpuan sa archive",
"Extract cover failed": "Nabigo ang pagkuha ng pabalat",
"Custom plugin security warning": "⚠️ <b>Malubhang Babala sa Seguridad</b><br><br>Ang mga custom na plugin ay may buong access at kontrol sa iyong computer, lalo na ang mga custom na TTS plugin, na maaaring magpatakbo ng anumang code.<br>Ibig sabihin, maaari nilang:<br>• Basahin, baguhin, o burahin ang iyong mga file<br>• Nakawin ang mga account, password, at data ng browser<br>• Mag-install ng malware<br>• Kontrolin ang iyong device mula sa malayo<br><br>Magdagdag lamang ng plugin kapag sigurado kang lubos mong pinagkakatiwalaan ito at maingat mong nasuri ang lahat ng code nito.<br>Huwag kailanman magdagdag ng plugin mula sa hindi kilalang website, hindi kilalang pinagmulan, o hindi opisyal na channel.",
"Enable paragraph mode": "Paganahin ang mode ng talata",
"Import notes, highlights and dictionary history": "Mag-import ng mga tala, highlight, at kasaysayan ng diksyunaryo",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Pumili ng mga dating na-export na CSV o JSON na file para i-import pabalik sa library ang mga tala, highlight, at kasaysayan ng diksyunaryo",
"Invalid data": "Di-wastong datos",
"The book {{name}} is not found in the library, please import the original book before importing": "Hindi natagpuan ang librong {{name}} sa library, paki-import muna ang orihinal na libro bago mag-import",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Nag-import ng {{imported}} record, nilaktawan ang {{skipped}} na existing na record",
"Download featured backgrounds": "I-download ang mga tampok na background",
"Official background": "Opisyal na background",
"Recognize title with AI": "Kilalanin ang pamagat gamit ang AI",
"Download open dictionaries": "I-download ang mga bukas na diksyunaryo",
"Dictionary already downloaded": "Na-download na ang diksyunaryo",
"Source": "Pinagmulan",
"Word definitions and fast reading mode cannot be enabled at the same time": "Hindi maaaring paganahin nang sabay ang mga kahulugan ng salita at ang mabilis na pagbasa",
"Reading ruler height": "Taas ng panukat sa pagbasa (mga linya)",
"FAQ": "Mga Madalas Itanong",
"Auto scan and import books when starting the app or when clicking Scan": "Awtomatikong i-scan at i-import ang mga libro kapag binubuksan ang app o kapag pinindot ang Scan",
"Please enter book name": "Pakilagay ang pangalan ng libro",
"Waiting for download...": "Naghihintay ng download...",
"Pin to right": "I-pin sa kanan",
"Unpin": "Alisin ang pin",
"Resize": "Baguhin ang laki",
"Limited free": "Limitadong libre",
"7-day free trial upon registration, then billed $4.99 per Year": "7-araw na libreng pagsubok pagkatapos magrehistro, pagkatapos ay sisingilin ng $4.99 bawat taon",
"Yearly": "Taunan",
"Year": "Taon",
"Limited offer": "Limitadong alok",
"$4.99": "$4.99",
"Title recognized successfully": "Matagumpay na nakilala ang pamagat",
"Failed to recognize title": "Nabigong makilala ang pamagat",
"Show total page number (Experimental)": "Ipakita ang kabuuang bilang ng pahina (Sperimental)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Masyadong luma ang bersyong ito ng Koodo Reader. Pumunta sa Mga setting - Tungkol sa - Suriin kung may update para i-update ang Koodo Reader sa pinakabagong bersyon at subukang muli.",
"Background opacity": "Opasidad ng background"
}
+55 -5
View File
@@ -571,7 +571,7 @@
"The Koodo Reader Docker version does not support the data source feature by default. You need to modify the configuration parameters during deployment to manually enable it. Also due to browser's security restrictions, the Docker service must be accessed via HTTPS protocol when you're visiting Koodo Reader via HTTPS protocol.": "Koodo Reader'ın Docker sürümü varsayılan olarak veri kaynağı özelliğini desteklemez. Bunu manuel olarak etkinleştirmek için dağıtım sırasında yapılandırma parametrelerini değiştirmeniz gerekir. Ayrıca tarayıcı güvenlik kısıtlamaları nedeniyle Koodo Reader'a HTTPS üzerinden erişirken Docker hizmetine de HTTPS ile erişilmelidir.",
"Select server region": "Sunucu bölgesini seçin",
"Server region": "Sunucu bölgesi",
"Global": "Global",
"Global": "Küresel",
"China": "Çin",
"Some login options and data sources are not available in your selected server region": "Bazı giriş seçenekleri ve veri kaynakları seçtiğiniz sunucu bölgesinde kullanılabilir değildir",
"Grant access to local folder to save your data and reduce the risk of data loss": "Verilerinizi kaydetmek ve veri kaybı riskini azaltmak için yerel klasöre erişim izni verin",
@@ -840,6 +840,7 @@
"Bilingual translation": "İki dilli çeviri",
"Use AI to analyze books, with different characters reading aloud in different voices": "Kitapları analiz etmek için AI kullanın, farklı karakterler farklı seslerle okusun",
"Voice type": "Ses türü",
"Please reselect voices for all roles": "Lütfen tüm roller için sesleri yeniden seçin",
"System voice": "Sistem sesi",
"Purchase the code": "Kodu satın al",
"Please upgrade to Pro to use this feature": "Bu özelliği kullanmak için lütfen Pro'ya yükseltin",
@@ -1145,8 +1146,6 @@
"None": "Yok",
"Slide": "Kaydır",
"Flip": "Çevir",
"Custom voice plugins are not supported": "Özel ses eklentileri desteklenmiyor",
"Custom voice plugins have been disabled": "Özel ses eklentileri devre dışı bırakıldı",
"Paste voice list JSON": "Ses listesi JSON'ını yapıştırın",
"Invalid voice list JSON": "Geçerli ses yapılandırmaları içeren boş olmayan bir JSON dizisi girin",
"Failed to load more": "Daha fazla yükleme başarısız",
@@ -1291,7 +1290,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Pro'dan çıktığınızda, senkronizasyon ve diğer premium özellikleri kaybedersiniz",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Gelecekte, notlarınızın, vurgularınızın, okuma ilerlemenizin ve kelime listenizin Notion, Obsidian, Logseq, Anki ve daha fazlası gibi platformlara otomatik senkronizasyonu ve okuma istatistikleri dahil olmak üzere daha fazla üyeye özel özellik sunacağız.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Çapraz platform veri senkronizasyonu (bulut sürücüleri, WebDAV, Docker, nesne depolama)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Bulut sürücülerinden kitap içe aktar (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Bulut sürücülerinden kitap içe aktar (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "90'dan fazla dilde resmi çeviri",
"Official dictionary with definitions, examples & pronunciation": "Tanımlar, örnekler ve telaffuz içeren resmi sözlük",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI okuma yardımcıları (bölüm özetleri, ana hat, çoklu rol anlatım)",
@@ -1322,5 +1321,56 @@
"Enter your Notion personal access token": "Notion kişisel erişim belirtecinizi girin",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Lütfen ayarlarda varsayılan senkronizasyon seçeneğini yerel olarak ayarlayın veya daha fazla bulut depolama ile senkronize etmek için Pro'ya yükseltin",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Lütfen tarayıcının sağ üst köşesindeki Koodo Reader uzantı simgesine tıklayın, bu uç noktaya erişim yetkisi verin ve tekrar deneyin",
"How to sync library across devices": "Kütüphane cihazlar arasında nasıl senkronize edilir"
"How to sync library across devices": "Kütüphane cihazlar arasında nasıl senkronize edilir",
"Enable reading ruler": "Okuma cetvelini etkinleştir",
"Reading ruler height (lines)": "Okuma cetveli yüksekliği (satır)",
"Reading ruler background opacity": "Okuma cetveli arka plan opaklığı",
"Enable speed reading": "Hızlı okumayı etkinleştir",
"Reading speed (WPM)": "Okuma hızı (WPM)",
"ISBN": "ISBN",
"Rating": "Puan",
"Rating count": "Puan sayısı",
"Publish date": "Yayın tarihi",
"Categories": "Kategoriler",
"Member login": "Üye girişi",
"Register / Login": "Kayıt ol / Giriş yap",
"Start 7-day free trial": "7 günlük ücretsiz denemeyi başlat",
"Scan for new books": "Yeni kitapları tara",
"Recognize book title and author with AI on import": "İçe aktarırken kitap adını ve yazarı AI ile tanı",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Kitaplar içe aktarılırken kitap meta verilerinden bir ad çıkarılamazsa, kitap adını ve yazarı tanımak için AI kullanılır",
"No image found in archive": "Arşivde görsel bulunamadı",
"Extract cover failed": "Kapak çıkarılamadı",
"Custom plugin security warning": "⚠️ <b>Ciddi Güvenlik Uyarısı</b><br><br>Özel eklentiler bilgisayarınıza tam erişime ve kontrol yetkisine sahiptir; özellikle rastgele kod çalıştırabilen özel TTS eklentileri.<br>Bu, şunları yapabilecekleri anlamına gelir:<br>• Dosyalarınızı okuma, değiştirme veya silme<br>• Hesapları, parolaları ve tarayıcı verilerini çalma<br>• Kötü amaçlı yazılım yükleme<br>• Cihazınızı uzaktan kontrol etme<br><br>Bir eklentiyi ancak ona tamamen güvendiğinizden emin olduktan ve tüm kodunu dikkatle inceledikten sonra ekleyin.<br>Bilinmeyen web sitelerinden, bilinmeyen kaynaklardan veya resmi olmayan kanallardan asla eklenti eklemeyin.",
"Enable paragraph mode": "Paragraf modunu etkinleştir",
"Import notes, highlights and dictionary history": "Notları, vurgulananları ve sözlük geçmişini içe aktar",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Notları, vurgulananları ve sözlük geçmişini kitaplığa geri aktarmak için daha önce dışa aktardığınız CSV veya JSON dosyalarını seçin",
"Invalid data": "Geçersiz veri",
"The book {{name}} is not found in the library, please import the original book before importing": "«{{name}}» kitabı kitaplıkta bulunamadı. İçe aktarmaya devam etmeden önce özgün kitabı içe aktarın",
"Imported {{imported}} records, skipped {{skipped}} existing records": "{{imported}} kayıt içe aktarıldı, {{skipped}} mevcut kayıt atlandı",
"Download featured backgrounds": "Öne çıkan arka planları indir",
"Official background": "Resmi arka plan",
"Recognize title with AI": "Adı AI ile tanı",
"Download open dictionaries": "Açık sözlükleri indir",
"Dictionary already downloaded": "Sözlük zaten indirildi",
"Source": "Kaynak",
"Word definitions and fast reading mode cannot be enabled at the same time": "Kelime tanımları ve hızlı okuma modu aynı anda etkinleştirilemez",
"Reading ruler height": "Okuma cetveli yüksekliği",
"FAQ": "SSS",
"Auto scan and import books when starting the app or when clicking Scan": "Uygulama başlatıldığında veya Tara'ya tıklandığında kitapları otomatik olarak tara ve içe aktar",
"Please enter book name": "Lütfen kitap adını girin",
"Waiting for download...": "İndirme bekleniyor...",
"Pin to right": "Sağa sabitle",
"Unpin": "Sabitlemeyi kaldır",
"Resize": "Yeniden boyutlandır",
"Limited free": "Sınırlı süre ücretsiz",
"7-day free trial upon registration, then billed $4.99 per Year": "Kayıtta 7 gün ücretsiz deneme, ardından yılda $4.99",
"Yearly": "Yıllık",
"Year": "Yıl",
"Limited offer": "Sınırlı teklif",
"$4.99": "$4.99",
"Title recognized successfully": "Ad başarıyla tanındı",
"Failed to recognize title": "Ad tanınamadı",
"Show total page number (Experimental)": "Toplam sayfa sayısını göster (Deneysel)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Bu Koodo Reader sürümü çok eski. Lütfen Ayarlar - Hakkında - Güncellemeleri kontrol et bölümüne gidip Koodo Reader'ı en son sürüme güncelleyin ve tekrar deneyin.",
"Background opacity": "Arka plan opaklığı"
}
+54 -4
View File
@@ -850,6 +850,7 @@
"Bilingual translation": "Двомовний переклад",
"Use AI to analyze books, with different characters reading aloud in different voices": "Використовувати AI для аналізу книг, різні персонажі читають різними голосами",
"Voice type": "Тип голосу",
"Please reselect voices for all roles": "Будь ласка, оберіть знову голоси для всіх ролей",
"System voice": "Системний голос",
"Purchase the code": "Придбати код",
"Please upgrade to Pro to use this feature": "Оновіться до Pro, щоб використовувати цю функцію",
@@ -1155,8 +1156,6 @@
"None": "Відсутня",
"Slide": "Прокрутка",
"Flip": "Перегортання",
"Custom voice plugins are not supported": "Спеціальні голосові плагіни не підтримуються",
"Custom voice plugins have been disabled": "Спеціальні голосові плагіни вимкнено",
"Paste voice list JSON": "Вставте JSON-список голосів",
"Invalid voice list JSON": "Введіть непорожній JSON-масив із дійсними налаштуваннями голосів",
"Failed to load more": "Не вдалося завантажити більше",
@@ -1301,7 +1300,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Після виходу з Pro-версії ви негайно втратите такі переваги для учасників",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "У майбутньому ми додамо більше ексклюзивних функцій для учасників, зокрема статистику читання та автоматичну синхронізацію ваших нотаток, виділень, прогресу читання та списків слів із такими платформами, як Notion, Obsidian, Logseq, Anki тощо.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Крос-платформова синхронізація даних (хмарні диски, WebDAV, Docker, об’єктне сховище)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Імпортувати книги з хмарних дисків (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Імпортувати книги з хмарних дисків (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Офіційний переклад 90+ мовами",
"Official dictionary with definitions, examples & pronunciation": "Офіційний словник із визначеннями, прикладами та вимовою",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI-помічник для читання (підсумки розділів, план, багаторольове озвучення)",
@@ -1332,5 +1331,56 @@
"Enter your Notion personal access token": "Введіть ваш персональний токен доступу до Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Будь ласка, встановіть параметр синхронізації за замовчуванням на локальний у налаштуваннях або оновіться до Pro, щоб синхронізуватися з більшою кількістю хмарних сховищ",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Будь ласка, натисніть значок розширення Koodo Reader у правому верхньому куті браузера, авторизуйте запит до цієї адреси та повторіть спробу",
"How to sync library across devices": "Як синхронізувати бібліотеку між пристроями"
"How to sync library across devices": "Як синхронізувати бібліотеку між пристроями",
"Enable reading ruler": "Увімкнути лінійку для читання",
"Reading ruler height (lines)": "Висота лінійки для читання (рядків)",
"Reading ruler background opacity": "Непрозорість фону лінійки для читання",
"Enable speed reading": "Увімкнути швидкочитання",
"Reading speed (WPM)": "Швидкість читання (WPM)",
"ISBN": "ISBN",
"Rating": "Рейтинг",
"Rating count": "Кількість оцінок",
"Publish date": "Дата публікації",
"Categories": "Категорії",
"Member login": "Вхід для учасників",
"Register / Login": "Реєстрація / Вхід",
"Start 7-day free trial": "Почати безкоштовно на 7 днів",
"Scan for new books": "Сканувати нові книги",
"Recognize book title and author with AI on import": "Розпізнавати назву та автора книги за допомогою AI під час імпорту",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Під час імпорту книг, якщо з метаданих книги не вдалося витягти назву, для розпізнавання назви та автора використовуватиметься AI",
"No image found in archive": "В архіві не знайдено зображень",
"Extract cover failed": "Не вдалося витягти обкладинку",
"Custom plugin security warning": "⚠️ <b>Серйозне попередження про безпеку</b><br><br>Власні плагіни мають повний доступ до вашого комп'ютера та контроль над ним, особливо власні плагіни TTS, які можуть виконувати довільний код.<br>Це означає, що вони можуть:<br>• Читати, змінювати або видаляти ваші файли<br>• Викрадати облікові записи, паролі та дані браузера<br>• Встановлювати шкідливі програми<br>• Віддалено керувати вашим пристроєм<br><br>Додавайте плагін лише після того, як переконаєтеся, що повністю йому довіряєте та уважно перевірили весь його код.<br>Ніколи не додавайте плагіни з незнайомих сайтів, невідомих джерел чи неофіційних каналів.",
"Enable paragraph mode": "Увімкнути режим абзаців",
"Import notes, highlights and dictionary history": "Імпортувати примітки, виділене та історію словника",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Виберіть раніше експортовані файли CSV або JSON, щоб імпортувати примітки, виділене та історію словника назад до бібліотеки",
"Invalid data": "Некоректні дані",
"The book {{name}} is not found in the library, please import the original book before importing": "Книгу «{{name}}» не знайдено в бібліотеці. Імпортуйте оригінальну книгу, перш ніж продовжити імпорт",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Імпортовано записів: {{imported}}, пропущено наявних: {{skipped}}",
"Download featured backgrounds": "Завантажити добірку фонів",
"Official background": "Офіційний фон",
"Recognize title with AI": "Розпізнати назву за допомогою AI",
"Download open dictionaries": "Завантажити відкриті словники",
"Dictionary already downloaded": "Словник уже завантажено",
"Source": "Джерело",
"Word definitions and fast reading mode cannot be enabled at the same time": "Визначення слів і режим швидкочитання не можна ввімкнути одночасно",
"Reading ruler height": "Висота лінійки для читання",
"FAQ": "Поширені запитання",
"Auto scan and import books when starting the app or when clicking Scan": "Автоматично сканувати та імпортувати книги під час запуску застосунку або натисканні «Сканувати»",
"Please enter book name": "Введіть назву книги",
"Waiting for download...": "Очікування завантаження...",
"Pin to right": "Закріпити праворуч",
"Unpin": "Відкріпити",
"Resize": "Змінити розмір",
"Limited free": "Тимчасово безкоштовно",
"7-day free trial upon registration, then billed $4.99 per Year": "7-денний безкоштовний пробний період після реєстрації, потім оплата $4.99 на рік",
"Yearly": "Щорічно",
"Year": "Рік",
"Limited offer": "Обмежена пропозиція",
"$4.99": "$4.99",
"Title recognized successfully": "Назву успішно розпізнано",
"Failed to recognize title": "Не вдалося розпізнати назву",
"Show total page number (Experimental)": "Показувати загальну кількість сторінок (експериментально)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Ця версія Koodo Reader застаріла. Перейдіть у «Налаштування — Про програму — Перевірити оновлення», оновіть Koodo Reader до останньої версії та спробуйте знову.",
"Background opacity": "Непрозорість фону"
}
+54 -4
View File
@@ -843,6 +843,7 @@
"Bilingual translation": "Dịch song ngữ",
"Use AI to analyze books, with different characters reading aloud in different voices": "Sử dụng AI để phân tích sách, với các nhân vật khác nhau đọc to bằng các giọng khác nhau",
"Voice type": "Loại giọng nói",
"Please reselect voices for all roles": "Vui lòng chọn lại giọng nói cho tất cả các vai",
"System voice": "Giọng hệ thống",
"Purchase the code": "Mua mã",
"Please upgrade to Pro to use this feature": "Vui lòng nâng cấp lên Pro để sử dụng tính năng này",
@@ -1148,8 +1149,6 @@
"None": "Không có",
"Slide": "Trượt",
"Flip": "Lật",
"Custom voice plugins are not supported": "Không hỗ trợ phần bổ trợ giọng đọc tùy chỉnh",
"Custom voice plugins have been disabled": "Phần bổ trợ giọng đọc tùy chỉnh đã bị vô hiệu hóa",
"Paste voice list JSON": "Dán JSON danh sách giọng đọc",
"Invalid voice list JSON": "Nhập mảng JSON không rỗng chứa cấu hình giọng đọc hợp lệ",
"Failed to load more": "Tải thêm thất bại",
@@ -1294,7 +1293,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "Khi rời khỏi Pro, bạn sẽ không còn sử dụng được tính năng đồng bộ và các tính năng cao cấp khác nữa",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "Trong tương lai, chúng tôi sẽ giới thiệu thêm nhiều tính năng dành riêng cho thành viên, bao gồm thống kê đọc và tự động đồng bộ ghi chú, phần nổi bật, tiến độ đọc và danh sách từ vựng của bạn lên các nền tảng như Notion, Obsidian, Logseq, Anki và nhiều nền tảng khác.",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "Đồng bộ dữ liệu đa nền tảng (dịch vụ đám mây, WebDAV, Docker, bộ lưu trữ đối tượng)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "Nhập sách từ dịch vụ đám mây (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "Nhập sách từ dịch vụ đám mây (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages": "Bản dịch chính thức trong hơn 90 ngôn ngữ",
"Official dictionary with definitions, examples & pronunciation": "Từ điển chính thức (định nghĩa, ví dụ và phát âm)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "Trợ giúp đọc AI (tóm tắt chương, dàn bài, thuật lại đa vai)",
@@ -1325,5 +1324,56 @@
"Enter your Notion personal access token": "Nhập mã truy cập cá nhân Notion",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "Vui lòng đặt tùy chọn đồng bộ mặc định là cục bộ trong cài đặt, hoặc nâng cấp lên Pro để đồng bộ với nhiều bộ lưu trữ đám mây hơn",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "Vui lòng nhấp vào biểu tượng tiện ích mở rộng Koodo Reader ở góc trên bên phải trình duyệt, cấp quyền cho yêu cầu tới điểm cuối này và thử lại",
"How to sync library across devices": "Cách đồng bộ thư viện giữa các thiết bị"
"How to sync library across devices": "Cách đồng bộ thư viện giữa các thiết bị",
"Enable reading ruler": "Bật thước đọc",
"Reading ruler height (lines)": "Chiều cao thước đọc (dòng)",
"Reading ruler background opacity": "Độ mờ nền thước đọc",
"Enable speed reading": "Bật chế độ đọc nhanh",
"Reading speed (WPM)": "Tốc độ đọc (WPM)",
"ISBN": "ISBN",
"Rating": "Đánh giá",
"Rating count": "Số lượt đánh giá",
"Publish date": "Ngày xuất bản",
"Categories": "Danh mục",
"Member login": "Đăng nhập thành viên",
"Register / Login": "Đăng ký / Đăng nhập",
"Start 7-day free trial": "Bắt đầu dùng thử miễn phí 7 ngày",
"Scan for new books": "Quét sách mới",
"Recognize book title and author with AI on import": "Nhận diện tên sách và tác giả bằng AI khi nhập",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "Khi nhập sách, nếu không phân tích được tên sách từ siêu dữ liệu của sách, AI sẽ được dùng để nhận diện tên sách và tác giả",
"No image found in archive": "Không tìm thấy hình ảnh trong tệp nén",
"Extract cover failed": "Trích xuất bìa thất bại",
"Custom plugin security warning": "⚠️ <b>Cảnh báo bảo mật nghiêm trọng</b><br><br>Plugin tùy chỉnh có toàn quyền truy cập và kiểm soát máy tính của bạn, đặc biệt là plugin TTS tùy chỉnh có thể thực thi mã tùy ý.<br>Điều này có nghĩa là chúng có thể:<br>• Đọc, sửa đổi hoặc xóa tệp của bạn<br>• Đánh cắp tài khoản, mật khẩu và dữ liệu trình duyệt<br>• Cài đặt phần mềm độc hại<br>• Điều khiển thiết bị của bạn từ xa<br><br>Chỉ thêm plugin sau khi bạn chắc chắn hoàn toàn tin tưởng và đã xem xét kỹ toàn bộ mã của nó.<br>Không bao giờ thêm plugin từ các trang web lạ, nguồn không rõ ràng hoặc kênh không chính thức.",
"Enable paragraph mode": "Bật chế độ đoạn văn",
"Import notes, highlights and dictionary history": "Nhập ghi chú, highlight và lịch sử từ điển",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "Chọn tệp CSV hoặc JSON đã xuất trước đó để nhập ghi chú, highlight và lịch sử từ điển trở lại thư viện",
"Invalid data": "Dữ liệu không hợp lệ",
"The book {{name}} is not found in the library, please import the original book before importing": "Không tìm thấy sách {{name}} trong thư viện, vui lòng nhập sách gốc trước rồi mới nhập",
"Imported {{imported}} records, skipped {{skipped}} existing records": "Đã nhập {{imported}} bản ghi, bỏ qua {{skipped}} bản ghi đã tồn tại",
"Download featured backgrounds": "Tải hình nền nổi bật",
"Official background": "Hình nền chính thức",
"Recognize title with AI": "Nhận diện tên sách bằng AI",
"Download open dictionaries": "Tải từ điển mở",
"Dictionary already downloaded": "Từ điển đã được tải xuống",
"Source": "Nguồn",
"Word definitions and fast reading mode cannot be enabled at the same time": "Không thể bật đồng thời định nghĩa từ và chế độ đọc nhanh",
"Reading ruler height": "Chiều cao thước đọc (dòng)",
"FAQ": "Câu hỏi thường gặp",
"Auto scan and import books when starting the app or when clicking Scan": "Tự động quét và nhập sách khi khởi động ứng dụng hoặc khi nhấp vào Quét",
"Please enter book name": "Vui lòng nhập tên sách",
"Waiting for download...": "Đang chờ tải xuống...",
"Pin to right": "Ghim sang phải",
"Unpin": "Bỏ ghim",
"Resize": "Thay đổi kích thước",
"Limited free": "Miễn phí có thời hạn",
"7-day free trial upon registration, then billed $4.99 per Year": "Dùng thử miễn phí 7 ngày khi đăng ký, sau đó thanh toán $4.99 mỗi năm",
"Yearly": "Hàng năm",
"Year": "Năm",
"Limited offer": "Ưu đãi có hạn",
"$4.99": "$4.99",
"Title recognized successfully": "Nhận diện tên sách thành công",
"Failed to recognize title": "Nhận diện tên sách thất bại",
"Show total page number (Experimental)": "Hiển thị tổng số trang (Thử nghiệm)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "Phiên bản Koodo Reader này quá cũ. Vui lòng vào Cài đặt - Giới thiệu - Kiểm tra cập nhật để cập nhật Koodo Reader lên phiên bản mới nhất rồi thử lại.",
"Background opacity": "Độ mờ nền"
}
+52 -11
View File
@@ -84,13 +84,17 @@
"Not installed": "未安装",
"Install": "安装",
"Add custom plugin": "添加自定义插件",
"Reading ruler height": "阅读尺高度(行)",
"Custom plugin security warning": "⚠️ <b>严重安全警告</b><br><br>自定义插件拥有对您电脑的完整访问与控制权限,尤其是自定义听书插件,可执行任意代码。<br><br>这意味着它可能:<br>• 读取、修改或删除您的文件<br>• 窃取账号、密码、浏览器数据<br>• 安装恶意程序<br>• 远程控制您的设备<br>请务必确认您完全信任并已仔细审查过插件的全部代码后,再进行添加。<br><br>严禁添加任何来自陌生网站、未知来源、非官方渠道的插件。",
"How to custom plugin": "如何自定义插件",
"Plugin market": "插件市场",
"Bookmark already exists": "书签已存在",
"You are clicking too fast, please try again later": "您点击的太快了,请稍后再试",
"Visit online version": "访问在线版本",
"Enable hyphenation": "启用连字符",
"Enable paragraph mode": "启用段落模式",
"Shortcuts": "快捷键",
"FAQ": "常见问题",
"Go to the next page while reading": "阅读时翻到下一页",
"Go to the previous page while reading": "阅读时翻到上一页",
"Hide reader (Boss key)": "一键隐藏阅读器(老板键)",
@@ -565,7 +569,7 @@
"I've paid": "我已支付",
"Importing": "导入中",
"Disable AI features": "关闭 AI 功能",
"CJK font family": "中文字体",
"CJK font family": "CJK 字体",
"Fast reading mode (make the first half of the word bold)": "快速阅读模式(将单词的前半部分加粗)",
"Can't find Koodo Reader's folder in the default iCloud path, please make sure iCloud Drive is installed and set up correctly, and you have already synced your library to iCloud Drive on the iOS version first.": "在默认的 iCloud 路径下未找到 Koodo Reader 的文件夹,请确保 iCloud Drive 已正确安装和设置,并且您已经在 iOS 版本上将您的图书库同步到 iCloud Drive。",
"This is the order number not the redemption code, please check your email again, the redemption code is below the order number": "这是订单号不是兑换码,请再次检查您的邮件,兑换码位于订单号下方",
@@ -629,8 +633,14 @@
"Keep the original background in PDFs": "保留 PDF 中的原始背景",
"Bilingual translation": "双语对照翻译",
"No more images": "没有更多图片",
"7-day free trial upon registration, then billed $4.99 per Year": "注册即开始7天免费试用,之后以 ¥25 每年续费",
"Yearly": "每年",
"Year": "年",
"Limited offer": "限时优惠",
"$4.99": "¥25",
"Use AI to analyze books, with different characters reading aloud in different voices": "使用AI分析图书,不同角色使用不同的声音朗读",
"Voice type": "语音类型",
"Please reselect voices for all roles": "请重新选择所有角色的声音",
"System voice": "系统语音",
"Purchase the code": "购买兑换码",
"Please upgrade to Pro to use this feature": "请升级到专业版以使用此功能",
@@ -668,8 +678,6 @@
"Hide sync progress bar when syncing": "同步时隐藏同步进度条",
"Meticulously designed and built for Android and iOS": "为安卓和 iOS 平台精心设计和开发的客户端",
"Official AI OCR": "官方 AI 文字识别",
"Custom voice plugins are not supported": "自定义语音插件不受支持",
"Custom voice plugins have been disabled": "自定义语音插件已被禁用",
"Paste voice list JSON": "粘贴语音列表 JSON",
"Invalid voice list JSON": "请输入包含有效语音配置的非空 JSON 数组",
"After three years of design and development, the mobile version of Koodo Reader is finally out": "经过3年的设计和开发,移动版的 Koodo Reader 终于正式上线了",
@@ -717,6 +725,8 @@
"Not bound": "未绑定",
"Shelf location": "所在书架",
"Use file name as book title": "使用文件名作为书名",
"Recognize book title and author with AI on import": "导入图书时自动使用 AI 识别书名和作者",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "导入图书时,如果未能从图书元数据中解析出书名,将使用 AI 识别书名和作者",
"Bound": "已绑定",
"Document": "帮助文档",
"Feedback": "反馈建议",
@@ -768,6 +778,15 @@
"Author name": "作者名",
"Get metadata": "获取元数据",
"Data source": "数据来源",
"Rating": "评分",
"Recognize title with AI": "使用 AI 识别书名",
"Rating count": "评分人数",
"Title recognized successfully": "书名识别成功",
"Failed to recognize title": "书名识别失败",
"Show total page number (Experimental)": "显示总页数(实验性功能)",
"Publish date": "出版日期",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "当前 Koodo Reader 版本过低,请前往设置 - 关于 - 检查更新,将 Koodo Reader 更新到最新版本后重试。",
"Categories": "分类",
"Search": "搜索",
"Search chapters...": "搜索章节...",
"Search bookmarks...": "搜索书签...",
@@ -795,6 +814,9 @@
"Api key": "API 密钥",
"Deck Name": "卡组名称",
"Import dictionary": "导入词典",
"Download open dictionaries": "下载开放词典",
"Dictionary already downloaded": "词典已下载",
"Source": "来源",
"Local dictionary": "本地词典",
"e.g. Vocabulary": "例如 词汇表",
"Auto sync new words to MaiMemo": "自动同步新添加的生词到墨墨背单词",
@@ -1100,6 +1122,9 @@
"Reset failed": "重置失败",
"Reset": "重置",
"Pro version": "升级专业版",
"Member login": "会员登录",
"Register / Login": "注册 / 登录",
"Start 7-day free trial": "开始7天免费试用",
"Upgrade to Pro": "升级专业版",
"Updated successfully": "更新成功",
"Enable this option to increase synchronization speed. Your reading progress, notes, highlights, bookmarks, and other reading-related data will be encrypted, stored and synced via our cloud service, your books and covers will still be synced by your added data sources. Turning off this option will remove the above data from our cloud.": "启用此选项以提高同步速度。您的阅读进度、笔记、高亮、书签等阅读相关数据将经过加密之后,由我们的云服务进行存储和同步,您的图书和封面仍将由您添加的数据源同步。关闭此选项将从我们的云端删除上述数据",
@@ -1139,9 +1164,17 @@
"Paste the code of the plugin here, check out document to learn how to get more plugins": "将插件的代码粘贴在这里,查看帮助文档了解如何获取更多插件",
"Full screen": "全屏模式",
"Provider": "服务商",
"Enable reading ruler": "启用阅读标尺",
"Enable speed reading": "启用速读模式",
"Reading speed (WPM)": "阅读速度 (WPM)",
"Background opacity": "背景透明度",
"Enter your API Key": "请输入您的 API Key",
"Loading...": "加载中...",
"Fetch models": "获取模型列表",
"Download featured backgrounds": "下载精选背景",
"Official background": "官方背景",
"No image found in archive": "在压缩包中未找到图片",
"Extract cover failed": "提取封面失败",
"Select model": "选择模型",
"Please select a model": "请选择一个模型",
"Model name": "模型名称",
@@ -1169,6 +1202,11 @@
"Edit prompt": "编辑提示词",
"Background": "背景图片",
"Import successful": "导入成功",
"Import notes, highlights and dictionary history": "导入笔记、高亮和生词",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "选择之前导出的 CSV 或 JSON 文件,将笔记、高亮和生词导入回书库",
"Invalid data": "无效数据",
"The book {{name}} is not found in the library, please import the original book before importing": "未在书库中找到《{{name}}》,请导入原图书之后再继续导入",
"Imported {{imported}} records, skipped {{skipped}} existing records": "已导入 {{imported}} 条数据,跳过 {{skipped}} 条已存在的数据",
"Clear app background": "清除应用背景",
"Set as app background": "设为应用背景",
"Clear book background": "清除书籍背景",
@@ -1319,14 +1357,17 @@
"I'll think about it": "我再想想",
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "退出专业版后,您将立即失去以下会员权益",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "后续我们还会推出更多会员专属功能,包括阅读统计,自动同步您的笔记、高亮、阅读进度和生词本到Notion、语雀、Obsidian、Anki等平台。",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "跨平台数据同步(网盘、WebDAV、Docker、对象存储)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "从网盘/服务器导入图书(百度网盘、阿里云盘、Google Drive、WebDAV、FTP、SMB)",
"Official translation in 90+ languages": "官方翻译(90+ 语言)",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "跨平台数据同步(支持国内外10多款网盘和数据源)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "从网盘、WebDAV、FTP、SMB 等众多数据源导入图书",
"Official translation in 90+ languages": "官方翻译(实现90多种语言之间的即时翻译)",
"How to sync library across devices": "如何跨设备同步图书库",
"Official dictionary with definitions, examples & pronunciation": "官方词典(释义、例句、发音)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "官方阅读辅助(章节总结、大纲生成、多角色朗读、在线匹配封面)",
"Natural text-to-speech (82 languages, 569 voices)": "真人语音朗读(82 门语言、569 种语音)",
"Official dictionary with definitions, examples & pronunciation": "官方词典(支持超过10门语言,提供详细释义、例句和发音)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "官方阅读辅助(章节总结、多角色朗读、在线匹配封面等)",
"Natural text-to-speech (82 languages, 569 voices)": "真人语音朗读(支持 82 门语言、569 种语音)",
"OCR text recognition for scanned PDFs": "OCR 文字识别",
"Send to Kindle": "发送到 Kindle",
"Email & live-chat priority support": "邮件与实时聊天支持"
}
"Email & live-chat priority support": "邮件与实时聊天支持",
"Reading ruler height (lines)": "阅读标尺高度(行)",
"Reading ruler background opacity": "阅读标尺背景透明度",
"ISBN": "ISBN"
}
+55 -5
View File
@@ -702,6 +702,8 @@
"Download in Browser": "在瀏覽器中下載",
"Shelf location": "書架位置",
"Use file name as book title": "使用檔名作為書名",
"Recognize book title and author with AI on import": "匯入圖書時自動使用 AI 辨識書名和作者",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "匯入圖書時,如果未能從圖書中繼資料解析出書名,將使用 AI 辨識書名和作者",
"With the integration of popular cloud storage services, WebDAV, FTP, SFTP, SMB, Docker, and object storage, all your data remains securely in your control": "整合了常見雲端儲存服務、WebDAV、FTP、SFTP、SMB、Docker 和物件儲存,所有資料仍安全地由你掌控",
"Only recommended for VIP users": "僅推薦給 VIP 用戶",
"The 115 cloud is only recommended for VIP users, as it is nearly unusable for free users. Additionally, due to API issues with 115 cloud, synchronization can be very slow. If you insist on using 115 cloud storage for syncing, it is recommended to enable Koodo Sync simultaneously, which will significantly improve the synchronization speed.": "115 雲端僅推薦給 VIP 用戶,對免費用戶幾乎不可用。此外,因 115 雲端的 API 問題,同步可能非常緩慢。如果你堅持使用 115 雲端同步,建議同時啟用 Koodo Sync,可大幅提升同步速度。",
@@ -840,6 +842,7 @@
"Bilingual translation": "雙語對照翻譯",
"Use AI to analyze books, with different characters reading aloud in different voices": "使用 AI 分析圖書,不同角色使用不同聲音朗讀",
"Voice type": "語音類型",
"Please reselect voices for all roles": "請重新選擇所有角色的聲音",
"System voice": "系統語音",
"Purchase the code": "購買兌換碼",
"Please upgrade to Pro to use this feature": "請升級到專業版以使用此功能",
@@ -997,6 +1000,9 @@
"Api key": "API 密鑰",
"Deck Name": "卡組名稱",
"Import dictionary": "導入詞典",
"Download open dictionaries": "下載開放詞典",
"Dictionary already downloaded": "詞典已下載",
"Source": "來源",
"Local dictionary": "本地詞典",
"e.g. Vocabulary": "例如 詞彙表",
"Number parser": "數字目錄解析器",
@@ -1145,8 +1151,6 @@
"None": "無",
"Slide": "滑動",
"Flip": "翻頁",
"Custom voice plugins are not supported": "不支持自定義語音插件",
"Custom voice plugins have been disabled": "自定義語音插件已被禁用",
"Paste voice list JSON": "粘貼語音列表 JSON",
"Invalid voice list JSON": "請輸入包含有效語音配置的非空 JSON 數組",
"Failed to load more": "加載更多失敗",
@@ -1291,7 +1295,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "退出專業版後,您將立即失去以下會員權益",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "未來我們還會推出更多會員專屬功能,包括閱讀統計,自動同步您的筆記、高亮、閱讀進度和生詞本到 Notion、Obsidian、Logseq、Anki 等平台。",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "跨平台數據同步(網盤、WebDAV、Docker、對象存儲)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "從網盤/服務器導入書籍(百度網盤、阿里雲盤、Google Drive、WebDAV、FTP、SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "從網盤/服務器導入書籍(OneDrive、Google Drive、WebDAV、FTP、SMB)",
"Official translation in 90+ languages": "官方翻譯(90+ 語言)",
"Official dictionary with definitions, examples & pronunciation": "官方詞典(釋義、例句、發音)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI 閱讀輔助(章節總結、大綱、多角色朗讀)",
@@ -1322,5 +1326,51 @@
"Enter your Notion personal access token": "請輸入您的 Notion 個人訪問令牌",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "請在設置中將默認同步選項設置為本地,或升級到 Pro 以同步更多雲端存儲",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "請點擊瀏覽器右上角的 Koodo Reader 擴展圖標,授權訪問此網域,然後重試",
"How to sync library across devices": "如何跨設備同步書籍庫"
}
"How to sync library across devices": "如何跨設備同步書籍庫",
"Enable reading ruler": "啟用閱讀標尺",
"Reading ruler height (lines)": "閱讀標尺高度(行)",
"Reading ruler background opacity": "閱讀標尺背景不透明度",
"Enable speed reading": "啟用速讀模式",
"Reading speed (WPM)": "閱讀速度 (WPM)",
"ISBN": "ISBN",
"Rating": "評分",
"Rating count": "評分人數",
"Publish date": "出版日期",
"Categories": "分類",
"Member login": "會員登入",
"Register / Login": "註冊 / 登入",
"Start 7-day free trial": "開始 7 天免費試用",
"Scan for new books": "掃描新書籍",
"No image found in archive": "在壓縮檔中找不到圖片",
"Extract cover failed": "擷取封面失敗",
"Custom plugin security warning": "⚠️ <b>嚴重安全警告</b><br><br>自訂插件擁有對您電腦的完整存取與控制權限,尤其是自訂 TTS 插件,可執行任意程式碼。<br>這意味著它可能:<br>• 讀取、修改或刪除您的檔案<br>• 竊取帳號、密碼、瀏覽器資料<br>• 安裝惡意程式<br>• 遠端控制您的裝置<br><br>請務必確認您完全信任並已仔細審查過插件的全部程式碼後,再進行新增。<br>嚴禁新增任何來自陌生網站、未知來源、非官方途徑的插件。",
"Enable paragraph mode": "啟用段落模式",
"Import notes, highlights and dictionary history": "匯入筆記、重點和字典歷史紀錄",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "選擇之前匯出的 CSV 或 JSON 檔案,將筆記、重點和字典歷史紀錄匯入回書庫",
"Invalid data": "無效的資料",
"The book {{name}} is not found in the library, please import the original book before importing": "在書庫中找不到《{{name}}》,請先匯入原始書籍後再繼續匯入",
"Imported {{imported}} records, skipped {{skipped}} existing records": "已匯入 {{imported}} 筆資料,略過 {{skipped}} 筆已存在的資料",
"Download featured backgrounds": "下載精選背景",
"Official background": "官方背景",
"Recognize title with AI": "使用 AI 辨識書名",
"Word definitions and fast reading mode cannot be enabled at the same time": "生詞釋義功能與快速閱讀模式無法同時開啟",
"Reading ruler height": "閱讀標尺高度(行)",
"FAQ": "常見問題",
"Auto scan and import books when starting the app or when clicking Scan": "啟動應用程式或點擊掃描時,自動掃描並匯入書籍",
"Please enter book name": "請輸入書名",
"Waiting for download...": "等待下載中...",
"Pin to right": "固定至右側",
"Unpin": "取消固定",
"Resize": "調整大小",
"Limited free": "限時免費",
"7-day free trial upon registration, then billed $4.99 per Year": "註冊即開始 7 天免費試用,之後每年收取 $4.99",
"Yearly": "每年",
"Year": "年",
"Limited offer": "限時優惠",
"$4.99": "$4.99",
"Title recognized successfully": "書名辨識成功",
"Failed to recognize title": "書名辨識失敗",
"Show total page number (Experimental)": "顯示總頁數(實驗性功能)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "此版本的 Koodo Reader 過舊。請前往設定 - 關於 - 檢查更新,將 Koodo Reader 更新至最新版本後再試。",
"Background opacity": "背景不透明度"
}
+56 -6
View File
@@ -702,6 +702,8 @@
"Download in Browser": "在瀏覽器中下載",
"Shelf location": "書架位置",
"Use file name as book title": "使用檔名作為書名",
"Recognize book title and author with AI on import": "匯入圖書時自動使用 AI 辨識書名和作者",
"When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author": "匯入圖書時,如果未能從圖書中繼資料解析出書名,將使用 AI 辨識書名和作者",
"With the integration of popular cloud storage services, WebDAV, FTP, SFTP, SMB, Docker, and object storage, all your data remains securely in your control": "整合了常見雲端儲存服務、WebDAV、FTP、SFTP、SMB、Docker 和物件儲存,所有資料仍安全地由你掌控",
"Only recommended for VIP users": "僅推薦給 VIP 用戶",
"The 115 cloud is only recommended for VIP users, as it is nearly unusable for free users. Additionally, due to API issues with 115 cloud, synchronization can be very slow. If you insist on using 115 cloud storage for syncing, it is recommended to enable Koodo Sync simultaneously, which will significantly improve the synchronization speed.": "115 雲端僅推薦給 VIP 用戶,對免費用戶幾乎不可用。此外,因 115 雲端的 API 問題,同步可能非常緩慢。如果你堅持使用 115 雲端同步,建議同時啟用 Koodo Sync,可大幅提升同步速度。",
@@ -834,12 +836,13 @@
"Please make sure you entered the correct redemption code and the code matches your server region, if you have any questions, please contact our support team": "請確保您輸入了正確的兌換碼,並且兌換碼與您帳戶的伺服器地區匹配,如果您有任何疑問,請聯繫我們的支持團隊",
"Disable automatically scroll to the bottom of the AI chat": "禁用自動滾動到 AI 對話底部",
"Disable AI features": "關閉 AI 功能",
"CJK font family": "中文字體",
"CJK font family": "CJK 字體",
"Fast reading mode (make the first half of the word bold)": "快速閱讀模式(將單詞的前半部分加粗)",
"Full text translation": "全文翻譯",
"Bilingual translation": "雙語對照翻譯",
"Use AI to analyze books, with different characters reading aloud in different voices": "使用AI分析圖書,不同角色使用不同的聲音朗讀",
"Voice type": "語音類型",
"Please reselect voices for all roles": "請重新選擇所有角色的聲音",
"System voice": "系統語音",
"Purchase the code": "購買兌換碼",
"Please upgrade to Pro to use this feature": "請升級到專業版以使用此功能",
@@ -996,6 +999,9 @@
"Api key": "API 密鑰",
"Deck Name": "卡組名稱",
"Import dictionary": "導入詞典",
"Download open dictionaries": "下載開放詞典",
"Dictionary already downloaded": "詞典已下載",
"Source": "來源",
"Local dictionary": "本地詞典",
"e.g. Vocabulary": "例如 詞彙表",
"Auto sync new words to MaiMemo": "自動同步新添加的生詞到墨墨背單詞",
@@ -1150,8 +1156,6 @@
"None": "無",
"Slide": "滑動",
"Flip": "翻頁",
"Custom voice plugins are not supported": "不支援自訂語音外掛程式",
"Custom voice plugins have been disabled": "自訂語音外掛程式已停用",
"Paste voice list JSON": "貼上語音清單 JSON",
"Invalid voice list JSON": "請輸入包含有效語音設定的非空 JSON 陣列",
"Failed to load more": "載入更多失敗",
@@ -1290,7 +1294,7 @@
"Once you exit the Pro version, you will no longer be able to use synchronization and other premium features": "退出專業版後,您將立即失去以下會員權益",
"In the future, we will introduce more member-exclusive features, including reading statistics and automatic synchronization of your notes, highlights, reading progress, and vocabulary lists to platforms like Notion, Obsidian, Logseq, Anki, and more.": "未來我們還會推出更多會員專屬功能,包括閱讀統計,自動同步您的筆記、高亮、閱讀進度和生詞本到 Notion、Obsidian、Logseq、Anki 等平台。",
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)": "跨平台資料同步(雲端硬碟、WebDAV、Docker、物件儲存)",
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)": "從雲端硬碟匯入書籍(百度網盤、阿里雲盤、Google Drive、WebDAV、FTP、SMB)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)": "從雲端硬碟匯入書籍(OneDrive、Google Drive、WebDAV、FTP、SMB)",
"Official translation in 90+ languages": "官方翻譯(90+ 種語言)",
"Official dictionary with definitions, examples & pronunciation": "官方字典(釋義、例句、發音)",
"AI reading aids (chapter summaries, outline, multi-role narration)": "AI 閱讀輔助(章節摘要、大綱、多角色朗讀)",
@@ -1321,5 +1325,51 @@
"Enter your Notion personal access token": "請輸入您的 Notion 個人存取權杖",
"Please set the default sync option to local in the settings, or upgrade to Pro to sync with more cloud storage": "請在設定中將預設同步選項設為本機,或升級至 Pro 以同步更多雲端儲存空間",
"Please click the Koodo Reader extension icon in the upper right corner of the browser, authorize the request to this endpoint, and try again": "請點擊瀏覽器右上角的 Koodo Reader 擴充功能圖示,授權存取此網域,然後重試",
"How to sync library across devices": "如何跨裝置同步書籍庫"
}
"How to sync library across devices": "如何跨裝置同步書籍庫",
"Enable reading ruler": "啟用閱讀標尺",
"Reading ruler height (lines)": "閱讀標尺高度(行)",
"Reading ruler background opacity": "閱讀標尺背景不透明度",
"Enable speed reading": "啟用速讀模式",
"Reading speed (WPM)": "閱讀速度 (WPM)",
"ISBN": "ISBN",
"Rating": "評分",
"Rating count": "評分人數",
"Publish date": "出版日期",
"Categories": "分類",
"Member login": "會員登入",
"Register / Login": "註冊 / 登入",
"Start 7-day free trial": "開始 7 天免費試用",
"Scan for new books": "掃描新書籍",
"No image found in archive": "在壓縮檔中找不到圖片",
"Extract cover failed": "擷取封面失敗",
"Custom plugin security warning": "⚠️ <b>嚴重安全警告</b><br><br>自訂插件擁有對您電腦的完整存取與控制權限,尤其是自訂 TTS 插件,可執行任意程式碼。<br>這意味著它可能:<br>• 讀取、修改或刪除您的檔案<br>• 竊取帳號、密碼、瀏覽器資料<br>• 安裝惡意程式<br>• 遠端控制您的裝置<br><br>請務必確認您完全信任並已仔細審查過插件的全部程式碼後,再進行新增。<br>嚴禁新增任何來自陌生網站、未知來源、非官方管道的插件。",
"Enable paragraph mode": "啟用段落模式",
"Import notes, highlights and dictionary history": "匯入筆記、重點和字典歷史紀錄",
"Select previously exported CSV or JSON files to import notes, highlights and dictionary history back to the library": "選擇之前匯出的 CSV 或 JSON 檔案,將筆記、重點和字典歷史紀錄匯入回書庫",
"Invalid data": "無效的資料",
"The book {{name}} is not found in the library, please import the original book before importing": "在書庫中找不到《{{name}}》,請先匯入原始書籍後再繼續匯入",
"Imported {{imported}} records, skipped {{skipped}} existing records": "已匯入 {{imported}} 筆資料,略過 {{skipped}} 筆已存在的資料",
"Download featured backgrounds": "下載精選背景",
"Official background": "官方背景",
"Recognize title with AI": "使用 AI 辨識書名",
"Word definitions and fast reading mode cannot be enabled at the same time": "生詞釋義功能與快速閱讀模式無法同時開啟",
"Reading ruler height": "閱讀標尺高度(行)",
"FAQ": "常見問題",
"Auto scan and import books when starting the app or when clicking Scan": "啟動應用程式或點擊掃描時,自動掃描並匯入書籍",
"Please enter book name": "請輸入書名",
"Waiting for download...": "等待下載中...",
"Pin to right": "固定至右側",
"Unpin": "取消固定",
"Resize": "調整大小",
"Limited free": "限時免費",
"7-day free trial upon registration, then billed $4.99 per Year": "註冊即開始 7 天免費試用,之後每年收取 $4.99",
"Yearly": "每年",
"Year": "年",
"Limited offer": "限時優惠",
"$4.99": "$4.99",
"Title recognized successfully": "書名辨識成功",
"Failed to recognize title": "書名辨識失敗",
"Show total page number (Experimental)": "顯示總頁數(實驗性功能)",
"This version of Koodo Reader is too old. Please go to Settings - About - Check for Updates to update Koodo Reader to the latest version and try again.": "此版本的 Koodo Reader 過舊。請前往設定 - 關於 - 檢查更新,將 Koodo Reader 更新至最新版本後再試。",
"Background opacity": "背景不透明度"
}
-12
View File
@@ -47,7 +47,6 @@
}
.icon-chart:before {
content: "\e967";
color: #3e4055;
}
.icon-clock:before {
content: "\e966";
@@ -96,27 +95,21 @@
}
.icon-desktop:before {
content: "\e959";
color: #585858;
}
.icon-phone:before {
content: "\e95a";
color: #585858;
}
.icon-github:before {
content: "\e90f";
color: #585858;
}
.icon-onedrive:before {
content: "\e930";
color: #585858;
}
.icon-facebook:before {
content: "\e931";
color: #585858;
}
.icon-microsoft:before {
content: "\e952";
color: #585858;
}
.icon-s3compatible:before {
content: "\e958";
@@ -279,11 +272,9 @@
}
.icon-simplified:before {
content: "\e92e";
color: #565656;
}
.icon-traditional:before {
content: "\e932";
color: #565656;
}
.icon-local:before {
content: "\e92a";
@@ -323,11 +314,9 @@
}
.icon-dropbox:before {
content: "\e910";
color: #4b4b4b;
}
.icon-webdav:before {
content: "\e916";
color: #4b4b4b;
}
.icon-exit:before {
content: "\e919";
@@ -337,7 +326,6 @@
}
.icon-googledrive:before {
content: "\e934";
color: #4b4b4b;
}
.icon-list:before {
content: "\e937";
@@ -11,6 +11,7 @@ import { isElectron } from "react-device-detect";
import MetadataDialog from "../metadataDialog";
import { MetadataResult } from "../metadataDialog/interface";
import { trimSpecialCharacters } from "../../../utils/common";
import { analyzeBookTitle } from "../../../utils/request/reader";
declare var window: any;
class EditDialog extends React.Component<EditDialogProps, EditDialogState> {
@@ -33,6 +34,7 @@ class EditDialog extends React.Component<EditDialogProps, EditDialogState> {
pendingDescription: "",
pendingPublishedDate: "",
pendingCover: "",
isAnalyzing: false,
};
}
@@ -83,6 +85,38 @@ class EditDialog extends React.Component<EditDialogProps, EditDialogState> {
});
};
handleAnalyzeTitle = async () => {
if (!this.props.isAuthed) {
toast(this.props.t("Please upgrade to Pro to use this feature"));
this.props.handleSetting(true);
this.props.handleSettingMode("account");
return;
}
if (this.state.isAnalyzing) return;
const title = trimSpecialCharacters(
this.nameRef.current?.value || this.props.currentBook.name || ""
);
if (!title) return;
this.setState({ isAnalyzing: true });
try {
const response = await analyzeBookTitle(title);
if (response && response.code === 200 && response.data?.name) {
if (this.nameRef.current) {
this.nameRef.current.value = response.data.name;
}
if (this.authorRef.current && response.data.author) {
this.authorRef.current.value = response.data.author;
}
toast.success(this.props.t("Title recognized successfully"));
}
} catch (error) {
console.error(error, title);
toast.error(this.props.t("Failed to recognize title"));
} finally {
this.setState({ isAnalyzing: false });
}
};
handleCancel = () => {
this.props.handleEditDialog(false);
};
@@ -228,9 +262,32 @@ class EditDialog extends React.Component<EditDialogProps, EditDialogState> {
{/* Book name */}
<div className="edit-dialog-field">
<span className="edit-dialog-label">
<Trans>Book name</Trans>
</span>
<div className="edit-dialog-input-row">
<span className="edit-dialog-label">
<Trans>Book name</Trans>
</span>
<span
className="edit-dialog-ai-button"
onClick={this.handleAnalyzeTitle}
>
<svg
viewBox="0 0 24 24"
width="14"
height="14"
fill="currentColor"
style={{
animation: this.state.isAnalyzing
? "edit-dialog-ai-spin 1s linear infinite"
: undefined,
}}
>
<path d="M12 2l2.4 7.6L22 12l-7.6 2.4L12 22l-2.4-7.6L2 12l7.6-2.4L12 2z" />
</svg>
<span className="edit-dialog-ai-text">
<Trans>Recognize title with AI</Trans>
</span>
</span>
</div>
<input className="edit-dialog-input" ref={this.nameRef} />
</div>
@@ -53,6 +53,38 @@
outline: none;
background: transparent;
}
/* Book name label row with AI button */
.edit-dialog-input-row {
display: flex;
justify-content: flex-start;
align-items: center;
width: 100%;
}
.edit-dialog-ai-button {
display: flex;
align-items: center;
gap: 2px;
flex-shrink: 0;
font-size: 13px;
line-height: 1.4;
border-radius: 4px;
padding: 2px 4px;
margin-bottom: 4px;
margin-left: 6px;
cursor: pointer;
transition: color 0.15s;
}
.edit-dialog-ai-button:hover {
color: #f16464;
}
@keyframes edit-dialog-ai-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.edit-dialog-textarea {
width: 100%;
box-sizing: border-box;
@@ -25,4 +25,5 @@ export interface EditDialogState {
pendingDescription: string;
pendingPublishedDate: string;
pendingCover: string;
isAnalyzing: boolean;
}
@@ -1,6 +1,8 @@
import React from "react";
import "./metadataDialog.css";
import { Trans } from "react-i18next";
import Parser from "html-react-parser";
import DOMPurify from "dompurify";
import {
MetadataDialogProps,
MetadataDialogState,
@@ -8,6 +10,7 @@ import {
BookResultItem,
} from "./interface";
import toast from "react-hot-toast";
import copy from "copy-text-to-clipboard";
import { getBookMetadata } from "../../../utils/request/reader";
class MetadataDialog extends React.Component<
@@ -171,7 +174,16 @@ class MetadataDialog extends React.Component<
const author = item.author;
const publisher = item.publisher || "";
const description = item.description || "";
const source = "Cloud";
const ratingSource = item.rating_source || "";
const rating = item.rating || 0;
const ratingCount = item.rating_count || 0;
const maxRating = ratingSource === "Douban" ? 10 : 5;
const filledStars = Math.max(
0,
Math.round((rating / maxRating) * 5)
);
const stars =
"★".repeat(filledStars) + "☆".repeat(5 - filledStars);
return (
<div
key={id}
@@ -191,24 +203,89 @@ class MetadataDialog extends React.Component<
<div className="metadata-book-basic">
<div className="metadata-book-name">{title}</div>
<div className="metadata-book-author">{author}</div>
<div className="metadata-book-source">
{this.props.t("Data source") +
": " +
this.props.t(source)}
</div>
{publisher && (
<div className="metadata-book-publisher">
{publisher}
</div>
)}
{item.rating ? (
<div className="metadata-book-rating">
<span className="metadata-book-rating-stars">
{stars}
</span>
<span className="metadata-book-rating-value">
{rating.toFixed(1)} / {maxRating}
</span>
{ratingCount > 0 && (
<span className="metadata-book-rating-count">
({ratingCount})
</span>
)}
</div>
) : null}
</div>
</div>
{/* Expanded detail */}
{isSelected && (
<div className="metadata-book-detail">
{publisher && (
{item.isbn && (
<div className="metadata-book-detail-row">
<span className="metadata-book-detail-label">
<Trans>Publisher</Trans>:
<Trans>ISBN</Trans>:
</span>
<span className="metadata-book-detail-value metadata-book-detail-isbn">
{item.isbn}
</span>
<button
className="metadata-book-copy-btn"
onClick={(e) => {
e.stopPropagation();
copy(item.isbn || "");
toast(this.props.t("Copying successful"));
}}
>
<span className="icon-copy"></span>
</button>
</div>
)}
{item.pub_date && (
<div className="metadata-book-detail-row">
<span className="metadata-book-detail-label">
<Trans>Publish date</Trans>:
</span>
<span className="metadata-book-detail-value">
{publisher}
{item.pub_date}
</span>
</div>
)}
{item.categories && (
<div className="metadata-book-detail-row">
<span className="metadata-book-detail-label">
<Trans>Categories</Trans>:
</span>
<span className="metadata-book-detail-value">
{item.categories}
</span>
</div>
)}
{item.language && (
<div className="metadata-book-detail-row">
<span className="metadata-book-detail-label">
<Trans>Language</Trans>:
</span>
<span className="metadata-book-detail-value">
{item.language}
</span>
</div>
)}
{item.pages && (
<div className="metadata-book-detail-row">
<span className="metadata-book-detail-label">
<Trans>Pages</Trans>:
</span>
<span className="metadata-book-detail-value">
{item.pages}
</span>
</div>
)}
@@ -218,7 +295,7 @@ class MetadataDialog extends React.Component<
<Trans>Description</Trans>:
</span>
<span className="metadata-book-detail-value">
{description}
{Parser(DOMPurify.sanitize(description))}
</span>
</div>
)}
@@ -25,7 +25,14 @@ export interface CloudBookItem {
publisher?: string;
description?: string;
cover?: string;
source: "cloud";
isbn?: string;
rating_source?: string;
rating?: number;
rating_count?: number;
categories?: string;
pub_date?: string;
language?: string;
pages?: number;
}
export type BookResultItem = CloudBookItem;
@@ -144,7 +144,8 @@
}
.metadata-book-author {
font-size: 12px;
font-size: 10px;
line-height: 1.5;
opacity: 0.65;
overflow: hidden;
text-overflow: ellipsis;
@@ -158,6 +159,37 @@
float: right;
}
.metadata-book-publisher {
font-size: 10px;
line-height: 1.5;
opacity: 0.65;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 2px;
}
.metadata-book-rating {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
margin-top: 2px;
}
.metadata-book-rating-stars {
color: #f5a623;
letter-spacing: 1px;
}
.metadata-book-rating-value {
opacity: 0.75;
}
.metadata-book-rating-count {
opacity: 0.75;
}
.metadata-book-detail {
padding: 0 10px 10px 70px;
font-size: 12px;
@@ -185,6 +217,32 @@
text-overflow: ellipsis;
}
.metadata-book-detail-isbn {
flex: none;
}
.metadata-book-copy-btn {
flex-shrink: 0;
width: 18px;
height: 20px;
padding: 0;
font-size: 12px;
display: flex;
align-items: center;
justify-content: center;
border: none;
outline: none;
border-radius: 4px;
cursor: pointer;
opacity: 0.4;
background: transparent;
color: inherit;
}
.metadata-book-copy-btn:hover {
opacity: 0.5;
}
.metadata-dialog-apply-row {
display: flex;
justify-content: flex-end;
+52 -39
View File
@@ -35,28 +35,56 @@ class MoreAction extends React.Component<MoreActionProps, MoreActionState> {
this.state = { exportSubmenu: "" };
}
renderFormatSubmenu(type: "notes" | "highlights") {
renderFormatSubmenu(type: "notes" | "highlights" | "words") {
const isVisible = this.state.exportSubmenu === type;
const isNotes = type === "notes";
const filterFn = isNotes
? (note: any) =>
note.notes && note.notes.length > 0 && note.notes !== "annotation"
: (note: any) => note.notes === "";
const exportFn = isNotes ? exportNotes : exportHighlights;
const isWords = type === "words";
const filterFn = isWords
? () => true
: isNotes
? (note: any) =>
note.notes && note.notes.length > 0 && note.notes !== "annotation"
: (note: any) => note.notes === "";
const exportFn = (
isWords
? exportDictionaryHistory
: isNotes
? exportNotes
: exportHighlights
) as (
records: any[],
books: any[],
format: "csv" | "md" | "txt" | "html" | "pdf" | "json"
) => Promise<"success" | "failed" | "cancel">;
const formats = isWords
? (["csv", "json"] as const)
: (["csv", "md", "txt", "html", "pdf", "json"] as const);
const formatLabels: Record<string, string> = {
csv: "CSV",
md: "Markdown",
txt: "TXT",
html: "HTML",
pdf: "PDF",
json: "JSON",
};
const handleExport = async (
format: "csv" | "md" | "txt" | "html" | "pdf"
format: "csv" | "md" | "txt" | "html" | "pdf" | "json"
) => {
let books = await DatabaseService.getAllRecords("books");
let notes = (
let records = (
await DatabaseService.getRecordsByBookKey(
this.props.currentBook.key,
"notes"
isWords ? "words" : "notes"
)
).filter(filterFn);
if (notes.length > 0) {
exportFn(notes, books, format);
toast.success(this.props.t("Export successful"), { id: "exporting" });
if (records.length > 0) {
const result = await exportFn(records, books, format);
if (result === "success") {
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else if (result === "failed") {
toast.error(this.props.t("Failed to export"), { id: "exporting" });
}
} else {
toast(this.props.t("Nothing to export"));
}
@@ -65,7 +93,7 @@ class MoreAction extends React.Component<MoreActionProps, MoreActionState> {
this.props.handleActionDialog(false);
};
const noteOffset = isNotes ? 1 : 2;
const noteOffset = isWords ? 3 : isNotes ? 1 : 2;
const itemHeight = 33;
// 主菜单渲染时会被 clampMenuPosition 校正到视口内(靠近底部时会整体上移),
// 格式子菜单必须以主菜单“实际渲染后的 top”为基准水平对齐,而不是用未校正的 top,
@@ -89,7 +117,7 @@ class MoreAction extends React.Component<MoreActionProps, MoreActionState> {
195,
mainMenuPos.top + noteOffset * itemHeight,
120,
estimateMenuHeight(5)
estimateMenuHeight(isWords ? 2 : 6)
);
return {
position: "fixed",
@@ -110,24 +138,14 @@ class MoreAction extends React.Component<MoreActionProps, MoreActionState> {
}}
>
<div className="action-dialog-actions-container">
{(["csv", "md", "txt", "html", "pdf"] as const).map((fmt) => (
{formats.map((fmt) => (
<div
key={fmt}
className="action-dialog-edit"
style={{ paddingLeft: "0px" }}
onClick={() => handleExport(fmt)}
>
<p className="action-name">
{fmt === "csv"
? "CSV"
: fmt === "md"
? "Markdown"
: fmt === "txt"
? "TXT"
: fmt === "html"
? "HTML"
: "PDF"}
</p>
<p className="action-name">{formatLabels[fmt]}</p>
</div>
))}
</div>
@@ -267,22 +285,16 @@ class MoreAction extends React.Component<MoreActionProps, MoreActionState> {
<div
className="action-dialog-edit"
style={{ paddingLeft: "0px" }}
onClick={async () => {
let dictHistory = await DatabaseService.getRecordsByBookKey(
this.props.currentBook.key,
"words"
);
let books = await DatabaseService.getAllRecords("books");
if (dictHistory.length > 0) {
exportDictionaryHistory(dictHistory, books);
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else {
toast(this.props.t("Nothing to export"));
}
onMouseEnter={() => {
this.setState({ exportSubmenu: "words" });
}}
onMouseLeave={() => {
this.setState({ exportSubmenu: "" });
}}
>
<p className="action-name">
<p className="action-name export-action-name">
<Trans>Export dictionary history</Trans>
<span className="icon-dropdown icon-export-all"></span>
</p>
</div>
<div
@@ -426,6 +438,7 @@ class MoreAction extends React.Component<MoreActionProps, MoreActionState> {
</div>
{this.renderFormatSubmenu("notes")}
{this.renderFormatSubmenu("highlights")}
{this.renderFormatSubmenu("words")}
</>
);
}
@@ -184,7 +184,7 @@
overflow-y: auto;
overflow-x: hidden;
padding-bottom: 16px;
margin-bottom: 50px;
margin-bottom: 42px;
}
.setting-dialog-illustration {
width: 200px;
@@ -536,6 +536,214 @@
box-sizing: border-box;
}
/* Pro version banner styles */
.pro-banner-container {
margin: 0 25px 20px;
}
.pro-banner {
position: relative;
z-index: 1;
border-radius: 16px;
overflow: hidden;
background: linear-gradient(175deg, #f5f5fa 0%, #ffffff 100%);
color: #202124;
padding: 18px 28px 16px;
display: flex;
flex-direction: column;
}
:root[data-theme="dark"] .pro-banner {
background: linear-gradient(
175deg,
rgba(64, 70, 76, 0.95) 0%,
rgba(47, 52, 55, 1) 100%
);
color: rgba(235, 235, 235, 1);
border: none;
}
.pro-banner-overlay {
position: absolute;
inset: 0;
pointer-events: none;
}
.pro-banner-content {
position: relative;
display: flex;
flex-direction: column;
}
.pro-banner-header {
display: flex;
align-items: center;
}
.pro-banner-title {
font-size: 18px;
font-weight: 700;
}
.pro-banner-tabs {
margin-left: auto;
background: rgba(0, 0, 0, 0.06);
border-radius: 14px;
padding: 3px;
display: flex;
}
:root[data-theme="dark"] .pro-banner-tabs {
background: rgba(255, 255, 255, 0.16);
}
.pro-banner-tab {
padding: 4px 12px;
border-radius: 12px;
font-size: 11px;
cursor: pointer;
background: transparent;
}
.pro-banner-tab.active-pro-banner-tab {
background: rgba(0, 0, 0, 0.06);
}
:root[data-theme="dark"] .pro-banner-tab.active-pro-banner-tab {
background: rgba(255, 255, 255, 0.22);
}
.pro-banner-price {
display: flex;
align-items: baseline;
margin-top: 6px;
}
.pro-banner-price-value {
font-size: 26px;
font-weight: 700;
}
.pro-banner-price-unit {
font-size: 12px;
opacity: 0.9;
margin-left: 8px;
}
.pro-banner-features {
background: rgba(0, 0, 0, 0.04);
border-radius: 14px;
padding: 14px 16px;
margin-top: 12px;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px 16px;
}
.pro-banner-feature-icon {
margin-top: 2px;
}
:root[data-theme="dark"] .pro-banner-features {
background: rgba(255, 255, 255, 0.12);
}
.pro-banner-feature-item {
display: flex;
align-items: flex-start;
gap: 10px;
font-size: 13px;
line-height: 18px;
}
.pro-banner-actions {
display: flex;
justify-content: flex-end;
margin-top: 14px;
gap: 12px;
}
.pro-banner-btn {
padding: 0 16px;
height: 42px;
border-radius: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 600;
cursor: pointer;
user-select: none;
box-sizing: border-box;
transition: opacity 0.15s;
}
.pro-banner-btn:hover {
opacity: 0.85;
}
.pro-banner-btn-login {
padding: 0 16px;
background: #202124;
color: #fff;
border: none;
}
:root[data-theme="dark"] .pro-banner-btn-login {
background: rgba(235, 235, 235, 1);
color: #2f3437;
}
@property --pro-banner-btn-trial-angle {
syntax: "<angle>";
initial-value: 0deg;
inherits: false;
}
.pro-banner-btn-trial {
position: relative;
border: 1px solid transparent;
color: #202124;
background: transparent;
}
:root[data-theme="dark"] .pro-banner-btn-trial {
color: rgba(235, 235, 235, 1);
}
.pro-banner-btn-trial::before {
content: "";
position: absolute;
inset: -2px;
border-radius: inherit;
padding: 2px;
background: #c0c4cc;
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
mask-composite: exclude;
pointer-events: none;
}
:root[data-theme="light"] .pro-banner-btn-trial::after {
content: "";
position: absolute;
inset: -2px;
border-radius: inherit;
padding: 2px;
background: conic-gradient(
from var(--pro-banner-btn-trial-angle),
rgba(139, 180, 255, 0) 0deg,
rgba(57, 100, 254, 1) 110deg,
rgba(139, 180, 255, 0) 180deg,
rgba(139, 180, 255, 0) 220deg,
rgba(57, 100, 254, 1) 290deg,
rgba(139, 180, 255, 0) 360deg
);
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
mask-composite: exclude;
animation: pro-banner-btn-trial-shine 3s linear infinite;
pointer-events: none;
}
:root[data-theme="dark"] .pro-banner-btn-trial::before {
background: conic-gradient(
from var(--pro-banner-btn-trial-angle),
rgba(255, 255, 255, 0.35),
rgba(255, 255, 255, 1) 90deg,
rgba(255, 255, 255, 0.35) 180deg,
rgba(139, 180, 255, 0.9) 270deg,
rgba(255, 255, 255, 0.35)
);
animation: pro-banner-btn-trial-shine 3s linear infinite;
}
@keyframes pro-banner-btn-trial-shine {
to {
--pro-banner-btn-trial-angle: 360deg;
}
}
/* AI Setting styles */
.ai-setting-form-row {
margin-bottom: 12px;
@@ -20,6 +20,7 @@ import {
getUserRequest,
} from "../../../utils/request/user";
import TokenService from "../../../utils/storage/tokenService";
import { proFeatures } from "../../../constants/loginList";
class SupportDialog extends React.Component<
SupportDialogProps,
SupportDialogState
@@ -114,41 +115,9 @@ class SupportDialog extends React.Component<
)}
</p>
<ul className="support-dialog-benefit-list">
<li>
{this.props.t(
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)"
)}
</li>
<li>
{this.props.t(
"Import books from cloud drives (Baidu Netdisk, Google Drive, WebDAV, FTP, SMB)"
)}
</li>
<li>
{this.props.t("Official translation in 90+ languages")}
</li>
<li>
{this.props.t(
"Official dictionary with definitions, examples & pronunciation"
)}
</li>
<li>
{this.props.t(
"AI reading aids (chapter summaries, outline, multi-role narration)"
)}
</li>
<li>
{this.props.t(
"Natural text-to-speech (82 languages, 569 voices)"
)}
</li>
<li>
{this.props.t("OCR text recognition for scanned PDFs")}
</li>
<li>{this.props.t("Send to Kindle")}</li>
<li>
{this.props.t("Email & live-chat priority support")}
</li>
{proFeatures.map((feature, index) => (
<li key={index}>{this.props.t(feature)}</li>
))}
</ul>
</div>
</>
+2 -1
View File
@@ -71,9 +71,10 @@ class ImageViewer extends React.Component<ImageViewerProps, ImageViewerStates> {
const image = this.imageRef.current;
if (!image) return;
// 先恢复默认宽度约束,避免换图时 img 以原始尺寸闪现
image.style.width = "60vw";
image.style.removeProperty("margin-top");
image.style.removeProperty("transform");
image.style.removeProperty("width");
image.style.removeProperty("height");
if (this.previewRef.current) {
+184 -23
View File
@@ -18,6 +18,7 @@ import CoverUtil from "../../utils/file/coverUtil";
import { Readability } from "@mozilla/readability";
import {
calculateFileMD5,
clearComicTemp,
getTextRules,
supportedFormats,
throttle,
@@ -25,6 +26,7 @@ import {
} from "../../utils/common";
import DatabaseService from "../../utils/storage/databaseService";
import { BookHelper } from "../../assets/lib/kookit.min";
import { analyzeBookTitle } from "../../utils/request/reader";
// Convert supportedFormats to react-dropzone v14+ accept format
// Key is MIME type, value is array of file extensions
@@ -40,6 +42,25 @@ const supportedFormatsAccept = supportedFormats.reduce<
}, {});
declare var window: any;
let clickFilePath = "";
// Comic 封面规则与 kookit comic-book.js 保持一致:取自然排序后的第一张图片
const COMIC_IMAGE_EXTS = [
".jpg",
".jpeg",
".png",
".gif",
".webp",
".svg",
".bmp",
".tif",
".tiff",
".jfif",
".jpe",
".heic",
];
const getComicImageExt = (name: string) => {
const ext = name.split(".").pop()?.toLowerCase() || "png";
return ext === "jpg" ? "jpeg" : ext;
};
class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
resizeHandler: (() => void) | null = null;
@@ -99,9 +120,13 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
clickFilePath = filePath;
const fileName = window.electronAPI.path.basename(filePath);
const stat = window.electronAPI.fs.statSync(filePath);
const tempFile: any = new File([], fileName);
const tempFile = new File([], fileName);
tempFile.path = filePath;
tempFile.size = stat.size;
Object.defineProperty(tempFile, "size", {
value: stat.size,
writable: true,
configurable: true,
});
let md5 = await calculateFileMD5(tempFile);
let repeatBook: BookModel | null = await BookUtil.getBookByMd5(md5);
@@ -110,9 +135,13 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
return;
}
const fileTemp: any = new File([], fileName);
const fileTemp = new File([], fileName);
fileTemp.path = filePath;
fileTemp.size = stat.size;
Object.defineProperty(fileTemp, "size", {
value: stat.size,
writable: true,
configurable: true,
});
this.setState({ isOpenFile: true }, async () => {
await this.getMd5WithBrowser(fileTemp);
@@ -239,7 +268,26 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
});
};
getMd5WithBrowser = async (file: any) => {
analyzeBookMetadata = async (book: BookModel, bookName: string) => {
if (
ConfigService.getReaderConfig("isAIAnalyzeTitle") !== "yes" ||
!this.props.isAuthed ||
book.name !== bookName
) {
return;
}
try {
const response = await analyzeBookTitle(book.name);
if (response && response.code === 200 && response.data?.name) {
book.name = response.data.name;
book.author = response.data.author || book.author;
}
} catch (error) {
console.error(error, bookName);
}
};
getMd5WithBrowser = async (file: File) => {
return new Promise<void>(async (resolve) => {
const md5 = await calculateFileMD5(file);
if (!md5) {
@@ -263,7 +311,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
});
};
handleBook = (file: any, md5: string) => {
handleBook = (file: File, md5: string) => {
let extension = (file.name as string)
.split(".")
.reverse()[0]
@@ -293,24 +341,51 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
return resolve();
}
if (!isRepeat) {
// Electron: read the file content from disk directly to avoid
// keeping the whole file in memory via FileReader.
const sourcePath: string = isElectron
? (file as any).path || clickFilePath
: "";
// Pick the first candidate path that actually exists on disk.
// There are two candidates:
// 1. file.path - real disk path for drag & drop / dialog import,
// but a virtual cloud path for cloud import;
// 2. clickFilePath - path captured when opening a book by click.
const fs = isElectron ? window.electronAPI.fs : null;
const candidates = [file.path, clickFilePath];
let sourcePath = "";
for (const candidate of candidates) {
if (isElectron && candidate && fs.existsSync(candidate)) {
sourcePath = candidate;
break;
}
}
// Path only used for the database record, never for file IO.
// Keeps the original path (or URL) when it can't be verified on disk,
// falling back to the original file name, so book.path is never empty.
const recordPath = sourcePath || file.path || file.name;
if (sourcePath) {
try {
if (
extension.toUpperCase() === "CBZ" ||
extension.toUpperCase() === "CBT"
) {
await this.handleComicImport(
file,
bookName,
extension,
md5,
sourcePath,
resolve
);
return;
}
const content = window.electronAPI.fs.readFileSync(sourcePath);
const file_content = content.buffer as ArrayBuffer;
const realSize = content.byteLength;
await this.processBookContent(
file,
bookName,
extension,
md5,
file_content,
file.size || realSize,
sourcePath,
recordPath,
resolve
);
} catch (error) {
@@ -331,15 +406,15 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
});
return resolve();
}
const file_content = (event.target as any).result;
const file_content = event.target.result as ArrayBuffer;
await this.processBookContent(
file,
bookName,
extension,
md5,
file_content,
file.size,
file.path || clickFilePath,
sourcePath,
recordPath,
resolve
);
};
@@ -355,14 +430,99 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
});
};
handleComicImport = async (
file: File,
bookName: string,
extension: string,
md5: string,
sourcePath: string,
resolve: (value: void) => void
) => {
try {
if (!isElectron) {
toast.error(this.props.t("Import failed") + ": " + bookName, {
duration: 4000,
});
return resolve();
}
const ipcRenderer = window.electronAPI;
const fs = window.electronAPI.fs;
const isZip = extension.toUpperCase() === "CBZ";
// 只读取归档索引,不解压完整文件
const entryList: {
entryPath: string;
size: number;
fileName: string;
}[] = await ipcRenderer.invoke(
isZip ? "list-zip-file" : "list-tar-file",
{ filePath: sourcePath }
);
const images = entryList
.filter((entry) =>
COMIC_IMAGE_EXTS.some((ext) =>
entry.entryPath.toLowerCase().endsWith(ext)
)
)
.sort((a, b) =>
a.entryPath.localeCompare(b.entryPath, undefined, {
numeric: true,
sensitivity: "base",
})
);
if (images.length === 0) {
throw new Error(this.props.t("No image found in archive"));
}
const coverEntry = images[0].entryPath;
const extracted: string[] = await ipcRenderer.invoke(
isZip ? "unzip-file" : "untar-file",
{ filePath: sourcePath, entries: [coverEntry] }
);
const extractedPath =
Array.isArray(extracted) && extracted.length > 0 ? extracted[0] : "";
if (!extractedPath || !fs.existsSync(extractedPath)) {
throw new Error(this.props.t("Extract cover failed"));
}
const buf = fs.readFileSync(extractedPath);
clearComicTemp();
const cover = `data:image/${getComicImageExt(
coverEntry
)};base64,${CommonTool.arrayBufferToBase64(buf)}`;
const stat = fs.statSync(sourcePath);
const key = new Date().getTime() + "" + Math.floor(Math.random() * 1000);
const book = new BookModel(
key,
bookName,
"",
"",
md5,
cover,
extension.toUpperCase(),
"",
stat.size || file.size || 0,
images.length,
sourcePath,
""
);
await this.analyzeBookMetadata(book, bookName);
await this.handleAddBook(book, new ArrayBuffer(0), sourcePath);
return resolve();
} catch (error) {
console.error(error, bookName);
toast.error(this.props.t("Import failed") + ": " + bookName, {
duration: 4000,
});
return resolve();
}
};
processBookContent = async (
file: any,
bookName: string,
extension: string,
md5: string,
file_content: ArrayBuffer,
fileSize: number,
filePath: string,
recordPath: string,
resolve: (value: void) => void
) => {
let result: BookModel;
@@ -394,7 +554,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
extension,
md5,
fileSize,
filePath,
recordPath,
file_content,
rendition
);
@@ -426,10 +586,11 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
});
return resolve();
}
await this.analyzeBookMetadata(result as BookModel, bookName);
await this.handleAddBook(
result as BookModel,
file_content as ArrayBuffer,
file.path || filePath
filePath
);
return resolve();
@@ -600,7 +761,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
// 1) Try better main-content extraction (more aggressive clipping).
let extracted: any = null;
try {
const reader = new Readability(doc as any);
const reader = new Readability(doc);
extracted = reader.parse();
} catch (e) {
extracted = null;
@@ -638,7 +799,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
const blob = new Blob([new TextEncoder().encode(finalHtml)], {
type: "text/html",
});
const file: any = new File([blob], finalHtmlFileName);
const file = new File([blob], finalHtmlFileName);
file.path = url; // Helps bookkeeping; works in Electron, no harm in browser.
toast.dismiss(toastId);
@@ -758,7 +919,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
offset += chunk.length;
}
const blob = new Blob([arrayBuffer.buffer]);
const file: any = new File([blob], fileName);
const file = new File([blob], fileName);
await this.getMd5WithBrowser(file);
} catch (error) {
const errorMessage =
@@ -883,7 +1044,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
const path = window.electronAPI.path;
const fileName = path.basename(filePath);
let file: any = new File([], fileName);
let file = new File([], fileName);
file.path = filePath;
await this.getMd5WithBrowser(file);
@@ -1031,7 +1192,7 @@ class ImportLocal extends React.Component<ImportLocalProps, ImportLocalState> {
for (let filePath of filePaths) {
try {
const path = window.electronAPI.path;
let file: any = new File([], path.basename(filePath));
let file = new File([], path.basename(filePath));
file.path = filePath;
await this.getMd5WithBrowser(file);
@@ -72,22 +72,6 @@
left: 5%;
}
}
.popup-menu-triangle-down {
float: left;
margin-left: 59px;
font-size: 16px;
text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.16);
z-index: 0;
}
.popup-menu-triangle-up {
transform: rotate(180deg);
position: absolute;
bottom: 172px;
margin-left: 60px;
font-size: 16px;
text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.16);
z-index: 0;
}
.delete-highlighter-container {
position: relative;
}
@@ -13,6 +13,7 @@ import DictHistory from "../../../models/DictHistory";
import { Trans } from "react-i18next";
import {
getFullTranslationTarget,
getOfficialDictLang,
getWebsiteUrl,
openExternalUrl,
} from "../../../utils/common";
@@ -208,10 +209,7 @@ class PopupDict extends React.Component<PopupDictProps, PopupDictState> {
dictText = await getDictText(
text,
ConfigService.getReaderConfig("dictTarget") || "auto",
ConfigService.getReaderConfig("lang") &&
ConfigService.getReaderConfig("lang").startsWith("zh")
? "chs"
: "eng"
getOfficialDictLang()
);
if (dictText) {
isFullAnalysis = false;
@@ -257,6 +255,12 @@ class PopupDict extends React.Component<PopupDictProps, PopupDictState> {
dictText: dictText,
},
() => {
const audioPlayers = document.querySelectorAll(
"audio.audio-player"
);
audioPlayers.forEach((item) => {
(item as HTMLAudioElement).load();
});
let moreElement = document.querySelector(".dict-learn-more");
if (moreElement) {
moreElement.addEventListener("click", () => {
+5 -15
View File
@@ -1,5 +1,6 @@
import React from "react";
import "./popupMenu.css";
import { isReadingRawPDF } from "../../../utils/common";
import PopupOption from "../popupOption";
import ColorOption from "../../colorOption";
import { PopupMenuProps, PopupMenuStates } from "./interface";
@@ -101,21 +102,15 @@ class PopupMenu extends React.Component<PopupMenuProps, PopupMenuStates> {
}
posX = posX - MENU_WIDTH / 2 + pageSize.left;
if (
this.props.currentBook.format === "PDF" &&
isReadingRawPDF(this.props.currentBook) &&
this.props.readerMode === "double" &&
this.props.chapterDocIndex % 2 === 1 &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
this.props.chapterDocIndex % 2 === 1
) {
posX = posX + pageSize.sectionWidth + pageSize.gap;
}
if (
this.props.currentBook.format === "PDF" &&
isReadingRawPDF(this.props.currentBook) &&
this.props.readerMode === "scroll" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
) &&
posY < 0
) {
posY = posY + pageSize.offsetTop;
@@ -145,12 +140,7 @@ class PopupMenu extends React.Component<PopupMenuProps, PopupMenuStates> {
for (let i = 0; i < docs.length; i++) {
let doc = docs[i];
if (!doc) continue;
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
let targetIframe = doc?.defaultView?.frameElement;
let id = targetIframe?.getAttribute("id") || "";
let chapterDocIndex = id ? parseInt(id.split("-").reverse()[0]) : 0;
@@ -15,22 +15,6 @@
width: 252px;
box-sizing: border-box;
}
.popup-menu-triangle-down {
float: left;
margin-left: 59px;
font-size: 16px;
text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.16);
z-index: 0;
}
.popup-menu-triangle-up {
transform: rotate(180deg);
position: absolute;
bottom: 172px;
margin-left: 60px;
font-size: 16px;
text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.16);
z-index: 0;
}
.delete-highlighter-container {
position: relative;
}
@@ -1,5 +1,6 @@
import React from "react";
import "./popupNote.css";
import { isReadingRawPDF } from "../../../utils/common";
import Note from "../../../models/Note";
import _ from "underscore";
import { PopupNoteProps, PopupNoteState } from "./interface";
@@ -112,12 +113,7 @@ class PopupNote extends React.Component<PopupNoteProps, PopupNoteState> {
{}
)
);
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
let bookLocation = this.props.htmlBook.rendition.getPositionByChapter(
this.props.chapterDocIndex
);
+20 -11
View File
@@ -7,7 +7,10 @@ import {
popupOptionMap,
PopupOptionKey,
} from "../../../constants/popupList";
import { ConfigService, HighlightUtil } from "../../../assets/lib/kookit-extra-browser.min";
import {
ConfigService,
HighlightUtil,
} from "../../../assets/lib/kookit-extra-browser.min";
import toast from "react-hot-toast";
import {
getSelection,
@@ -16,7 +19,7 @@ import {
} from "../../../utils/reader/mouseEvent";
import copy from "copy-text-to-clipboard";
import { getIframeDoc } from "../../../utils/reader/docUtil";
import { openExternalUrl } from "../../../utils/common";
import { isReadingRawPDF, openExternalUrl } from "../../../utils/common";
import { createHighlight } from "../../../utils/reader/noteUtil";
import { Tooltip } from "react-tooltip";
@@ -33,19 +36,25 @@ class PopupOption extends React.Component<PopupOptionProps> {
this.props.handleOpenMenu(true);
};
handleCopy = () => {
let text = getSelection(this.props.currentBook.format);
const format = this.props.currentBook.format;
let text = getSelection(format);
if (!text) return;
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
text = text.split("\n").join(" ").trim();
}
copy(text);
let copied = false;
const docs = getIframeDoc(format);
for (let i = 0; i < docs.length && !copied; i++) {
const doc = docs[i];
if (!doc) continue;
const sel = doc.getSelection();
if (!sel || sel.rangeCount === 0 || !sel.toString().trim()) continue;
copied = doc.execCommand("copy");
}
if (!copied) {
copy(text);
}
this.props.handleOpenMenu(false);
let docs = getIframeDoc(this.props.currentBook.format);
for (let i = 0; i < docs.length; i++) {
let doc = docs[i];
if (!doc) continue;
+13 -11
View File
@@ -2,7 +2,7 @@ import React from "react";
import "./popupRefer.css";
import { PopupReferProps, PopupReferStates } from "./interface";
import { getIframeDoc } from "../../../utils/reader/docUtil";
import { openExternalUrl } from "../../../utils/common";
import { isReadingRawPDF, openExternalUrl } from "../../../utils/common";
import Parser from "html-react-parser";
import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min";
@@ -70,6 +70,14 @@ class PopupRefer extends React.Component<PopupReferProps, PopupReferStates> {
openExternalUrl(href);
return true;
}
if (result.redirectChapter) {
let prevPosition = ConfigService.getObjectConfig(
this.props.currentBook.key,
"recordLocation",
{}
);
this.props.handleJumpPosition(prevPosition);
}
if (result.isJump) {
this.setState({
isJump: true,
@@ -115,21 +123,15 @@ class PopupRefer extends React.Component<PopupReferProps, PopupReferStates> {
}
posX = posX - 135 + pageSize.left;
if (
this.props.currentBook.format === "PDF" &&
isReadingRawPDF(this.props.currentBook) &&
this.props.readerMode === "double" &&
this.props.chapterDocIndex % 2 === 1 &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
this.props.chapterDocIndex % 2 === 1
) {
posX = posX + pageSize.sectionWidth + pageSize.gap;
}
if (
this.props.currentBook.format === "PDF" &&
this.props.readerMode === "scroll" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
isReadingRawPDF(this.props.currentBook) &&
this.props.readerMode === "scroll"
) {
posY = posY + this.props.chapterDocIndex * pageSize.sectionHeight;
}
+2 -1
View File
@@ -1,4 +1,4 @@
import { handleSelection } from "../../../store/actions";
import { handleSelection, handleJumpPosition } from "../../../store/actions";
import { connect } from "react-redux";
import { stateType } from "../../../store";
import PopupRefer from "./component";
@@ -13,6 +13,7 @@ const mapStateToProps = (state: stateType) => {
};
const actionCreator = {
handleSelection,
handleJumpPosition,
};
export default connect(
mapStateToProps,
@@ -8,6 +8,7 @@ export interface PopupReferProps {
chapterDocIndex: number;
readerMode: string;
t: (title: string) => string;
handleJumpPosition: (jumpPosition: object | null) => void;
}
export interface PopupReferStates {
rect: any;
@@ -190,10 +190,6 @@ class DropdownList extends React.Component<
currentTextOrientationValue: arr[0],
});
this.props.handleTextOrientation(arr[0]);
if (arr[0] === "vertical") {
this.props.handleHideBackground(true);
ConfigService.setReaderConfig("isHideBackground", "yes");
}
break;
case "selectAction":
@@ -2,6 +2,7 @@ import React from "react";
import "./modeControl.css";
import { ModeControlProps, ModeControlState } from "./interface";
import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min";
import { isReadingRawPDF } from "../../../utils/common";
import { Trans } from "react-i18next";
class ModeControl extends React.Component<ModeControlProps, ModeControlState> {
@@ -12,10 +13,7 @@ class ModeControl extends React.Component<ModeControlProps, ModeControlState> {
handleChangeMode = (mode: string) => {
if (
(this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)) ||
isReadingRawPDF(this.props.currentBook) ||
this.props.currentBook.format.startsWith("CB")
) {
ConfigService.setReaderConfig("pdfReaderMode", mode);
@@ -5,8 +5,48 @@ import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min";
import { readerSettingList } from "../../../constants/settingList";
import { wordFrequencyList } from "../../../constants/dropdownList";
import toast from "react-hot-toast";
import { detectLocalLanguage } from "../../../utils/common";
import { detectLocalLanguage, isReadingRawPDF } from "../../../utils/common";
import BookUtil from "../../../utils/file/bookUtil";
import SliderList from "../sliderList";
const readingRulerSliderConfigs = [
{
maxValue: 20,
minValue: 0,
mode: "readingRulerLineHeight",
minLabel: "0",
maxLabel: "20",
step: 1,
title: "Reading ruler height",
isPDF: false,
defaultValue: 3,
},
{
maxValue: 1,
minValue: 0,
mode: "readingRulerBackgroundOpacity",
minLabel: "0",
maxLabel: "1",
step: 0.05,
title: "Background opacity",
isPDF: false,
defaultValue: 0.6,
},
];
const speedReadingSliderConfigs = [
{
maxValue: 900,
minValue: 100,
mode: "speedReadingSpeed",
minLabel: "100",
maxLabel: "900",
step: 50,
title: "Reading speed (WPM)",
isPDF: false,
defaultValue: 300,
},
];
class SettingSwitch extends React.Component<
SettingSwitchProps,
SettingSwitchState
@@ -21,11 +61,15 @@ class SettingSwitch extends React.Component<
isItalic: ConfigService.getReaderConfig("isItalic") === "yes",
isInvert: ConfigService.getReaderConfig("isInvert") === "yes",
isBionic: ConfigService.getReaderConfig("isBionic") === "yes",
isParagraphMode:
ConfigService.getReaderConfig("isParagraphMode") === "yes",
isHyphenation: ConfigService.getReaderConfig("isHyphenation") === "yes",
isOrphanWidow: ConfigService.getReaderConfig("isOrphanWidow") === "yes",
isKeepPDFBackground:
ConfigService.getReaderConfig("isKeepPDFBackground") === "yes",
isAllowScript: ConfigService.getReaderConfig("isAllowScript") === "yes",
isShowTotalPage:
ConfigService.getReaderConfig("isShowTotalPage") === "yes",
isStartFromEven:
ConfigService.getReaderConfig("isStartFromEven") === "yes",
isHideBackground:
@@ -37,6 +81,15 @@ class SettingSwitch extends React.Component<
isCustomBookCSS:
ConfigService.getReaderConfig("isCustomBookCSS") === "yes",
customBookCSS: ConfigService.getReaderConfig("customBookCSS") || "",
isReadingRuler: ConfigService.getReaderConfig("isReadingRuler") === "yes",
readingRulerLineHeight:
ConfigService.getReaderConfig("readingRulerLineHeight") || "3",
readingRulerBackgroundOpacity:
ConfigService.getReaderConfig("readingRulerBackgroundOpacity") || "0.6",
isSpeedReading: ConfigService.getReaderConfig("isSpeedReading") === "yes",
speedReadingSpeed:
ConfigService.getReaderConfig("speedReadingSpeed") || "300",
isMergeWord: ConfigService.getReaderConfig("isMergeWord") === "yes",
isWordDefinition: ConfigService.getAllListConfig(
"wordDefinitionBooks"
).includes(props.currentBook?.key),
@@ -100,6 +153,40 @@ class SettingSwitch extends React.Component<
toast(this.props.t("Change successful"));
};
exclusiveModeNames = [
"isParagraphMode",
"isReadingRuler",
"isSpeedReading",
] as const;
handleExclusiveOff = (
enabledName: (typeof this.exclusiveModeNames)[number]
) => {
const exclusiveHandlers: Record<
(typeof this.exclusiveModeNames)[number],
(value: boolean) => void
> = {
isParagraphMode: this.props.handleParagraphMode,
isReadingRuler: this.props.handleReadingRuler,
isSpeedReading: this.props.handleSpeedReading,
};
const offNames = this.exclusiveModeNames.filter(
(name) => name !== enabledName && this.state[name]
);
if (offNames.length === 0) return;
offNames.forEach((name) => {
ConfigService.setReaderConfig(name, "no");
exclusiveHandlers[name](false);
});
this.setState((prevState) => {
const nextState = { ...prevState };
offNames.forEach((name) => {
nextState[name] = false;
});
return nextState;
});
};
render() {
return (
<>
@@ -381,14 +468,117 @@ class SettingSwitch extends React.Component<
</li>
);
})()}
<div className="single-control-switch-container" key="isReadingRuler">
<span className="single-control-switch-title">
<Trans>Enable reading ruler</Trans>
</span>
<span
className="single-control-switch"
onClick={() => {
const next = !this.state.isReadingRuler;
if (next) {
this.handleExclusiveOff("isReadingRuler");
}
this.setState({ isReadingRuler: next });
ConfigService.setReaderConfig(
"isReadingRuler",
next ? "yes" : "no"
);
this.props.handleReadingRuler(next);
if (next) {
if (!ConfigService.getReaderConfig("readingRulerLineHeight")) {
ConfigService.setReaderConfig("readingRulerLineHeight", "3");
}
if (
!ConfigService.getReaderConfig(
"readingRulerBackgroundOpacity"
)
) {
ConfigService.setReaderConfig(
"readingRulerBackgroundOpacity",
"0.6"
);
}
}
toast(this.props.t("Change successful"));
setTimeout(async () => {
await this.props.renderBookFunc();
}, 500);
}}
style={this.state.isReadingRuler ? {} : { opacity: 0.6 }}
>
<span
className="single-control-button"
style={
!this.state.isReadingRuler
? {
transform: "translateX(0px)",
transition: "transform 0.5s ease",
}
: {
transform: "translateX(20px)",
transition: "transform 0.5s ease",
}
}
></span>
</span>
</div>
{this.state.isReadingRuler &&
readingRulerSliderConfigs.map((item) => (
<SliderList key={item.mode} {...{ item }} />
))}
<div className="single-control-switch-container" key="isSpeedReading">
<span className="single-control-switch-title">
<Trans>Enable speed reading</Trans>
</span>
<span
className="single-control-switch"
onClick={() => {
const next = !this.state.isSpeedReading;
if (next) {
this.handleExclusiveOff("isSpeedReading");
}
this.setState({ isSpeedReading: next });
ConfigService.setReaderConfig(
"isSpeedReading",
next ? "yes" : "no"
);
this.props.handleSpeedReading(next);
if (next) {
if (!ConfigService.getReaderConfig("speedReadingSpeed")) {
ConfigService.setReaderConfig("speedReadingSpeed", "300");
}
}
toast(this.props.t("Change successful"));
setTimeout(async () => {
await this.props.renderBookFunc();
}, 500);
}}
style={this.state.isSpeedReading ? {} : { opacity: 0.6 }}
>
<span
className="single-control-button"
style={
!this.state.isSpeedReading
? {
transform: "translateX(0px)",
transition: "transform 0.5s ease",
}
: {
transform: "translateX(20px)",
transition: "transform 0.5s ease",
}
}
></span>
</span>
</div>
{this.state.isSpeedReading &&
speedReadingSliderConfigs.map((item) => (
<SliderList key={item.mode} {...{ item }} />
))}
{readerSettingList
.filter((item) => {
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
return item.isPDF;
}
return true;
@@ -424,17 +614,25 @@ class SettingSwitch extends React.Component<
this._handleChange(propName);
} else if (propName === "isShowPageBorder") {
this.props.handleShowBorder(!this.state.isShowPageBorder);
if (!this.state.isShowPageBorder) {
this.props.handleHideBackground(true);
this.handleChange("isHideBackground");
}
this.handleChange("isShowPageBorder");
} else if (propName === "isAllowScript") {
this.handleChange(propName);
setTimeout(() => {
BookUtil.reloadBooks(this.props.currentBook);
}, 500);
} else if (propName === "isParagraphMode") {
const next = !this.state.isParagraphMode;
if (next) {
this.handleExclusiveOff("isParagraphMode");
}
this.props.handleParagraphMode(next);
this.handleChange(propName);
setTimeout(async () => {
await this.props.renderBookFunc();
}, 500);
} else if (propName === "isMergeWord") {
this.props.handleMergeWord(!this.state.isMergeWord);
this._handleChange(propName);
} else if (propName in renderProps) {
renderProps[propName]!(!this.state[propName]);
this.handleChange(propName);
@@ -10,6 +10,10 @@ import {
handleSetting,
handleSettingMode,
handleBackgroundColor,
handleParagraphMode,
handleReadingRuler,
handleSpeedReading,
handleMergeWord,
} from "../../../store/actions";
const mapStateToProps = (state: stateType) => {
@@ -29,6 +33,10 @@ const actionCreator = {
handleSetting,
handleSettingMode,
handleBackgroundColor,
handleParagraphMode,
handleReadingRuler,
handleSpeedReading,
handleMergeWord,
};
export default connect(
mapStateToProps,
@@ -11,6 +11,10 @@ export interface SettingSwitchProps {
handleHideHeader: (isHideHeader: boolean) => void;
t: (title: string) => string;
handleHideBackground: (isHideBackground: boolean) => void;
handleParagraphMode: (isParagraphMode: boolean) => void;
handleReadingRuler: (isReadingRuler: boolean) => void;
handleSpeedReading: (isSpeedReading: boolean) => void;
handleMergeWord: (isMergeWord: boolean) => void;
handleShowBorder: (isShowPageBorder: boolean) => void;
handleSetting: (isOpenSetting: boolean) => void;
handleSettingMode: (mode: string) => void;
@@ -26,17 +30,25 @@ export interface SettingSwitchState {
isItalic: boolean;
isInvert: boolean;
isStartFromEven: boolean;
isShowTotalPage: boolean;
isAllowScript: boolean;
isHyphenation: boolean;
isOrphanWidow: boolean;
isKeepPDFBackground: boolean;
isBionic: boolean;
isParagraphMode: boolean;
isHideHeader: boolean;
isShowPageBorder: boolean;
isCustomBookCSS: boolean;
customBookCSS: string;
isWordDefinition: boolean;
isSeperateStyle: boolean;
isReadingRuler: boolean;
readingRulerLineHeight: string;
readingRulerBackgroundOpacity: string;
isSpeedReading: boolean;
speedReadingSpeed: string;
isMergeWord: boolean;
wordDefinitionLang: string;
currentChineseLevel: string;
currentJapaneseLevel: string;
@@ -16,7 +16,13 @@ class SliderList extends React.Component<SliderListProps, SliderListState> {
paraSpacing: ConfigService.getReaderConfig("paraSpacing") || "0",
brightness: ConfigService.getReaderConfig("brightness") || "1",
margin: ConfigService.getReaderConfig("margin") || "0",
};
readingRulerLineHeight:
ConfigService.getReaderConfig("readingRulerLineHeight") || "3",
readingRulerBackgroundOpacity:
ConfigService.getReaderConfig("readingRulerBackgroundOpacity") || "0.6",
speedReadingSpeed:
ConfigService.getReaderConfig("speedReadingSpeed") || "300",
} as SliderListState;
}
getClampedValue = (rawValue: string) => {
@@ -17,4 +17,7 @@ export interface SliderListState {
brightness: string;
scale: string;
margin: string;
readingRulerLineHeight?: string;
readingRulerBackgroundOpacity?: string;
speedReadingSpeed?: string;
}
+115 -48
View File
@@ -166,7 +166,13 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
"books"
);
if (books.length > 0) {
await exportBooks(books);
const result = await exportBooks(books);
if (result === "success") {
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else if (result === "failed") {
toast.dismiss("exporting");
toast.error(this.props.t("Failed to export"), { id: "exporting" });
}
} else {
toast(this.props.t("Nothing to export"));
}
@@ -194,7 +200,7 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
className="select-more-actions select-export-format-submenu"
style={
this.state.exportSubmenu === "notes"
? { left: "160px", bottom: "auto", top: "0px" }
? { left: "160px", top: "auto", bottom: "0px" }
: { display: "none" }
}
onMouseEnter={() => {
@@ -207,7 +213,7 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
this.setState({ exportSubmenu: "", isShowExport: false });
}}
>
{(["csv", "md", "txt", "html", "pdf"] as const).map(
{(["csv", "md", "txt", "html", "pdf", "json"] as const).map(
(fmt) => (
<span
key={fmt}
@@ -229,8 +235,12 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
note.notes !== "annotation"
);
if (notes.length > 0) {
exportNotes(notes, selectedBooks, fmt);
toast.success(this.props.t("Export successful"), { id: "exporting" });
const result = await exportNotes(notes, selectedBooks, fmt);
if (result === "success") {
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else if (result === "failed") {
toast.error(this.props.t("Failed to export"), { id: "exporting" });
}
} else {
toast(this.props.t("Nothing to export"));
}
@@ -240,15 +250,16 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
});
}}
>
{fmt === "csv"
? "CSV"
: fmt === "md"
? "Markdown"
: fmt === "txt"
? "TXT"
: fmt === "html"
? "HTML"
: "PDF"}
{
({
csv: "CSV",
md: "Markdown",
txt: "TXT",
html: "HTML",
pdf: "PDF",
json: "JSON",
} as Record<string, string>)[fmt]
}
</span>
)
)}
@@ -274,7 +285,7 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
className="select-more-actions select-export-format-submenu"
style={
this.state.exportSubmenu === "highlights"
? { left: "160px", bottom: "auto", top: "0px" }
? { left: "160px", top: "auto", bottom: "0px" }
: { display: "none" }
}
onMouseEnter={() => {
@@ -287,7 +298,7 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
this.setState({ exportSubmenu: "", isShowExport: false });
}}
>
{(["csv", "md", "txt", "html", "pdf"] as const).map(
{(["csv", "md", "txt", "html", "pdf", "json"] as const).map(
(fmt) => (
<span
key={fmt}
@@ -305,8 +316,12 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
)
).filter((note) => note.notes === "");
if (highlights.length > 0) {
exportHighlights(highlights, selectedBooks, fmt);
toast.success(this.props.t("Export successful"), { id: "exporting" });
const result = await exportHighlights(highlights, selectedBooks, fmt);
if (result === "success") {
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else if (result === "failed") {
toast.error(this.props.t("Failed to export"), { id: "exporting" });
}
} else {
toast(this.props.t("Nothing to export"));
}
@@ -316,42 +331,94 @@ class SelectBook extends React.Component<BookListProps, BookListState> {
});
}}
>
{fmt === "csv"
? "CSV"
: fmt === "md"
? "Markdown"
: fmt === "txt"
? "TXT"
: fmt === "html"
? "HTML"
: "PDF"}
{
({
csv: "CSV",
md: "Markdown",
txt: "TXT",
html: "HTML",
pdf: "PDF",
json: "JSON",
} as Record<string, string>)[fmt]
}
</span>
)
)}
</div>
</div>
<span
className="book-manage-title select-book-action"
onClick={async () => {
let selectedBooks = await DatabaseService.getRecordsByKeys(
this.props.selectedBooks,
"books"
);
let dictHistory =
await DatabaseService.getRecordsByBookKeys(
this.props.selectedBooks,
"words"
);
if (dictHistory.length > 0) {
exportDictionaryHistory(dictHistory, selectedBooks);
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else {
toast(this.props.t("Nothing to export"));
<div style={{ position: "relative" }}>
<span
className="book-manage-title select-book-action"
onMouseEnter={() => {
this.setState({
exportSubmenu: "words",
isShowExport: true,
});
}}
onMouseLeave={() => {
this.setState({ exportSubmenu: "" });
}}
>
<Trans>Export dictionary history</Trans>
<span className="icon-dropdown icon-export-all"></span>
</span>
<div
className="select-more-actions select-export-format-submenu"
style={
this.state.exportSubmenu === "words"
? { left: "160px", top: "auto", bottom: "0px" }
: { display: "none" }
}
}}
>
<Trans>Export dictionary history</Trans>
</span>
onMouseEnter={() => {
this.setState({
exportSubmenu: "words",
isShowExport: true,
});
}}
onMouseLeave={() => {
this.setState({ exportSubmenu: "", isShowExport: false });
}}
>
{(["csv", "json"] as const).map((fmt) => (
<span
key={fmt}
className="book-manage-title select-book-action"
onClick={async () => {
let selectedBooks =
await DatabaseService.getRecordsByKeys(
this.props.selectedBooks,
"books"
);
let dictHistory =
await DatabaseService.getRecordsByBookKeys(
this.props.selectedBooks,
"words"
);
if (dictHistory.length > 0) {
const result = await exportDictionaryHistory(
dictHistory,
selectedBooks,
fmt
);
if (result === "success") {
toast.success(this.props.t("Export successful"), { id: "exporting" });
} else if (result === "failed") {
toast.error(this.props.t("Failed to export"), { id: "exporting" });
}
} else {
toast(this.props.t("Nothing to export"));
}
this.setState({
exportSubmenu: "",
isShowExport: false,
});
}}
>
{fmt === "csv" ? "CSV" : "JSON"}
</span>
))}
</div>
</div>
<span
className="book-manage-title select-book-action"
onClick={async () => {
+105 -52
View File
@@ -11,6 +11,7 @@ import {
checkReachPageEnd,
getAllVoices,
getFormatFromAudioPath,
isReadingRawPDF,
langToName,
sleep,
splitSentences,
@@ -18,6 +19,7 @@ import {
import { isElectron } from "react-device-detect";
import toast from "react-hot-toast";
import TTSUtil from "../../utils/reader/ttsUtil";
import { getTextRules } from "../../utils/common";
import "./textToSpeech.css";
import { fetchUserInfo } from "../../utils/request/user";
import { getSplitSentence } from "../../utils/request/reader";
@@ -398,6 +400,8 @@ class TextToSpeech extends React.Component<
) {
ConfigService.setReaderConfig("voiceEngine", "system");
}
// 每次开始朗读前刷新文本规则(replace / delete)
TTSUtil.setTextRules(getTextRules(this.props.currentBook?.key));
this.handleStartSpeech();
};
handlePauseAudio = async () => {
@@ -586,6 +590,48 @@ class TextToSpeech extends React.Component<
};
});
} else {
// 多角色朗读的所有角色统一使用 multiRoleVoiceType 约束的引擎类型,
// 并校验 voice/engine 组合在声音列表中真实存在(自动修复遗留的混合组合)
const voiceType =
ConfigService.getReaderConfig("multiRoleVoiceType") || "";
const resolveVoice = (voiceName: string, voiceEngine: string) => {
if (!voiceName) return null;
const matched =
this.getVoiceByNameAndEngine(voiceName, voiceEngine) ||
this.voices.find((item: any) => item.name === voiceName);
if (!matched) return null;
const matchedEngine = matched.plugin || "system";
if (
voiceType === "" ||
(voiceType === "custom"
? matchedEngine !== "system" &&
matchedEngine !== "official-ai-voice-plugin"
: matchedEngine === voiceType)
) {
return { voiceName, voiceEngine: matchedEngine };
}
return null;
};
const globalVoice = resolveVoice(
ConfigService.getReaderConfig("voiceName"),
ConfigService.getReaderConfig("voiceEngine") || "system"
);
const narratorVoiceInfo =
resolveVoice(
this.state.multiRoleNarratorVoice,
this.state.multiRoleNarratorEngine || "system"
) || globalVoice;
if (voiceType !== "" && voiceType !== "system" && !narratorVoiceInfo) {
// AI/自定义类型下没有任何可用声音时,回退到全局单语音朗读
nodeList = nodeTextList.map((text: string) => {
return {
text,
voiceName: ConfigService.getReaderConfig("voiceName"),
voiceEngine: ConfigService.getReaderConfig("voiceEngine"),
};
});
return nodeList;
}
toast.loading(this.props.t("Analyzing roles, please wait..."), {
id: "tts-load",
});
@@ -602,32 +648,39 @@ class TextToSpeech extends React.Component<
let res = await getSplitSentence(splitTextList);
toast.dismiss("tts-load");
let narratorVoice = this.state.multiRoleNarratorVoice;
let narratorEngine = this.state.multiRoleNarratorEngine;
let maleVoice = this.state.multiRoleMaleVoice;
let maleEngine = this.state.multiRoleMaleEngine;
let femaleVoice = this.state.multiRoleFemaleVoice;
let femaleEngine = this.state.multiRoleFemaleEngine;
let childVoice = this.state.multiRoleChildVoice;
let childEngine = this.state.multiRoleChildEngine;
const narratorVoice = narratorVoiceInfo || {
voiceName: "",
voiceEngine: "system",
};
const maleVoice =
resolveVoice(
this.state.multiRoleMaleVoice,
this.state.multiRoleMaleEngine || "system"
) || narratorVoice;
const femaleVoice =
resolveVoice(
this.state.multiRoleFemaleVoice,
this.state.multiRoleFemaleEngine || "system"
) || narratorVoice;
const childVoice =
resolveVoice(
this.state.multiRoleChildVoice,
this.state.multiRoleChildEngine || "system"
) || narratorVoice;
if (res && res.data && res.data.sentences) {
nodeList = res.data.sentences.map((item: any) => {
let voiceName = narratorVoice;
let voiceEngine = narratorEngine;
let voice = narratorVoice;
if (item.role === "male") {
voiceName = maleVoice || narratorVoice;
voiceEngine = maleEngine || narratorEngine;
voice = maleVoice;
} else if (item.role === "female") {
voiceName = femaleVoice || narratorVoice;
voiceEngine = femaleEngine || narratorEngine;
voice = femaleVoice;
} else if (item.role === "child") {
voiceName = childVoice || narratorVoice;
voiceEngine = childEngine || narratorEngine;
voice = childVoice;
}
return {
text: item.text,
voiceName,
voiceEngine,
voiceName: voice.voiceName,
voiceEngine: voice.voiceEngine,
};
});
} else {
@@ -638,12 +691,7 @@ class TextToSpeech extends React.Component<
}
if (nodeList.length === 0) {
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
let currentPosition = this.props.htmlBook.rendition.getPosition();
await this.props.htmlBook.rendition.goToChapterIndex(
parseInt(currentPosition.chapterDocIndex) +
@@ -668,10 +716,7 @@ class TextToSpeech extends React.Component<
this.setState({ currentIndex: index });
let node = this.nodeList[index];
let style = this.highlightUtil.buildTtsHighlightStyle(
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
),
isReadingRawPDF(this.props.currentBook),
ConfigService.getReaderConfig("textOrientation") === "vertical"
);
this.props.htmlBook.rendition.highlightAudioNode(node.text, style);
@@ -703,7 +748,7 @@ class TextToSpeech extends React.Component<
speed * 100 - 100,
this.props.plugins,
this.nodeList,
10,
20,
false,
node.voiceEngine === "official-ai-voice-plugin"
);
@@ -735,12 +780,7 @@ class TextToSpeech extends React.Component<
}
if (isReachPageEnd) {
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
let currentPosition = this.props.htmlBook.rendition.getPosition();
await this.props.htmlBook.rendition.goToChapterIndex(
parseInt(currentPosition.chapterDocIndex) +
@@ -781,10 +821,7 @@ class TextToSpeech extends React.Component<
this.setState({ currentIndex: index });
let node = this.nodeList[index];
let style = this.highlightUtil.buildTtsHighlightStyle(
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
),
isReadingRawPDF(this.props.currentBook),
ConfigService.getReaderConfig("textOrientation") === "vertical"
);
this.props.htmlBook.rendition.highlightAudioNode(node.text, style);
@@ -816,12 +853,7 @@ class TextToSpeech extends React.Component<
isReachPageEnd = true;
}
if (isReachPageEnd) {
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
let currentPosition = this.props.htmlBook.rendition.getPosition();
await this.props.htmlBook.rendition.goToChapterIndex(
parseInt(currentPosition.chapterDocIndex) +
@@ -886,13 +918,15 @@ class TextToSpeech extends React.Component<
) => {
return new Promise<string>(async (resolve) => {
var msg = new SpeechSynthesisUtterance();
msg.text = this.nodeList[index].text
.replace(/\s\s/g, "")
.replace(/\r/g, "")
.replace(/\n/g, "")
.replace(/\t/g, "")
.replace(/&/g, "")
.replace(/\f/g, "");
msg.text = TTSUtil.applyTextRules(
this.nodeList[index].text
.replace(/\s\s/g, "")
.replace(/\r/g, "")
.replace(/\n/g, "")
.replace(/\t/g, "")
.replace(/&/g, "")
.replace(/\f/g, "")
);
if (!voiceName) {
voiceName = this.nativeVoices[0]?.name;
}
@@ -1290,11 +1324,30 @@ class TextToSpeech extends React.Component<
id="multi-role-voice-type"
value={this.state.multiRoleVoiceType}
onChange={(event) => {
if (event.target.value === this.state.multiRoleVoiceType)
return;
this.setState({ multiRoleVoiceType: event.target.value });
ConfigService.setReaderConfig(
"multiRoleVoiceType",
event.target.value
);
// 切换声音类型后清除各角色旧类型的 voice/engine 配置,
// 避免遗留“系统声音 + AI 引擎”之类的混合组合
["Narrator", "Male", "Female", "Child"].forEach((role) => {
ConfigService.setReaderConfig(`multiRole${role}Voice`, "");
ConfigService.setReaderConfig(`multiRole${role}Engine`, "");
});
this.setState({
multiRoleNarratorVoice: "",
multiRoleNarratorEngine: "",
multiRoleMaleVoice: "",
multiRoleMaleEngine: "",
multiRoleFemaleVoice: "",
multiRoleFemaleEngine: "",
multiRoleChildVoice: "",
multiRoleChildEngine: "",
});
toast(this.props.t("Please reselect voices for all roles"));
}}
>
<option value="" className="lang-setting-option">
+7 -6
View File
@@ -80,12 +80,7 @@ export const dropdownList = [
option: [{ label: "Built-in font", value: "Built-in font" }],
isPDF: false,
},
{
title: "CJK font family",
value: "subFontFamily",
option: [{ label: "Built-in font", value: "Built-in font" }],
isPDF: false,
},
{
title: "Line height",
value: "lineHeight",
@@ -190,6 +185,12 @@ export const dropdownList = [
],
isPDF: false,
},
{
title: "CJK font family",
value: "subFontFamily",
option: [{ label: "Built-in font", value: "Built-in font" }],
isPDF: false,
},
];
export const wordFrequencyList = [
{
+10
View File
@@ -24,3 +24,13 @@ export const loginList = [
fontsize: "17px",
},
];
export const proFeatures = [
"Cross-platform data sync (cloud drives, WebDAV, Docker, object storage)",
"Import books from cloud drives (OneDrive, Google Drive, WebDAV, FTP, SMB)",
"Official translation in 90+ languages",
"Official dictionary with definitions, examples & pronunciation",
"AI reading aids (chapter summaries, outline, multi-role narration)",
"Natural text-to-speech (82 languages, 569 voices)",
"OCR text recognition for scanned PDFs",
"Send to Kindle",
];
+16 -5
View File
@@ -73,6 +73,12 @@ export const generalSettingList = [
title: "Use file name as book title",
propName: "isUseOriginalName",
},
{
isElectron: false,
title: "Recognize book title and author with AI on import",
desc: "When importing books, if no book title is parsed from the book metadata, AI will be used to recognize the book title and author",
propName: "isAIAnalyzeTitle",
},
{
isElectron: true,
title: "Disable update notification",
@@ -506,11 +512,21 @@ export const skinList = [
];
export const readerSettingList = [
{
title: "Enable paragraph mode",
propName: "isParagraphMode",
isPDF: true,
},
{
title: "Render PDF from even page",
propName: "isStartFromEven",
isPDF: true,
},
{
title: "Show total page number (Experimental)",
propName: "isShowTotalPage",
isPDF: true,
},
{
title: "Allow Javascript in the books",
propName: "isAllowScript",
@@ -687,11 +703,6 @@ export const officialDictList = [
{ lang: "Automatic", code: "auto", nativeLang: "Automatic" },
{ lang: "English", code: "eng", nativeLang: "English" },
{ lang: "Simplified Chinese", code: "chs", nativeLang: "Simplified Chinese" },
{
lang: "Traditional Chinese",
code: "cht",
nativeLang: "Traditional Chinese",
},
{ lang: "Japanese", code: "jpn", nativeLang: "Japanese" },
{ lang: "Korean", code: "kor", nativeLang: "Korean" },
{ lang: "French", code: "fra", nativeLang: "French" },
-3
View File
@@ -29,11 +29,9 @@ import {
checkMissingBook,
generateSyncRecord,
getBookPartialMd5,
getChatLocale,
getTaskStats,
getWebsiteUrl,
openInBrowser,
resetKoodoSync,
scanFolderForNewBooks,
showTaskProgress,
throttle,
@@ -42,7 +40,6 @@ import {
} from "../../utils/common";
import { driveList } from "../../constants/driveList";
import SupportDialog from "../../components/dialogs/supportDialog";
import SyncService from "../../utils/storage/syncService";
import { LocalFileManager } from "../../utils/file/localFile";
import packageJson from "../../../package.json";
import { getTempToken, updateUserConfig } from "../../utils/request/user";
+16 -5
View File
@@ -29,6 +29,7 @@ class ContentList extends React.Component<ContentListProps, ContentListState> {
isSearchOpen: false,
searchKeyword: "",
isComposing: false,
chapterPages: [],
};
this.handleJump = this.handleJump.bind(this);
this.searchInputRef = React.createRef<HTMLInputElement>();
@@ -178,6 +179,7 @@ class ContentList extends React.Component<ContentListProps, ContentListState> {
this.setState(
{
chapters: htmlBook.chapters,
chapterPages: htmlBook.rendition.getPages(),
},
() => {
let bookLocation: {
@@ -234,6 +236,9 @@ class ContentList extends React.Component<ContentListProps, ContentListState> {
UNSAFE_componentWillReceiveProps(nextProps: ContentListProps) {
if (nextProps.htmlBook !== this.props.htmlBook && nextProps.htmlBook) {
this.handleScrollToChapter(nextProps.htmlBook);
nextProps.htmlBook.rendition.on("chapter-pages", () => {
this.handleScrollToChapter(nextProps.htmlBook);
});
}
if (
nextProps.currentChapterIndex !== this.props.currentChapterIndex &&
@@ -300,15 +305,22 @@ class ContentList extends React.Component<ContentListProps, ContentListState> {
></span>
)}
<span
<div
onClick={() => {
this.handleJump(item);
}}
className="book-content-name"
className="book-content-name content-chapter-title"
data-href={item.href}
>
{item.label}
</span>
<span>{item.label}</span>
<span
style={{ marginRight: "20px", opacity: 0.6, fontSize: "12px" }}
>
{this.state.chapterPages[item.index]
? this.state.chapterPages[item.index]
: ""}
</span>
</div>
{item.subitems &&
item.subitems.length > 0 &&
(isExpanded || this.state.isExpandContent) ? (
@@ -321,7 +333,6 @@ class ContentList extends React.Component<ContentListProps, ContentListState> {
const searchResults = this.getSearchResults();
const isSearching =
this.state.searchKeyword.trim().length > 0 && !this.state.isComposing;
const renderSearchResults = () => {
if (searchResults.length === 0) {
return (
@@ -3,10 +3,15 @@
width: calc(100% - 15px);
margin-left: 15px;
}
.content-chapter-title {
display: flex !important;
align-items: center;
justify-content: space-between;
}
.book-content-name {
display: block;
padding: 10px 0px;
width: 90%;
width: calc(100% - 15px);
font-size: 15px;
line-height: 18px;
opacity: 1;
@@ -33,7 +38,7 @@
}
.content-dropdown {
float: right;
margin-top: 15px;
margin-top: 13px;
position: relative;
right: 15px;
opacity: 0.5;
@@ -21,4 +21,5 @@ export interface ContentListState {
isSearchOpen: boolean;
searchKeyword: string;
isComposing: boolean;
chapterPages: number[];
}
+111 -17
View File
@@ -7,16 +7,24 @@ import { getBatchTrans, getWordDefinitions } from "../../utils/request/reader";
import {
detectLocalLanguage,
getFullTranslationTarget,
isReadingRawPDF,
} from "../../utils/common";
import toast from "react-hot-toast";
import { isElectron } from "react-device-detect";
import DatabaseService from "../../utils/storage/databaseService";
import Note from "../../models/Note";
import ConfigUtil from "../../utils/file/configUtil";
declare var window: any;
type TransCache = Record<string, Record<string, string>>;
class PageWidget extends React.Component<PageWidgetProps, PageWidgetState> {
isFirst: Boolean;
timeInterval: any;
lastBatchTranslationTriggerAt: number;
batchTranslationLock: Promise<any>;
transCacheMap: Map<string, TransCache>;
transCacheDirPath: string;
constructor(props: any) {
super(props);
this.state = {
@@ -30,6 +38,8 @@ class PageWidget extends React.Component<PageWidgetProps, PageWidgetState> {
this.isFirst = true;
this.lastBatchTranslationTriggerAt = 0;
this.batchTranslationLock = Promise.resolve();
this.transCacheMap = new Map();
this.transCacheDirPath = "";
}
getFormattedTime() {
@@ -137,6 +147,57 @@ class PageWidget extends React.Component<PageWidgetProps, PageWidgetState> {
this.setState({ ignoreNextPageChange: true });
}
}
getTransCachePath(chapterDocIndex: string): string {
const electron = window.electronAPI;
const dirPath = electron.sendSync("user-data", "ping");
const transDir = electron.path.join(dirPath, "trans");
if (!electron.fs.existsSync(transDir)) {
electron.fs.mkdirSync(transDir, { recursive: true });
}
this.transCacheDirPath = transDir;
return electron.path.join(
transDir,
this.props.currentBook.key + "_" + chapterDocIndex + ".json"
);
}
getTransCache(chapterDocIndex: string): TransCache {
if (this.transCacheMap.has(chapterDocIndex)) {
return this.transCacheMap.get(chapterDocIndex)!;
}
let cache: TransCache = {};
if (isElectron && window.electronAPI && window.electronAPI.fs) {
try {
const cachePath = this.getTransCachePath(chapterDocIndex);
const fs = window.electronAPI.fs;
if (fs.existsSync(cachePath)) {
cache = JSON.parse(fs.readFileSync(cachePath, "utf-8")) || {};
}
} catch (error) {
console.error("Failed to load translation cache:", error);
cache = {};
}
}
this.transCacheMap.set(chapterDocIndex, cache);
return cache;
}
saveTransCache(chapterDocIndex: string, cache: TransCache) {
if (!isElectron || !window.electronAPI || !window.electronAPI.fs) {
return;
}
try {
const cachePath = this.getTransCachePath(chapterDocIndex);
window.electronAPI.fs.writeFileSync(
cachePath,
JSON.stringify(cache),
"utf-8"
);
} catch (error) {
console.error("Failed to save translation cache:", error);
}
}
async handleBatchTranslation(rendition) {
const prev = this.batchTranslationLock;
const next = prev.then(async () => {
@@ -150,15 +211,47 @@ class PageWidget extends React.Component<PageWidgetProps, PageWidgetState> {
return;
}
let batchTransTexts = await rendition.getBatchTransTexts();
let batchTransTexts: string[] = await rendition.getBatchTransTexts();
if (batchTransTexts && batchTransTexts.length > 0) {
let res = await getBatchTrans(
batchTransTexts,
"Automatic",
getFullTranslationTarget()
);
if (res && res.data && res.data.texts) {
rendition.handleBatchTransResult(batchTransTexts, res.data.texts);
let targetLang = getFullTranslationTarget();
let chapterDocIndex = "";
if (typeof rendition.getPosition === "function") {
chapterDocIndex = rendition.getPosition()?.chapterDocIndex || "";
}
if (!chapterDocIndex && rendition.tempLocation) {
chapterDocIndex = rendition.tempLocation.chapterDocIndex || "";
}
if (!chapterDocIndex) {
chapterDocIndex = "0";
}
let cache = this.getTransCache(chapterDocIndex);
let translatedTexts: string[] = new Array(batchTransTexts.length);
let pendingIndexes: number[] = [];
let pendingTexts: string[] = [];
batchTransTexts.forEach((text, index) => {
let cachedText = cache[targetLang] && cache[targetLang][text];
if (cachedText !== undefined) {
translatedTexts[index] = cachedText;
} else {
pendingIndexes.push(index);
pendingTexts.push(text);
}
});
if (pendingTexts.length > 0) {
let res = await getBatchTrans(pendingTexts, "Automatic", targetLang);
if (res && res.data && res.data.texts) {
pendingIndexes.forEach((index, i) => {
translatedTexts[index] = res.data.texts[i];
if (!cache[targetLang]) {
cache[targetLang] = {};
}
cache[targetLang][batchTransTexts[index]] = res.data.texts[i];
});
this.saveTransCache(chapterDocIndex, cache);
}
}
if (translatedTexts.every((text) => text !== undefined)) {
rendition.handleBatchTransResult(batchTransTexts, translatedTexts);
}
}
});
@@ -213,12 +306,7 @@ class PageWidget extends React.Component<PageWidgetProps, PageWidgetState> {
if (!pageInfo) {
return;
}
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
this.setState({
prevPage: pageInfo.currentPage,
nextPage: pageInfo.currentPage + 1,
@@ -247,13 +335,19 @@ class PageWidget extends React.Component<PageWidgetProps, PageWidgetState> {
? ConfigService.getReaderConfig("textColor")
: "",
width:
!this.props.isNavLocked && !this.props.isSettingLocked && !this.props.isDockedRight
!this.props.isNavLocked &&
!this.props.isSettingLocked &&
!this.props.isDockedRight
? "100%"
: this.props.isNavLocked && (this.props.isSettingLocked || this.props.isDockedRight)
: this.props.isNavLocked &&
(this.props.isSettingLocked || this.props.isDockedRight)
? "calc(100% - 600px)"
: "calc(100% - 300px)",
left: !this.props.isNavLocked ? "0" : "300px",
right: !this.props.isSettingLocked && !this.props.isDockedRight ? "0" : "300px",
right:
!this.props.isSettingLocked && !this.props.isDockedRight
? "0"
: "300px",
backgroundColor: this.props.backgroundColor,
filter: `brightness(${
ConfigService.getReaderConfig("brightness") || 1
+2 -2
View File
@@ -1,6 +1,6 @@
import { connect } from "react-redux";
import { stateType } from "../../store";
import Background from "./component";
import PageWidget from "./component";
import {
handleCurrentChapter,
handleCurrentChapterIndex,
@@ -38,4 +38,4 @@ const actionCreator = {
export default connect(
mapStateToProps,
actionCreator
)(withTranslation()(Background) as any);
)(withTranslation()(PageWidget) as any);
@@ -1,5 +1,6 @@
import React from "react";
import "./navigationPanel.css";
import { isReadingRawPDF } from "../../../utils/common";
import ContentList from "../../lists/contentList";
import BookNavList from "../../lists/navList";
import { Trans } from "react-i18next";
@@ -215,10 +216,7 @@ class NavigationPanel extends React.Component<
})
);
let style = this.highlightUtil.buildSearchHighlightStyle(
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
),
isReadingRawPDF(this.props.currentBook),
ConfigService.getReaderConfig("textOrientation") === "vertical"
);
this.props.htmlBook.rendition.highlightSearchNode(
@@ -281,7 +279,9 @@ class NavigationPanel extends React.Component<
this.handleSearchItemClick(entry.item);
}}
>
<div>{Parser(DOMPurify.sanitize(entry.item.excerpt))}</div>
<div>
{Parser(DOMPurify.sanitize(entry.item.excerpt))}
</div>
</li>
);
})}
@@ -100,7 +100,7 @@ class OperationPanel extends React.Component<
if (ConfigService.getReaderConfig("isOpenInMain") === "yes") {
window.electronAPI.invoke("exit-tab", "ping");
} else {
window.close();
window.electronAPI.invoke("exit-reader", "ping");
}
} else {
ConfigService.setReaderConfig("isFinishWebReading", "yes");
@@ -4,7 +4,7 @@ import { Trans } from "react-i18next";
import { ProgressPanelProps, ProgressPanelState } from "./interface";
import _ from "underscore";
import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min";
import { scrollContents } from "../../../utils/common";
import { isReadingRawPDF, scrollContents } from "../../../utils/common";
class ProgressPanel extends React.Component<
ProgressPanelProps,
ProgressPanelState
@@ -117,10 +117,7 @@ class ProgressPanel extends React.Component<
return <div className="progress-panel">Loading</div>;
}
let readerMode =
(this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)) ||
isReadingRawPDF(this.props.currentBook) ||
this.props.currentBook.format.startsWith("CB")
? ConfigService.getReaderConfig("pdfReaderMode") || "scroll"
: ConfigService.getReaderConfig("readerMode") || "double";
@@ -1,5 +1,6 @@
import React from "react";
import "./settingPanel.css";
import { isReadingRawPDF } from "../../../utils/common";
import ThemeList from "../../../components/readerSettings/themeList";
import SliderList from "../../../components/readerSettings/sliderList";
import DropdownList from "../../../components/readerSettings/dropdownList";
@@ -94,12 +95,7 @@ class SettingPanel extends React.Component<
<ThemeList />
{sliderConfigs
.filter((item) => {
if (
this.props.currentBook.format === "PDF" &&
!ConfigService.getAllListConfig("convertPDFBooks").includes(
this.props.currentBook.key
)
) {
if (isReadingRawPDF(this.props.currentBook)) {
return item.isPDF;
}
return true;
@@ -92,7 +92,7 @@ class AboutSetting extends React.Component<SettingInfoProps, SettingInfoState> {
}}
>
{[
{value:"",label: "Please select"},
{ value: "", label: "Please select" },
{ value: "dev", label: "Developer version" },
{ value: "stable", label: "Stable version" },
].map((item) => (
@@ -127,9 +127,7 @@ class AboutSetting extends React.Component<SettingInfoProps, SettingInfoState> {
<span
className="change-location-button"
onClick={async () => {
window
.electronAPI
.invoke("open-console", "ping");
window.electronAPI.invoke("open-console", "ping");
}}
>
<Trans>View</Trans>
@@ -155,6 +153,25 @@ class AboutSetting extends React.Component<SettingInfoProps, SettingInfoState> {
<Trans>Visit</Trans>
</span>
</div>
<div className="setting-dialog-new-title">
<Trans>FAQ</Trans>
<span
className="change-location-button"
onClick={async () => {
if (
ConfigService.getReaderConfig("lang") &&
ConfigService.getReaderConfig("lang").startsWith("zh")
) {
openExternalUrl(getWebsiteUrl() + "/zh/faq");
} else {
openExternalUrl(getWebsiteUrl() + "/en/faq");
}
}}
>
<Trans>Visit</Trans>
</span>
</div>
<div className="setting-dialog-new-title">
<Trans>Support</Trans>
@@ -1,7 +1,6 @@
import React from "react";
import { SettingInfoProps, SettingInfoState } from "./interface";
import { Trans } from "react-i18next";
import { isElectron } from "react-device-detect";
import _ from "underscore";
import toast from "react-hot-toast";
import {
@@ -20,7 +19,7 @@ import {
KookitConfig,
LoginHelper,
} from "../../../assets/lib/kookit-extra-browser.min";
import { loginList } from "../../../constants/loginList";
import { loginList, proFeatures } from "../../../constants/loginList";
import {
getTempToken,
getUserRequest,
@@ -49,6 +48,7 @@ class AccountSetting extends React.Component<
isSendingCode: false,
countdown: 0,
serverRegion: getServerRegion(),
showLoginOptions: false,
};
}
componentDidMount(): void {
@@ -625,11 +625,82 @@ class AccountSetting extends React.Component<
</div>
</div>
)}
<div className="setting-dialog-new-title">
<div>
<Trans>
{this.props.isAuthed ? "Server region" : "Select server region"}
</Trans>
{!this.props.isAuthed && !this.state.showLoginOptions && (
<div className="pro-banner-container">
<div className="pro-banner">
<div className="pro-banner-overlay"></div>
<div className="pro-banner-content">
<div className="pro-banner-header">
<div className="pro-banner-title">
<Trans>Pro version</Trans>
</div>
<div className="pro-banner-tabs">
{(
[
{ key: "yearly", label: "Yearly" },
{ key: "limited", label: "Limited offer" },
] as const
).map((item) => (
<div
key={item.key}
className={
item.key === "yearly"
? "pro-banner-tab active-pro-banner-tab"
: "pro-banner-tab"
}
>
<Trans>{item.label}</Trans>
</div>
))}
</div>
</div>
<div className="pro-banner-price">
<span className="pro-banner-price-value">
<Trans>{"$4.99"}</Trans>
</span>
<span className="pro-banner-price-unit">
{" / "}
<Trans>{"Year"}</Trans>
</span>
</div>
<div className="pro-banner-features">
{proFeatures.map((item) => (
<div key={item} className="pro-banner-feature-item">
<span className="icon-check pro-banner-feature-icon"></span>
<span>
<Trans>{item}</Trans>
</span>
</div>
))}
</div>
<div className="pro-banner-actions">
<div
className="pro-banner-btn pro-banner-btn-login"
onClick={() => {
this.setState({ showLoginOptions: true });
}}
>
<Trans>Register / Login</Trans>
</div>
<div
className="pro-banner-btn pro-banner-btn-trial"
onClick={() => {
this.setState({ showLoginOptions: true });
}}
>
<Trans>Start 7-day free trial</Trans>
</div>
</div>
</div>
</div>
</div>
)}
{(this.props.isAuthed || this.state.showLoginOptions) && (
<div className="setting-dialog-new-title">
<div>
<Trans>
{this.props.isAuthed ? "Server region" : "Select server region"}
</Trans>
{ConfigService.getReaderConfig("lang").startsWith("zh") && (
<span
style={{
@@ -720,8 +791,9 @@ class AccountSetting extends React.Component<
))}
</select>
)}
</div>
{!this.props.isAuthed && (
</div>
)}
{!this.props.isAuthed && this.state.showLoginOptions && (
<>
<div className="setting-dialog-new-title">
<Trans>Select login method</Trans>
@@ -749,22 +821,20 @@ class AccountSetting extends React.Component<
</div>
</>
)}
{!this.props.isAuthed && (
{!this.props.isAuthed && this.state.showLoginOptions && (
<>
<div className="account-login-tips">
<div
className="account-login-tips"
style={{
opacity: 1,
}}
>
{this.props.t(
"7-day free trial upon registration, then billed annually"
"7-day free trial upon registration, then billed $4.99 per Year"
)}
</div>
<div
className="account-login-tips"
style={{
marginTop: "10px",
opacity: 1,
fontWeight: "bold",
cursor: "pointer",
textDecoration: "underline",
}}
onClick={() => {
openInBrowser(
getWebsiteUrl() +
@@ -774,6 +844,13 @@ class AccountSetting extends React.Component<
"/pricing"
);
}}
style={{
marginTop: "10px",
fontWeight: "bold",
cursor: "pointer",
textDecoration: "underline",
opacity: 1,
}}
>
{this.props.t("Compare Free and Pro features")}
</div>
@@ -34,6 +34,7 @@ export interface SettingInfoState {
loginConfig: any;
settingLogin: string;
serverRegion: string;
showLoginOptions: boolean;
isSendingCode: boolean;
countdown: number;
}
@@ -4,7 +4,12 @@
gap: 10px;
margin: 10px 25px 60px 25px;
}
.background-apple-button {
font-size: 14px;
padding: 6px 16px;
height: 32px;
background-color: transparent !important;
}
.background-setting-item {
width: 120px;
height: 80px;
@@ -137,3 +142,69 @@
font-size: 14px;
width: 100%;
}
/* Featured backgrounds section */
.background-featured-section {
margin: 0 25px 80px 25px;
}
.background-featured-section-title {
font-weight: 600;
font-size: 15px;
margin-bottom: 10px;
display: flex;
align-items: baseline;
gap: 10px;
opacity: 0.9;
}
.background-featured-section-note {
font-size: 12px;
font-weight: normal;
opacity: 0.55;
}
.background-featured-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.background-featured-item {
position: relative;
aspect-ratio: 512 / 288;
overflow: hidden;
cursor: pointer;
border: 2px solid transparent;
box-sizing: border-box;
transition: border-color 0.15s;
}
.background-featured-item:hover {
opacity: 0.85;
}
.background-featured-item.active-bg-item {
border-color: var(--color-theme-color, #0179ca);
}
.background-featured-img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.background-featured-placeholder {
background: repeating-linear-gradient(
45deg,
rgba(128, 128, 128, 0.08),
rgba(128, 128, 128, 0.08) 8px,
transparent 8px,
transparent 16px
);
}
.change-location-button.is-downloading {
opacity: 0.7;
pointer-events: none;
}
@@ -11,11 +11,14 @@ import toast from "react-hot-toast";
import { applyAppBackgroundImage } from "../../../utils/reader/launchUtil";
import BackgroundUtil from "../../../utils/file/backgroundUtil";
const FEATURED_COUNT = 100;
class BackgroundSetting extends React.Component<
SettingInfoProps,
SettingInfoState
> {
fileInputRef = React.createRef<HTMLInputElement>();
featuredObserver: IntersectionObserver | null = null;
constructor(props: SettingInfoProps) {
super(props);
@@ -23,18 +26,66 @@ class BackgroundSetting extends React.Component<
images: [],
loadedUrls: {},
previewImage: null,
previewFeatured: null,
appBackgroundId:
ConfigService.getReaderConfig("appBackgroundImage") || "",
readerBackgroundId:
ConfigService.getReaderConfig("readerBackgroundImage") || "",
isLoading: true,
visibleFeatured: new Set<number>(),
downloadingId: "",
downloadProgress: 0,
};
}
componentDidMount() {
this.loadAllImages();
this.setupFeaturedObserver();
}
componentWillUnmount() {
this.featuredObserver?.disconnect();
}
setupFeaturedObserver = () => {
if (typeof IntersectionObserver === "undefined") return;
this.featuredObserver = new IntersectionObserver(
(entries) => {
const newlyVisible: number[] = [];
entries.forEach((entry) => {
if (!entry.isIntersecting) return;
const index = Number(
(entry.target as HTMLElement).dataset.featuredIndex
);
if (index && !this.state.visibleFeatured.has(index)) {
newlyVisible.push(index);
}
});
if (newlyVisible.length > 0) {
this.setState((prev) => ({
visibleFeatured: new Set([
...prev.visibleFeatured,
...newlyVisible,
]),
}));
}
},
{ rootMargin: "300px 0px" }
);
};
registerFeaturedItem = (index: number) => (el: HTMLDivElement | null) => {
if (!el) return;
el.dataset.featuredIndex = String(index);
if (this.featuredObserver) {
this.featuredObserver.observe(el);
} else if (!this.state.visibleFeatured.has(index)) {
this.setState((prev) => ({
visibleFeatured: new Set([...prev.visibleFeatured, index]),
}));
}
};
loadAllImages = async () => {
this.setState({ isLoading: true });
const ids = BackgroundUtil.getImageIds();
@@ -151,6 +202,76 @@ class BackgroundSetting extends React.Component<
ConfigService.setReaderConfig("backgroundColor", "");
};
getFeaturedImage = (index: number): BackgroundImage | undefined => {
const id = BackgroundUtil.getFeaturedBackgroundId(index);
return this.state.images.find((img) => img.id === id);
};
handleFeaturedPreview = (index: number) => {
const existing = this.getFeaturedImage(index);
if (existing) {
this.handlePreview(existing);
} else {
this.setState({ previewFeatured: index });
}
};
handleCloseFeaturedPreview = () => {
this.setState({ previewFeatured: null });
};
handleFeaturedSetBackground = async (
index: number,
type: "app" | "reader"
) => {
const id = BackgroundUtil.getFeaturedBackgroundId(index);
if (this.state.downloadingId) return;
const existing = this.getFeaturedImage(index);
if (existing) {
if (type === "app") {
this.handleSetAppBackground(existing);
} else {
this.handleSetReaderBackground(existing);
}
return;
}
this.setState({ downloadingId: id, downloadProgress: 0 });
try {
const dataUrl = await BackgroundUtil.downloadFeaturedBackground(
index,
(progress) => this.setState({ downloadProgress: progress })
);
if (!dataUrl) {
toast.error(this.props.t("Download failed"));
return;
}
const meta = BackgroundUtil.getImageMeta(id);
const newImage: BackgroundImage = {
id,
name: meta?.name || id,
extension: meta?.extension || "png",
backgroundColor: meta?.backgroundColor,
textColor: meta?.textColor,
};
this.setState((prev) => ({
images: [...prev.images, newImage],
loadedUrls: { ...prev.loadedUrls, [id]: dataUrl },
}));
if (type === "app") {
this.handleSetAppBackground(newImage);
} else {
this.handleSetReaderBackground(newImage);
}
toast.success(this.props.t("Download successful"));
} catch (err) {
console.error(err);
toast.error(this.props.t("Download failed"));
} finally {
this.setState({ downloadingId: "", downloadProgress: 0 });
}
};
handleDelete = async (e: React.MouseEvent, image: BackgroundImage) => {
e.stopPropagation();
try {
@@ -206,7 +327,7 @@ class BackgroundSetting extends React.Component<
>
{isApp ? (
<span
className="change-location-button"
className="change-location-button background-apple-button"
style={{ fontSize: "14px", padding: "6px 16px", height: "32px" }}
onClick={this.handleClearAppBackground}
>
@@ -214,7 +335,7 @@ class BackgroundSetting extends React.Component<
</span>
) : (
<span
className="change-location-button"
className="change-location-button background-apple-button"
style={{ fontSize: "14px", padding: "6px 16px", height: "32px" }}
onClick={() => this.handleSetAppBackground(previewImage)}
>
@@ -223,7 +344,7 @@ class BackgroundSetting extends React.Component<
)}
{isReader ? (
<span
className="change-location-button"
className="change-location-button background-apple-button"
style={{ fontSize: "14px", padding: "6px 16px", height: "32px" }}
onClick={this.handleClearReaderBackground}
>
@@ -231,7 +352,7 @@ class BackgroundSetting extends React.Component<
</span>
) : (
<span
className="change-location-button"
className="change-location-button background-apple-button"
style={{ fontSize: "14px", padding: "6px 16px", height: "32px" }}
onClick={() => this.handleSetReaderBackground(previewImage)}
>
@@ -242,8 +363,116 @@ class BackgroundSetting extends React.Component<
);
};
renderFeaturedPreviewActions = (index: number) => {
const id = BackgroundUtil.getFeaturedBackgroundId(index);
const isDownloading = this.state.downloadingId === id;
const percent = Math.round(this.state.downloadProgress * 100);
const isApp = this.state.appBackgroundId === id;
const isReader = this.state.readerBackgroundId === id;
return (
<div
className="background-preview-actions"
onClick={(e) => e.stopPropagation()}
>
{isApp ? (
<span
className="change-location-button background-apple-button"
onClick={this.handleClearAppBackground}
>
<Trans>Clear app background</Trans>
</span>
) : (
<span
className={
"change-location-button background-apple-button" +
(isDownloading ? " is-downloading" : "")
}
onClick={() => this.handleFeaturedSetBackground(index, "app")}
>
{isDownloading ? (
<span>
<Trans>Downloading</Trans> {percent}%
</span>
) : (
<Trans>Set as app background</Trans>
)}
</span>
)}
{isReader ? (
<span
className="change-location-button background-apple-button"
onClick={this.handleClearReaderBackground}
>
<Trans>Clear book background</Trans>
</span>
) : (
<span
className={
"change-location-button background-apple-button" +
(isDownloading ? " is-downloading" : "")
}
onClick={() => this.handleFeaturedSetBackground(index, "reader")}
>
{isDownloading ? (
<span>
<Trans>Downloading</Trans> {percent}%
</span>
) : (
<Trans>Set as book background</Trans>
)}
</span>
)}
</div>
);
};
renderFeaturedSection = () => {
const { visibleFeatured, appBackgroundId, readerBackgroundId } = this.state;
const indices = Array.from({ length: FEATURED_COUNT }, (_, i) => i + 1);
return (
<div className="background-featured-section">
<div className="background-featured-section-title">
<Trans>Download featured backgrounds</Trans>
<span className="background-featured-section-note">
<Trans>Generated with AI</Trans>
</span>
</div>
<div className="background-featured-grid">
{indices.map((index) => {
const id = BackgroundUtil.getFeaturedBackgroundId(index);
const isActive =
appBackgroundId === id || readerBackgroundId === id;
return (
<div
key={index}
className={
"background-featured-item" +
(isActive ? " active-bg-item" : "")
}
ref={this.registerFeaturedItem(index)}
onClick={() => this.handleFeaturedPreview(index)}
>
{visibleFeatured.has(index) ? (
<img
className="background-featured-img"
src={BackgroundUtil.getFeaturedThumbnailUrl(index)}
alt={id}
loading="lazy"
/>
) : (
<div className="background-featured-img background-featured-placeholder" />
)}
</div>
);
})}
</div>
</div>
);
};
render() {
const { images, previewImage, loadedUrls, isLoading } = this.state;
const { images, previewImage, previewFeatured, loadedUrls, isLoading } =
this.state;
return (
<>
<div className="background-setting-grid">
@@ -288,6 +517,8 @@ class BackgroundSetting extends React.Component<
)}
</div>
{this.renderFeaturedSection()}
{/* Hidden file input */}
<input
ref={this.fileInputRef}
@@ -326,6 +557,26 @@ class BackgroundSetting extends React.Component<
{this.renderPreviewActions(previewImage)}
</div>
)}
{/* Featured preview overlay */}
{previewFeatured !== null && !previewImage && (
<div
className="background-preview-overlay"
onClick={this.handleCloseFeaturedPreview}
>
<span
className="background-preview-close icon-close"
onClick={this.handleCloseFeaturedPreview}
/>
<img
className="background-preview-image"
src={BackgroundUtil.getFeaturedOriginalUrl(previewFeatured)}
alt={BackgroundUtil.getFeaturedBackgroundId(previewFeatured)}
onClick={(e) => e.stopPropagation()}
/>
{this.renderFeaturedPreviewActions(previewFeatured)}
</div>
)}
</>
);
}
@@ -18,7 +18,14 @@ export interface SettingInfoState {
/** loaded dataUrls keyed by image id */
loadedUrls: Record<string, string>;
previewImage: BackgroundImage | null;
/** featured background index currently in preview */
previewFeatured: number | null;
appBackgroundId: string;
readerBackgroundId: string;
isLoading: boolean;
/** featured indexes whose thumbnail has entered the viewport */
visibleFeatured: Set<number>;
/** id of the featured background being downloaded */
downloadingId: string;
downloadProgress: number;
}
Loaded 100 of 165 files, more files were not shown because too many files have changed in this diff. Show more