From 815ccc98ec079619144db453991b9a840a4e272b Mon Sep 17 00:00:00 2001 From: ping Date: Tue, 5 Sep 2023 14:51:07 +0800 Subject: [PATCH] Add ability to generate a new setup code for another device --- CHANGELOG.md | 1 + calibre-plugin/config.py | 62 +++++++++- calibre-plugin/libby/client.py | 9 ++ calibre-plugin/translations/default.pot | 149 +++++++++++++----------- calibre-plugin/translations/ja.po | 148 ++++++++++++----------- calibre-plugin/translations/ko.po | 148 ++++++++++++----------- calibre-plugin/translations/zh_CN.po | 148 ++++++++++++----------- calibre-plugin/translations/zh_TW.po | 148 ++++++++++++----------- 8 files changed, 477 insertions(+), 336 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b6bbad..8d45376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Unreleased - New: Simple filter for titles and names in the Loans/Holds/Magazines/Cards tabs - New: Copy the Libby share link for a book - New: Verify a card +- New: Generate a setup code (for another device) - Improve: Display linked identifiers, subjects in Book Details - Improve: Infrequently changed data like libraries are now cached to give sync a small speed bump - Improve: Card image in cards tab is not fuzzy anymore diff --git a/calibre-plugin/config.py b/calibre-plugin/config.py index c544455..66db6a5 100644 --- a/calibre-plugin/config.py +++ b/calibre-plugin/config.py @@ -7,6 +7,7 @@ # See https://github.com/ping/libby-calibre-plugin for more # information # +import time from typing import Tuple from calibre import confirm_config_name @@ -34,6 +35,7 @@ QVBoxLayout, QWidget, Qt, + QTimer, ) from . import DEMO_MODE, PLUGIN_NAME, PLUGINS_FOLDER_NAME, logger @@ -42,7 +44,7 @@ # noinspection PyUnreachableCode if False: - load_translations = _ = lambda x=None: x + load_translations = _ = ngettext = lambda x=None, y=None, z=None: x load_translations() @@ -224,6 +226,24 @@ def __init__(self, plugin_action): self.libby_setup_code_txt.setText(PREFS[PreferenceKeys.LIBBY_SETUP_CODE]) libby_layout.addRow(self.libby_setup_code_lbl, self.libby_setup_code_txt) + if is_configured: + generate_code_layout = QHBoxLayout() + self.generate_code_btn = QPushButton(_("Generate Setup Code"), self) + self.generate_code_btn.setToolTip( + _("Generate setup code for another device") + ) + self.generate_code_btn.setMinimumWidth(150) + self.generate_code_btn.clicked.connect(self.generate_code_btn_clicked) + generate_code_layout.addWidget(self.generate_code_btn) + self.generated_code_lbl = QLabel(self) + self.generated_code_lbl.setTextInteractionFlags( + Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse + ) + generate_code_layout.addWidget(self.generated_code_lbl) + self.time_remaining_lbl = QLabel(self) + generate_code_layout.addWidget(self.time_remaining_lbl, stretch=1) + libby_layout.addRow(generate_code_layout) + # ------------------------------------ LOANS ------------------------------------ loans_section = QGroupBox(_("Loans")) loan_layout = QFormLayout() @@ -647,6 +667,46 @@ def __init__(self, plugin_action): self.resize(self.sizeHint()) + def generate_code_btn_clicked(self): + from .libby import LibbyClient + + client = LibbyClient( + identity_token=PREFS[PreferenceKeys.LIBBY_TOKEN], + max_retries=PREFS[PreferenceKeys.NETWORK_RETRY], + timeout=PREFS[PreferenceKeys.NETWORK_TIMEOUT], + logger=logger, + ) + res = client.generate_clone_code() + generated_code = res.get("code", "") + expiry: int = res.get("expiry", 0) + if generated_code and expiry: + self.code_expiry = expiry + self.generated_code = generated_code + self.timer = QTimer(self) + self.timer.timeout.connect(self.timer_update) + self.generate_code_btn.setEnabled(False) + self.generated_code_lbl.setText(f"{self.generated_code}") + self.timer_update() + self.timer.start(1000) + + def timer_update(self): + remaining_seconds = self.code_expiry - int(time.time()) + if remaining_seconds <= 0: + self.timer.stop() + self.generate_code_btn.setEnabled(True) + self.generated_code_lbl.setText("") + self.time_remaining_lbl.setText("") + self.generated_code = "" + self.code_expiry = 0 + else: + self.time_remaining_lbl.setText( + ngettext( + "{remaining} second remaining", + "{remaining} seconds remaining", + remaining_seconds, + ).format(remaining=remaining_seconds) + ) + def custom_column_name(self, col_type: str): for c in (" ",): col_type = col_type.replace(c, "_") diff --git a/calibre-plugin/libby/client.py b/calibre-plugin/libby/client.py index 8c9aa2f..61e76aa 100644 --- a/calibre-plugin/libby/client.py +++ b/calibre-plugin/libby/client.py @@ -608,6 +608,15 @@ def clone_by_code(self, code: str) -> Dict: res: Dict = self.send_request("chip/clone/code", params={"code": code}) return res + def generate_clone_code(self): + """ + Get a clone code for setting up another device + + :return: + """ + res: Dict = self.send_request("chip/clone/code") + return res + def sync(self) -> Dict: """ Get the user account state, which includes loans, holds, etc. diff --git a/calibre-plugin/translations/default.pot b/calibre-plugin/translations/default.pot index 12a827c..86e229f 100644 --- a/calibre-plugin/translations/default.pot +++ b/calibre-plugin/translations/default.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: libby-calibre-plugin 0.1.7\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-09-03 20:12+0800\n" +"POT-Creation-Date: 2023-09-05 13:22+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,7 +22,7 @@ msgstr "" msgid "Import loans from your OverDrive Libby account" msgstr "" -#: calibre-plugin/action.py:67 calibre-plugin/config.py:185 +#: calibre-plugin/action.py:67 calibre-plugin/config.py:187 msgid "Libby" msgstr "" @@ -63,165 +63,173 @@ msgstr "" msgid "Borrowing" msgstr "" -#: calibre-plugin/config.py:99 calibre-plugin/config.py:767 +#: calibre-plugin/config.py:101 calibre-plugin/config.py:827 msgid "Libby Setup Code" msgstr "" -#: calibre-plugin/config.py:100 +#: calibre-plugin/config.py:102 msgid "8-digit setup code" msgstr "" -#: calibre-plugin/config.py:101 +#: calibre-plugin/config.py:103 msgid "Hide Magazines" msgstr "" -#: calibre-plugin/config.py:102 +#: calibre-plugin/config.py:104 msgid "Hide Ebooks" msgstr "" -#: calibre-plugin/config.py:103 +#: calibre-plugin/config.py:105 msgid "Include titles without downloadable formats" msgstr "" -#: calibre-plugin/config.py:104 +#: calibre-plugin/config.py:106 msgid "Hide titles already in library" msgstr "" -#: calibre-plugin/config.py:105 +#: calibre-plugin/config.py:107 msgid "Exclude empty books when hiding titles already in library" msgstr "" -#: calibre-plugin/config.py:106 +#: calibre-plugin/config.py:108 msgid "Hide unavailable holds" msgstr "" -#: calibre-plugin/config.py:107 +#: calibre-plugin/config.py:109 msgid "Prefer Open Formats" msgstr "" -#: calibre-plugin/config.py:108 +#: calibre-plugin/config.py:110 msgid "Tag downloaded ebooks with" msgstr "" -#: calibre-plugin/config.py:109 +#: calibre-plugin/config.py:111 msgid "Example: library,books" msgstr "" -#: calibre-plugin/config.py:110 +#: calibre-plugin/config.py:112 msgid "Tag downloaded magazines with" msgstr "" -#: calibre-plugin/config.py:111 +#: calibre-plugin/config.py:113 msgid "Example: library,magazines" msgstr "" -#: calibre-plugin/config.py:112 +#: calibre-plugin/config.py:114 msgid "Always confirm returns" msgstr "" -#: calibre-plugin/config.py:113 +#: calibre-plugin/config.py:115 msgid "Always confirm holds cancellation" msgstr "" -#: calibre-plugin/config.py:114 +#: calibre-plugin/config.py:116 msgid "Always confirm Read with Kindle" msgstr "" -#: calibre-plugin/config.py:115 +#: calibre-plugin/config.py:117 msgid "Enable OverDrive Link Plugin integration" msgstr "" -#: calibre-plugin/config.py:116 +#: calibre-plugin/config.py:118 msgid "Mark updated books" msgstr "" -#: calibre-plugin/config.py:117 +#: calibre-plugin/config.py:119 msgid "Always download as a new book" msgstr "" -#: calibre-plugin/config.py:118 +#: calibre-plugin/config.py:120 msgid "Connection timeout" msgstr "" -#: calibre-plugin/config.py:120 +#: calibre-plugin/config.py:122 msgid "Maximum search results" msgstr "" -#: calibre-plugin/config.py:121 +#: calibre-plugin/config.py:123 #, python-brace-format msgid "Library Keys (comma-separated, max: {n})" msgstr "" -#: calibre-plugin/config.py:124 +#: calibre-plugin/config.py:126 msgid "Custom column for Borrowed Date" msgstr "" -#: calibre-plugin/config.py:125 +#: calibre-plugin/config.py:127 msgid "Custom column for Due Date" msgstr "" -#: calibre-plugin/config.py:126 +#: calibre-plugin/config.py:128 msgid "Custom column for Loan Type" msgstr "" -#: calibre-plugin/config.py:127 +#: calibre-plugin/config.py:129 msgid "Use highest-resolution cover for book details" msgstr "" -#: calibre-plugin/config.py:128 +#: calibre-plugin/config.py:130 msgid "Cache data for" msgstr "" -#: calibre-plugin/config.py:192 +#: calibre-plugin/config.py:194 msgid "Libby is configured." msgstr "" -#: calibre-plugin/config.py:194 calibre-plugin/dialog/base.py:406 +#: calibre-plugin/config.py:196 calibre-plugin/dialog/base.py:406 msgid "Libby is not configured yet." msgstr "" -#: calibre-plugin/config.py:217 +#: calibre-plugin/config.py:219 msgid "Enter the 8-digit Libby setup code generated from another device" msgstr "" -#: calibre-plugin/config.py:228 calibre-plugin/dialog/cards.py:326 +#: calibre-plugin/config.py:231 +msgid "Generate Setup Code" +msgstr "" + +#: calibre-plugin/config.py:233 +msgid "Generate setup code for another device" +msgstr "" + +#: calibre-plugin/config.py:248 calibre-plugin/dialog/cards.py:326 #: calibre-plugin/dialog/cards.py:392 calibre-plugin/dialog/loans.py:169 msgid "Loans" msgstr "" -#: calibre-plugin/config.py:235 +#: calibre-plugin/config.py:255 msgid "Don't list ebook loans" msgstr "" -#: calibre-plugin/config.py:241 +#: calibre-plugin/config.py:261 msgid "Don't list magazine loans" msgstr "" -#: calibre-plugin/config.py:250 +#: calibre-plugin/config.py:270 msgid "Hide loans that are already in your calibre library" msgstr "" -#: calibre-plugin/config.py:263 +#: calibre-plugin/config.py:283 msgid "" "When enabled, empty books are excluded when hiding titles already in your " "library" msgstr "" -#: calibre-plugin/config.py:274 +#: calibre-plugin/config.py:294 msgid "Toggle the confirmation prompt before returning loans" msgstr "" -#: calibre-plugin/config.py:287 +#: calibre-plugin/config.py:307 msgid "" "Toggle the confirmation prompt before chosing to Read with Kindle a title " "that is not format-locked" msgstr "" -#: calibre-plugin/config.py:300 +#: calibre-plugin/config.py:320 msgid "Choose DRM-free formats if available" msgstr "" -#: calibre-plugin/config.py:313 +#: calibre-plugin/config.py:333 msgid "" "If enabled, the plugin will attempt to find a matching OverDrive-linked book " "that does not have any formats and add the new download as an EPUB to the " @@ -229,123 +237,130 @@ msgid "" "added." msgstr "" -#: calibre-plugin/config.py:328 +#: calibre-plugin/config.py:348 msgid "" "If enabled, book records that were updated with a new format will be marked." msgstr "" -#: calibre-plugin/config.py:342 +#: calibre-plugin/config.py:362 msgid "" "Never update an existing empty book. Always create a new book entry for a " "download." msgstr "" -#: calibre-plugin/config.py:352 +#: calibre-plugin/config.py:372 msgid "Add specified tags to the ebooks downloaded" msgstr "" -#: calibre-plugin/config.py:361 +#: calibre-plugin/config.py:381 msgid "Add specified tags to the magazines downloaded" msgstr "" -#: calibre-plugin/config.py:380 +#: calibre-plugin/config.py:400 msgid "If specified, this column will be updated with the loan checkout date" msgstr "" -#: calibre-plugin/config.py:399 +#: calibre-plugin/config.py:419 msgid "If specified, this column will be updated with the loan expiry date" msgstr "" -#: calibre-plugin/config.py:416 +#: calibre-plugin/config.py:436 msgid "" "If specified, this column will be updated with the loan type, e.g. ebook / " "magazine / audiobook." msgstr "" -#: calibre-plugin/config.py:448 +#: calibre-plugin/config.py:468 msgid "Loan's borrowed/checkout date" msgstr "" -#: calibre-plugin/config.py:460 +#: calibre-plugin/config.py:480 msgid "Loan's due/expiry date" msgstr "" -#: calibre-plugin/config.py:474 +#: calibre-plugin/config.py:494 msgid "Loan type, e.g. ebook, audiobook, magazine" msgstr "" -#: calibre-plugin/config.py:498 calibre-plugin/dialog/cards.py:348 +#: calibre-plugin/config.py:518 calibre-plugin/dialog/cards.py:348 #: calibre-plugin/dialog/cards.py:403 calibre-plugin/dialog/holds.py:164 #: calibre-plugin/dialog/holds.py:203 msgid "Holds" msgstr "" -#: calibre-plugin/config.py:508 +#: calibre-plugin/config.py:528 msgid "Hide holds that are not yet available" msgstr "" -#: calibre-plugin/config.py:520 +#: calibre-plugin/config.py:540 msgid "Toggle the confirmation prompt before cancelling a hold" msgstr "" -#: calibre-plugin/config.py:528 +#: calibre-plugin/config.py:548 msgid "Search" msgstr "" -#: calibre-plugin/config.py:535 +#: calibre-plugin/config.py:555 msgid "Limit the number of search results returned" msgstr "" -#: calibre-plugin/config.py:545 +#: calibre-plugin/config.py:565 msgid "This determines the libraries that will be used for search." msgstr "" -#: calibre-plugin/config.py:550 +#: calibre-plugin/config.py:570 #, python-brace-format msgid "" "Up to {n} libraries, comma-separated. View your library key codes from the " "Cards tab. Example: lapl,sno-isle,livebrary,kcls" msgstr "" -#: calibre-plugin/config.py:565 +#: calibre-plugin/config.py:585 msgid "General" msgstr "" -#: calibre-plugin/config.py:576 +#: calibre-plugin/config.py:596 msgid "" "Include titles that do not have a supported downloadable format, e.g. " "Kindle, audiobook loans" msgstr "" -#: calibre-plugin/config.py:588 +#: calibre-plugin/config.py:608 msgid "Use the best quality cover in book details. Maybe slower." msgstr "" -#: calibre-plugin/config.py:594 +#: calibre-plugin/config.py:614 msgid " day(s)" msgstr "" -#: calibre-plugin/config.py:598 +#: calibre-plugin/config.py:618 #, python-brace-format msgid "" "How long to retain cacheable data such as library information (max: {n} days)" msgstr "" -#: calibre-plugin/config.py:606 +#: calibre-plugin/config.py:626 msgid "Network" msgstr "" -#: calibre-plugin/config.py:614 +#: calibre-plugin/config.py:634 msgid "" "The maximum interval to wait on a connection. You can increase this value if " "you have a slow connection." msgstr "" -#: calibre-plugin/config.py:625 +#: calibre-plugin/config.py:645 msgid "The number of retries upon connection failures" msgstr "" -#: calibre-plugin/config.py:768 +#: calibre-plugin/config.py:704 +#, python-brace-format +msgid "{remaining} second remaining" +msgid_plural "{remaining} seconds remaining" +msgstr[0] "" +msgstr[1] "" + +#: calibre-plugin/config.py:828 #, python-brace-format msgid "Invalid setup code format: {code}" msgstr "" diff --git a/calibre-plugin/translations/ja.po b/calibre-plugin/translations/ja.po index ae21861..dc4bc6a 100644 --- a/calibre-plugin/translations/ja.po +++ b/calibre-plugin/translations/ja.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: libby-calibre-plugin 0.1.7\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-09-03 20:12+0800\n" +"POT-Creation-Date: 2023-09-05 13:22+0800\n" "PO-Revision-Date: 2023-07-04 07:26+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -22,7 +22,7 @@ msgstr "" msgid "Import loans from your OverDrive Libby account" msgstr "OverDrive Libbyアカウントからローンをインポート" -#: calibre-plugin/action.py:67 calibre-plugin/config.py:185 +#: calibre-plugin/action.py:67 calibre-plugin/config.py:187 msgid "Libby" msgstr "" @@ -63,165 +63,173 @@ msgstr "" msgid "Borrowing" msgstr "貸し出し中" -#: calibre-plugin/config.py:99 calibre-plugin/config.py:767 +#: calibre-plugin/config.py:101 calibre-plugin/config.py:827 msgid "Libby Setup Code" msgstr "Libby セットアップコード" -#: calibre-plugin/config.py:100 +#: calibre-plugin/config.py:102 msgid "8-digit setup code" msgstr "8桁のコード" -#: calibre-plugin/config.py:101 +#: calibre-plugin/config.py:103 msgid "Hide Magazines" msgstr "雑誌を隠す" -#: calibre-plugin/config.py:102 +#: calibre-plugin/config.py:104 msgid "Hide Ebooks" msgstr "電子書籍を隠す" -#: calibre-plugin/config.py:103 +#: calibre-plugin/config.py:105 msgid "Include titles without downloadable formats" msgstr "" -#: calibre-plugin/config.py:104 +#: calibre-plugin/config.py:106 msgid "Hide titles already in library" msgstr "ライブラリ内の既存の本を非表示にする" -#: calibre-plugin/config.py:105 +#: calibre-plugin/config.py:107 msgid "Exclude empty books when hiding titles already in library" msgstr "" -#: calibre-plugin/config.py:106 +#: calibre-plugin/config.py:108 msgid "Hide unavailable holds" msgstr "" -#: calibre-plugin/config.py:107 +#: calibre-plugin/config.py:109 msgid "Prefer Open Formats" msgstr "オープンフォーマットを好む" -#: calibre-plugin/config.py:108 +#: calibre-plugin/config.py:110 msgid "Tag downloaded ebooks with" msgstr "ダウンロードした電子書籍にタグ付け" -#: calibre-plugin/config.py:109 +#: calibre-plugin/config.py:111 msgid "Example: library,books" msgstr "例:図書館,本" -#: calibre-plugin/config.py:110 +#: calibre-plugin/config.py:112 msgid "Tag downloaded magazines with" msgstr "ダウンロードした雑誌にタグ付け" -#: calibre-plugin/config.py:111 +#: calibre-plugin/config.py:113 msgid "Example: library,magazines" msgstr "例:図書館,雑誌" -#: calibre-plugin/config.py:112 +#: calibre-plugin/config.py:114 msgid "Always confirm returns" msgstr "常に返品確認" -#: calibre-plugin/config.py:113 +#: calibre-plugin/config.py:115 msgid "Always confirm holds cancellation" msgstr "" -#: calibre-plugin/config.py:114 +#: calibre-plugin/config.py:116 msgid "Always confirm Read with Kindle" msgstr "" -#: calibre-plugin/config.py:115 +#: calibre-plugin/config.py:117 msgid "Enable OverDrive Link Plugin integration" msgstr "" -#: calibre-plugin/config.py:116 +#: calibre-plugin/config.py:118 msgid "Mark updated books" msgstr "" -#: calibre-plugin/config.py:117 +#: calibre-plugin/config.py:119 msgid "Always download as a new book" msgstr "" -#: calibre-plugin/config.py:118 +#: calibre-plugin/config.py:120 msgid "Connection timeout" msgstr "接続タイムアウト" -#: calibre-plugin/config.py:120 +#: calibre-plugin/config.py:122 msgid "Maximum search results" msgstr "" -#: calibre-plugin/config.py:121 +#: calibre-plugin/config.py:123 #, python-brace-format msgid "Library Keys (comma-separated, max: {n})" msgstr "" -#: calibre-plugin/config.py:124 +#: calibre-plugin/config.py:126 msgid "Custom column for Borrowed Date" msgstr "" -#: calibre-plugin/config.py:125 +#: calibre-plugin/config.py:127 msgid "Custom column for Due Date" msgstr "" -#: calibre-plugin/config.py:126 +#: calibre-plugin/config.py:128 msgid "Custom column for Loan Type" msgstr "" -#: calibre-plugin/config.py:127 +#: calibre-plugin/config.py:129 msgid "Use highest-resolution cover for book details" msgstr "" -#: calibre-plugin/config.py:128 +#: calibre-plugin/config.py:130 msgid "Cache data for" msgstr "" -#: calibre-plugin/config.py:192 +#: calibre-plugin/config.py:194 msgid "Libby is configured." msgstr "Libbyが構成されました。" -#: calibre-plugin/config.py:194 calibre-plugin/dialog/base.py:406 +#: calibre-plugin/config.py:196 calibre-plugin/dialog/base.py:406 msgid "Libby is not configured yet." msgstr "Libbyが構成されていません。" -#: calibre-plugin/config.py:217 +#: calibre-plugin/config.py:219 msgid "Enter the 8-digit Libby setup code generated from another device" msgstr "" -#: calibre-plugin/config.py:228 calibre-plugin/dialog/cards.py:326 +#: calibre-plugin/config.py:231 +msgid "Generate Setup Code" +msgstr "" + +#: calibre-plugin/config.py:233 +msgid "Generate setup code for another device" +msgstr "" + +#: calibre-plugin/config.py:248 calibre-plugin/dialog/cards.py:326 #: calibre-plugin/dialog/cards.py:392 calibre-plugin/dialog/loans.py:169 msgid "Loans" msgstr "貸出中" -#: calibre-plugin/config.py:235 +#: calibre-plugin/config.py:255 msgid "Don't list ebook loans" msgstr "" -#: calibre-plugin/config.py:241 +#: calibre-plugin/config.py:261 msgid "Don't list magazine loans" msgstr "" -#: calibre-plugin/config.py:250 +#: calibre-plugin/config.py:270 msgid "Hide loans that are already in your calibre library" msgstr "" -#: calibre-plugin/config.py:263 +#: calibre-plugin/config.py:283 msgid "" "When enabled, empty books are excluded when hiding titles already in your " "library" msgstr "" -#: calibre-plugin/config.py:274 +#: calibre-plugin/config.py:294 msgid "Toggle the confirmation prompt before returning loans" msgstr "" -#: calibre-plugin/config.py:287 +#: calibre-plugin/config.py:307 msgid "" "Toggle the confirmation prompt before chosing to Read with Kindle a title " "that is not format-locked" msgstr "" -#: calibre-plugin/config.py:300 +#: calibre-plugin/config.py:320 msgid "Choose DRM-free formats if available" msgstr "" -#: calibre-plugin/config.py:313 +#: calibre-plugin/config.py:333 msgid "" "If enabled, the plugin will attempt to find a matching OverDrive-linked book " "that does not have any formats and add the new download as an EPUB to the " @@ -229,123 +237,129 @@ msgid "" "added." msgstr "" -#: calibre-plugin/config.py:328 +#: calibre-plugin/config.py:348 msgid "" "If enabled, book records that were updated with a new format will be marked." msgstr "" -#: calibre-plugin/config.py:342 +#: calibre-plugin/config.py:362 msgid "" "Never update an existing empty book. Always create a new book entry for a " "download." msgstr "" -#: calibre-plugin/config.py:352 +#: calibre-plugin/config.py:372 msgid "Add specified tags to the ebooks downloaded" msgstr "" -#: calibre-plugin/config.py:361 +#: calibre-plugin/config.py:381 msgid "Add specified tags to the magazines downloaded" msgstr "" -#: calibre-plugin/config.py:380 +#: calibre-plugin/config.py:400 msgid "If specified, this column will be updated with the loan checkout date" msgstr "" -#: calibre-plugin/config.py:399 +#: calibre-plugin/config.py:419 msgid "If specified, this column will be updated with the loan expiry date" msgstr "" -#: calibre-plugin/config.py:416 +#: calibre-plugin/config.py:436 msgid "" "If specified, this column will be updated with the loan type, e.g. ebook / " "magazine / audiobook." msgstr "" -#: calibre-plugin/config.py:448 +#: calibre-plugin/config.py:468 msgid "Loan's borrowed/checkout date" msgstr "" -#: calibre-plugin/config.py:460 +#: calibre-plugin/config.py:480 msgid "Loan's due/expiry date" msgstr "" -#: calibre-plugin/config.py:474 +#: calibre-plugin/config.py:494 msgid "Loan type, e.g. ebook, audiobook, magazine" msgstr "" -#: calibre-plugin/config.py:498 calibre-plugin/dialog/cards.py:348 +#: calibre-plugin/config.py:518 calibre-plugin/dialog/cards.py:348 #: calibre-plugin/dialog/cards.py:403 calibre-plugin/dialog/holds.py:164 #: calibre-plugin/dialog/holds.py:203 msgid "Holds" msgstr "予約中" -#: calibre-plugin/config.py:508 +#: calibre-plugin/config.py:528 msgid "Hide holds that are not yet available" msgstr "" -#: calibre-plugin/config.py:520 +#: calibre-plugin/config.py:540 msgid "Toggle the confirmation prompt before cancelling a hold" msgstr "" -#: calibre-plugin/config.py:528 +#: calibre-plugin/config.py:548 msgid "Search" msgstr "" -#: calibre-plugin/config.py:535 +#: calibre-plugin/config.py:555 msgid "Limit the number of search results returned" msgstr "" -#: calibre-plugin/config.py:545 +#: calibre-plugin/config.py:565 msgid "This determines the libraries that will be used for search." msgstr "" -#: calibre-plugin/config.py:550 +#: calibre-plugin/config.py:570 #, python-brace-format msgid "" "Up to {n} libraries, comma-separated. View your library key codes from the " "Cards tab. Example: lapl,sno-isle,livebrary,kcls" msgstr "" -#: calibre-plugin/config.py:565 +#: calibre-plugin/config.py:585 msgid "General" msgstr "" -#: calibre-plugin/config.py:576 +#: calibre-plugin/config.py:596 msgid "" "Include titles that do not have a supported downloadable format, e.g. " "Kindle, audiobook loans" msgstr "" -#: calibre-plugin/config.py:588 +#: calibre-plugin/config.py:608 msgid "Use the best quality cover in book details. Maybe slower." msgstr "" -#: calibre-plugin/config.py:594 +#: calibre-plugin/config.py:614 msgid " day(s)" msgstr "" -#: calibre-plugin/config.py:598 +#: calibre-plugin/config.py:618 #, python-brace-format msgid "" "How long to retain cacheable data such as library information (max: {n} days)" msgstr "" -#: calibre-plugin/config.py:606 +#: calibre-plugin/config.py:626 msgid "Network" msgstr "" -#: calibre-plugin/config.py:614 +#: calibre-plugin/config.py:634 msgid "" "The maximum interval to wait on a connection. You can increase this value if " "you have a slow connection." msgstr "" -#: calibre-plugin/config.py:625 +#: calibre-plugin/config.py:645 msgid "The number of retries upon connection failures" msgstr "" -#: calibre-plugin/config.py:768 +#: calibre-plugin/config.py:704 +#, python-brace-format +msgid "{remaining} second remaining" +msgid_plural "{remaining} seconds remaining" +msgstr[0] "" + +#: calibre-plugin/config.py:828 #, python-brace-format msgid "Invalid setup code format: {code}" msgstr "" diff --git a/calibre-plugin/translations/ko.po b/calibre-plugin/translations/ko.po index 3d9d75f..555a793 100644 --- a/calibre-plugin/translations/ko.po +++ b/calibre-plugin/translations/ko.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: libby-calibre-plugin 0.1.7\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-09-03 20:12+0800\n" +"POT-Creation-Date: 2023-09-05 13:22+0800\n" "PO-Revision-Date: 2023-07-04 07:26+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -22,7 +22,7 @@ msgstr "" msgid "Import loans from your OverDrive Libby account" msgstr "OverDrive Libby 계정에서 대출 가져오기" -#: calibre-plugin/action.py:67 calibre-plugin/config.py:185 +#: calibre-plugin/action.py:67 calibre-plugin/config.py:187 msgid "Libby" msgstr "" @@ -63,165 +63,173 @@ msgstr "" msgid "Borrowing" msgstr "대출하기" -#: calibre-plugin/config.py:99 calibre-plugin/config.py:767 +#: calibre-plugin/config.py:101 calibre-plugin/config.py:827 msgid "Libby Setup Code" msgstr "Libby설정 코드" -#: calibre-plugin/config.py:100 +#: calibre-plugin/config.py:102 msgid "8-digit setup code" msgstr "8자리 코드" -#: calibre-plugin/config.py:101 +#: calibre-plugin/config.py:103 msgid "Hide Magazines" msgstr "매거진 숨기기" -#: calibre-plugin/config.py:102 +#: calibre-plugin/config.py:104 msgid "Hide Ebooks" msgstr "eBook 숨기기" -#: calibre-plugin/config.py:103 +#: calibre-plugin/config.py:105 msgid "Include titles without downloadable formats" msgstr "" -#: calibre-plugin/config.py:104 +#: calibre-plugin/config.py:106 msgid "Hide titles already in library" msgstr "서재에서 이미 있는 책 숨기기" -#: calibre-plugin/config.py:105 +#: calibre-plugin/config.py:107 msgid "Exclude empty books when hiding titles already in library" msgstr "" -#: calibre-plugin/config.py:106 +#: calibre-plugin/config.py:108 msgid "Hide unavailable holds" msgstr "" -#: calibre-plugin/config.py:107 +#: calibre-plugin/config.py:109 msgid "Prefer Open Formats" msgstr "오픈 포맷 선호" -#: calibre-plugin/config.py:108 +#: calibre-plugin/config.py:110 msgid "Tag downloaded ebooks with" msgstr "다운로드한 전자책에 태그 지정" -#: calibre-plugin/config.py:109 +#: calibre-plugin/config.py:111 msgid "Example: library,books" msgstr "예: 도서관,책" -#: calibre-plugin/config.py:110 +#: calibre-plugin/config.py:112 msgid "Tag downloaded magazines with" msgstr "다운로드한 잡지에 태그 지정" -#: calibre-plugin/config.py:111 +#: calibre-plugin/config.py:113 msgid "Example: library,magazines" msgstr "예: 도서관,잡지" -#: calibre-plugin/config.py:112 +#: calibre-plugin/config.py:114 msgid "Always confirm returns" msgstr "항상 반품 확인" -#: calibre-plugin/config.py:113 +#: calibre-plugin/config.py:115 msgid "Always confirm holds cancellation" msgstr "" -#: calibre-plugin/config.py:114 +#: calibre-plugin/config.py:116 msgid "Always confirm Read with Kindle" msgstr "" -#: calibre-plugin/config.py:115 +#: calibre-plugin/config.py:117 msgid "Enable OverDrive Link Plugin integration" msgstr "" -#: calibre-plugin/config.py:116 +#: calibre-plugin/config.py:118 msgid "Mark updated books" msgstr "" -#: calibre-plugin/config.py:117 +#: calibre-plugin/config.py:119 msgid "Always download as a new book" msgstr "" -#: calibre-plugin/config.py:118 +#: calibre-plugin/config.py:120 msgid "Connection timeout" msgstr "연결 대기시간 초과" -#: calibre-plugin/config.py:120 +#: calibre-plugin/config.py:122 msgid "Maximum search results" msgstr "" -#: calibre-plugin/config.py:121 +#: calibre-plugin/config.py:123 #, python-brace-format msgid "Library Keys (comma-separated, max: {n})" msgstr "" -#: calibre-plugin/config.py:124 +#: calibre-plugin/config.py:126 msgid "Custom column for Borrowed Date" msgstr "" -#: calibre-plugin/config.py:125 +#: calibre-plugin/config.py:127 msgid "Custom column for Due Date" msgstr "" -#: calibre-plugin/config.py:126 +#: calibre-plugin/config.py:128 msgid "Custom column for Loan Type" msgstr "" -#: calibre-plugin/config.py:127 +#: calibre-plugin/config.py:129 msgid "Use highest-resolution cover for book details" msgstr "" -#: calibre-plugin/config.py:128 +#: calibre-plugin/config.py:130 msgid "Cache data for" msgstr "" -#: calibre-plugin/config.py:192 +#: calibre-plugin/config.py:194 msgid "Libby is configured." msgstr "Libby가 구성되었습니다." -#: calibre-plugin/config.py:194 calibre-plugin/dialog/base.py:406 +#: calibre-plugin/config.py:196 calibre-plugin/dialog/base.py:406 msgid "Libby is not configured yet." msgstr "Libby가 구성되지 않았습니다." -#: calibre-plugin/config.py:217 +#: calibre-plugin/config.py:219 msgid "Enter the 8-digit Libby setup code generated from another device" msgstr "" -#: calibre-plugin/config.py:228 calibre-plugin/dialog/cards.py:326 +#: calibre-plugin/config.py:231 +msgid "Generate Setup Code" +msgstr "" + +#: calibre-plugin/config.py:233 +msgid "Generate setup code for another device" +msgstr "" + +#: calibre-plugin/config.py:248 calibre-plugin/dialog/cards.py:326 #: calibre-plugin/dialog/cards.py:392 calibre-plugin/dialog/loans.py:169 msgid "Loans" msgstr "대출" -#: calibre-plugin/config.py:235 +#: calibre-plugin/config.py:255 msgid "Don't list ebook loans" msgstr "" -#: calibre-plugin/config.py:241 +#: calibre-plugin/config.py:261 msgid "Don't list magazine loans" msgstr "" -#: calibre-plugin/config.py:250 +#: calibre-plugin/config.py:270 msgid "Hide loans that are already in your calibre library" msgstr "" -#: calibre-plugin/config.py:263 +#: calibre-plugin/config.py:283 msgid "" "When enabled, empty books are excluded when hiding titles already in your " "library" msgstr "" -#: calibre-plugin/config.py:274 +#: calibre-plugin/config.py:294 msgid "Toggle the confirmation prompt before returning loans" msgstr "" -#: calibre-plugin/config.py:287 +#: calibre-plugin/config.py:307 msgid "" "Toggle the confirmation prompt before chosing to Read with Kindle a title " "that is not format-locked" msgstr "" -#: calibre-plugin/config.py:300 +#: calibre-plugin/config.py:320 msgid "Choose DRM-free formats if available" msgstr "" -#: calibre-plugin/config.py:313 +#: calibre-plugin/config.py:333 msgid "" "If enabled, the plugin will attempt to find a matching OverDrive-linked book " "that does not have any formats and add the new download as an EPUB to the " @@ -229,123 +237,129 @@ msgid "" "added." msgstr "" -#: calibre-plugin/config.py:328 +#: calibre-plugin/config.py:348 msgid "" "If enabled, book records that were updated with a new format will be marked." msgstr "" -#: calibre-plugin/config.py:342 +#: calibre-plugin/config.py:362 msgid "" "Never update an existing empty book. Always create a new book entry for a " "download." msgstr "" -#: calibre-plugin/config.py:352 +#: calibre-plugin/config.py:372 msgid "Add specified tags to the ebooks downloaded" msgstr "" -#: calibre-plugin/config.py:361 +#: calibre-plugin/config.py:381 msgid "Add specified tags to the magazines downloaded" msgstr "" -#: calibre-plugin/config.py:380 +#: calibre-plugin/config.py:400 msgid "If specified, this column will be updated with the loan checkout date" msgstr "" -#: calibre-plugin/config.py:399 +#: calibre-plugin/config.py:419 msgid "If specified, this column will be updated with the loan expiry date" msgstr "" -#: calibre-plugin/config.py:416 +#: calibre-plugin/config.py:436 msgid "" "If specified, this column will be updated with the loan type, e.g. ebook / " "magazine / audiobook." msgstr "" -#: calibre-plugin/config.py:448 +#: calibre-plugin/config.py:468 msgid "Loan's borrowed/checkout date" msgstr "" -#: calibre-plugin/config.py:460 +#: calibre-plugin/config.py:480 msgid "Loan's due/expiry date" msgstr "" -#: calibre-plugin/config.py:474 +#: calibre-plugin/config.py:494 msgid "Loan type, e.g. ebook, audiobook, magazine" msgstr "" -#: calibre-plugin/config.py:498 calibre-plugin/dialog/cards.py:348 +#: calibre-plugin/config.py:518 calibre-plugin/dialog/cards.py:348 #: calibre-plugin/dialog/cards.py:403 calibre-plugin/dialog/holds.py:164 #: calibre-plugin/dialog/holds.py:203 msgid "Holds" msgstr "예약" -#: calibre-plugin/config.py:508 +#: calibre-plugin/config.py:528 msgid "Hide holds that are not yet available" msgstr "" -#: calibre-plugin/config.py:520 +#: calibre-plugin/config.py:540 msgid "Toggle the confirmation prompt before cancelling a hold" msgstr "" -#: calibre-plugin/config.py:528 +#: calibre-plugin/config.py:548 msgid "Search" msgstr "" -#: calibre-plugin/config.py:535 +#: calibre-plugin/config.py:555 msgid "Limit the number of search results returned" msgstr "" -#: calibre-plugin/config.py:545 +#: calibre-plugin/config.py:565 msgid "This determines the libraries that will be used for search." msgstr "" -#: calibre-plugin/config.py:550 +#: calibre-plugin/config.py:570 #, python-brace-format msgid "" "Up to {n} libraries, comma-separated. View your library key codes from the " "Cards tab. Example: lapl,sno-isle,livebrary,kcls" msgstr "" -#: calibre-plugin/config.py:565 +#: calibre-plugin/config.py:585 msgid "General" msgstr "" -#: calibre-plugin/config.py:576 +#: calibre-plugin/config.py:596 msgid "" "Include titles that do not have a supported downloadable format, e.g. " "Kindle, audiobook loans" msgstr "" -#: calibre-plugin/config.py:588 +#: calibre-plugin/config.py:608 msgid "Use the best quality cover in book details. Maybe slower." msgstr "" -#: calibre-plugin/config.py:594 +#: calibre-plugin/config.py:614 msgid " day(s)" msgstr "" -#: calibre-plugin/config.py:598 +#: calibre-plugin/config.py:618 #, python-brace-format msgid "" "How long to retain cacheable data such as library information (max: {n} days)" msgstr "" -#: calibre-plugin/config.py:606 +#: calibre-plugin/config.py:626 msgid "Network" msgstr "" -#: calibre-plugin/config.py:614 +#: calibre-plugin/config.py:634 msgid "" "The maximum interval to wait on a connection. You can increase this value if " "you have a slow connection." msgstr "" -#: calibre-plugin/config.py:625 +#: calibre-plugin/config.py:645 msgid "The number of retries upon connection failures" msgstr "" -#: calibre-plugin/config.py:768 +#: calibre-plugin/config.py:704 +#, python-brace-format +msgid "{remaining} second remaining" +msgid_plural "{remaining} seconds remaining" +msgstr[0] "" + +#: calibre-plugin/config.py:828 #, python-brace-format msgid "Invalid setup code format: {code}" msgstr "" diff --git a/calibre-plugin/translations/zh_CN.po b/calibre-plugin/translations/zh_CN.po index 1fc95bd..56f2f61 100644 --- a/calibre-plugin/translations/zh_CN.po +++ b/calibre-plugin/translations/zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: libby-calibre-plugin 0.1.7\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-09-03 20:12+0800\n" +"POT-Creation-Date: 2023-09-05 13:22+0800\n" "PO-Revision-Date: 2023-07-04 07:26+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -22,7 +22,7 @@ msgstr "" msgid "Import loans from your OverDrive Libby account" msgstr "从您的OverDrive Libby账户导入已借作品" -#: calibre-plugin/action.py:67 calibre-plugin/config.py:185 +#: calibre-plugin/action.py:67 calibre-plugin/config.py:187 msgid "Libby" msgstr "" @@ -63,165 +63,173 @@ msgstr "" msgid "Borrowing" msgstr "正在借阅" -#: calibre-plugin/config.py:99 calibre-plugin/config.py:767 +#: calibre-plugin/config.py:101 calibre-plugin/config.py:827 msgid "Libby Setup Code" msgstr "Libby设置代码" -#: calibre-plugin/config.py:100 +#: calibre-plugin/config.py:102 msgid "8-digit setup code" msgstr "8位代码" -#: calibre-plugin/config.py:101 +#: calibre-plugin/config.py:103 msgid "Hide Magazines" msgstr "隐藏杂志" -#: calibre-plugin/config.py:102 +#: calibre-plugin/config.py:104 msgid "Hide Ebooks" msgstr "隐藏电子书" -#: calibre-plugin/config.py:103 +#: calibre-plugin/config.py:105 msgid "Include titles without downloadable formats" msgstr "" -#: calibre-plugin/config.py:104 +#: calibre-plugin/config.py:106 msgid "Hide titles already in library" msgstr "隐藏书库中已有的书籍" -#: calibre-plugin/config.py:105 +#: calibre-plugin/config.py:107 msgid "Exclude empty books when hiding titles already in library" msgstr "" -#: calibre-plugin/config.py:106 +#: calibre-plugin/config.py:108 msgid "Hide unavailable holds" msgstr "" -#: calibre-plugin/config.py:107 +#: calibre-plugin/config.py:109 msgid "Prefer Open Formats" msgstr "偏好开放格式" -#: calibre-plugin/config.py:108 +#: calibre-plugin/config.py:110 msgid "Tag downloaded ebooks with" msgstr "将下载的电子书标记为" -#: calibre-plugin/config.py:109 +#: calibre-plugin/config.py:111 msgid "Example: library,books" msgstr "示例:图书馆,书籍" -#: calibre-plugin/config.py:110 +#: calibre-plugin/config.py:112 msgid "Tag downloaded magazines with" msgstr "将下载的杂志标记为" -#: calibre-plugin/config.py:111 +#: calibre-plugin/config.py:113 msgid "Example: library,magazines" msgstr "示例:图书馆,杂志" -#: calibre-plugin/config.py:112 +#: calibre-plugin/config.py:114 msgid "Always confirm returns" msgstr "始终确认还书" -#: calibre-plugin/config.py:113 +#: calibre-plugin/config.py:115 msgid "Always confirm holds cancellation" msgstr "" -#: calibre-plugin/config.py:114 +#: calibre-plugin/config.py:116 msgid "Always confirm Read with Kindle" msgstr "" -#: calibre-plugin/config.py:115 +#: calibre-plugin/config.py:117 msgid "Enable OverDrive Link Plugin integration" msgstr "" -#: calibre-plugin/config.py:116 +#: calibre-plugin/config.py:118 msgid "Mark updated books" msgstr "" -#: calibre-plugin/config.py:117 +#: calibre-plugin/config.py:119 msgid "Always download as a new book" msgstr "" -#: calibre-plugin/config.py:118 +#: calibre-plugin/config.py:120 msgid "Connection timeout" msgstr "连接超时" -#: calibre-plugin/config.py:120 +#: calibre-plugin/config.py:122 msgid "Maximum search results" msgstr "" -#: calibre-plugin/config.py:121 +#: calibre-plugin/config.py:123 #, python-brace-format msgid "Library Keys (comma-separated, max: {n})" msgstr "" -#: calibre-plugin/config.py:124 +#: calibre-plugin/config.py:126 msgid "Custom column for Borrowed Date" msgstr "" -#: calibre-plugin/config.py:125 +#: calibre-plugin/config.py:127 msgid "Custom column for Due Date" msgstr "" -#: calibre-plugin/config.py:126 +#: calibre-plugin/config.py:128 msgid "Custom column for Loan Type" msgstr "" -#: calibre-plugin/config.py:127 +#: calibre-plugin/config.py:129 msgid "Use highest-resolution cover for book details" msgstr "" -#: calibre-plugin/config.py:128 +#: calibre-plugin/config.py:130 msgid "Cache data for" msgstr "" -#: calibre-plugin/config.py:192 +#: calibre-plugin/config.py:194 msgid "Libby is configured." msgstr "Libby已配置。" -#: calibre-plugin/config.py:194 calibre-plugin/dialog/base.py:406 +#: calibre-plugin/config.py:196 calibre-plugin/dialog/base.py:406 msgid "Libby is not configured yet." msgstr "Libby未配置。" -#: calibre-plugin/config.py:217 +#: calibre-plugin/config.py:219 msgid "Enter the 8-digit Libby setup code generated from another device" msgstr "" -#: calibre-plugin/config.py:228 calibre-plugin/dialog/cards.py:326 +#: calibre-plugin/config.py:231 +msgid "Generate Setup Code" +msgstr "" + +#: calibre-plugin/config.py:233 +msgid "Generate setup code for another device" +msgstr "" + +#: calibre-plugin/config.py:248 calibre-plugin/dialog/cards.py:326 #: calibre-plugin/dialog/cards.py:392 calibre-plugin/dialog/loans.py:169 msgid "Loans" msgstr "已借作品" -#: calibre-plugin/config.py:235 +#: calibre-plugin/config.py:255 msgid "Don't list ebook loans" msgstr "" -#: calibre-plugin/config.py:241 +#: calibre-plugin/config.py:261 msgid "Don't list magazine loans" msgstr "" -#: calibre-plugin/config.py:250 +#: calibre-plugin/config.py:270 msgid "Hide loans that are already in your calibre library" msgstr "" -#: calibre-plugin/config.py:263 +#: calibre-plugin/config.py:283 msgid "" "When enabled, empty books are excluded when hiding titles already in your " "library" msgstr "" -#: calibre-plugin/config.py:274 +#: calibre-plugin/config.py:294 msgid "Toggle the confirmation prompt before returning loans" msgstr "" -#: calibre-plugin/config.py:287 +#: calibre-plugin/config.py:307 msgid "" "Toggle the confirmation prompt before chosing to Read with Kindle a title " "that is not format-locked" msgstr "" -#: calibre-plugin/config.py:300 +#: calibre-plugin/config.py:320 msgid "Choose DRM-free formats if available" msgstr "" -#: calibre-plugin/config.py:313 +#: calibre-plugin/config.py:333 msgid "" "If enabled, the plugin will attempt to find a matching OverDrive-linked book " "that does not have any formats and add the new download as an EPUB to the " @@ -229,123 +237,129 @@ msgid "" "added." msgstr "" -#: calibre-plugin/config.py:328 +#: calibre-plugin/config.py:348 msgid "" "If enabled, book records that were updated with a new format will be marked." msgstr "" -#: calibre-plugin/config.py:342 +#: calibre-plugin/config.py:362 msgid "" "Never update an existing empty book. Always create a new book entry for a " "download." msgstr "" -#: calibre-plugin/config.py:352 +#: calibre-plugin/config.py:372 msgid "Add specified tags to the ebooks downloaded" msgstr "" -#: calibre-plugin/config.py:361 +#: calibre-plugin/config.py:381 msgid "Add specified tags to the magazines downloaded" msgstr "" -#: calibre-plugin/config.py:380 +#: calibre-plugin/config.py:400 msgid "If specified, this column will be updated with the loan checkout date" msgstr "" -#: calibre-plugin/config.py:399 +#: calibre-plugin/config.py:419 msgid "If specified, this column will be updated with the loan expiry date" msgstr "" -#: calibre-plugin/config.py:416 +#: calibre-plugin/config.py:436 msgid "" "If specified, this column will be updated with the loan type, e.g. ebook / " "magazine / audiobook." msgstr "" -#: calibre-plugin/config.py:448 +#: calibre-plugin/config.py:468 msgid "Loan's borrowed/checkout date" msgstr "" -#: calibre-plugin/config.py:460 +#: calibre-plugin/config.py:480 msgid "Loan's due/expiry date" msgstr "" -#: calibre-plugin/config.py:474 +#: calibre-plugin/config.py:494 msgid "Loan type, e.g. ebook, audiobook, magazine" msgstr "" -#: calibre-plugin/config.py:498 calibre-plugin/dialog/cards.py:348 +#: calibre-plugin/config.py:518 calibre-plugin/dialog/cards.py:348 #: calibre-plugin/dialog/cards.py:403 calibre-plugin/dialog/holds.py:164 #: calibre-plugin/dialog/holds.py:203 msgid "Holds" msgstr "预约" -#: calibre-plugin/config.py:508 +#: calibre-plugin/config.py:528 msgid "Hide holds that are not yet available" msgstr "" -#: calibre-plugin/config.py:520 +#: calibre-plugin/config.py:540 msgid "Toggle the confirmation prompt before cancelling a hold" msgstr "" -#: calibre-plugin/config.py:528 +#: calibre-plugin/config.py:548 msgid "Search" msgstr "" -#: calibre-plugin/config.py:535 +#: calibre-plugin/config.py:555 msgid "Limit the number of search results returned" msgstr "" -#: calibre-plugin/config.py:545 +#: calibre-plugin/config.py:565 msgid "This determines the libraries that will be used for search." msgstr "" -#: calibre-plugin/config.py:550 +#: calibre-plugin/config.py:570 #, python-brace-format msgid "" "Up to {n} libraries, comma-separated. View your library key codes from the " "Cards tab. Example: lapl,sno-isle,livebrary,kcls" msgstr "" -#: calibre-plugin/config.py:565 +#: calibre-plugin/config.py:585 msgid "General" msgstr "" -#: calibre-plugin/config.py:576 +#: calibre-plugin/config.py:596 msgid "" "Include titles that do not have a supported downloadable format, e.g. " "Kindle, audiobook loans" msgstr "" -#: calibre-plugin/config.py:588 +#: calibre-plugin/config.py:608 msgid "Use the best quality cover in book details. Maybe slower." msgstr "" -#: calibre-plugin/config.py:594 +#: calibre-plugin/config.py:614 msgid " day(s)" msgstr "" -#: calibre-plugin/config.py:598 +#: calibre-plugin/config.py:618 #, python-brace-format msgid "" "How long to retain cacheable data such as library information (max: {n} days)" msgstr "" -#: calibre-plugin/config.py:606 +#: calibre-plugin/config.py:626 msgid "Network" msgstr "" -#: calibre-plugin/config.py:614 +#: calibre-plugin/config.py:634 msgid "" "The maximum interval to wait on a connection. You can increase this value if " "you have a slow connection." msgstr "" -#: calibre-plugin/config.py:625 +#: calibre-plugin/config.py:645 msgid "The number of retries upon connection failures" msgstr "" -#: calibre-plugin/config.py:768 +#: calibre-plugin/config.py:704 +#, python-brace-format +msgid "{remaining} second remaining" +msgid_plural "{remaining} seconds remaining" +msgstr[0] "" + +#: calibre-plugin/config.py:828 #, python-brace-format msgid "Invalid setup code format: {code}" msgstr "" diff --git a/calibre-plugin/translations/zh_TW.po b/calibre-plugin/translations/zh_TW.po index 0b9f136..cc61810 100644 --- a/calibre-plugin/translations/zh_TW.po +++ b/calibre-plugin/translations/zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: libby-calibre-plugin 0.1.7\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-09-03 20:12+0800\n" +"POT-Creation-Date: 2023-09-05 13:22+0800\n" "PO-Revision-Date: 2023-07-04 07:25+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -22,7 +22,7 @@ msgstr "" msgid "Import loans from your OverDrive Libby account" msgstr "從您的 OverDrive Libby 帳戶導入已借閱的圖書" -#: calibre-plugin/action.py:67 calibre-plugin/config.py:185 +#: calibre-plugin/action.py:67 calibre-plugin/config.py:187 msgid "Libby" msgstr "" @@ -63,165 +63,173 @@ msgstr "" msgid "Borrowing" msgstr "正在借阅" -#: calibre-plugin/config.py:99 calibre-plugin/config.py:767 +#: calibre-plugin/config.py:101 calibre-plugin/config.py:827 msgid "Libby Setup Code" msgstr "Libby設定代碼" -#: calibre-plugin/config.py:100 +#: calibre-plugin/config.py:102 msgid "8-digit setup code" msgstr "8 位數字代碼" -#: calibre-plugin/config.py:101 +#: calibre-plugin/config.py:103 msgid "Hide Magazines" msgstr "隱藏雜誌" -#: calibre-plugin/config.py:102 +#: calibre-plugin/config.py:104 msgid "Hide Ebooks" msgstr "隱藏電子書" -#: calibre-plugin/config.py:103 +#: calibre-plugin/config.py:105 msgid "Include titles without downloadable formats" msgstr "" -#: calibre-plugin/config.py:104 +#: calibre-plugin/config.py:106 msgid "Hide titles already in library" msgstr "隱藏書庫中已有的書籍" -#: calibre-plugin/config.py:105 +#: calibre-plugin/config.py:107 msgid "Exclude empty books when hiding titles already in library" msgstr "" -#: calibre-plugin/config.py:106 +#: calibre-plugin/config.py:108 msgid "Hide unavailable holds" msgstr "" -#: calibre-plugin/config.py:107 +#: calibre-plugin/config.py:109 msgid "Prefer Open Formats" msgstr "偏好开放格式" -#: calibre-plugin/config.py:108 +#: calibre-plugin/config.py:110 msgid "Tag downloaded ebooks with" msgstr "將下載的電子書標記為" -#: calibre-plugin/config.py:109 +#: calibre-plugin/config.py:111 msgid "Example: library,books" msgstr "示例:圖書館,書籍" -#: calibre-plugin/config.py:110 +#: calibre-plugin/config.py:112 msgid "Tag downloaded magazines with" msgstr "將下載的雜誌標記為" -#: calibre-plugin/config.py:111 +#: calibre-plugin/config.py:113 msgid "Example: library,magazines" msgstr "示例:圖書館,雜誌" -#: calibre-plugin/config.py:112 +#: calibre-plugin/config.py:114 msgid "Always confirm returns" msgstr "始终确认还书" -#: calibre-plugin/config.py:113 +#: calibre-plugin/config.py:115 msgid "Always confirm holds cancellation" msgstr "" -#: calibre-plugin/config.py:114 +#: calibre-plugin/config.py:116 msgid "Always confirm Read with Kindle" msgstr "" -#: calibre-plugin/config.py:115 +#: calibre-plugin/config.py:117 msgid "Enable OverDrive Link Plugin integration" msgstr "" -#: calibre-plugin/config.py:116 +#: calibre-plugin/config.py:118 msgid "Mark updated books" msgstr "" -#: calibre-plugin/config.py:117 +#: calibre-plugin/config.py:119 msgid "Always download as a new book" msgstr "" -#: calibre-plugin/config.py:118 +#: calibre-plugin/config.py:120 msgid "Connection timeout" msgstr "連接逾時" -#: calibre-plugin/config.py:120 +#: calibre-plugin/config.py:122 msgid "Maximum search results" msgstr "" -#: calibre-plugin/config.py:121 +#: calibre-plugin/config.py:123 #, python-brace-format msgid "Library Keys (comma-separated, max: {n})" msgstr "" -#: calibre-plugin/config.py:124 +#: calibre-plugin/config.py:126 msgid "Custom column for Borrowed Date" msgstr "" -#: calibre-plugin/config.py:125 +#: calibre-plugin/config.py:127 msgid "Custom column for Due Date" msgstr "" -#: calibre-plugin/config.py:126 +#: calibre-plugin/config.py:128 msgid "Custom column for Loan Type" msgstr "" -#: calibre-plugin/config.py:127 +#: calibre-plugin/config.py:129 msgid "Use highest-resolution cover for book details" msgstr "" -#: calibre-plugin/config.py:128 +#: calibre-plugin/config.py:130 msgid "Cache data for" msgstr "" -#: calibre-plugin/config.py:192 +#: calibre-plugin/config.py:194 msgid "Libby is configured." msgstr "Libby已配置。" -#: calibre-plugin/config.py:194 calibre-plugin/dialog/base.py:406 +#: calibre-plugin/config.py:196 calibre-plugin/dialog/base.py:406 msgid "Libby is not configured yet." msgstr "Libby未配置。" -#: calibre-plugin/config.py:217 +#: calibre-plugin/config.py:219 msgid "Enter the 8-digit Libby setup code generated from another device" msgstr "" -#: calibre-plugin/config.py:228 calibre-plugin/dialog/cards.py:326 +#: calibre-plugin/config.py:231 +msgid "Generate Setup Code" +msgstr "" + +#: calibre-plugin/config.py:233 +msgid "Generate setup code for another device" +msgstr "" + +#: calibre-plugin/config.py:248 calibre-plugin/dialog/cards.py:326 #: calibre-plugin/dialog/cards.py:392 calibre-plugin/dialog/loans.py:169 msgid "Loans" msgstr "借書" -#: calibre-plugin/config.py:235 +#: calibre-plugin/config.py:255 msgid "Don't list ebook loans" msgstr "" -#: calibre-plugin/config.py:241 +#: calibre-plugin/config.py:261 msgid "Don't list magazine loans" msgstr "" -#: calibre-plugin/config.py:250 +#: calibre-plugin/config.py:270 msgid "Hide loans that are already in your calibre library" msgstr "" -#: calibre-plugin/config.py:263 +#: calibre-plugin/config.py:283 msgid "" "When enabled, empty books are excluded when hiding titles already in your " "library" msgstr "" -#: calibre-plugin/config.py:274 +#: calibre-plugin/config.py:294 msgid "Toggle the confirmation prompt before returning loans" msgstr "" -#: calibre-plugin/config.py:287 +#: calibre-plugin/config.py:307 msgid "" "Toggle the confirmation prompt before chosing to Read with Kindle a title " "that is not format-locked" msgstr "" -#: calibre-plugin/config.py:300 +#: calibre-plugin/config.py:320 msgid "Choose DRM-free formats if available" msgstr "" -#: calibre-plugin/config.py:313 +#: calibre-plugin/config.py:333 msgid "" "If enabled, the plugin will attempt to find a matching OverDrive-linked book " "that does not have any formats and add the new download as an EPUB to the " @@ -229,123 +237,129 @@ msgid "" "added." msgstr "" -#: calibre-plugin/config.py:328 +#: calibre-plugin/config.py:348 msgid "" "If enabled, book records that were updated with a new format will be marked." msgstr "" -#: calibre-plugin/config.py:342 +#: calibre-plugin/config.py:362 msgid "" "Never update an existing empty book. Always create a new book entry for a " "download." msgstr "" -#: calibre-plugin/config.py:352 +#: calibre-plugin/config.py:372 msgid "Add specified tags to the ebooks downloaded" msgstr "" -#: calibre-plugin/config.py:361 +#: calibre-plugin/config.py:381 msgid "Add specified tags to the magazines downloaded" msgstr "" -#: calibre-plugin/config.py:380 +#: calibre-plugin/config.py:400 msgid "If specified, this column will be updated with the loan checkout date" msgstr "" -#: calibre-plugin/config.py:399 +#: calibre-plugin/config.py:419 msgid "If specified, this column will be updated with the loan expiry date" msgstr "" -#: calibre-plugin/config.py:416 +#: calibre-plugin/config.py:436 msgid "" "If specified, this column will be updated with the loan type, e.g. ebook / " "magazine / audiobook." msgstr "" -#: calibre-plugin/config.py:448 +#: calibre-plugin/config.py:468 msgid "Loan's borrowed/checkout date" msgstr "" -#: calibre-plugin/config.py:460 +#: calibre-plugin/config.py:480 msgid "Loan's due/expiry date" msgstr "" -#: calibre-plugin/config.py:474 +#: calibre-plugin/config.py:494 msgid "Loan type, e.g. ebook, audiobook, magazine" msgstr "" -#: calibre-plugin/config.py:498 calibre-plugin/dialog/cards.py:348 +#: calibre-plugin/config.py:518 calibre-plugin/dialog/cards.py:348 #: calibre-plugin/dialog/cards.py:403 calibre-plugin/dialog/holds.py:164 #: calibre-plugin/dialog/holds.py:203 msgid "Holds" msgstr "預約" -#: calibre-plugin/config.py:508 +#: calibre-plugin/config.py:528 msgid "Hide holds that are not yet available" msgstr "" -#: calibre-plugin/config.py:520 +#: calibre-plugin/config.py:540 msgid "Toggle the confirmation prompt before cancelling a hold" msgstr "" -#: calibre-plugin/config.py:528 +#: calibre-plugin/config.py:548 msgid "Search" msgstr "" -#: calibre-plugin/config.py:535 +#: calibre-plugin/config.py:555 msgid "Limit the number of search results returned" msgstr "" -#: calibre-plugin/config.py:545 +#: calibre-plugin/config.py:565 msgid "This determines the libraries that will be used for search." msgstr "" -#: calibre-plugin/config.py:550 +#: calibre-plugin/config.py:570 #, python-brace-format msgid "" "Up to {n} libraries, comma-separated. View your library key codes from the " "Cards tab. Example: lapl,sno-isle,livebrary,kcls" msgstr "" -#: calibre-plugin/config.py:565 +#: calibre-plugin/config.py:585 msgid "General" msgstr "" -#: calibre-plugin/config.py:576 +#: calibre-plugin/config.py:596 msgid "" "Include titles that do not have a supported downloadable format, e.g. " "Kindle, audiobook loans" msgstr "" -#: calibre-plugin/config.py:588 +#: calibre-plugin/config.py:608 msgid "Use the best quality cover in book details. Maybe slower." msgstr "" -#: calibre-plugin/config.py:594 +#: calibre-plugin/config.py:614 msgid " day(s)" msgstr "" -#: calibre-plugin/config.py:598 +#: calibre-plugin/config.py:618 #, python-brace-format msgid "" "How long to retain cacheable data such as library information (max: {n} days)" msgstr "" -#: calibre-plugin/config.py:606 +#: calibre-plugin/config.py:626 msgid "Network" msgstr "" -#: calibre-plugin/config.py:614 +#: calibre-plugin/config.py:634 msgid "" "The maximum interval to wait on a connection. You can increase this value if " "you have a slow connection." msgstr "" -#: calibre-plugin/config.py:625 +#: calibre-plugin/config.py:645 msgid "The number of retries upon connection failures" msgstr "" -#: calibre-plugin/config.py:768 +#: calibre-plugin/config.py:704 +#, python-brace-format +msgid "{remaining} second remaining" +msgid_plural "{remaining} seconds remaining" +msgstr[0] "" + +#: calibre-plugin/config.py:828 #, python-brace-format msgid "Invalid setup code format: {code}" msgstr ""