From 5ed57ca45ffd891f8ede3ec717b2a2fccd0810d1 Mon Sep 17 00:00:00 2001 From: ping Date: Tue, 1 Aug 2023 19:39:01 +0800 Subject: [PATCH] Implement cards tab --- CHANGELOG.md | 1 + calibre-plugin/action.py | 7 +- calibre-plugin/dialog/__init__.py | 1 + calibre-plugin/dialog/cards.py | 271 ++++++++++++++++++++++++ calibre-plugin/libby/client.py | 6 +- calibre-plugin/translations/default.pot | 125 ++++++----- calibre-plugin/translations/ja.po | 125 ++++++----- calibre-plugin/translations/ko.po | 125 ++++++----- calibre-plugin/translations/zh_CN.po | 125 ++++++----- calibre-plugin/translations/zh_TW.po | 125 ++++++----- 10 files changed, 654 insertions(+), 257 deletions(-) create mode 100644 calibre-plugin/dialog/cards.py diff --git a/CHANGELOG.md b/CHANGELOG.md index dad7cd8..8414397 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog Unreleased +- New: Cards tab that gives an overview of your linked cards - New: Display number of available holds in the Holds tab text - New: Last used tab will be opened by default - New: Disable borrow button if limits for the card has been reached diff --git a/calibre-plugin/action.py b/calibre-plugin/action.py index 99d18a4..34408c5 100644 --- a/calibre-plugin/action.py +++ b/calibre-plugin/action.py @@ -33,6 +33,7 @@ from .config import PREFS, PreferenceKeys from .dialog import ( BaseDialogMixin, + CardsDialogMixin, HoldsDialogMixin, LoansDialogMixin, MagazinesDialogMixin, @@ -142,7 +143,11 @@ def apply_settings(self): class OverdriveLibbyDialog( - MagazinesDialogMixin, HoldsDialogMixin, LoansDialogMixin, BaseDialogMixin + CardsDialogMixin, + MagazinesDialogMixin, + HoldsDialogMixin, + LoansDialogMixin, + BaseDialogMixin, ): def __init__(self, gui, icon, do_user_config, icons): super().__init__(gui, icon, do_user_config, icons) diff --git a/calibre-plugin/dialog/__init__.py b/calibre-plugin/dialog/__init__.py index 5d52487..877c5bc 100644 --- a/calibre-plugin/dialog/__init__.py +++ b/calibre-plugin/dialog/__init__.py @@ -10,6 +10,7 @@ # flake8: noqa from .base import BaseDialogMixin +from .cards import CardsDialogMixin from .holds import HoldsDialogMixin from .loans import LoansDialogMixin from .magazines import MagazinesDialogMixin diff --git a/calibre-plugin/dialog/cards.py b/calibre-plugin/dialog/cards.py new file mode 100644 index 0000000..f37680d --- /dev/null +++ b/calibre-plugin/dialog/cards.py @@ -0,0 +1,271 @@ +# +# Copyright (C) 2023 github.com/ping +# +# This file is part of the OverDrive Libby Plugin by ping +# OverDrive Libby Plugin for calibre / libby-calibre-plugin +# +# See https://github.com/ping/libby-calibre-plugin for more +# information +# +from urllib.parse import urljoin + +from calibre.utils.config import tweaks +from calibre.utils.date import dt_as_local, format_date +from qt.core import ( + QCursor, + QDesktopServices, + QFrame, + QGridLayout, + QLabel, + QMenu, + QMouseEvent, + QPalette, + QProgressBar, + QScrollArea, + QSizePolicy, + QUrl, + QWidget, + Qt, + pyqtSignal, +) + +from .base import BaseDialogMixin +from .. import DEMO_MODE +from ..borrow_book import LibbyBorrowHold +from ..libby import LibbyClient +from ..models import LibbyCardsModel +from ..utils import PluginIcons, obfuscate_date, obfuscate_int, obfuscate_name + +# noinspection PyUnreachableCode +if False: + load_translations = _ = lambda x=None: x + + +load_translations() + +gui_libby_borrow_hold = LibbyBorrowHold() + + +class ClickableQLabel(QLabel): + clicked = pyqtSignal(QMouseEvent) + doubleClicked = pyqtSignal(QMouseEvent) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def mousePressEvent(self, ev): + self.clicked.emit(ev) + + def mouseDoubleClickEvent(self, ev): + self.doubleClicked.emit(ev) + + +class CardWidget(QWidget): + def __init__(self, card, library, tab, *args, **kwargs): + super().__init__(*args, **kwargs) + self.card = card + self.library = library + self.tab = tab + self.icons = self.tab.icons + layout = QGridLayout() + layout.setColumnStretch(0, 1) + self.setLayout(layout) + widget_row_pos = 0 + + # library name + library_lbl = ClickableQLabel( + library["name"] if not DEMO_MODE else obfuscate_name(library["name"]) + ) + curr_font = library_lbl.font() + curr_font.setPointSizeF(curr_font.pointSizeF() * 1.2) + library_lbl.setFont(curr_font) + library_lbl.setStyleSheet("font-weight: bold;") + library_lbl.doubleClicked.connect( + lambda: self.tab.display_debug("Library", self.library) + ) + layout.addWidget(library_lbl, widget_row_pos, 0, 1, 2) + widget_row_pos += 1 + + card_name = ( + card["cardName"] if not DEMO_MODE else obfuscate_name(card["cardName"]) + ) + card_lbl = ClickableQLabel("" + _("Card name") + ": " + card_name) + card_lbl.setTextFormat(Qt.RichText) + card_lbl.doubleClicked.connect( + lambda: self.tab.display_debug("Card", self.card) + ) + + layout.addWidget(card_lbl, widget_row_pos, 0) + if card.get("username"): + card_username = ( + card["username"] if not DEMO_MODE else obfuscate_name(card["username"]) + ) + card_user_lbl = QLabel("" + _("Card account") + ": " + card_username) + card_user_lbl.setTextInteractionFlags( + Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse + ) + layout.addWidget(card_user_lbl, widget_row_pos, 1) + widget_row_pos += 1 + + if card.get("createDate"): + dt_value = dt_as_local(LibbyClient.parse_datetime(card["createDate"])) + card_create_lbl = QLabel( + "" + + _("Created date") + + ": " + + format_date( + dt_value + if not DEMO_MODE + else obfuscate_date(dt_value, year=dt_value.year), + tweaks["gui_timestamp_display_format"], + ) + ) + card_create_lbl.setTextFormat(Qt.RichText) + layout.addWidget(card_create_lbl, widget_row_pos, 0) + if card.get("authorizeDate"): + dt_value = dt_as_local( + LibbyClient.parse_datetime(card["authorizeDate"]) + ) + card_auth_lbl = QLabel( + "" + + _("Verified date") + + ": " + + format_date( + dt_value + if not DEMO_MODE + else obfuscate_date(dt_value, year=dt_value.year), + tweaks["gui_timestamp_display_format"], + ) + ) + card_auth_lbl.setTextFormat(Qt.RichText) + layout.addWidget(card_auth_lbl, widget_row_pos, 1) + widget_row_pos += 1 + + # loans limits + loans_limit = card.get("limits", {}).get("loan", 0) + loans_count = card.get("counts", {}).get("loan", 0) + loans_progressbar = QProgressBar(self) + loans_progressbar.setFormat(_("Loans") + " %v/%m") + loans_progressbar.setMinimum(0) + loans_progressbar.setMaximum( + loans_limit + if not DEMO_MODE + else obfuscate_int(loans_limit, offset=10, min_value=10) + ) + loans_progressbar.setValue( + loans_count if not DEMO_MODE else obfuscate_int(loans_count) + ) + loans_progressbar.setContextMenuPolicy(Qt.CustomContextMenu) + loans_progressbar.customContextMenuRequested.connect( + self.loans_progressbar_context_menu_requested + ) + layout.addWidget(loans_progressbar, widget_row_pos, 0, 1, 2) + widget_row_pos += 1 + + # holds limits + holds_limit = card.get("limits", {}).get("hold", 0) + holds_count = card.get("counts", {}).get("hold", 0) + holds_progressbar = QProgressBar(self) + holds_progressbar.setFormat(_("Holds") + " %v/%m") + holds_progressbar.setMinimum(0) + holds_progressbar.setMaximum( + holds_limit + if not DEMO_MODE + else obfuscate_int(holds_limit, offset=10, min_value=3) + ) + holds_progressbar.setValue( + holds_count if not DEMO_MODE else obfuscate_int(holds_count) + ) + holds_progressbar.setContextMenuPolicy(Qt.CustomContextMenu) + holds_progressbar.customContextMenuRequested.connect( + self.holds_progressbar_context_menu_requested + ) + layout.addWidget(holds_progressbar, widget_row_pos, 0, 1, 2) + + def loans_progressbar_context_menu_requested(self): + menu = QMenu(self) + view_in_libby_action = menu.addAction(_("View in Libby")) + view_in_libby_action.setIcon(self.icons[PluginIcons.ExternalLink]) + view_in_libby_action.triggered.connect(self.open_libby_loans) + view_in_overdrive_action = menu.addAction(_("View in OverDrive")) + view_in_overdrive_action.setIcon(self.icons[PluginIcons.ExternalLink]) + view_in_overdrive_action.triggered.connect(self.open_overdrive_loans) + menu.exec(QCursor.pos()) + + def holds_progressbar_context_menu_requested(self): + menu = QMenu(self) + view_in_libby_action = menu.addAction(_("View in Libby")) + view_in_libby_action.setIcon(self.icons[PluginIcons.ExternalLink]) + view_in_libby_action.triggered.connect(self.open_libby_holds) + view_in_overdrive_action = menu.addAction(_("View in OverDrive")) + view_in_overdrive_action.setIcon(self.icons[PluginIcons.ExternalLink]) + view_in_overdrive_action.triggered.connect(self.open_overdrive_holds) + menu.exec(QCursor.pos()) + + def open_link(self, link): + QDesktopServices.openUrl(QUrl(link)) + + def overdrive_url(self): + return f'https://{self.library["preferredKey"]}.overdrive.com/' + + def open_libby_loans(self): + self.open_link( + f'https://libbyapp.com/shelf/loans/default,all,{self.library["websiteId"]}' + ) + + def open_libby_holds(self): + self.open_link( + f'https://libbyapp.com/shelf/holds/default,all,{self.library["websiteId"]}' + ) + + def open_overdrive_loans(self): + self.open_link(urljoin(self.overdrive_url(), "account/loans")) + + def open_overdrive_holds(self): + self.open_link(urljoin(self.overdrive_url(), "account/holds")) + + +class CardsDialogMixin(BaseDialogMixin): + def __init__(self, gui, icon, do_user_config, icons): + super().__init__(gui, icon, do_user_config, icons) + + self.libby_cards_model = LibbyCardsModel(None, [], self.db) # model + self.models.append(self.libby_cards_model) + + self.card_widgets = [] + self.cards_tab_widget = QWidget() + self.cards_tab_widget.layout = QGridLayout() + self.cards_tab_widget.setSizePolicy( + QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding + ) + self.cards_tab_widget.setLayout(self.cards_tab_widget.layout) + self.cards_scroll_area = QScrollArea() + self.cards_scroll_area.setBackgroundRole(QPalette.Window) + self.cards_scroll_area.setFrameShadow(QFrame.Plain) + self.cards_scroll_area.setFrameShape(QFrame.NoFrame) + self.cards_scroll_area.setWidgetResizable(True) + self.cards_scroll_area.setWidget(self.cards_tab_widget) + + self.libby_cards_model = LibbyCardsModel(None, [], self.db) # model + self.models.append(self.libby_cards_model) + + self.libby_cards_model.modelReset.connect(self.libby_cards_model_reset) + self.cards_tab_index = self.add_tab(self.cards_scroll_area, _("Cards")) + + def libby_cards_model_reset(self): + for card_widget in self.card_widgets: + self.cards_tab_widget.layout.removeWidget(card_widget) + del card_widget + self.card_widgets = [] + widget_row_pos = 0 + for i in range(self.libby_cards_model.rowCount()): + card = self.libby_cards_model.data( + self.libby_cards_model.index(i, 0), Qt.UserRole + ) + library = self.libby_cards_model.get_library( + self.libby_cards_model.get_website_id(card) + ) + card_widget = CardWidget(card, library, self, self.cards_tab_widget) + self.card_widgets.append(card_widget) + self.cards_tab_widget.layout.addWidget(card_widget, widget_row_pos, 0) + widget_row_pos += 1 diff --git a/calibre-plugin/libby/client.py b/calibre-plugin/libby/client.py index bc8e10b..7c7d889 100644 --- a/calibre-plugin/libby/client.py +++ b/calibre-plugin/libby/client.py @@ -263,7 +263,11 @@ def parse_datetime(value: str) -> datetime: # type: ignore[return] :param value: :return: """ - formats = ("%Y-%m-%dT%H:%M:%SZ", "%Y-%m-%dT%H:%M:%S.%fZ") + formats = ( + "%Y-%m-%dT%H:%M:%SZ", + "%Y-%m-%dT%H:%M:%S.%fZ", + "%Y-%m-%dT%H:%M:%S%z", + ) for i, fmt in enumerate(formats, start=1): try: dt = datetime.strptime(value, fmt) diff --git a/calibre-plugin/translations/default.pot b/calibre-plugin/translations/default.pot index 662d088..e89813f 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.6\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-07-30 15:44+0800\n" +"POT-Creation-Date: 2023-08-01 19:35+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,15 +18,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:54 +#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:55 msgid "Import loans from your OverDrive Libby account" msgstr "" -#: calibre-plugin/action.py:60 +#: calibre-plugin/action.py:61 msgid "Libby" msgstr "" -#: calibre-plugin/action.py:124 calibre-plugin/dialog/base.py:131 +#: calibre-plugin/action.py:125 calibre-plugin/dialog/base.py:131 msgid "MobileRead" msgstr "" @@ -187,63 +187,63 @@ msgstr "" msgid "PDF (DRM)" msgstr "" -#: calibre-plugin/models.py:158 +#: calibre-plugin/models.py:169 msgid "Expire Date" msgstr "" -#: calibre-plugin/models.py:159 calibre-plugin/models.py:319 +#: calibre-plugin/models.py:170 calibre-plugin/models.py:330 msgid "Library" msgstr "" -#: calibre-plugin/models.py:270 +#: calibre-plugin/models.py:281 msgid "A skip-the-line loan" msgstr "" -#: calibre-plugin/models.py:318 +#: calibre-plugin/models.py:329 msgid "Hold/Expire Date" msgstr "" -#: calibre-plugin/models.py:321 +#: calibre-plugin/models.py:332 msgid "Available" msgstr "" -#: calibre-plugin/models.py:410 +#: calibre-plugin/models.py:421 #, python-brace-format msgid "Expires {dt}" msgstr "" -#: calibre-plugin/models.py:415 +#: calibre-plugin/models.py:426 #, python-brace-format msgid "Placed on {dt}" msgstr "" -#: calibre-plugin/models.py:431 +#: calibre-plugin/models.py:442 #, python-brace-format msgid "Deliver after {dt}" msgstr "" -#: calibre-plugin/models.py:437 +#: calibre-plugin/models.py:448 #, python-brace-format msgid "Suspended till {dt}" msgstr "" -#: calibre-plugin/models.py:482 +#: calibre-plugin/models.py:493 msgid "Delivering Later" msgstr "" -#: calibre-plugin/models.py:483 +#: calibre-plugin/models.py:494 msgid "Suspended Hold" msgstr "" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Release Date" msgstr "" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Library Card" msgstr "" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Borrowed" msgstr "" @@ -294,14 +294,51 @@ msgstr "" msgid "Check your connection or retry in a few minutes." msgstr "" -#: calibre-plugin/dialog/holds.py:75 -msgid "Get latest holds" +#: calibre-plugin/dialog/cards.py:92 +msgid "Card name" +msgstr "" + +#: calibre-plugin/dialog/cards.py:103 +msgid "Card account" +msgstr "" + +#: calibre-plugin/dialog/cards.py:114 +msgid "Created date" +msgstr "" + +#: calibre-plugin/dialog/cards.py:131 +msgid "Verified date" +msgstr "" + +#: calibre-plugin/dialog/cards.py:148 calibre-plugin/dialog/loans.py:154 +msgid "Loans" msgstr "" -#: calibre-plugin/dialog/holds.py:155 calibre-plugin/dialog/holds.py:169 +#: calibre-plugin/dialog/cards.py:169 calibre-plugin/dialog/holds.py:155 +#: calibre-plugin/dialog/holds.py:169 msgid "Holds" msgstr "" +#: calibre-plugin/dialog/cards.py:187 calibre-plugin/dialog/cards.py:197 +#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 +#: calibre-plugin/dialog/magazines.py:260 +msgid "View in Libby" +msgstr "" + +#: calibre-plugin/dialog/cards.py:190 calibre-plugin/dialog/cards.py:200 +#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 +#: calibre-plugin/dialog/magazines.py:265 +msgid "View in OverDrive" +msgstr "" + +#: calibre-plugin/dialog/cards.py:253 +msgid "Cards" +msgstr "" + +#: calibre-plugin/dialog/holds.py:75 +msgid "Get latest holds" +msgstr "" + #: calibre-plugin/dialog/holds.py:166 #, python-brace-format msgid "Holds ({n})" @@ -337,16 +374,6 @@ msgid "" "Refresh." msgstr "" -#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 -#: calibre-plugin/dialog/magazines.py:262 -msgid "View in Libby" -msgstr "" - -#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 -#: calibre-plugin/dialog/magazines.py:267 -msgid "View in OverDrive" -msgstr "" - #: calibre-plugin/dialog/holds.py:270 msgid "Manage hold" msgstr "" @@ -355,7 +382,7 @@ msgstr "" msgid "Cancel hold" msgstr "" -#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:303 +#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:301 #, python-brace-format msgid "Borrowing {book}" msgstr "" @@ -412,10 +439,6 @@ msgstr "" msgid "Download selected loans" msgstr "" -#: calibre-plugin/dialog/loans.py:154 -msgid "Loans" -msgstr "" - #: calibre-plugin/dialog/loans.py:199 #, python-brace-format msgid "Return {n} loan" @@ -448,58 +471,58 @@ msgstr "" msgid "Failed to return loan" msgstr "" -#: calibre-plugin/dialog/magazines.py:88 +#: calibre-plugin/dialog/magazines.py:86 msgid "" "Paste the share link of the magazine you wish to favorite and select a " "library card. \n" "Click on the Add button to monitor this title for new issues." msgstr "" -#: calibre-plugin/dialog/magazines.py:122 +#: calibre-plugin/dialog/magazines.py:120 msgid "Add to monitor for new issues" msgstr "" -#: calibre-plugin/dialog/magazines.py:133 +#: calibre-plugin/dialog/magazines.py:131 msgid "Get latest magazines" msgstr "" -#: calibre-plugin/dialog/magazines.py:210 +#: calibre-plugin/dialog/magazines.py:208 msgid "Magazines" msgstr "" -#: calibre-plugin/dialog/magazines.py:328 +#: calibre-plugin/dialog/magazines.py:326 msgid "Failed to borrow magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:350 -#: calibre-plugin/dialog/magazines.py:372 -#: calibre-plugin/dialog/magazines.py:384 -#: calibre-plugin/dialog/magazines.py:403 -#: calibre-plugin/dialog/magazines.py:418 +#: calibre-plugin/dialog/magazines.py:348 +#: calibre-plugin/dialog/magazines.py:370 +#: calibre-plugin/dialog/magazines.py:382 +#: calibre-plugin/dialog/magazines.py:401 +#: calibre-plugin/dialog/magazines.py:416 msgid "Add Magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:351 +#: calibre-plugin/dialog/magazines.py:349 #, python-brace-format msgid "Invalid URL {url}" msgstr "" -#: calibre-plugin/dialog/magazines.py:374 +#: calibre-plugin/dialog/magazines.py:372 #, python-brace-format msgid "{media} is not a downloadable magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:385 +#: calibre-plugin/dialog/magazines.py:383 #, python-brace-format msgid "{library} does not own this title" msgstr "" -#: calibre-plugin/dialog/magazines.py:404 +#: calibre-plugin/dialog/magazines.py:402 #, python-brace-format msgid "Already added {magazine}" msgstr "" -#: calibre-plugin/dialog/magazines.py:420 +#: calibre-plugin/dialog/magazines.py:418 #, python-brace-format msgid "" "Added {magazine} for monitoring.\n" diff --git a/calibre-plugin/translations/ja.po b/calibre-plugin/translations/ja.po index 1f98fb3..27cef21 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.6\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-07-29 22:21+0800\n" +"POT-Creation-Date: 2023-08-01 19:35+0800\n" "PO-Revision-Date: 2023-07-04 07:26+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,15 +18,15 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 3.3.2\n" -#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:54 +#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:55 msgid "Import loans from your OverDrive Libby account" msgstr "OverDrive Libbyアカウントからローンをインポート" -#: calibre-plugin/action.py:60 +#: calibre-plugin/action.py:61 msgid "Libby" msgstr "" -#: calibre-plugin/action.py:124 calibre-plugin/dialog/base.py:131 +#: calibre-plugin/action.py:125 calibre-plugin/dialog/base.py:131 msgid "MobileRead" msgstr "" @@ -187,63 +187,63 @@ msgstr "" msgid "PDF (DRM)" msgstr "" -#: calibre-plugin/models.py:158 +#: calibre-plugin/models.py:169 msgid "Expire Date" msgstr "" -#: calibre-plugin/models.py:159 calibre-plugin/models.py:319 +#: calibre-plugin/models.py:170 calibre-plugin/models.py:330 msgid "Library" msgstr "ライブラリー" -#: calibre-plugin/models.py:270 +#: calibre-plugin/models.py:281 msgid "A skip-the-line loan" msgstr "優先貸出作品。" -#: calibre-plugin/models.py:318 +#: calibre-plugin/models.py:329 msgid "Hold/Expire Date" msgstr "" -#: calibre-plugin/models.py:321 +#: calibre-plugin/models.py:332 msgid "Available" msgstr "貸出可能" -#: calibre-plugin/models.py:410 +#: calibre-plugin/models.py:421 #, python-brace-format msgid "Expires {dt}" msgstr "" -#: calibre-plugin/models.py:415 +#: calibre-plugin/models.py:426 #, python-brace-format msgid "Placed on {dt}" msgstr "予約した日:{dt}" -#: calibre-plugin/models.py:431 +#: calibre-plugin/models.py:442 #, python-brace-format msgid "Deliver after {dt}" msgstr "{dt}以降に借りられます" -#: calibre-plugin/models.py:437 +#: calibre-plugin/models.py:448 #, python-brace-format msgid "Suspended till {dt}" msgstr "" -#: calibre-plugin/models.py:482 +#: calibre-plugin/models.py:493 msgid "Delivering Later" msgstr "後で借りる" -#: calibre-plugin/models.py:483 +#: calibre-plugin/models.py:494 msgid "Suspended Hold" msgstr "保留期間を変更する" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Release Date" msgstr "公開日" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Library Card" msgstr "図書カード" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Borrowed" msgstr "借り" @@ -294,14 +294,51 @@ msgstr "" msgid "Check your connection or retry in a few minutes." msgstr "接続を確認するか、数分後に再試行してください。" -#: calibre-plugin/dialog/holds.py:75 -msgid "Get latest holds" +#: calibre-plugin/dialog/cards.py:92 +msgid "Card name" +msgstr "カードの名前" + +#: calibre-plugin/dialog/cards.py:103 +msgid "Card account" +msgstr "" + +#: calibre-plugin/dialog/cards.py:114 +msgid "Created date" msgstr "" -#: calibre-plugin/dialog/holds.py:155 calibre-plugin/dialog/holds.py:169 +#: calibre-plugin/dialog/cards.py:131 +msgid "Verified date" +msgstr "" + +#: calibre-plugin/dialog/cards.py:148 calibre-plugin/dialog/loans.py:154 +msgid "Loans" +msgstr "貸出中" + +#: calibre-plugin/dialog/cards.py:169 calibre-plugin/dialog/holds.py:155 +#: calibre-plugin/dialog/holds.py:169 msgid "Holds" msgstr "予約中" +#: calibre-plugin/dialog/cards.py:187 calibre-plugin/dialog/cards.py:197 +#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 +#: calibre-plugin/dialog/magazines.py:260 +msgid "View in Libby" +msgstr "Libbyで見る" + +#: calibre-plugin/dialog/cards.py:190 calibre-plugin/dialog/cards.py:200 +#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 +#: calibre-plugin/dialog/magazines.py:265 +msgid "View in OverDrive" +msgstr "OverDriveで見る" + +#: calibre-plugin/dialog/cards.py:253 +msgid "Cards" +msgstr "ライブラリーカード" + +#: calibre-plugin/dialog/holds.py:75 +msgid "Get latest holds" +msgstr "" + #: calibre-plugin/dialog/holds.py:166 #, python-brace-format msgid "Holds ({n})" @@ -335,16 +372,6 @@ msgid "" "Refresh." msgstr "" -#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 -#: calibre-plugin/dialog/magazines.py:262 -msgid "View in Libby" -msgstr "Libbyで見る" - -#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 -#: calibre-plugin/dialog/magazines.py:267 -msgid "View in OverDrive" -msgstr "OverDriveで見る" - #: calibre-plugin/dialog/holds.py:270 msgid "Manage hold" msgstr "予約を管理する" @@ -353,7 +380,7 @@ msgstr "予約を管理する" msgid "Cancel hold" msgstr "予約をキャンセルする" -#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:303 +#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:301 #, python-brace-format msgid "Borrowing {book}" msgstr "" @@ -408,10 +435,6 @@ msgstr "最近借りた本を入手する" msgid "Download selected loans" msgstr "選択した書籍ローンをダウンロードする" -#: calibre-plugin/dialog/loans.py:154 -msgid "Loans" -msgstr "貸出中" - #: calibre-plugin/dialog/loans.py:199 #, python-brace-format msgid "Return {n} loan" @@ -442,58 +465,58 @@ msgstr "{book}を返却中" msgid "Failed to return loan" msgstr "図書貸出返還失敗" -#: calibre-plugin/dialog/magazines.py:88 +#: calibre-plugin/dialog/magazines.py:86 msgid "" "Paste the share link of the magazine you wish to favorite and select a " "library card. \n" "Click on the Add button to monitor this title for new issues." msgstr "" -#: calibre-plugin/dialog/magazines.py:122 +#: calibre-plugin/dialog/magazines.py:120 msgid "Add to monitor for new issues" msgstr "" -#: calibre-plugin/dialog/magazines.py:133 +#: calibre-plugin/dialog/magazines.py:131 msgid "Get latest magazines" msgstr "" -#: calibre-plugin/dialog/magazines.py:210 +#: calibre-plugin/dialog/magazines.py:208 msgid "Magazines" msgstr "雑誌" -#: calibre-plugin/dialog/magazines.py:328 +#: calibre-plugin/dialog/magazines.py:326 msgid "Failed to borrow magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:350 -#: calibre-plugin/dialog/magazines.py:372 -#: calibre-plugin/dialog/magazines.py:384 -#: calibre-plugin/dialog/magazines.py:403 -#: calibre-plugin/dialog/magazines.py:418 +#: calibre-plugin/dialog/magazines.py:348 +#: calibre-plugin/dialog/magazines.py:370 +#: calibre-plugin/dialog/magazines.py:382 +#: calibre-plugin/dialog/magazines.py:401 +#: calibre-plugin/dialog/magazines.py:416 msgid "Add Magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:351 +#: calibre-plugin/dialog/magazines.py:349 #, python-brace-format msgid "Invalid URL {url}" msgstr "" -#: calibre-plugin/dialog/magazines.py:374 +#: calibre-plugin/dialog/magazines.py:372 #, python-brace-format msgid "{media} is not a downloadable magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:385 +#: calibre-plugin/dialog/magazines.py:383 #, python-brace-format msgid "{library} does not own this title" msgstr "{library}はこの作品を所有していません。" -#: calibre-plugin/dialog/magazines.py:404 +#: calibre-plugin/dialog/magazines.py:402 #, python-brace-format msgid "Already added {magazine}" msgstr "" -#: calibre-plugin/dialog/magazines.py:420 +#: calibre-plugin/dialog/magazines.py:418 #, python-brace-format msgid "" "Added {magazine} for monitoring.\n" diff --git a/calibre-plugin/translations/ko.po b/calibre-plugin/translations/ko.po index 52aab93..2b49e28 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.6\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-07-29 22:21+0800\n" +"POT-Creation-Date: 2023-08-01 19:35+0800\n" "PO-Revision-Date: 2023-07-04 07:26+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,15 +18,15 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 3.3.2\n" -#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:54 +#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:55 msgid "Import loans from your OverDrive Libby account" msgstr "OverDrive Libby 계정에서 대출 가져오기" -#: calibre-plugin/action.py:60 +#: calibre-plugin/action.py:61 msgid "Libby" msgstr "" -#: calibre-plugin/action.py:124 calibre-plugin/dialog/base.py:131 +#: calibre-plugin/action.py:125 calibre-plugin/dialog/base.py:131 msgid "MobileRead" msgstr "" @@ -187,63 +187,63 @@ msgstr "" msgid "PDF (DRM)" msgstr "" -#: calibre-plugin/models.py:158 +#: calibre-plugin/models.py:169 msgid "Expire Date" msgstr "" -#: calibre-plugin/models.py:159 calibre-plugin/models.py:319 +#: calibre-plugin/models.py:170 calibre-plugin/models.py:330 msgid "Library" msgstr "도서관" -#: calibre-plugin/models.py:270 +#: calibre-plugin/models.py:281 msgid "A skip-the-line loan" msgstr "대기 없는 인기 자료 대출." -#: calibre-plugin/models.py:318 +#: calibre-plugin/models.py:329 msgid "Hold/Expire Date" msgstr "" -#: calibre-plugin/models.py:321 +#: calibre-plugin/models.py:332 msgid "Available" msgstr "이용 가능" -#: calibre-plugin/models.py:410 +#: calibre-plugin/models.py:421 #, python-brace-format msgid "Expires {dt}" msgstr "" -#: calibre-plugin/models.py:415 +#: calibre-plugin/models.py:426 #, python-brace-format msgid "Placed on {dt}" msgstr "예약일: {dt}" -#: calibre-plugin/models.py:431 +#: calibre-plugin/models.py:442 #, python-brace-format msgid "Deliver after {dt}" msgstr "{dt} 이후 전송" -#: calibre-plugin/models.py:437 +#: calibre-plugin/models.py:448 #, python-brace-format msgid "Suspended till {dt}" msgstr "" -#: calibre-plugin/models.py:482 +#: calibre-plugin/models.py:493 msgid "Delivering Later" msgstr "나중에 전송 예정" -#: calibre-plugin/models.py:483 +#: calibre-plugin/models.py:494 msgid "Suspended Hold" msgstr "보류된 예약" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Release Date" msgstr "발행일" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Library Card" msgstr "도서관 카드" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Borrowed" msgstr "대출됨" @@ -294,14 +294,51 @@ msgstr "" msgid "Check your connection or retry in a few minutes." msgstr "연결 상태를 확인하거나 몇 분 후 다시 시도하십시오." -#: calibre-plugin/dialog/holds.py:75 -msgid "Get latest holds" +#: calibre-plugin/dialog/cards.py:92 +msgid "Card name" +msgstr "카드 이름" + +#: calibre-plugin/dialog/cards.py:103 +msgid "Card account" +msgstr "" + +#: calibre-plugin/dialog/cards.py:114 +msgid "Created date" msgstr "" -#: calibre-plugin/dialog/holds.py:155 calibre-plugin/dialog/holds.py:169 +#: calibre-plugin/dialog/cards.py:131 +msgid "Verified date" +msgstr "" + +#: calibre-plugin/dialog/cards.py:148 calibre-plugin/dialog/loans.py:154 +msgid "Loans" +msgstr "대출" + +#: calibre-plugin/dialog/cards.py:169 calibre-plugin/dialog/holds.py:155 +#: calibre-plugin/dialog/holds.py:169 msgid "Holds" msgstr "예약" +#: calibre-plugin/dialog/cards.py:187 calibre-plugin/dialog/cards.py:197 +#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 +#: calibre-plugin/dialog/magazines.py:260 +msgid "View in Libby" +msgstr "Libby에서 보기" + +#: calibre-plugin/dialog/cards.py:190 calibre-plugin/dialog/cards.py:200 +#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 +#: calibre-plugin/dialog/magazines.py:265 +msgid "View in OverDrive" +msgstr "OverDrive에서 보기" + +#: calibre-plugin/dialog/cards.py:253 +msgid "Cards" +msgstr "도서관 카드" + +#: calibre-plugin/dialog/holds.py:75 +msgid "Get latest holds" +msgstr "" + #: calibre-plugin/dialog/holds.py:166 #, python-brace-format msgid "Holds ({n})" @@ -335,16 +372,6 @@ msgid "" "Refresh." msgstr "" -#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 -#: calibre-plugin/dialog/magazines.py:262 -msgid "View in Libby" -msgstr "Libby에서 보기" - -#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 -#: calibre-plugin/dialog/magazines.py:267 -msgid "View in OverDrive" -msgstr "OverDrive에서 보기" - #: calibre-plugin/dialog/holds.py:270 msgid "Manage hold" msgstr "예약 관리" @@ -353,7 +380,7 @@ msgstr "예약 관리" msgid "Cancel hold" msgstr "예약 취소" -#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:303 +#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:301 #, python-brace-format msgid "Borrowing {book}" msgstr "" @@ -408,10 +435,6 @@ msgstr "최신 도서 대출 받기" msgid "Download selected loans" msgstr "선택한 도서 대출 다운로드" -#: calibre-plugin/dialog/loans.py:154 -msgid "Loans" -msgstr "대출" - #: calibre-plugin/dialog/loans.py:199 #, python-brace-format msgid "Return {n} loan" @@ -442,58 +465,58 @@ msgstr "{book}를 반환하는 중" msgid "Failed to return loan" msgstr "도서 대출 반환 실패" -#: calibre-plugin/dialog/magazines.py:88 +#: calibre-plugin/dialog/magazines.py:86 msgid "" "Paste the share link of the magazine you wish to favorite and select a " "library card. \n" "Click on the Add button to monitor this title for new issues." msgstr "" -#: calibre-plugin/dialog/magazines.py:122 +#: calibre-plugin/dialog/magazines.py:120 msgid "Add to monitor for new issues" msgstr "" -#: calibre-plugin/dialog/magazines.py:133 +#: calibre-plugin/dialog/magazines.py:131 msgid "Get latest magazines" msgstr "" -#: calibre-plugin/dialog/magazines.py:210 +#: calibre-plugin/dialog/magazines.py:208 msgid "Magazines" msgstr "잡지" -#: calibre-plugin/dialog/magazines.py:328 +#: calibre-plugin/dialog/magazines.py:326 msgid "Failed to borrow magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:350 -#: calibre-plugin/dialog/magazines.py:372 -#: calibre-plugin/dialog/magazines.py:384 -#: calibre-plugin/dialog/magazines.py:403 -#: calibre-plugin/dialog/magazines.py:418 +#: calibre-plugin/dialog/magazines.py:348 +#: calibre-plugin/dialog/magazines.py:370 +#: calibre-plugin/dialog/magazines.py:382 +#: calibre-plugin/dialog/magazines.py:401 +#: calibre-plugin/dialog/magazines.py:416 msgid "Add Magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:351 +#: calibre-plugin/dialog/magazines.py:349 #, python-brace-format msgid "Invalid URL {url}" msgstr "" -#: calibre-plugin/dialog/magazines.py:374 +#: calibre-plugin/dialog/magazines.py:372 #, python-brace-format msgid "{media} is not a downloadable magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:385 +#: calibre-plugin/dialog/magazines.py:383 #, python-brace-format msgid "{library} does not own this title" msgstr "{library}은 이 타이틀의 사본을 소유하지 않습니다." -#: calibre-plugin/dialog/magazines.py:404 +#: calibre-plugin/dialog/magazines.py:402 #, python-brace-format msgid "Already added {magazine}" msgstr "" -#: calibre-plugin/dialog/magazines.py:420 +#: calibre-plugin/dialog/magazines.py:418 #, python-brace-format msgid "" "Added {magazine} for monitoring.\n" diff --git a/calibre-plugin/translations/zh_CN.po b/calibre-plugin/translations/zh_CN.po index 6970a45..18fc6c3 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.6\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-07-29 22:21+0800\n" +"POT-Creation-Date: 2023-08-01 19:35+0800\n" "PO-Revision-Date: 2023-07-04 07:26+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,15 +18,15 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 3.3.2\n" -#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:54 +#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:55 msgid "Import loans from your OverDrive Libby account" msgstr "从您的OverDrive Libby账户导入已借作品" -#: calibre-plugin/action.py:60 +#: calibre-plugin/action.py:61 msgid "Libby" msgstr "" -#: calibre-plugin/action.py:124 calibre-plugin/dialog/base.py:131 +#: calibre-plugin/action.py:125 calibre-plugin/dialog/base.py:131 msgid "MobileRead" msgstr "" @@ -187,63 +187,63 @@ msgstr "" msgid "PDF (DRM)" msgstr "" -#: calibre-plugin/models.py:158 +#: calibre-plugin/models.py:169 msgid "Expire Date" msgstr "" -#: calibre-plugin/models.py:159 calibre-plugin/models.py:319 +#: calibre-plugin/models.py:170 calibre-plugin/models.py:330 msgid "Library" msgstr "图书馆" -#: calibre-plugin/models.py:270 +#: calibre-plugin/models.py:281 msgid "A skip-the-line loan" msgstr "免排队已借作品。" -#: calibre-plugin/models.py:318 +#: calibre-plugin/models.py:329 msgid "Hold/Expire Date" msgstr "" -#: calibre-plugin/models.py:321 +#: calibre-plugin/models.py:332 msgid "Available" msgstr "可供借阅" -#: calibre-plugin/models.py:410 +#: calibre-plugin/models.py:421 #, python-brace-format msgid "Expires {dt}" msgstr "" -#: calibre-plugin/models.py:415 +#: calibre-plugin/models.py:426 #, python-brace-format msgid "Placed on {dt}" msgstr "于{dt}预约" -#: calibre-plugin/models.py:431 +#: calibre-plugin/models.py:442 #, python-brace-format msgid "Deliver after {dt}" msgstr "{dt}后交付" -#: calibre-plugin/models.py:437 +#: calibre-plugin/models.py:448 #, python-brace-format msgid "Suspended till {dt}" msgstr "" -#: calibre-plugin/models.py:482 +#: calibre-plugin/models.py:493 msgid "Delivering Later" msgstr "稍后交付" -#: calibre-plugin/models.py:483 +#: calibre-plugin/models.py:494 msgid "Suspended Hold" msgstr "已延缓预约" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Release Date" msgstr "发布日期" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Library Card" msgstr "借书卡" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Borrowed" msgstr "已借阅" @@ -294,14 +294,51 @@ msgstr "" msgid "Check your connection or retry in a few minutes." msgstr "检查您的连接或在几分钟后重试。" -#: calibre-plugin/dialog/holds.py:75 -msgid "Get latest holds" +#: calibre-plugin/dialog/cards.py:92 +msgid "Card name" +msgstr "读者卡名称" + +#: calibre-plugin/dialog/cards.py:103 +msgid "Card account" +msgstr "" + +#: calibre-plugin/dialog/cards.py:114 +msgid "Created date" msgstr "" -#: calibre-plugin/dialog/holds.py:155 calibre-plugin/dialog/holds.py:169 +#: calibre-plugin/dialog/cards.py:131 +msgid "Verified date" +msgstr "" + +#: calibre-plugin/dialog/cards.py:148 calibre-plugin/dialog/loans.py:154 +msgid "Loans" +msgstr "已借作品" + +#: calibre-plugin/dialog/cards.py:169 calibre-plugin/dialog/holds.py:155 +#: calibre-plugin/dialog/holds.py:169 msgid "Holds" msgstr "预约" +#: calibre-plugin/dialog/cards.py:187 calibre-plugin/dialog/cards.py:197 +#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 +#: calibre-plugin/dialog/magazines.py:260 +msgid "View in Libby" +msgstr "在Libby中查看" + +#: calibre-plugin/dialog/cards.py:190 calibre-plugin/dialog/cards.py:200 +#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 +#: calibre-plugin/dialog/magazines.py:265 +msgid "View in OverDrive" +msgstr "在OverDrive中查看" + +#: calibre-plugin/dialog/cards.py:253 +msgid "Cards" +msgstr "借书证" + +#: calibre-plugin/dialog/holds.py:75 +msgid "Get latest holds" +msgstr "" + #: calibre-plugin/dialog/holds.py:166 #, python-brace-format msgid "Holds ({n})" @@ -335,16 +372,6 @@ msgid "" "Refresh." msgstr "" -#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 -#: calibre-plugin/dialog/magazines.py:262 -msgid "View in Libby" -msgstr "在Libby中查看" - -#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 -#: calibre-plugin/dialog/magazines.py:267 -msgid "View in OverDrive" -msgstr "在OverDrive中查看" - #: calibre-plugin/dialog/holds.py:270 msgid "Manage hold" msgstr "" @@ -353,7 +380,7 @@ msgstr "" msgid "Cancel hold" msgstr "取消预约" -#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:303 +#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:301 #, python-brace-format msgid "Borrowing {book}" msgstr "" @@ -408,10 +435,6 @@ msgstr "获取最新借阅的书籍" msgid "Download selected loans" msgstr "下载选定的图书借阅" -#: calibre-plugin/dialog/loans.py:154 -msgid "Loans" -msgstr "已借作品" - #: calibre-plugin/dialog/loans.py:199 #, python-brace-format msgid "Return {n} loan" @@ -442,58 +465,58 @@ msgstr "归还 {book}" msgid "Failed to return loan" msgstr "借书归还失败" -#: calibre-plugin/dialog/magazines.py:88 +#: calibre-plugin/dialog/magazines.py:86 msgid "" "Paste the share link of the magazine you wish to favorite and select a " "library card. \n" "Click on the Add button to monitor this title for new issues." msgstr "" -#: calibre-plugin/dialog/magazines.py:122 +#: calibre-plugin/dialog/magazines.py:120 msgid "Add to monitor for new issues" msgstr "" -#: calibre-plugin/dialog/magazines.py:133 +#: calibre-plugin/dialog/magazines.py:131 msgid "Get latest magazines" msgstr "" -#: calibre-plugin/dialog/magazines.py:210 +#: calibre-plugin/dialog/magazines.py:208 msgid "Magazines" msgstr "杂志" -#: calibre-plugin/dialog/magazines.py:328 +#: calibre-plugin/dialog/magazines.py:326 msgid "Failed to borrow magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:350 -#: calibre-plugin/dialog/magazines.py:372 -#: calibre-plugin/dialog/magazines.py:384 -#: calibre-plugin/dialog/magazines.py:403 -#: calibre-plugin/dialog/magazines.py:418 +#: calibre-plugin/dialog/magazines.py:348 +#: calibre-plugin/dialog/magazines.py:370 +#: calibre-plugin/dialog/magazines.py:382 +#: calibre-plugin/dialog/magazines.py:401 +#: calibre-plugin/dialog/magazines.py:416 msgid "Add Magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:351 +#: calibre-plugin/dialog/magazines.py:349 #, python-brace-format msgid "Invalid URL {url}" msgstr "" -#: calibre-plugin/dialog/magazines.py:374 +#: calibre-plugin/dialog/magazines.py:372 #, python-brace-format msgid "{media} is not a downloadable magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:385 +#: calibre-plugin/dialog/magazines.py:383 #, python-brace-format msgid "{library} does not own this title" msgstr "{library}没有该作品的副本。" -#: calibre-plugin/dialog/magazines.py:404 +#: calibre-plugin/dialog/magazines.py:402 #, python-brace-format msgid "Already added {magazine}" msgstr "" -#: calibre-plugin/dialog/magazines.py:420 +#: calibre-plugin/dialog/magazines.py:418 #, python-brace-format msgid "" "Added {magazine} for monitoring.\n" diff --git a/calibre-plugin/translations/zh_TW.po b/calibre-plugin/translations/zh_TW.po index 5d3b542..7148a1c 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.6\n" "Report-Msgid-Bugs-To: https://github.com/ping/libby-calibre-plugin/\n" -"POT-Creation-Date: 2023-07-29 22:21+0800\n" +"POT-Creation-Date: 2023-08-01 19:35+0800\n" "PO-Revision-Date: 2023-07-04 07:25+0800\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,15 +18,15 @@ msgstr "" "Generated-By: pygettext.py 1.5\n" "X-Generator: Poedit 3.3.2\n" -#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:54 +#: calibre-plugin/__init__.py:55 calibre-plugin/action.py:55 msgid "Import loans from your OverDrive Libby account" msgstr "從您的 OverDrive Libby 帳戶導入已借閱的圖書" -#: calibre-plugin/action.py:60 +#: calibre-plugin/action.py:61 msgid "Libby" msgstr "" -#: calibre-plugin/action.py:124 calibre-plugin/dialog/base.py:131 +#: calibre-plugin/action.py:125 calibre-plugin/dialog/base.py:131 msgid "MobileRead" msgstr "" @@ -187,63 +187,63 @@ msgstr "" msgid "PDF (DRM)" msgstr "" -#: calibre-plugin/models.py:158 +#: calibre-plugin/models.py:169 msgid "Expire Date" msgstr "" -#: calibre-plugin/models.py:159 calibre-plugin/models.py:319 +#: calibre-plugin/models.py:170 calibre-plugin/models.py:330 msgid "Library" msgstr "圖書館" -#: calibre-plugin/models.py:270 +#: calibre-plugin/models.py:281 msgid "A skip-the-line loan" msgstr "一本免排隊借書。" -#: calibre-plugin/models.py:318 +#: calibre-plugin/models.py:329 msgid "Hold/Expire Date" msgstr "" -#: calibre-plugin/models.py:321 +#: calibre-plugin/models.py:332 msgid "Available" msgstr "可看" -#: calibre-plugin/models.py:410 +#: calibre-plugin/models.py:421 #, python-brace-format msgid "Expires {dt}" msgstr "" -#: calibre-plugin/models.py:415 +#: calibre-plugin/models.py:426 #, python-brace-format msgid "Placed on {dt}" msgstr "已在 {dt} 預約" -#: calibre-plugin/models.py:431 +#: calibre-plugin/models.py:442 #, python-brace-format msgid "Deliver after {dt}" msgstr "在 {dt} 之後傳遞" -#: calibre-plugin/models.py:437 +#: calibre-plugin/models.py:448 #, python-brace-format msgid "Suspended till {dt}" msgstr "" -#: calibre-plugin/models.py:482 +#: calibre-plugin/models.py:493 msgid "Delivering Later" msgstr "稍後傳遞" -#: calibre-plugin/models.py:483 +#: calibre-plugin/models.py:494 msgid "Suspended Hold" msgstr "暫停的預約" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Release Date" msgstr "發行日期" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Library Card" msgstr "借書卡" -#: calibre-plugin/models.py:529 +#: calibre-plugin/models.py:540 msgid "Borrowed" msgstr "已借閱" @@ -294,14 +294,51 @@ msgstr "" msgid "Check your connection or retry in a few minutes." msgstr "檢查您的連接或在幾分鐘後重試。" -#: calibre-plugin/dialog/holds.py:75 -msgid "Get latest holds" +#: calibre-plugin/dialog/cards.py:92 +msgid "Card name" +msgstr "借書證名稱" + +#: calibre-plugin/dialog/cards.py:103 +msgid "Card account" +msgstr "" + +#: calibre-plugin/dialog/cards.py:114 +msgid "Created date" msgstr "" -#: calibre-plugin/dialog/holds.py:155 calibre-plugin/dialog/holds.py:169 +#: calibre-plugin/dialog/cards.py:131 +msgid "Verified date" +msgstr "" + +#: calibre-plugin/dialog/cards.py:148 calibre-plugin/dialog/loans.py:154 +msgid "Loans" +msgstr "借書" + +#: calibre-plugin/dialog/cards.py:169 calibre-plugin/dialog/holds.py:155 +#: calibre-plugin/dialog/holds.py:169 msgid "Holds" msgstr "預約" +#: calibre-plugin/dialog/cards.py:187 calibre-plugin/dialog/cards.py:197 +#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 +#: calibre-plugin/dialog/magazines.py:260 +msgid "View in Libby" +msgstr "在Libby中查看" + +#: calibre-plugin/dialog/cards.py:190 calibre-plugin/dialog/cards.py:200 +#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 +#: calibre-plugin/dialog/magazines.py:265 +msgid "View in OverDrive" +msgstr "在OverDrive中查看" + +#: calibre-plugin/dialog/cards.py:253 +msgid "Cards" +msgstr "借書證" + +#: calibre-plugin/dialog/holds.py:75 +msgid "Get latest holds" +msgstr "" + #: calibre-plugin/dialog/holds.py:166 #, python-brace-format msgid "Holds ({n})" @@ -335,16 +372,6 @@ msgid "" "Refresh." msgstr "" -#: calibre-plugin/dialog/holds.py:259 calibre-plugin/dialog/loans.py:188 -#: calibre-plugin/dialog/magazines.py:262 -msgid "View in Libby" -msgstr "在Libby中查看" - -#: calibre-plugin/dialog/holds.py:264 calibre-plugin/dialog/loans.py:193 -#: calibre-plugin/dialog/magazines.py:267 -msgid "View in OverDrive" -msgstr "在OverDrive中查看" - #: calibre-plugin/dialog/holds.py:270 msgid "Manage hold" msgstr "" @@ -353,7 +380,7 @@ msgstr "" msgid "Cancel hold" msgstr "取消預約" -#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:303 +#: calibre-plugin/dialog/holds.py:292 calibre-plugin/dialog/magazines.py:301 #, python-brace-format msgid "Borrowing {book}" msgstr "" @@ -408,10 +435,6 @@ msgstr "獲取最新借閱的書籍" msgid "Download selected loans" msgstr "下載選定的圖書借閱" -#: calibre-plugin/dialog/loans.py:154 -msgid "Loans" -msgstr "借書" - #: calibre-plugin/dialog/loans.py:199 #, python-brace-format msgid "Return {n} loan" @@ -442,58 +465,58 @@ msgstr "歸還 {book}" msgid "Failed to return loan" msgstr "借阅图书未能归还" -#: calibre-plugin/dialog/magazines.py:88 +#: calibre-plugin/dialog/magazines.py:86 msgid "" "Paste the share link of the magazine you wish to favorite and select a " "library card. \n" "Click on the Add button to monitor this title for new issues." msgstr "" -#: calibre-plugin/dialog/magazines.py:122 +#: calibre-plugin/dialog/magazines.py:120 msgid "Add to monitor for new issues" msgstr "" -#: calibre-plugin/dialog/magazines.py:133 +#: calibre-plugin/dialog/magazines.py:131 msgid "Get latest magazines" msgstr "" -#: calibre-plugin/dialog/magazines.py:210 +#: calibre-plugin/dialog/magazines.py:208 msgid "Magazines" msgstr "雜誌" -#: calibre-plugin/dialog/magazines.py:328 +#: calibre-plugin/dialog/magazines.py:326 msgid "Failed to borrow magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:350 -#: calibre-plugin/dialog/magazines.py:372 -#: calibre-plugin/dialog/magazines.py:384 -#: calibre-plugin/dialog/magazines.py:403 -#: calibre-plugin/dialog/magazines.py:418 +#: calibre-plugin/dialog/magazines.py:348 +#: calibre-plugin/dialog/magazines.py:370 +#: calibre-plugin/dialog/magazines.py:382 +#: calibre-plugin/dialog/magazines.py:401 +#: calibre-plugin/dialog/magazines.py:416 msgid "Add Magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:351 +#: calibre-plugin/dialog/magazines.py:349 #, python-brace-format msgid "Invalid URL {url}" msgstr "" -#: calibre-plugin/dialog/magazines.py:374 +#: calibre-plugin/dialog/magazines.py:372 #, python-brace-format msgid "{media} is not a downloadable magazine" msgstr "" -#: calibre-plugin/dialog/magazines.py:385 +#: calibre-plugin/dialog/magazines.py:383 #, python-brace-format msgid "{library} does not own this title" msgstr "{library}不擁有此出版物的任何副本。" -#: calibre-plugin/dialog/magazines.py:404 +#: calibre-plugin/dialog/magazines.py:402 #, python-brace-format msgid "Already added {magazine}" msgstr "" -#: calibre-plugin/dialog/magazines.py:420 +#: calibre-plugin/dialog/magazines.py:418 #, python-brace-format msgid "" "Added {magazine} for monitoring.\n"