From 6b327641078b5d2256cac9bcf065eb478c748563 Mon Sep 17 00:00:00 2001 From: rdbende Date: Fri, 31 May 2024 18:10:09 +0200 Subject: [PATCH 01/15] Remove manual signal definitions --- cozy/ui/chapter_element.py | 8 +++----- cozy/ui/widgets/album_element.py | 26 ++++---------------------- cozy/ui/widgets/book_element.py | 19 +++++++++---------- cozy/ui/widgets/seek_bar.py | 16 +++++++++------- cozy/ui/widgets/storages.py | 16 ++++++---------- 5 files changed, 31 insertions(+), 54 deletions(-) diff --git a/cozy/ui/chapter_element.py b/cozy/ui/chapter_element.py index 66343c1d..51d1d7ff 100644 --- a/cozy/ui/chapter_element.py +++ b/cozy/ui/chapter_element.py @@ -33,6 +33,9 @@ def __init__(self, chapter: Chapter): self.title_label.set_text(self.chapter.name) self.duration_label.set_text(seconds_to_str(self.chapter.length)) + @GObject.Signal(arg_types=(object,)) + def play_pause_clicked(self, *_): ... + def _on_button_press(self, *_): self.emit("play-pause-clicked", self.chapter) @@ -63,8 +66,3 @@ def set_playing(self, playing): self.play_icon.set_from_icon_name("media-playback-pause-symbolic") else: self.play_icon.set_from_icon_name("media-playback-start-symbolic") - - -GObject.type_register(ChapterElement) -GObject.signal_new('play-pause-clicked', ChapterElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,)) diff --git a/cozy/ui/widgets/album_element.py b/cozy/ui/widgets/album_element.py index 875a8a41..ce662b55 100644 --- a/cozy/ui/widgets/album_element.py +++ b/cozy/ui/widgets/album_element.py @@ -43,10 +43,11 @@ def __init__(self, book: Book): self.play_button.connect("clicked", self._on_play_button_press) - # TODO: Just use CSS - #self.progress_drawing_area.connect("realize", lambda w: w.get_window().set_pass_through(True)) + # TODO: Use CSS for hover self.progress_drawing_area.set_draw_func(self._draw_progress) - #self.album_art_drawing_area.set_draw_func(self._draw_album_hover) + + @GObject.Signal(arg_types=(object,)) + def play_pause_clicked(self, *_): ... def set_playing(self, playing: bool): if playing: @@ -61,11 +62,6 @@ def set_hover(self, hover: bool): def _on_play_button_press(self, _): self.emit("play-pause-clicked", self._book) - def _draw_album_hover(self, area: Gtk.DrawingArea, context: cairo.Context, *_): - context.rectangle(0, 0, area.get_allocated_width(), area.get_allocated_height()) - context.set_source_rgba(1, 1, 1, 0.15) - context.fill() - def _draw_progress(self, area: Gtk.DrawingArea, context: cairo.Context, *_): width = area.get_allocated_width() height = area.get_allocated_height() @@ -83,19 +79,5 @@ def _draw_progress(self, area: Gtk.DrawingArea, context: cairo.Context, *_): context.set_line_width(STROKE_WIDTH) context.stroke() - def draw_background(self, area: Gtk.DrawingArea, context: cairo.Context): - width = area.get_allocated_width() - height = area.get_allocated_height() - - context.arc(width / 2.0, height / 2.0, self.radius, 0, math.pi * 2.0) - context.set_source_rgba(0, 0, 0, 1.0) - context.set_line_width(2) - context.stroke() - def update_progress(self): self.progress_drawing_area.queue_draw() - - -GObject.type_register(AlbumElement) -GObject.signal_new('play-pause-clicked', AlbumElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,)) diff --git a/cozy/ui/widgets/book_element.py b/cozy/ui/widgets/book_element.py index 0d6c13e0..b6405197 100644 --- a/cozy/ui/widgets/book_element.py +++ b/cozy/ui/widgets/book_element.py @@ -57,6 +57,15 @@ def _add_event_controllers(self): motion_event_controller.connect("leave", self._on_cover_leave_notify) self.container_box.add_controller(motion_event_controller) + @GObject.Signal(arg_types=(object,)) + def play_pause_clicked(self, *_): ... + + @GObject.Signal(arg_types=(object,)) + def open_book_overview(self, *_): ... + + @GObject.Signal(arg_types=(object,)) + def book_removed(self, *_): ... + def set_playing(self, is_playing): self.art.set_playing(is_playing) @@ -127,13 +136,3 @@ def _on_cover_leave_notify(self, *_): def _on_album_art_press_event(self, *_): self.emit("play-pause-clicked", self.book) - - -GObject.type_register(BookElement) -GObject.signal_new('play-pause-clicked', BookElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,)) -GObject.signal_new('open-book-overview', BookElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,)) -GObject.signal_new('book-removed', BookElement, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,)) - diff --git a/cozy/ui/widgets/seek_bar.py b/cozy/ui/widgets/seek_bar.py index 9c058086..28c7a73f 100644 --- a/cozy/ui/widgets/seek_bar.py +++ b/cozy/ui/widgets/seek_bar.py @@ -41,6 +41,15 @@ def __init__(self, **kwargs): keyboard_controller.connect("key-pressed", self._on_progress_key_pressed) self.progress_scale.add_controller(keyboard_controller) + @GObject.Signal(arg_types=(object,)) + def position_changed(self, *_): ... + + @GObject.Signal + def rewind(self): ... + + @GObject.Signal + def forward(self): ... + @property def position(self) -> float: return self.progress_scale.get_value() @@ -89,10 +98,3 @@ def _on_progress_key_pressed(self, _, event, *__): def _on_progress_scale_press(self, *_): self._progress_scale_pressed = True - - -GObject.signal_new('position-changed', SeekBar, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,)) - -GObject.signal_new('rewind', SeekBar, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, ()) -GObject.signal_new('forward', SeekBar, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, ()) diff --git a/cozy/ui/widgets/storages.py b/cozy/ui/widgets/storages.py index a6366929..7d24df21 100644 --- a/cozy/ui/widgets/storages.py +++ b/cozy/ui/widgets/storages.py @@ -45,6 +45,12 @@ def __init__(self, model: Storage, menu_model: Gio.Menu) -> None: self._set_default_icon() self._set_drive_icon() + @GObject.Signal(arg_types=(object,)) + def location_changed(self, *_): ... + + @GObject.Signal + def menu_opened(self): ... + @property def model(self) -> Storage: return self._model @@ -71,16 +77,6 @@ def _set_default_icon(self) -> None: self.default_icon.set_visible(self._model.default) -GObject.signal_new( - "location-changed", - StorageRow, - GObject.SIGNAL_RUN_LAST, - GObject.TYPE_PYOBJECT, - (GObject.TYPE_PYOBJECT,), -) -GObject.signal_new("menu-opened", StorageRow, GObject.SIGNAL_RUN_LAST, GObject.TYPE_PYOBJECT, ()) - - @Gtk.Template.from_resource("/com/github/geigi/cozy/ui/storage_locations.ui") class StorageLocations(Adw.PreferencesGroup): __gtype_name__ = "StorageLocations" From 67a291657271335ad8f4e160ededb94138abcf3c Mon Sep 17 00:00:00 2001 From: Manuel Traut Date: Sat, 1 Jun 2024 11:52:03 +0200 Subject: [PATCH 02/15] appdata.xml: Use a SPDX license tag (#922) According to appdata specification this shall be a SPDX tag. Signed-off-by: Manuel Traut --- data/com.github.geigi.cozy.appdata.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/com.github.geigi.cozy.appdata.xml b/data/com.github.geigi.cozy.appdata.xml index 450f1557..0360c705 100644 --- a/data/com.github.geigi.cozy.appdata.xml +++ b/data/com.github.geigi.cozy.appdata.xml @@ -2,7 +2,7 @@ com.github.geigi.cozy Cozy - CC0 + CC0-1.0 GPL-3.0+ com.github.geigi.cozy.desktop com.github.geigi.cozy From 5189bbe9436b85a1b7833d9972896d5f772d6dc5 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 11:56:16 +0200 Subject: [PATCH 03/15] Translate po/com.github.geigi.cozy.pot in hi (#918) 100% translated source file: 'po/com.github.geigi.cozy.pot' on 'hi'. Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com> --- po/hi.po | 962 +++++++++++++++++++++++-------------------------------- 1 file changed, 394 insertions(+), 568 deletions(-) diff --git a/po/hi.po b/po/hi.po index d5f7c73a..45dada2e 100644 --- a/po/hi.po +++ b/po/hi.po @@ -5,39 +5,40 @@ # # Translators: # Panwar108 , 2022 +# Scrambled777 , 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-04 16:30+0100\n" +"POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" -"Last-Translator: Panwar108 , 2022\n" -"Language-Team: Hindi (https://www.transifex.com/geigi/teams/78138/hi/)\n" +"Last-Translator: Scrambled777 , 2024\n" +"Language-Team: Hindi (https://app.transifex.com/geigi/teams/78138/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: cozy/application.py:101 +#: cozy/application.py:59 msgid "Audiobooks" msgstr "ऑडियो पुस्तकें" -#: cozy/control/offline_cache.py:200 +#: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "कॉपी करना जारी" -#: cozy/media/files.py:69 +#: cozy/media/files.py:67 msgid "Cannot copy: Audiobook directory is read only" -msgstr "कॉपी करना विफल : ऑडियो पुस्तक डायरेक्टरी केवल रीड योग्य है" +msgstr "कॉपी करना विफल : ऑडियो पुस्तक निर्देशिका केवल पढ़ने योग्य है" -#: cozy/media/files.py:71 +#: cozy/media/files.py:69 msgid "Cannot copy: Disk is full" -msgstr "कॉपी करना विफल : डिस्क पर स्पेस नहीं है" +msgstr "कॉपी करना विफल : डिस्क भरी हुई है" -#: cozy/media/files.py:73 cozy/media/files.py:89 +#: cozy/media/files.py:71 cozy/media/files.py:87 msgid "Cannot copy: Permission denied" msgstr "कॉपी करना विफल : अनुमति अस्वीकृत" @@ -45,10 +46,6 @@ msgstr "कॉपी करना विफल : अनुमति अस्व msgid "Error while importing new files" msgstr "नवीन फाइलें आयात करते समय त्रुटि" -#: cozy/model/track.py:38 -msgid "Chapter" -msgstr "अध्याय" - #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" @@ -112,240 +109,298 @@ msgid_plural "{years} years ago" msgstr[0] "{years} वर्ष पूर्व" msgstr[1] "{years} वर्ष पूर्व" -#: cozy/ui/book_detail_view.py:313 +#: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "डाउनलोड की गई" -#: cozy/ui/book_detail_view.py:316 data/ui/book_detail.ui:152 +#: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "डाउनलोड" -#: cozy/ui/chapter_element.py:27 -msgid "Play this part" -msgstr "यह खंड आरंभ करें" +#: cozy/ui/db_migration_failed_view.py:6 +msgid "" +"During an update of the database an error occurred and Cozy will not be able" +" to startup. A backup of the database was created before the update and has " +"been restored now. Until this issue is resolved please use version 0.9.5 of " +"Cozy. You can help resolve this problem by reporting an issue on GitHub." +msgstr "" +"डेटाबेस के अद्यतन के दौरान एक त्रुटि उत्पन्न हुई और कोजी शुरू नहीं हो पाएगा।" +" अद्यतन से पहले डेटाबेस का बैकअप बनाया गया था और अब इसे पुनर्स्थापित कर दिया" +" गया है। जब तक यह समस्या हल नहीं हो जाती, कृपया कोजी के संस्करण 0.9.5 का " +"उपयोग करें। आप GitHub पर किसी समस्या की रिपोर्ट करके इस समस्या को हल करने " +"में मदद कर सकते हैं।" + +#: cozy/ui/db_migration_failed_view.py:15 +msgid "Failed to Update Database" +msgstr "डेटाबेस अद्यतन करने में विफल" + +#: cozy/ui/db_migration_failed_view.py:22 +msgid "Close Cozy" +msgstr "कोजी बंद करें" + +#: cozy/ui/db_migration_failed_view.py:23 +msgid "Receive help on GitHub" +msgstr "GitHub द्वारा सहायता प्राप्त करें" + +#: cozy/ui/delete_book_view.py:13 +msgid "Delete Audiobook?" +msgstr "ऑडियो पुस्तक मिटाएं?" + +#: cozy/ui/delete_book_view.py:14 +msgid "The audiobook will be removed from your disk and from Cozy's library." +msgstr "ऑडियो पुस्तक को आपकी डिस्क और कोजी की लाइब्रेरी से हटा दिया जाएगा।" + +#: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 +msgid "Cancel" +msgstr "रद्द करें" + +#: cozy/ui/delete_book_view.py:22 +msgid "Remove Audiobook" +msgstr "ऑडियो पुस्तक हटाएं" -#: cozy/ui/disk_element.py:27 +#: cozy/ui/disk_element.py:22 msgid "Disc" msgstr "डिस्क" -#: cozy/ui/file_not_found_dialog.py:56 -msgid "All files" -msgstr "सभी फाइलें" +#: cozy/ui/file_not_found_dialog.py:18 +msgid "File not found" +msgstr "फाइल नहीं मिली" -#: cozy/ui/main_view.py:301 data/ui/main_window.ui:412 -msgid "Set Audiobooks Directory" -msgstr "ऑडियो पुस्तक हेतु डायरेक्टरी सेट करें" +#: cozy/ui/file_not_found_dialog.py:19 +msgid "This file could not be found. Do you want to locate it manually?" +msgstr "यह फाइल नहीं मिल पाई। क्या आप इसे हस्तचालित रूप से खोजना चाहते हैं?" + +#: cozy/ui/file_not_found_dialog.py:27 +msgid "Locate" +msgstr "खोजें" + +#: cozy/ui/file_not_found_dialog.py:38 +msgid "Locate Missing File" +msgstr "गुम फाइल का पता लगाएं" -#: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 +#: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format -msgid "{storage} is offline." -msgstr "{storage} ऑफलाइन है।" +msgid "{ext} files" +msgstr "{ext} फाइलें" + +#: cozy/ui/file_not_found_dialog.py:44 +msgid "Audio files" +msgstr "ऑडियो फाइलें" + +#: cozy/ui/import_failed_dialog.py:8 +msgid "This can have multiple reasons:" +msgstr "इसके कई कारण हो सकते हैं:" + +#: cozy/ui/import_failed_dialog.py:11 +msgid "The audio format is not supported" +msgstr "ऑडियो प्रारूप समर्थित नहीं है" + +#: cozy/ui/import_failed_dialog.py:12 +msgid "The path or filename contains non utf-8 characters" +msgstr "पथ या फाइल नाम में गैर utf-8 वर्ण हैं" + +#: cozy/ui/import_failed_dialog.py:13 +msgid "The file(s) are no valid audio files" +msgstr "फाइल(लें) कोई वैध ऑडियो फाइलें नहीं हैं" + +#: cozy/ui/import_failed_dialog.py:14 +msgid "The file(s) are corrupt" +msgstr "फाइल(लें) भ्रष्ट हैं" + +#: cozy/ui/import_failed_dialog.py:28 +msgid "Some files could not be imported" +msgstr "कुछ फाइलें आयात नहीं की जा सकी" -#: cozy/ui/widgets/book_element.py:52 +#: cozy/ui/import_failed_dialog.py:35 +msgid "Ok" +msgstr "ठीक है" + +#: cozy/ui/main_view.py:198 +msgid "Patreon Supporters" +msgstr "Patreon समर्थक" + +#: cozy/ui/main_view.py:202 +msgid "m4b chapter support in mutagen" +msgstr "म्यूटाजेन में m4b अध्याय समर्थन" + +#: cozy/ui/main_view.py:206 +msgid "Open Source Projects" +msgstr "मुक्त स्रोत परियोजनाएं" + +#. Translators: Replace "translator-credits" with your names, one name per +#. line +#: cozy/ui/main_view.py:211 +msgid "translator-credits" +msgstr "" +"Panwar108 \n" +"Scrambled777 " + +#: cozy/ui/widgets/book_element.py:70 msgid "Mark as read" -msgstr "श्रवण पूर्ण के रूप में चिन्हित करें" +msgstr "श्रवण पूर्ण चिन्हित करें" -#: cozy/ui/widgets/book_element.py:55 +#: cozy/ui/widgets/book_element.py:73 msgid "Open in file browser" msgstr "फाइल ब्राउज़र में खोलें" -#: cozy/ui/widgets/book_element.py:58 +#: cozy/ui/widgets/book_element.py:76 msgid "Remove from library" -msgstr "संग्रह से हटाएँ" +msgstr "लाइब्रेरी से हटाएं" -#: cozy/ui/widgets/error_reporting.py:12 +#: cozy/ui/widgets/book_row.py:25 +msgid "Play this book" +msgstr "यह पुस्तक चलायें" + +#: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" -msgstr "निष्क्रिय" +msgstr "अक्षम" -#: cozy/ui/widgets/error_reporting.py:13 +#: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" msgstr "त्रुटि हेतु सामान्य रिपोर्ट" -#: cozy/ui/widgets/error_reporting.py:14 +#: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" msgstr "त्रुटि हेतु विस्तृत रिपोर्ट" -#: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:240 +#: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" msgstr "आयात त्रुटियों सहित विस्तृत रिपोर्ट" -#: cozy/ui/widgets/error_reporting.py:19 +#: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." msgstr "त्रुटि या निरस्त हेतु कोई रिपोर्ट नहीं।" -#: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:259 +#: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" -msgstr "कोई त्रुटि या निरस्त होने पर निम्नलिखित सूचना भेजी जाएगी :" +msgstr "कोई त्रुटि या निरस्त होने पर निम्नलिखित सूचना भेजी जाएगी:" -#: cozy/ui/widgets/error_reporting.py:25 +#: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" -msgstr "त्रुटि प्रकार" +msgstr "किस प्रकार की त्रुटि हुई" -#: cozy/ui/widgets/error_reporting.py:26 +#: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" -msgstr "त्रुटि संबंधी कोड की पंक्ति" +msgstr "कोड की वह पंक्ति जहां त्रुटि हुई" -#: cozy/ui/widgets/error_reporting.py:27 +#: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" -msgstr "Cozy संस्करण" +msgstr "कोजी संस्करण" -#: cozy/ui/widgets/error_reporting.py:28 +#: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" msgstr "लिनक्स वितरण" -#: cozy/ui/widgets/error_reporting.py:29 +#: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" msgstr "डेस्कटॉप वातावरण" -#: cozy/ui/widgets/error_reporting.py:30 +#: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" -msgstr "मीडिया फाइल प्रकार जिनका Cozy द्वारा आयात विफल रहा" +msgstr "मीडिया प्रकार की फाइलें जिन्हें कोजी आयात नहीं कर सका" -#: cozy/ui/widgets/filter_list_box.py:20 -#: cozy/view_model/library_view_model.py:54 -#: cozy/view_model/library_view_model.py:160 +#: cozy/ui/widgets/filter_list_box.py:18 +#: cozy/view_model/library_view_model.py:45 +#: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "सभी" -#: cozy/ui/widgets/filter_list_box.py:21 +#: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "सभी पुस्तकें प्रदर्शित करें" -#: cozy/ui/widgets/search_results.py:73 -msgid "Jump to author " -msgstr "लेखक देखें" - -#: cozy/ui/widgets/search_results.py:76 -msgid "Jump to reader " -msgstr "वाचक देखें" - -#: cozy/ui/widgets/search_results.py:100 -msgid "Play this book" -msgstr "यह पुस्तक आरंभ करें" +#: cozy/ui/widgets/search_results.py:13 +#, python-brace-format +msgid "Jump to {artist_name}" +msgstr "{artist_name} पर जाएं" -#: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 +#: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 msgid "min" msgstr "मिनट" -#: cozy/ui/widgets/sleep_timer.py:65 +#: cozy/ui/widgets/sleep_timer.py:62 msgid "Off" msgstr "बंद" -#: cozy/ui/widgets/storage_list_box_row.py:70 data/ui/preferences.ui:377 +#: cozy/ui/widgets/storages.py:11 +msgid "Set Audiobooks Directory" +msgstr "ऑडियो पुस्तक निर्देशिका निर्धारित करें" + +#: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 msgid "External drive" -msgstr "बाह्य ड्राइव" +msgstr "बाहरी ड्राइव" -#: cozy/ui/widgets/storage_list_box_row.py:73 +#: cozy/ui/widgets/storages.py:68 msgid "Internal drive" msgstr "आतंरिक ड्राइव" -#: cozy/view_model/headerbar_view_model.py:91 +#: cozy/view_model/headerbar_view_model.py:78 msgid "Refreshing audio book collection" -msgstr "ऑडियो पुस्तक संग्रह रिफ्रेश करना जारी" +msgstr "ऑडियो पुस्तक संग्रह को ताजा किया जा रहा है" -#: cozy/view_model/headerbar_view_model.py:100 -#: cozy/view_model/headerbar_view_model.py:116 +#: cozy/view_model/headerbar_view_model.py:87 +#: cozy/view_model/headerbar_view_model.py:103 msgid "Copying new files…" -msgstr "नवीन फाइलें कॉपी करना जारी..." +msgstr "नई फाइलें कॉपी की जा रही हैं…" -#: cozy/view_model/headerbar_view_model.py:107 +#: cozy/view_model/headerbar_view_model.py:94 msgid "Changing audio book location…" -msgstr "ऑडियो पुस्तक स्थान परिवर्तन जारी..." +msgstr "ऑडियो पुस्तक का स्थान बदला जा रहा है…" -#: data/ui/about.ui:16 -msgid "GitHub" -msgstr "GitHub" - -#: data/ui/album_element.ui:104 +#: data/ui/album_element.ui:47 msgid "Play" -msgstr "आरंभ करें" +msgstr "चलाएं" -#: data/ui/book_detail.ui:219 +#: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "शेष" -#: data/ui/book_detail.ui:274 +#: data/ui/book_detail.ui:195 msgid "Total" msgstr "कुल" -#: data/ui/book_detail.ui:290 +#: data/ui/book_detail.ui:208 msgid "Last played" -msgstr "अंतिम बार प्रयुक्त" +msgstr "अंतिम चलाया गया" -#: data/ui/book_detail.ui:306 +#: data/ui/book_detail.ui:221 msgid "Published" msgstr "प्रकाशित" -#: data/ui/book_detail.ui:341 +#: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." -msgstr "पुस्तक की कुछ या सभी फाइलें प्राप्त करना विफल।" +msgstr "इस पुस्तक की कुछ या सभी फाइलें नहीं मिल सकी।" -#: data/ui/book_detail.ui:364 +#: data/ui/book_detail.ui:259 msgid "unavailable" msgstr "अनुपलब्ध" -#: data/ui/book_detail.ui:533 +#: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." -msgstr "अध्याय लोड करना जारी, कृपया प्रतीक्षा करें..." +msgstr "अध्याय लोड हो रहे हैं, कृपया प्रतीक्षा करें..." -#: data/ui/book_element.ui:36 +#: data/ui/book_element.ui:10 msgid "Open book overview" msgstr "पुस्तक अवलोकन खोलें" -#: data/ui/db_migration_failed.ui:31 -msgid "Close Cozy" -msgstr "Cozy बंद करें" - -#: data/ui/db_migration_failed.ui:47 -msgid "Receive help on GitHub" -msgstr "GitHub द्वारा सहायता प्राप्त करें" - -#: data/ui/db_migration_failed.ui:108 -msgid "An error occured while updating the database" -msgstr "डेटाबेस अपडेट करते समय त्रुटि हुई" - -#: data/ui/db_migration_failed.ui:129 -msgid "" -"During an update of the database an error occurred and Cozy will not be able to startup.\n" -"A backup of the database was created before the update and has been restored now.\n" -"Until this issue is resolved please use version 0.9.5 of Cozy.\n" -"You can help resolve this problem by reporting an issue on GitHub." -msgstr "" -"डेटाबेस अपडेट करते समय एक त्रुटि होने के कारण Cozy की आरंभिकरण प्रक्रिया विकृत हो गई है।\n" -"अपडेट से पूर्व डेटाबेस के बैकअप का सृजन किया गया था व उसे ही अब पुनः स्थापित कर दिया गया है।\n" -"इस समस्या का समाधान होने तक Cozy का 0.9.5 संस्करण ही उपयोग करें।\n" -"आप समस्या को GitHub पर रिपोर्ट कर इसके निवारण में सहयोग कर सकते हैं।" - -#: data/ui/delete_book_dialog.ui:31 data/ui/file_not_found.ui:19 -msgid "Cancel" -msgstr "रद्द करें" - -#: data/ui/delete_book_dialog.ui:45 -msgid "Delete Audiobook" -msgstr "ऑडियो पुस्तक हटाएँ" - -#: data/ui/delete_book_dialog.ui:105 -msgid "Are you sure you want to delete the selected audiobook?" -msgstr "क्या आप निश्चित ही चयनित ऑडियो पुस्तक हटाना चाहते हैं?" - -#: data/ui/delete_book_dialog.ui:126 -msgid "The audiobook will be removed from your disk and from Cozy's library." -msgstr "यह ऑडियो पुस्तक आपकी डिस्क एवं Cozy पुस्तक संग्रह से हटा दी जाएगी।" +#: data/ui/chapter_element.ui:5 +msgid "Play this part" +msgstr "यह खंड चलायें" -#: data/ui/error_reporting.ui:29 data/ui/preferences.ui:455 +#: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" msgstr "उपयोक्ता प्रतिक्रिया" -#: data/ui/error_reporting.ui:98 +#: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" -"आप त्रुटि या निरस्त संबंधी सूचना साझा कर Cozy के सॉफ्टवेयर विकास में योगदान " +"आप त्रुटि या निरस्त संबंधी सूचना साझा कर कोजी के सॉफ्टवेयर विकास में योगदान " "कर सकते हैं।" -#: data/ui/error_reporting.ui:112 +#: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " @@ -356,387 +411,305 @@ msgstr "" "आपका निजी डेटा, आयात की गई फाइलें या विशिष्ट पहचान संबंधी सूचना कभी एकत्र " "नहीं होगी।" -#: data/ui/error_reporting.ui:127 +#: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" -"Cozy एक मुक्त-स्रोत सॉफ्टवेयर है व निरीक्षण हेतु उपयोक्ता प्रतिक्रिया स्रोत " -"कोड यहाँ उपलब्ध है :" +"कोजी एक मुक्त-स्रोत सॉफ्टवेयर है व निरीक्षण हेतु उपयोक्ता प्रतिक्रिया स्रोत " +"कोड यहां उपलब्ध है: " -#: data/ui/file_not_found.ui:32 -msgid "Locate" -msgstr "स्थान खोजें" +#. Translators: Don't touch the markup. Translate the text "Sourcecode on +#. GitHub" only! +#: data/ui/error_reporting.ui:94 +msgid "" +"Sourcecode" +" on GitHub" +msgstr "" +"GitHub पर " +"सोर्सकोड" -#: data/ui/file_not_found.ui:86 -msgid "File not found" -msgstr "फाइल नहीं मिली" +#: data/ui/first_import_button.ui:12 +msgid "Select Folder" +msgstr "फोल्डर चुनें" -#: data/ui/file_not_found.ui:119 -msgid "This file could not be found. Do you want to locate it manually?" -msgstr "फाइल खोज विफल। क्या आप स्वयं फोल्डर में खोजना चाहते हैं?" +#: data/ui/headerbar.ui:17 +msgid "Toggle Filter Sidebar" +msgstr "फिल्टर पार्श्वपट्टी टॉगल करें" -#: data/ui/headerbar.ui:56 -msgid "Display background task progress" -msgstr "बैकग्राउंड कार्य की प्रगति प्रदर्शित करें" +#: data/ui/headerbar.ui:22 +msgid "Options" +msgstr "विकल्प" -#: data/ui/headerbar.ui:70 -msgid "Search your library" -msgstr "संग्रह में खोजें" +#: data/ui/headerbar.ui:26 +msgid "Open the options popover" +msgstr "विकल्प पॉपओवर खोलें" -#: data/ui/headerbar.ui:80 -msgid "Search menu button" -msgstr "खोज मेन्यू बटन" +#: data/ui/headerbar.ui:33 +msgid "Search your library" +msgstr "अपनी लाइब्रेरी खोजें" -#: data/ui/headerbar.ui:81 +#: data/ui/headerbar.ui:36 msgid "Open the search popover" msgstr "खोज साधन खोलें" -#: data/ui/headerbar.ui:96 -msgid "Options" -msgstr "विकल्प" +#: data/ui/headerbar.ui:44 +msgid "Display background task progress" +msgstr "बैकग्राउंड कार्य की प्रगति प्रदर्शित करें" -#: data/ui/headerbar.ui:107 -msgid "Options menu button" -msgstr "विकल्प मेन्यू बटन" +#: data/ui/headerbar.ui:67 +msgid "Start typing..." +msgstr "टाइप करना प्रारंभ करें..." -#: data/ui/headerbar.ui:108 -msgid "Open the options popover" -msgstr "विकल्प मेन्यू खोलें" +#: data/ui/headerbar.ui:80 +msgid "_Scan Library" +msgstr "लाइब्रेरी स्कैन करें (_S)" -#: data/ui/import_failed.ui:27 -msgid "Ok" -msgstr "ठीक है" +#: data/ui/headerbar.ui:86 +msgid "_Hide unavailable books" +msgstr "अनुपलब्ध पुस्तकें छिपाएं (_H)" -#: data/ui/import_failed.ui:81 -msgid "Some files could not be imported" -msgstr "कुछ फाइलों का आयात विफल" +#: data/ui/headerbar.ui:92 +msgid "_Preferences" +msgstr "प्राथमिकताएं (_P)" -#: data/ui/import_failed.ui:134 -msgid "" -"This can have multiple reasons:\n" -"- The audio format is not supported\n" -"- The path or filename contains non utf-8 characters\n" -"- The file(s) are no valid audio files\n" -"- The file(s) are corrupt" -msgstr "" -"इसके कई कारण संभव हैं :\n" -"- असमर्थित ऑडियो प्रारूप\n" -"- फोल्डर पथ या फाइल नाम में यूटीएफ-8 अक्षर न होना\n" -"- अमान्य ऑडियो फाइल\n" -"- विकृत फाइल" +#: data/ui/headerbar.ui:96 +msgid "_About Cozy" +msgstr "कोजी के बारे में (_A)" -#: data/ui/main_window.ui:68 +#: data/ui/headerbar.ui:102 +msgid "_Quit" +msgstr "बंद करें (_Q)" + +#: data/ui/main_window.ui:26 +msgid "Drop Audio Books Here to Add Them to Your Library" +msgstr "अपनी लाइब्रेरी में जोड़ने के लिए ऑडियो पुस्तकें यहां डालें" + +#: data/ui/main_window.ui:48 +msgid "Library" +msgstr "लाइब्रेरी" + +#: data/ui/main_window.ui:65 msgid "Recent" msgstr "हालिया" -#: data/ui/main_window.ui:90 -msgid "List of authors" -msgstr "लेखक सूची" - -#: data/ui/main_window.ui:106 data/ui/main_window.ui:250 -#: data/ui/search_popover.ui:107 +#: data/ui/main_window.ui:77 data/ui/search_page.ui:46 msgid "Author" msgstr "लेखक" -#: data/ui/main_window.ui:128 -msgid "List of readers" -msgstr "वाचक सूची" +#: data/ui/main_window.ui:89 +msgid "List of authors" +msgstr "लेखक सूची" -#: data/ui/main_window.ui:144 data/ui/search_popover.ui:201 +#: data/ui/main_window.ui:108 data/ui/search_page.ui:59 msgid "Reader" msgstr "वाचक" -#: data/ui/main_window.ui:189 +#: data/ui/main_window.ui:120 +msgid "List of readers" +msgstr "वाचक सूची" + +#: data/ui/main_window.ui:172 msgid "List of books" msgstr "पुस्तक सूची" -#: data/ui/main_window.ui:222 -msgid "" -"Start exploring your library by switching to the Author or Reader view." -msgstr "लेखक या वाचक दृश्य उपयोग कर अपने संग्रह में मौजूद पुस्तकें देखें।" - -#: data/ui/main_window.ui:280 -msgid "Stay tuned while Cozy is preparing your library…" -msgstr "" -"प्रक्रिया जारी रखें तब तक Cozy द्वारा पुस्तक संग्रह तैयार करना जारी है..." - -#: data/ui/main_window.ui:334 -msgid "Import your Audiobooks" -msgstr "आपकी ऑडियो पुस्तकें आयात करें" - -#: data/ui/main_window.ui:353 -msgid "" -"Cozy automatically imports your audiobooks in one directory - your library" -msgstr "" -"Cozy स्वतः ही आपकी ऑडियो पुस्तकों को एक डायरेक्टरी यानि संग्रह में आयात कर " -"देता है" +#: data/ui/main_window.ui:194 +msgid "No Recent Books Yet" +msgstr "कोई हालिया पुस्तकें नहीं" -#: data/ui/main_window.ui:385 -msgid "Drag & Drop" -msgstr "माउस द्वारा ड्रैग" +#: data/ui/main_window.ui:195 +msgid "Explore your library by switching to the Author or Reader view" +msgstr "लेखक या वाचक दृश्य पर जाके अपनी लाइब्रेरी का अन्वेषण करें" -#: data/ui/main_window.ui:387 -msgid "Drag your audiobooks into cozy and they will be automatically imported" -msgstr "" -"माउस द्वारा ऑडियो पुस्तकें Cozy में ड्रैग करें और वे स्वयं ही आयात हो जाएँगी" +#: data/ui/media_controller.ui:48 +msgid "Currently playing" +msgstr "वर्तमान में चालू" -#: data/ui/main_window.ui:414 -msgid "Load audiobooks from a directory, network drive or an external disk" -msgstr "" -"डायरेक्टरी, नेटवर्क ड्राइव या बाह्य ड्राइव से लोकल ऑडियो पुस्तकें लोड करें।" +#: data/ui/media_controller.ui:65 +msgid "Title of currently playing book" +msgstr "वर्तमान में चालू पुस्तक का शीर्षक" -#: data/ui/main_window.ui:417 -msgid "Select" -msgstr "चुनें" +#: data/ui/media_controller.ui:82 +msgid "Title of the currently playing part" +msgstr "वर्तमान खंड का शीर्षक" -#: data/ui/media_controller.ui:64 data/ui/media_controller.ui:482 -#: data/ui/media_controller_big.ui:189 data/ui/media_controller_small.ui:70 +#: data/ui/media_controller.ui:111 msgid "Rewind" -msgstr "पुनः आरंभ" - -#: data/ui/media_controller.ui:71 data/ui/media_controller.ui:489 -#: data/ui/media_controller_big.ui:197 data/ui/media_controller_small.ui:77 -msgid "Rewind button" -msgstr "पुनः आरंभ बटन" +msgstr "पीछे" -#: data/ui/media_controller.ui:72 data/ui/media_controller.ui:490 -#: data/ui/media_controller_big.ui:198 data/ui/media_controller_small.ui:78 +#: data/ui/media_controller.ui:116 msgid "Rewind playback" -msgstr "वाचक पुनः आरंभ करें" +msgstr "वाचन पीछे करें" -#: data/ui/media_controller.ui:89 data/ui/media_controller.ui:507 -#: data/ui/media_controller_big.ui:220 data/ui/media_controller_small.ui:100 +#: data/ui/media_controller.ui:130 msgid "Start playback" -msgstr "वाचक आरंभ करें" +msgstr "वाचन आरंभ करें" -#: data/ui/media_controller.ui:96 data/ui/media_controller.ui:514 -#: data/ui/media_controller_big.ui:228 data/ui/media_controller_small.ui:107 -msgid "Play/Pause Button" -msgstr "आरंभ/रोकने हेतु बटन" - -#: data/ui/media_controller.ui:97 data/ui/media_controller.ui:515 -#: data/ui/media_controller_big.ui:229 data/ui/media_controller_small.ui:108 +#: data/ui/media_controller.ui:135 msgid "Start or pause the playback" -msgstr "वाचक आरंभ करें व रोकें" +msgstr "वाचन आरंभ या रोकें" -#: data/ui/media_controller.ui:113 data/ui/media_controller.ui:531 -#: data/ui/media_controller_big.ui:252 data/ui/media_controller_small.ui:131 +#: data/ui/media_controller.ui:148 msgid "Forward" msgstr "आगे" -#: data/ui/media_controller.ui:120 data/ui/media_controller.ui:538 -#: data/ui/media_controller_big.ui:260 data/ui/media_controller_small.ui:138 -msgid "Forward button" -msgstr "आगे करने हेतु बटन" - -#: data/ui/media_controller.ui:121 data/ui/media_controller.ui:539 -#: data/ui/media_controller_big.ui:261 data/ui/media_controller_small.ui:139 +#: data/ui/media_controller.ui:153 msgid "Forward Playback" -msgstr "वाचक आगे करें" - -#: data/ui/media_controller.ui:175 data/ui/media_controller_big.ui:76 -msgid "Currently playing" -msgstr "वर्तमान में चालू" - -#: data/ui/media_controller.ui:190 data/ui/media_controller_big.ui:97 -msgid "Booktitle" -msgstr "पुस्तक शीर्षक" - -#: data/ui/media_controller.ui:191 data/ui/media_controller_big.ui:98 -msgid "Title of currently playing book" -msgstr "वर्तमान में चालू पुस्तक का शीर्षक" - -#: data/ui/media_controller.ui:217 data/ui/media_controller_big.ui:126 -msgid "Part name" -msgstr "खंड नाम" +msgstr "वाचन आगे करें" -#: data/ui/media_controller.ui:218 data/ui/media_controller_big.ui:127 -msgid "Title of the currently playing part" -msgstr "वर्तमान खंड का शीर्षक" - -#: data/ui/media_controller.ui:256 data/ui/seek_bar.ui:20 -msgid "Elapsed time" -msgstr "प्रयुक्त समय" - -#: data/ui/media_controller.ui:264 data/ui/seek_bar.ui:28 -msgid "Time elapsed" -msgstr "प्रयुक्त समय" - -#: data/ui/media_controller.ui:265 data/ui/seek_bar.ui:29 -msgid "Elapsed time of current part" -msgstr "वर्तमान खंड हेतु प्रयुक्त समय" - -#: data/ui/media_controller.ui:281 data/ui/seek_bar.ui:45 -msgid "Jump to position in current chapter" -msgstr "वर्तमान अध्याय में स्थिति देखें" - -#: data/ui/media_controller.ui:290 data/ui/seek_bar.ui:56 -msgid "Position slider" -msgstr "स्थिति परिवर्तन" - -#: data/ui/media_controller.ui:291 data/ui/seek_bar.ui:57 -msgid "Position of the current part in seconds" -msgstr "वर्तमान खंड स्थिति, सेकंड में" - -#: data/ui/media_controller.ui:310 data/ui/seek_bar.ui:76 -msgid "Remaining time" -msgstr "शेष समय" - -#: data/ui/media_controller.ui:317 data/ui/seek_bar.ui:83 -msgid "Time remaining" -msgstr "शेष समय" - -#: data/ui/media_controller.ui:318 data/ui/seek_bar.ui:84 -msgid "Remaining time of current part" -msgstr "वर्तमान खंड हेतु शेष समय" - -#: data/ui/media_controller.ui:350 data/ui/media_controller_big.ui:324 +#: data/ui/media_controller.ui:179 msgid "Volume control" msgstr "ध्वनि नियंत्रण" -#: data/ui/media_controller.ui:387 data/ui/media_controller.ui:572 -#: data/ui/media_controller_big.ui:367 data/ui/media_controller_small.ui:175 +#: data/ui/media_controller.ui:202 msgid "Playback speed" -msgstr "वाचक गति" +msgstr "वाचन गति" -#: data/ui/media_controller.ui:408 data/ui/media_controller_big.ui:394 -msgid "Sleep timer" +#: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 +msgid "Sleep Timer" msgstr "निद्रा टाइमर" -#: data/ui/media_controller.ui:418 data/ui/media_controller_big.ui:404 -msgid "Timer menu button" -msgstr "टाइमर मेन्यू बटन" - -#: data/ui/media_controller.ui:419 data/ui/media_controller_big.ui:405 +#: data/ui/media_controller.ui:220 msgid "Open the sleep timer popover" msgstr "निद्रा टाइमर साधन खोलें" -#: data/ui/media_controller_big.ui:53 -msgid "Open book" -msgstr "पुस्तक खोलें" - -#: data/ui/preferences.ui:55 +#: data/ui/preferences.ui:27 msgid "General" msgstr "सामान्य" -#: data/ui/preferences.ui:60 +#: data/ui/preferences.ui:30 msgid "Appearance" msgstr "स्वरूप" -#: data/ui/preferences.ui:83 +#: data/ui/preferences.ui:33 +msgid "Dark Mode" +msgstr "गहरा मोड" + +#: data/ui/preferences.ui:40 msgid "Tags" -msgstr "उपनाम" +msgstr "टैग" + +#: data/ui/preferences.ui:43 +msgid "Swap Author and Reader" +msgstr "लेखक और वाचक की अदला-बदली करें" -#: data/ui/preferences.ui:90 +#: data/ui/preferences.ui:44 msgid "Activate if author and reader are displayed the wrong way" -msgstr "लेखक व वाचक के अनुचित नाम प्रदर्शित होने पर इसे सक्रिय करें" +msgstr "लेखक या वाचक के अनुचित नाम प्रदर्शित होने पर इसे सक्रिय करें" -#: data/ui/preferences.ui:107 +#: data/ui/preferences.ui:51 msgid "Playback" msgstr "वाचन" -#: data/ui/preferences.ui:114 +#: data/ui/preferences.ui:54 +msgid "Replay" +msgstr "पुनः चलाएं" + +#: data/ui/preferences.ui:55 msgid "Rewind 30 seconds of the current book when starting Cozy" -msgstr "Cozy आरंभ होने पर वर्तमान पुस्तक को 30 सेकंड पूर्व से पुनः आरंभ करें" +msgstr "कोजी आरंभ करते समय वर्तमान पुस्तक को 30 सेकंड पूर्व से पुनः आरंभ करें" -#: data/ui/preferences.ui:172 -msgid "Sleep Timer" -msgstr "निद्रा टाइमर" +#: data/ui/preferences.ui:60 +msgid "Rewind Duration" +msgstr "पीछे की अवधि" + +#: data/ui/preferences.ui:69 +msgid "Forward Duration" +msgstr "आगे की अवधि" + +#: data/ui/preferences.ui:83 +msgid "Fadeout" +msgstr "अवमंदन" + +#: data/ui/preferences.ui:88 +msgid "Fadeout Duration" +msgstr "अवमंदन अवधि" -#: data/ui/preferences.ui:218 +#: data/ui/preferences.ui:104 msgid "Storage" -msgstr "संचय" +msgstr "स्टोरेज" -#: data/ui/preferences.ui:223 +#: data/ui/preferences.ui:107 msgid "Artwork" -msgstr "पुस्तक कवर" - -#: data/ui/preferences.ui:230 -msgid "Always use images (cover.jpg, *.png, …) when available" -msgstr "उपलब्ध होने पर सदैव चित्र (cover.jpg, *.png, ...) उपयोग करें" +msgstr "कलाकृति" -#: data/ui/preferences.ui:247 -msgid "Storage locations" -msgstr "संचय स्थान" +#: data/ui/preferences.ui:110 +msgid "Prefer External Images Over Embedded Cover" +msgstr "सन्निहित कवर के बजाय बाहरी छवियों को प्राथमिकता दें" -#: data/ui/preferences.ui:309 -msgid "Add location" -msgstr "स्थान जोड़ें" +#: data/ui/preferences.ui:111 +msgid "Always use images (cover.jpg, *.png, …) when available" +msgstr "उपलब्ध होने पर हमेशा छवियों (cover.jpg, *.png, …) का उपयोग करें" -#: data/ui/preferences.ui:335 -msgid "Remove location" -msgstr "स्थान हटाएँ" +#: data/ui/preferences.ui:121 +msgid "Feedback" +msgstr "प्रतिक्रिया" -#: data/ui/preferences.ui:373 -msgid "Toggle this storage location to be internal/external." -msgstr "यह संचय स्थान बाह्य/आंतरिक सेट करें।" +#: data/ui/search_page.ui:9 +msgid "Search in your library" +msgstr "अपनी लाइब्रेरी में खोजें" -#: data/ui/preferences.ui:402 -msgid "Set as default storage location for new audiobooks" -msgstr "नवीन ऑडियो पुस्तकों हेतु डिफ़ॉल्ट संचय स्थान के रूप में सेट करें" +#: data/ui/search_page.ui:15 +msgid "No results found" +msgstr "कोई परिणाम नहीं मिला" -#: data/ui/preferences.ui:406 -msgid "Set as default" -msgstr "डिफ़ॉल्ट के रूप में सेट करें" +#: data/ui/search_page.ui:33 +msgid "Book" +msgstr "पुस्तक" -#: data/ui/preferences.ui:450 -msgid "Feedback" -msgstr "प्रतिक्रिया" +#: data/ui/seek_bar.ui:15 +msgid "Elapsed time" +msgstr "व्यतीत समय" -#: data/ui/preferences.ui:460 -msgid "User Feedback" -msgstr "उपयोक्ता प्रतिक्रिया" +#: data/ui/seek_bar.ui:21 +msgid "Elapsed time of current part" +msgstr "वर्तमान खंड का व्यतीत समय" -#: data/ui/search_popover.ui:24 -msgid "Search" -msgstr "खोज" +#: data/ui/seek_bar.ui:32 +msgid "Jump to position in current chapter" +msgstr "वर्तमान अध्याय में स्थिति देखें" -#: data/ui/search_popover.ui:36 -msgid "Search box" -msgstr "खोज पट्टी" +#: data/ui/seek_bar.ui:39 +msgid "Position of the current part in seconds" +msgstr "वर्तमान खंड स्थिति, सेकंड में" -#: data/ui/search_popover.ui:37 -msgid "Search your audiobook library" -msgstr "अपने ऑडियो पुस्तक संग्रह में खोजें" +#: data/ui/seek_bar.ui:48 +msgid "Remaining time" +msgstr "शेष समय" -#: data/ui/search_popover.ui:67 -msgid "Which book are you looking for?" -msgstr "आप कौन सी पुस्तक खोज रहे हैं?" +#: data/ui/seek_bar.ui:53 +msgid "Remaining time of current part" +msgstr "वर्तमान खंड का शेष समय" -#: data/ui/search_popover.ui:154 -msgid "Book" -msgstr "पुस्तक" +#: data/ui/storage_locations.ui:5 +msgid "Storage locations" +msgstr "स्टोरेज स्थान" -#: data/ui/search_popover.ui:248 -msgid "Part" -msgstr "खंड" +#: data/ui/storage_locations.ui:24 +msgid "Set as default" +msgstr "तयशुदा निर्धारित करें" -#: data/ui/search_popover.ui:295 -msgid "Nothing found :(" -msgstr "कोई परिणाम नहीं :(" +#: data/ui/storage_locations.ui:28 +msgid "Remove" +msgstr "हटाएं" -#: data/ui/timer_popover.ui:37 +#: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "टाइमर अवधि" -#: data/ui/timer_popover.ui:49 -msgid "Timer duration slider" -msgstr "टाइमर अवधि परिवर्तन" - -#: data/ui/timer_popover.ui:50 +#: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" -msgstr "निद्रा टाइमर हेतु अवधि मिनट में सेट करें" +msgstr "निद्रा टाइमर की अवधि मिनटों में निर्धारित करें" -#: data/ui/timer_popover.ui:116 +#: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" -msgstr "वर्तमान अध्याय के उपरांत रोकें" +msgstr "वर्तमान अध्याय के बाद रोकें" -#: data/ui/timer_popover.ui:164 +#: data/ui/timer_popover.ui:107 msgid "Enable system power control" msgstr "सिस्टम ऊर्जा नियंत्रण सक्रिय करें" -#: data/ui/timer_popover.ui:201 +#: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" @@ -744,163 +717,16 @@ msgid "" msgstr "" "टाइमर समापन उपरांत कार्य।\n" "\"बंद करें\" यानी कंप्यूटर बंद करना (अन्य नाम - ऊर्चा बंद करना)\n" -"\"सुप्त करें\" यानी कंप्यूटर सुप्त करना (अन्य नाम - स्थगित करना)।" +"\"निलंबित करें\" यानी कंप्यूटर निलंबित करना (अन्य नाम - स्थगित करना)।" -#: data/ui/timer_popover.ui:205 -msgid "" -"System power action\n" -"to perform" -msgstr "" -"सिस्टम ऊर्जा कार्य\n" -"जो निष्पादित होगा" +#: data/ui/timer_popover.ui:129 +msgid "System power action to perform" +msgstr "निष्पादित करने के लिए सिस्टम पावर कार्रवाई" -#: data/ui/timer_popover.ui:221 +#: data/ui/timer_popover.ui:137 msgid "suspend" -msgstr "सुप्त करें" +msgstr "निलंबित करें" -#: data/ui/timer_popover.ui:237 +#: data/ui/timer_popover.ui:143 msgid "shutdown" msgstr "बंद करें" - -#: data/ui/titlebar_menu.ui:7 -msgid "_Scan Library" -msgstr "संग्रह स्कैन करें (_S)" - -#: data/ui/titlebar_menu.ui:13 -msgid "_Hide unavailable books" -msgstr "अनुपलब्ध पुस्तकें अदृश्य करें (_H)" - -#: data/ui/titlebar_menu.ui:19 -msgid "_Preferences" -msgstr "सेटिंग्स (_P)" - -#: data/ui/titlebar_menu.ui:25 -msgid "_Help" -msgstr "सहायता (_H)" - -#: data/ui/titlebar_menu.ui:29 -msgid "_About" -msgstr "बारे में (_A)" - -#: data/ui/titlebar_menu.ui:33 -msgid "_Quit" -msgstr "बंद करें (_Q)" - -#: data/ui/welcome.ui:29 -msgid "Welcome!" -msgstr "स्वागत है!" - -#: data/ui/welcome.ui:46 -msgid "Add your audiobooks and let's get cozy." -msgstr "अपनी ऑडियो पुस्तकों जोड़ें व Cozy के उपयोग का आनंद लें।" - -#: data/ui/whats_new.ui:9 -msgid "Whats new?" -msgstr "नया क्या है?" - -#: data/ui/whats_new.ui:27 -msgid "Continue" -msgstr "जारी रखें" - -#: data/ui/whats_new_importer.ui:17 data/ui/whats_new_library.ui:17 -#: data/ui/whats_new_m4b.ui:17 data/ui/whats_new_m4b_chapter.ui:17 -msgid "What's new in Cozy" -msgstr "Cozy में नया क्या है?" - -#: data/ui/whats_new_importer.ui:52 -msgid "A completely rewritten and far more reliable media importer." -msgstr "पूर्णतया नवीन रचित व श्रेष्ठतर विश्वसनीय मीडिया आयात साधन।" - -#: data/ui/whats_new_importer.ui:77 -msgid "" -"Did you experience audio files that couldn't be imported? Drag & Drop those " -"files onto Cozy or use the application menu in the titlebar to rescan your " -"audiobook directories!" -msgstr "" -"क्या ऑडियो पुस्तकों का आयात विफल रहा? इच्छित फाइलें माउस द्वारा Cozy में " -"ड्रैग करें या शीर्षक पट्टी की अनुप्रयोग मेन्यू से ऑडियो पुस्तक डायरेक्टरी " -"पुनः स्कैन करें।" - -#: data/ui/whats_new_importer.ui:92 -msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." -msgstr "" -"वर्तमान में समर्थित मीडिया फाइल प्रारूप mp3, m4a, flac, ogg, opus व wav हैं।" - -#: data/ui/whats_new_importer.ui:107 -msgid "More to come in a later update." -msgstr "आगामी अपडेट में और भी सम्मिलित होंगे।" - -#: data/ui/whats_new_library.ui:52 -msgid "An important change in library management" -msgstr "संग्रह प्रबंधन हेतु अहम परिवर्तन" - -#: data/ui/whats_new_library.ui:77 -msgid "" -"Previously every file which was imported in your library but couldn't be " -"found anymore was removed from the library during a scan." -msgstr "" -"पूर्व संस्करणों में स्कैन के उपरांत आपके संग्रह में आयात की गई प्रत्येक " -"अनुपलब्ध फाइल को हटा दिया जाता था।" - -#: data/ui/whats_new_library.ui:92 -msgid "" -"Now audiobooks are not removed from your library automatically anymore. This" -" prevents accidentally loosing the progress of a audiobook when a file can't" -" be found temporarily." -msgstr "" -"अब ऑडियो पुस्तकें आपके संग्रह से स्वतः नहीं हटेंगी। इस सुधार से लाभ यह होगा " -"कि ऑडियो पुस्तक की फाइल अस्थायी रूप से अनुपलब्ध होने की स्थिति में पुस्तक " -"प्रगति प्रभावित नहीं होगी।" - -#: data/ui/whats_new_library.ui:107 -msgid "" -"To remove an audiobook from the library simply right-click on it and choose " -"the remove from library option." -msgstr "" -"संग्रह से ऑडियो पुस्तक हटाने हेतु इच्छित पुस्तक पर दायाँ-क्लिक कर संग्रह से " -"हटाएँ का विकल्प चुनें।" - -#: data/ui/whats_new_m4b.ui:52 -msgid "Basic support for m4b audio books." -msgstr "m4b ऑडियो पुस्तकों हेतु सामान्य समर्थन।" - -#: data/ui/whats_new_m4b.ui:77 -msgid "" -"Many of you have been waiting for it: Support for m4b audio books! This " -"version features basic support for m4b files without chapter support." -msgstr "" -"बहुचर्चित विशेषता : m4b ऑडियो पुस्तक समर्थन! इस संस्करण में m4b फाइलों हेतु " -"अध्याय रहित सामान्य समर्थन सम्मिलित है।" - -#: data/ui/whats_new_m4b.ui:92 -msgid "" -"Drag & Drop your m4b files onto Cozy or use the application menu in the " -"titlebar to rescan your audiobook directories." -msgstr "" -"m4b फाइलें माउस द्वारा Cozy में ड्रैग करें या शीर्षक पट्टी की अनुप्रयोग " -"मेन्यू से ऑडियो पुस्तक डायरेक्टरी पुनः स्कैन करें।" - -#: data/ui/whats_new_m4b.ui:107 -msgid "Chapter support will follow in a later update. Stay tuned!" -msgstr "अध्याय समर्थन भावी अपडेट में सम्मिलित होगा। परियोजना से जुड़े रहें!" - -#: data/ui/whats_new_m4b_chapter.ui:52 -msgid "Chapter support for m4b audio books." -msgstr "m4b ऑडियो पुस्तकों हेतु अध्याय समर्थन।" - -#: data/ui/whats_new_m4b_chapter.ui:77 -msgid "This version of Cozy features chapter support for m4b audio books!" -msgstr "" -"Cozy के इस संस्करण में m4b ऑडियो पुस्तकों हेतु अध्याय समर्थन सम्मिलित है।" - -#: data/ui/whats_new_m4b_chapter.ui:92 -msgid "" -"If you already have m4b files imported you'll need to start a scan of your " -"library from the app menu." -msgstr "" -"यदि आपने पहले से ही m4b फाइलें आयात कर ली हैं, तो अनुप्रयोग मेन्यू से अपने " -"पुस्तक संग्रह का स्कैन आरंभ करें।" - -#: data/ui/whats_new_m4b_chapter.ui:107 -msgid "The chapters will then be detected." -msgstr "इसके उपरांत अध्यायों की पहचान सफल होगी।" From 477c0f6fe744539de423f90db77c64c44bbb1007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sabri=20=C3=9Cnal?= <161761531+yakushabb@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:15:26 +0300 Subject: [PATCH 04/15] UI String Improvements (#914) * ui: Improve remove strings Change the 'Remove from library' strings to 'Permanently delete' to make the action clearer for the user, informing them that the action will delete user files and cannot be recovered. * ui: Make some strings GNOME HIG compatible Use header capitalization for menu entries and titles. More information: https://developer.gnome.org/hig/guidelines/writing-style.html --- cozy/ui/delete_book_view.py | 6 +++--- cozy/ui/file_not_found_dialog.py | 2 +- cozy/ui/widgets/book_element.py | 6 +++--- data/ui/main_window.blp | 2 +- data/ui/preferences.blp | 2 +- data/ui/search_page.blp | 4 ++-- data/ui/storage_locations.blp | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cozy/ui/delete_book_view.py b/cozy/ui/delete_book_view.py index e0ba98c5..151e7091 100644 --- a/cozy/ui/delete_book_view.py +++ b/cozy/ui/delete_book_view.py @@ -10,14 +10,14 @@ class DeleteBookView(Adw.AlertDialog): def __init__(self, callback, book: Book): super().__init__( - heading=_("Delete Audiobook?"), - body=_("The audiobook will be removed from your disk and from Cozy's library."), + heading=_("Permanently Delete Audiobook?"), + body=_("The audiobook will be permanently deleted from your device and cannot be recovered"), default_response="cancel", close_response="cancel", ) self.add_response("cancel", _("Cancel")) - self.add_response("delete", _("Remove Audiobook")) + self.add_response("delete", _("Delete")) self.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE) list_box = Gtk.ListBox(margin_top=12, css_classes=["boxed-list"]) diff --git a/cozy/ui/file_not_found_dialog.py b/cozy/ui/file_not_found_dialog.py index 0f4192fb..f11ec2ee 100644 --- a/cozy/ui/file_not_found_dialog.py +++ b/cozy/ui/file_not_found_dialog.py @@ -15,7 +15,7 @@ def __init__(self, chapter: Chapter): self.missing_chapter = chapter super().__init__( - heading=_("File not found"), + heading=_("File Not Found"), body=_("This file could not be found. Do you want to locate it manually?"), default_response="locate", close_response="cancel", diff --git a/cozy/ui/widgets/book_element.py b/cozy/ui/widgets/book_element.py index b6405197..34285cad 100644 --- a/cozy/ui/widgets/book_element.py +++ b/cozy/ui/widgets/book_element.py @@ -76,13 +76,13 @@ def _create_context_menu(self): menu_model = Gio.Menu() self.install_action("book_element.mark_as_read", None, self._mark_as_read) - menu_model.append(_("Mark as read"), "book_element.mark_as_read") + menu_model.append(_("Mark as Read"), "book_element.mark_as_read") self.install_action("book_element.jump_to_folder", None, self._jump_to_folder) - menu_model.append(_("Open in file browser"), "book_element.jump_to_folder") + menu_model.append(_("Open in File Browser"), "book_element.jump_to_folder") self.install_action("book_element.remove_book", None, self._remove_book) - menu_model.append(_("Remove from library"), "book_element.remove_book") + menu_model.append(_("Permanently Delete…"), "book_element.remove_book") menu = Gtk.PopoverMenu(menu_model=menu_model, has_arrow=False) menu.set_parent(self.art) diff --git a/data/ui/main_window.blp b/data/ui/main_window.blp index 4a96dc38..be97a34c 100644 --- a/data/ui/main_window.blp +++ b/data/ui/main_window.blp @@ -193,7 +193,7 @@ Adw.ApplicationWindow app_window { } Adw.NavigationPage { - title: _("Book title"); + title: _("Book Title"); tag: 'book_overview'; child: Adw.ToolbarView book_details_container {}; diff --git a/data/ui/preferences.blp b/data/ui/preferences.blp index beaa90ca..312dcb74 100644 --- a/data/ui/preferences.blp +++ b/data/ui/preferences.blp @@ -100,7 +100,7 @@ template $PreferencesWindow: Adw.PreferencesDialog { title: _("Feedback"); Adw.PreferencesGroup user_feedback_preference_group { - title: _("User feedback"); + title: _("User Feedback"); } } } diff --git a/data/ui/search_page.blp b/data/ui/search_page.blp index b043e990..7e2e3947 100644 --- a/data/ui/search_page.blp +++ b/data/ui/search_page.blp @@ -4,12 +4,12 @@ using Adw 1; template $SearchView: Adw.Bin { Stack stack { Adw.StatusPage start_searching_page { - title: _("Search in your library"); + title: _("Search in Your Library"); icon-name: 'library-symbolic'; } Adw.StatusPage nothing_found_page { - title: _("No results found"); + title: _("No Results Found"); icon-name: 'edit-find-symbolic'; } diff --git a/data/ui/storage_locations.blp b/data/ui/storage_locations.blp index 2b59a738..ac283426 100644 --- a/data/ui/storage_locations.blp +++ b/data/ui/storage_locations.blp @@ -2,7 +2,7 @@ using Gtk 4.0; using Adw 1; template $StorageLocations: Adw.PreferencesGroup { - title: _("Storage locations"); + title: _("Storage Locations"); ListBox storage_locations_list { margin-bottom: 18; From 5e262b8fd5e04f619223b6dbc884e7a182aa581f Mon Sep 17 00:00:00 2001 From: Manuel Traut Date: Sat, 1 Jun 2024 13:48:06 +0200 Subject: [PATCH 05/15] README: Add reference to Debian package (#923) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 45a4ed57..1365a4c6 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ The preferred source for installing Cozy is Flathub | openSUSE |
cozy | | Fedora |
cozy | | Arch Linux (AUR) | cozy-audiobooks
| +| Debian | cozy
| | VoidLinux | cozy | | Solus | cozy | | MX Linux |
Cozy | From 390e10d6c3f9490fb282b197bc181488a5adaf3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20D=C3=A9v=C3=A9nyi?= Date: Sat, 15 Jun 2024 18:47:38 +0200 Subject: [PATCH 06/15] Fix bugs with artwork detection (#925) --- cozy/control/artwork_cache.py | 172 +++++++++++-------------- cozy/media/importer.py | 34 ++--- cozy/media/media_detector.py | 34 +---- cozy/media/tag_reader.py | 22 ++-- test/cozy/media/test_media_detector.py | 15 --- 5 files changed, 109 insertions(+), 168 deletions(-) delete mode 100644 test/cozy/media/test_media_detector.py diff --git a/cozy/control/artwork_cache.py b/cozy/control/artwork_cache.py index 020862f1..748529ad 100644 --- a/cozy/control/artwork_cache.py +++ b/cozy/control/artwork_cache.py @@ -1,6 +1,8 @@ import logging import os -import uuid +import shutil +from pathlib import Path +from uuid import uuid4 from gi.repository import Gdk, GdkPixbuf @@ -21,6 +23,10 @@ def __init__(self): _app_settings = inject.instance(ApplicationSettings) _app_settings.add_listener(self._on_app_setting_changed) + @property + def artwork_cache_dir(self): + return Path(get_cache_dir()) / "artwork" + def get_cover_paintable(self, book, scale, size=0) -> Gdk.Texture | None: pixbuf = None size *= scale @@ -45,18 +51,12 @@ def delete_artwork_cache(self): """ Deletes the artwork cache completely. """ - cache_dir = os.path.join(get_cache_dir(), "artwork") - - import shutil - if os.path.exists(cache_dir): - shutil.rmtree(cache_dir) - - q = ArtworkCacheModel.delete() - q.execute() + shutil.rmtree(self.artwork_cache_dir, ignore_errors=True) + ArtworkCacheModel.delete().execute() def _on_importer_event(self, event, data): if event == "scan" and data == ScanStatus.STARTED: - self.delete_artwork_cache() + self.delete_artwork_cache() def _create_artwork_cache(self, book, pixbuf, size): """ @@ -68,54 +68,49 @@ def _create_artwork_cache(self, book, pixbuf, size): :return: Resized pixbuf """ query = ArtworkCacheModel.select().where(ArtworkCacheModel.book == book.id) - gen_uuid = "" if query.exists(): - gen_uuid = str(query.first().uuid) + uuid = str(query.first().uuid) else: - gen_uuid = str(uuid.uuid4()) - ArtworkCacheModel.create(book=book.id, uuid=gen_uuid) + uuid = str(uuid4()) + ArtworkCacheModel.create(book=book.id, uuid=uuid) - cache_dir = os.path.join(os.path.join(get_cache_dir(), "artwork"), gen_uuid) - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) + cache_dir = self.artwork_cache_dir / uuid + cache_dir.mkdir(exist_ok=True, parents=True) + file_path = (cache_dir / str(size)).with_suffix(".jpg") resized_pixbuf = self._resize_pixbuf(pixbuf, size) - file_path = os.path.join(cache_dir, str(size) + ".jpg") - if not os.path.exists(file_path): + + if not file_path.exists(): try: - resized_pixbuf.savev(file_path, "jpeg", ["quality", None], ["95"]) + resized_pixbuf.savev(str(file_path), "jpeg", ["quality", None], ["95"]) except Exception as e: reporter.warning("artwork_cache", "Failed to save resized cache albumart") - log.warning("Failed to save resized cache albumart for uuid %r: %s", gen_uuid, e) + log.warning("Failed to save resized cache albumart for uuid %r: %s", uuid, e) return resized_pixbuf - def get_album_art_path(self, book, size): + def get_album_art_path(self, book, size) -> str: query = ArtworkCacheModel.select().where(ArtworkCacheModel.book == book.id) - if query.exists(): - try: - uuid = query.first().uuid - except Exception: - reporter.error("artwork_cache", "load_pixbuf_from_cache: query exists but query.first().uuid crashed.") - return None - else: + if not query.exists(): return None - cache_dir = os.path.join(get_cache_dir(), "artwork") - cache_dir = os.path.join(cache_dir, uuid) - try: - if os.path.exists(cache_dir): - file_path = os.path.join(cache_dir, str(size) + ".jpg") - if os.path.exists(file_path): - return file_path - else: - return None - except Exception as e: - log.warning(e) + uuid = query.first().uuid + except Exception: + reporter.error( + "artwork_cache", + "load_pixbuf_from_cache: query exists but query.first().uuid crashed.", + ) return None + cache_dir = self.artwork_cache_dir / uuid + + if cache_dir.is_dir(): + file_path = (cache_dir / str(size)).with_suffix(".jpg") + if file_path.exists(): + return str(file_path) + return None def _load_pixbuf_from_cache(self, book, size): @@ -139,92 +134,71 @@ def _load_cover_pixbuf(self, book, app_settings: ApplicationSettings): :param size: The size of the bigger side in pixels :return: pixbuf object containing the cover """ - pixbuf = None + loading_order = [self._load_pixbuf_from_db, self._load_pixbuf_from_file] if app_settings.prefer_external_cover: - pixbuf = self._load_pixbuf_from_file(book) - - if pixbuf is None: - pixbuf = self._load_pixbuf_from_db(book) - else: - pixbuf = self._load_pixbuf_from_db(book) + loading_order.reverse() - if pixbuf is None: - pixbuf = self._load_pixbuf_from_file(book) + for loader in loading_order: + pixbuf = loader(book) + if pixbuf: + return pixbuf - return pixbuf + return None def _load_pixbuf_from_db(self, book): - pixbuf = None - - if book and book.cover: - try: - loader = GdkPixbuf.PixbufLoader.new() - loader.write(book.cover) - loader.close() - pixbuf = loader.get_pixbuf() - except Exception as e: - reporter.warning("artwork_cache", "Could not get book cover from db.") - log.warning("Could not get cover for book %r: %s", book.name, e) + if not book or not book.cover: + return None - return pixbuf + try: + loader = GdkPixbuf.PixbufLoader.new() + loader.write(book.cover) + loader.close() + except Exception as e: + reporter.warning("artwork_cache", "Could not get book cover from db.") + log.warning("Could not get cover for book %r: %s", book.name, e) + else: + return loader.get_pixbuf() def _resize_pixbuf(self, pixbuf, size): """ Resizes an pixbuf and keeps the aspect ratio. :return: Resized pixbuf. """ - resized_pixbuf = pixbuf + if size == 0: + return pixbuf - if size > 0: - if pixbuf.get_height() > pixbuf.get_width(): - width = int(pixbuf.get_width() / (pixbuf.get_height() / size)) - resized_pixbuf = pixbuf.scale_simple( - width, size, GdkPixbuf.InterpType.BILINEAR) - else: - height = int(pixbuf.get_height() / (pixbuf.get_width() / size)) - resized_pixbuf = pixbuf.scale_simple( - size, height, GdkPixbuf.InterpType.BILINEAR) - - return resized_pixbuf + if pixbuf.get_height() > pixbuf.get_width(): + width = int(pixbuf.get_width() / (pixbuf.get_height() / size)) + return pixbuf.scale_simple(width, size, GdkPixbuf.InterpType.BILINEAR) + else: + height = int(pixbuf.get_height() / (pixbuf.get_width() / size)) + return pixbuf.scale_simple(size, height, GdkPixbuf.InterpType.BILINEAR) - def _load_pixbuf_from_file(self, book): + def _load_pixbuf_from_file(self, book) -> GdkPixbuf.Pixbuf | None: """ Try to load the artwork from a book from image files. :param book: The book to load the artwork from. :return: Artwork as pixbuf object. """ - pixbuf = None - cover_files = [] - try: - directory = os.path.dirname(os.path.normpath(book.chapters[0].file)) + directory = Path(book.chapters[0].file).absolute().parent + cover_extensions = {".jpg", ".jpeg", ".png", ".gif"} + + for path in directory.glob("cover.*"): + if path.suffix.lower() not in cover_extensions: + continue - cover_files = [f for f in os.listdir(directory) - if f.lower().endswith('.png') or f.lower().endswith(".jpg") or f.lower().endswith(".gif")] - except Exception as e: - log.warning("Could not open audiobook directory and look for cover files: %s", e) - for elem in (x for x in cover_files if os.path.splitext(x.lower())[0] == "cover"): - # find cover.[jpg,png,gif] try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(os.path.join(directory, elem)) + pixbuf = GdkPixbuf.Pixbuf.new_from_file(str(path)) except Exception as e: log.debug(e) + if pixbuf: - break - if pixbuf is None: - # find other cover file (sort alphabet) - cover_files.sort(key=str.lower) - for elem in cover_files: - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(os.path.join(directory, elem)) - except Exception as e: - log.debug(e) - if pixbuf: - break - return pixbuf + return pixbuf + + return None def _on_app_setting_changed(self, event: str, data): if event == "prefer-external-cover": self.delete_artwork_cache() - diff --git a/cozy/media/importer.py b/cozy/media/importer.py index d6e044af..aa20d6cc 100644 --- a/cozy/media/importer.py +++ b/cozy/media/importer.py @@ -4,6 +4,7 @@ import time from enum import Enum, auto from multiprocessing.pool import Pool as Pool +from pathlib import Path from urllib.parse import unquote, urlparse from cozy.architecture.event_sender import EventSender @@ -22,6 +23,8 @@ CHUNK_SIZE = 100 +AUDIO_EXTENSIONS = {".mp3", ".ogg", ".flac", ".m4a", ".m4b", ".mp4", ".wav", ".opus"} + class ScanStatus(Enum): STARTED = auto() @@ -109,13 +112,15 @@ def _execute_import(self, files_to_scan: list[str]) -> tuple[set[str], set[str]] self._progress += CHUNK_SIZE - if len(media_files) != 0: + if media_files: try: self._database_importer.insert_many(media_files) except Exception as e: log.exception("Error while inserting new tracks to the database") reporter.exception("importer", e) - self._toast.show("{}: {}".format(_("Error while importing new files"), str(e.__class__))) + self._toast.show( + "{}: {}".format(_("Error while importing new files"), str(e.__class__)) + ) if self._progress >= self._files_count: break @@ -150,10 +155,9 @@ def _get_files_to_scan(self) -> list[str]: def _get_configured_storage_paths(self) -> list[str]: """From all storage path configured by the user, we only want to scan those paths that are currently online and exist.""" - paths = [storage.path - for storage - in self._settings.storage_locations - if not storage.external] + paths = [ + storage.path for storage in self._settings.storage_locations if not storage.external + ] for storage in self._settings.external_storage_locations: try: @@ -164,13 +168,12 @@ def _get_configured_storage_paths(self) -> list[str]: return [path for path in paths if os.path.exists(path)] - def _walk_paths_to_scan(self, paths: list[str]) -> list[str]: + def _walk_paths_to_scan(self, directories: list[str]) -> list[str]: """Get all files recursive inside a directory. Returns absolute paths.""" - for path in paths: - for directory, _, files in os.walk(path): - for file in files: - filepath = os.path.join(directory, file) - yield filepath + for dir in directories: + for path in Path(dir).rglob("**/*"): + if path.suffix.lower() in AUDIO_EXTENSIONS: + yield str(path) def _filter_unchanged_files(self, files: list[str]) -> list[str]: """Filter all files that are already imported and that have not changed from a list of paths.""" @@ -179,10 +182,9 @@ def _filter_unchanged_files(self, files: list[str]) -> list[str]: for file in files: if file in imported_files: try: - chapter = next(chapter - for chapter - in self._library.chapters - if chapter.file == file) + chapter = next( + chapter for chapter in self._library.chapters if chapter.file == file + ) except StopIteration as e: log.warning("_filter_unchanged_files raised a stop iteration.") log.debug(e) diff --git a/cozy/media/media_detector.py b/cozy/media/media_detector.py index 63a894cb..e659ee29 100644 --- a/cozy/media/media_detector.py +++ b/cozy/media/media_detector.py @@ -21,44 +21,22 @@ class AudioFileCouldNotBeDiscovered(Exception): class MediaDetector(EventSender): def __init__(self, path: str): super().__init__() - self.uri = pathlib.Path(path).as_uri() + self.uri = pathlib.Path(path).absolute().as_uri() Gst.init(None) self.discoverer: GstPbutils.Discoverer = GstPbutils.Discoverer() def get_media_data(self) -> MediaFile: - if not self._has_audio_file_ending(): - raise NotAnAudioFile - try: - discoverer_info: GstPbutils.DiscovererInfo = self.discoverer.discover_uri(self.uri) + discoverer_info = self.discoverer.discover_uri(self.uri) except Exception: log.info("Skipping file because it couldn't be detected: %s", self.uri) raise AudioFileCouldNotBeDiscovered(self.uri) from None - is_valid_audio_file = self._is_valid_audio_file(discoverer_info) - if is_valid_audio_file: - tag_reader = TagReader(self.uri, discoverer_info) - tags = tag_reader.get_tags() - return tags + if self._is_valid_audio_file(discoverer_info): + return TagReader(self.uri, discoverer_info).get_tags() else: raise AudioFileCouldNotBeDiscovered(self.uri) - def _is_valid_audio_file(self, discoverer_info: GstPbutils.DiscovererInfo): - audio_streams = discoverer_info.get_audio_streams() - video_streams = discoverer_info.get_video_streams() - - if len(audio_streams) < 1: - log.info("File contains no audio stream.") - return False - elif len(audio_streams) > 1: - log.info("File contains more than one audio stream.") - return False - elif len(video_streams) > 0: - log.info("File contains a video stream.") - return False - - return True - - def _has_audio_file_ending(self) -> bool: - return self.uri.lower().endswith(('.mp3', '.ogg', '.flac', '.m4a', '.m4b', '.mp4', '.wav', '.opus')) + def _is_valid_audio_file(self, info: GstPbutils.DiscovererInfo): + return len(info.get_audio_streams()) == 1 and not info.get_video_streams() diff --git a/cozy/media/tag_reader.py b/cozy/media/tag_reader.py index 5b1b8c0a..4263eba8 100644 --- a/cozy/media/tag_reader.py +++ b/cozy/media/tag_reader.py @@ -8,7 +8,7 @@ from cozy.media.chapter import Chapter from cozy.media.media_file import MediaFile -NS_TO_SEC = 10 ** 9 +NS_TO_SEC = 10**9 class TagReader: @@ -20,7 +20,7 @@ def __init__(self, uri: str, discoverer_info: GstPbutils.DiscovererInfo): raise ValueError("discoverer_info must not be None") self.uri: str = uri - self.discoverer_info: GstPbutils.DiscovererInfo = discoverer_info + self.discoverer_info = discoverer_info self.tags: Gst.TagList = discoverer_info.get_tags() @@ -36,7 +36,7 @@ def get_tags(self) -> MediaFile: disk=self._get_disk(), chapters=self._get_chapters(), cover=self._get_cover(), - modified=self._get_modified() + modified=self._get_modified(), ) return media_file @@ -100,7 +100,7 @@ def _get_single_chapter(self): name=self._get_track_name(), position=0, length=self._get_length_in_seconds(), - number=self._get_track_number() + number=self._get_track_number(), ) return [chapter] @@ -151,12 +151,14 @@ def _get_m4b_chapters(self, mutagen_tags: MP4) -> list[Chapter]: title = chapter.title or "" - chapters.append(Chapter( - name=title, - position=int(chapter.start * NS_TO_SEC), - length=length, - number=index + 1 - )) + chapters.append( + Chapter( + name=title, + position=int(chapter.start * NS_TO_SEC), + length=length, + number=index + 1, + ) + ) return chapters diff --git a/test/cozy/media/test_media_detector.py b/test/cozy/media/test_media_detector.py deleted file mode 100644 index a7159cfa..00000000 --- a/test/cozy/media/test_media_detector.py +++ /dev/null @@ -1,15 +0,0 @@ -def test_get_media_data_should_work_with_valid_audio_files(mocker): - from cozy.media.media_detector import MediaDetector - - mocker.patch("gi.repository.GstPbutils.Discoverer") - mocker.patch("gi.repository.Gst.init") - - file_extensions = ['.mp3', '.ogg', '.flac', '.m4a', '.m4b', '.mp4', '.wav', '.opus'] - - for extension in file_extensions: - md = MediaDetector("/test.{}".format(extension)) - assert md._has_audio_file_ending() - - for extension in file_extensions: - md = MediaDetector("/test.{}".format(extension.upper())) - assert md._has_audio_file_ending() From 77333a3c255d8a2134b3d15ea3cee2e34815a22a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20D=C3=A9v=C3=A9nyi?= Date: Sat, 15 Jun 2024 18:47:48 +0200 Subject: [PATCH 07/15] Not all books from a storage location were removed (#926) --- cozy/view_model/storages_view_model.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cozy/view_model/storages_view_model.py b/cozy/view_model/storages_view_model.py index c238e40b..ac735bbb 100644 --- a/cozy/view_model/storages_view_model.py +++ b/cozy/view_model/storages_view_model.py @@ -95,17 +95,17 @@ def remove(self, model: Storage) -> None: if model.default: return - model.delete() - self._model.invalidate() + storage_path = model.path + chapters_to_remove = [] - storage_path = str(model.path) for book in self._library.books: - chapters_to_remove = [ - c for c in book.chapters if c.file.startswith(storage_path) - ] + chapters_to_remove.extend([c for c in book.chapters if c.file.startswith(storage_path)]) + + for chapter in set(chapters_to_remove): + chapter.delete() - for chapter in chapters_to_remove: - chapter.delete() + model.delete() + self._model.invalidate() self.emit_event("storage-removed", model) self._notify("storage_locations") From 0b669017bff8ab71aacb3bed53766c012df2b969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20D=C3=A9v=C3=A9nyi?= Date: Thu, 4 Jul 2024 22:13:53 +0200 Subject: [PATCH 08/15] Update ruff CI (#929) The original GH Action isn't compatible with Ruff 0.5 0, and unfortunately it can't be updated due to some legal bullshit. --- .github/workflows/checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 0a3e1a00..3d18143b 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: chartboost/ruff-action@v1 + - uses: nkarasiak/ruff-action@v2 with: args: --output-format github From ad9cda8853a26b025d0f4ba3f51afd343c435f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20D=C3=A9v=C3=A9nyi?= Date: Fri, 5 Jul 2024 23:00:24 +0200 Subject: [PATCH 09/15] Revert to chartboost/ruff-action (#931) Looks like it works actually, we just forgot to add "check" to the overwritten args parameter --- .github/workflows/checks.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 3d18143b..39f54d91 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -1,16 +1,12 @@ name: Checks -on: - push: - branches: - - "main" - pull_request: +on: [push, pull_request] jobs: ruff: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: nkarasiak/ruff-action@v2 + - uses: chartboost/ruff-action@v1 with: - args: --output-format github + args: 'check --output-format github' From 4da1a5a6e993a31d2a76fb8f807f7bdaafb2a82a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20D=C3=A9v=C3=A9nyi?= Date: Sat, 6 Jul 2024 19:35:52 +0200 Subject: [PATCH 10/15] Update Github Actions (#934) Now the Flatpak and the Ruff CI actions only run when pushing to master, and on pull requests. Also updated Flatpak CI image to GNOME 46. --- .github/workflows/checks.yml | 6 +++++- .github/workflows/flatpak.yml | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 39f54d91..8c8b685f 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -1,6 +1,10 @@ name: Checks -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: jobs: ruff: diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml index 673d5036..8cfe211b 100644 --- a/.github/workflows/flatpak.yml +++ b/.github/workflows/flatpak.yml @@ -1,12 +1,16 @@ name: Flatpak -on: [push, pull_request] +on: + push: + branches: + - master + pull_request: jobs: flatpak: runs-on: ubuntu-latest container: - image: bilelmoussaoui/flatpak-github-actions:gnome-45 + image: bilelmoussaoui/flatpak-github-actions:gnome-46 options: --privileged strategy: From e7f3b929e31cc1f2302f9de783a5716ae1a26d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedek=20D=C3=A9v=C3=A9nyi?= Date: Sat, 6 Jul 2024 19:37:26 +0200 Subject: [PATCH 11/15] Delay saving settings until closing the app (#933) This radically improves the performance of resizing the window, as it no longer has to save the three updated values on every resize signal. The volume slider is also smoother now. --- cozy/application_settings.py | 1 + cozy/ui/main_view.py | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cozy/application_settings.py b/cozy/application_settings.py index fa59a654..a723ba65 100644 --- a/cozy/application_settings.py +++ b/cozy/application_settings.py @@ -9,6 +9,7 @@ class ApplicationSettings(EventSender): def __init__(self): super().__init__() + self._settings.delay() self._connect() def _connect(self): diff --git a/cozy/ui/main_view.py b/cozy/ui/main_view.py index 1710a201..e2b14a1f 100644 --- a/cozy/ui/main_view.py +++ b/cozy/ui/main_view.py @@ -31,6 +31,7 @@ class CozyUI(EventSender, metaclass=Singleton): application_settings = inject.attr(ApplicationSettings) _importer: Importer = inject.attr(Importer) _settings: SettingsModel = inject.attr(SettingsModel) + _gio_settings: Gio.Settings = inject.attr(Gio.Settings) _files: Files = inject.attr(Files) _player: Player = inject.attr(Player) _storages_view_model: StoragesViewModel = inject.attr(StoragesViewModel) @@ -67,8 +68,6 @@ def __init_window(self): self.window.set_application(self.app) self.window.connect("close-request", self.on_close) - self.window.connect("notify::default-width", self._on_window_size_allocate) - self.window.connect("notify::default-height", self._on_window_size_allocate) self._drop_target = Gtk.DropTarget() self._drop_target.set_gtypes([Gdk.FileList]) @@ -228,12 +227,16 @@ def on_close(self, widget, data=None): log.info("Closing.") self.fs_monitor.close() + self._save_window_size() + self._player.destroy() close_db() report.close() + log.info("Saving settings.") + self._gio_settings.apply() log.info("Closing app.") self.app.quit() log.info("App closed.") @@ -254,7 +257,7 @@ def _restore_window_size(self): else: self.window.unmaximize() - def _on_window_size_allocate(self, *_): + def _save_window_size(self, *_): width, height = self.window.get_default_size() self.application_settings.window_width = width self.application_settings.window_height = height From 3b247d6a997be790d12aedb88e7eee881b7e781a Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:09:24 +0000 Subject: [PATCH 12/15] Translate po/extra/extra.pot in uk 100% translated source file: 'po/extra/extra.pot' on 'uk'. --- po/extra/uk.po | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 po/extra/uk.po diff --git a/po/extra/uk.po b/po/extra/uk.po new file mode 100644 index 00000000..245577fc --- /dev/null +++ b/po/extra/uk.po @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the extra package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Julian Geywitz , 2021 +# Simon Bezruchenko, 2024 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: extra\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-02-16 15:04+0100\n" +"PO-Revision-Date: 2019-09-08 09:39+0000\n" +"Last-Translator: Simon Bezruchenko, 2024\n" +"Language-Team: Ukrainian (https://app.transifex.com/geigi/teams/78138/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#: data/com.github.geigi.cozy.desktop:3 +msgid "Cozy" +msgstr "Cozy" + +#: data/com.github.geigi.cozy.desktop:4 +msgid "Audio Book Player" +msgstr "Програвач аудіокниг" + +#: data/com.github.geigi.cozy.desktop:5 +msgid "Play and organize your audio book collection" +msgstr "Слухайте та впорядковуйте свою колекцію аудіокниг" + +#: data/com.github.geigi.cozy.appdata.xml:15 +msgid "Listen to audio books" +msgstr "Слухати аудіокниги" + +#: data/com.github.geigi.cozy.appdata.xml:17 +msgid "Do you like audio books? Then lets get cozy!" +msgstr "Вам подобаються аудіокниги? Тоді давайте будемо затишні!" + +#: data/com.github.geigi.cozy.appdata.xml:18 +msgid "Cozy is a audio book player. Here are some of the features:" +msgstr "Cozy - це програвач аудіокниг. Ось деякі з його функцій:" + +#: data/com.github.geigi.cozy.appdata.xml:20 +msgid "Import all your audio books into Cozy to browse them comfortably" +msgstr "Імпортуйте всі свої аудіокниги до Cozy, щоб зручно переглядати їх" + +#: data/com.github.geigi.cozy.appdata.xml:21 +msgid "" +"Listen to your DRM free mp3, m4b, m4a (aac, ALAC, …), flac, ogg and wav " +"audio books" +msgstr "" +"Слухайте ваші аудіокниги без DRM в форматах mp3, m4b, m4a (aac, ALAC, ...), " +"flac, ogg та wav\"" + +#: data/com.github.geigi.cozy.appdata.xml:22 +msgid "Remembers your playback position" +msgstr "Запам'ятовує вашу позицію відтворення" + +#: data/com.github.geigi.cozy.appdata.xml:23 +msgid "Sleep timer" +msgstr "Таймер сну" + +#: data/com.github.geigi.cozy.appdata.xml:24 +msgid "Playback speed control for each book individually" +msgstr "Керування швидкістю відтворення для кожної книги окремо" + +#: data/com.github.geigi.cozy.appdata.xml:25 +msgid "Search your library" +msgstr "Пошук у вашій аудіобібліотеці" + +#: data/com.github.geigi.cozy.appdata.xml:26 +msgid "Multiple storage location support" +msgstr "Підтримка декількох місць зберігання" + +#: data/com.github.geigi.cozy.appdata.xml:27 +msgid "" +"Offline Mode! This allows you to keep an audio book on your internal storage" +" if you store your audio books on an external or network drive. Perfect to " +"listen to on the go!" +msgstr "" +"Офлайн режим! Це дозволяє вам зберігати аудіокнигу на вашому внутрішньому " +"сховищі, якщо ви зберігаєте свої аудіокниги на зовнішньому або мережевому " +"накопичувачі. Ідеально для прослуховування в дорозі!" + +#: data/com.github.geigi.cozy.appdata.xml:28 +msgid "Drag and Drop to import new audio books" +msgstr "Перетягуйте та відпускайте для імпорту нових аудіокниг" + +#: data/com.github.geigi.cozy.appdata.xml:29 +msgid "Sort your audio books by author, reader and name" +msgstr "Сортуйте ваші аудіокниги за автором, читачем та назвою" From f14a28c6900790072ed9a93d843241431ea60e74 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:24:22 +0000 Subject: [PATCH 13/15] Translate po/com.github.geigi.cozy.pot in uk 100% translated source file: 'po/com.github.geigi.cozy.pot' on 'uk'. --- po/uk.po | 1149 ++++++++++++++++++++++-------------------------------- 1 file changed, 476 insertions(+), 673 deletions(-) diff --git a/po/uk.po b/po/uk.po index ca585a2a..03e0a864 100644 --- a/po/uk.po +++ b/po/uk.po @@ -4,61 +4,74 @@ # FIRST AUTHOR , YEAR. # # Translators: -# Julian Geywitz , 2021 +# Julian Geywitz , 2024 +# Simon Bezruchenko, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.geigi.cozy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-25 13:55+0200\n" +"POT-Creation-Date: 2024-02-17 20:33+0100\n" "PO-Revision-Date: 2019-09-08 09:31+0000\n" -"Last-Translator: Julian Geywitz , 2021\n" -"Language-Team: Ukrainian (https://www.transifex.com/geigi/teams/78138/uk/)\n" +"Last-Translator: Simon Bezruchenko, 2024\n" +"Language-Team: Ukrainian (https://app.transifex.com/geigi/teams/78138/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" -#: cozy/control/offline_cache.py:201 +#: cozy/application.py:59 +msgid "Audiobooks" +msgstr "Аудіокниги" + +#: cozy/control/offline_cache.py:197 msgid "Copying" msgstr "Копіювання" -#: cozy/ui/widgets/sleep_timer.py:60 data/ui/timer_popover.ui:66 -msgid "min" -msgstr "хв." +#: cozy/media/files.py:67 +msgid "Cannot copy: Audiobook directory is read only" +msgstr "Неможливо скопіювати: Каталог аудіокниги доступний тільки для читання" -#: cozy/ui/widgets/sleep_timer.py:65 -msgid "Off" -msgstr "Вимк." +#: cozy/media/files.py:69 +msgid "Cannot copy: Disk is full" +msgstr "Неможливо скопіювати: Диск заповнений" + +#: cozy/media/files.py:71 cozy/media/files.py:87 +msgid "Cannot copy: Permission denied" +msgstr "Неможливо скопіювати: Доступ заборонено" + +#: cozy/media/importer.py:121 +msgid "Error while importing new files" +msgstr "Помилка при імпорті нових файлів" #: cozy/tools.py:92 cozy/tools.py:96 #, python-brace-format msgid "{hours} hour" msgid_plural "{hours} hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "{hours} година" +msgstr[1] "{hours} години" +msgstr[2] "{hours} години" +msgstr[3] "{hours} години" #: cozy/tools.py:94 cozy/tools.py:98 #, python-brace-format msgid "{minutes} minute" msgid_plural "{minutes} minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "{minutes} хвилина" +msgstr[1] "{minutes} хвилини" +msgstr[2] "{minutes} хвилини" +msgstr[3] "{minutes} хвилини" #: cozy/tools.py:100 #, python-brace-format msgid "{seconds} second" msgid_plural "{seconds} seconds" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "{seconds} секунда" +msgstr[1] "{seconds} секунди" +msgstr[2] "{seconds} секунди" +msgstr[3] "{seconds} секунди" #: cozy/tools.py:102 msgid "finished" @@ -79,862 +92,652 @@ msgstr "вчора" #: cozy/tools.py:132 #, python-format msgid "%s days ago" -msgstr "" +msgstr "%s днів тому" #: cozy/tools.py:134 #, python-brace-format msgid "{weeks} week ago" msgid_plural "{weeks} weeks ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "{weeks} тиждень тому" +msgstr[1] "{weeks} тижні тому" +msgstr[2] "{weeks} тижні тому" +msgstr[3] "{weeks} тижні тому" #: cozy/tools.py:136 #, python-brace-format msgid "{months} month ago" msgid_plural "{months} months ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "{months} місяць тому" +msgstr[1] "{months} місяці тому" +msgstr[2] "{months} місяці тому" +msgstr[3] "{months} місяці тому" #: cozy/tools.py:138 #, python-brace-format msgid "{years} year ago" msgid_plural "{years} years ago" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "{years} рік тому" +msgstr[1] "{years} роки тому" +msgstr[2] "{years} роки тому" +msgstr[3] "{years} роки тому" -#: cozy/application.py:101 -msgid "Audiobooks" -msgstr "" - -#: cozy/ui/album_element.py:65 cozy/ui/widgets/search_results.py:100 -msgid "Play this book" -msgstr "Слухати цю аудіокнигу" - -#: cozy/ui/book_detail_view.py:302 +#: cozy/ui/book_detail_view.py:299 msgid "Downloaded" msgstr "Завантажено" -#: cozy/ui/book_detail_view.py:305 data/ui/book_detail.ui:156 +#: cozy/ui/book_detail_view.py:302 data/ui/book_detail.ui:116 msgid "Download" msgstr "Завантажити" -#: cozy/ui/book_element.py:33 -msgid "Open book overview" -msgstr "Відкрити огляд книги" +#: cozy/ui/db_migration_failed_view.py:6 +msgid "" +"During an update of the database an error occurred and Cozy will not be able" +" to startup. A backup of the database was created before the update and has " +"been restored now. Until this issue is resolved please use version 0.9.5 of " +"Cozy. You can help resolve this problem by reporting an issue on GitHub." +msgstr "" +"\"Під час оновлення бази даних сталася помилка і Cozy не зможе запуститися.\\n\"\n" +"\"Перед оновленням було створено резервну копію бази даних, яку було відновлено.\\n\"\n" +"\"До вирішення цієї проблеми, будь ласка, використовуйте версію 0.9.5 Cozy.\\n\"\n" +"\"Ви можете допомогти вирішити цю проблему, повідомивши про неї на GitHub.\"" -#: cozy/ui/book_element.py:113 -msgid "Mark as read" -msgstr "Відзначити як прочитане" +#: cozy/ui/db_migration_failed_view.py:15 +msgid "Failed to Update Database" +msgstr "Не вдалося оновити базу даних" -#: cozy/ui/book_element.py:116 -msgid "Open in file browser" -msgstr "Відкрити у файловому браузері" +#: cozy/ui/db_migration_failed_view.py:22 +msgid "Close Cozy" +msgstr "Закрити Cozy" -#: cozy/ui/book_element.py:119 -msgid "Remove from library" -msgstr "Видалити з бібліотеки" +#: cozy/ui/db_migration_failed_view.py:23 +msgid "Receive help on GitHub" +msgstr "Отримати допомогу на GitHub" + +#: cozy/ui/delete_book_view.py:13 +msgid "Delete Audiobook?" +msgstr "Видалити аудіокнигу?" + +#: cozy/ui/delete_book_view.py:14 +msgid "The audiobook will be removed from your disk and from Cozy's library." +msgstr "Аудіокнигу буде видалено з вашого диску та з бібліотеки Cozy." + +#: cozy/ui/delete_book_view.py:21 cozy/ui/file_not_found_dialog.py:26 +msgid "Cancel" +msgstr "Відміна" -#: cozy/ui/disk_element.py:26 +#: cozy/ui/delete_book_view.py:22 +msgid "Remove Audiobook" +msgstr "Вилучити аудіокнигу" + +#: cozy/ui/disk_element.py:22 msgid "Disc" -msgstr "" +msgstr "Диск" -#: cozy/ui/file_not_found_dialog.py:56 -msgid "All files" -msgstr "Всі файли" +#: cozy/ui/file_not_found_dialog.py:18 +msgid "File not found" +msgstr "Файл не знайдено" -#: cozy/ui/settings.py:103 -msgid "Feedback" -msgstr "" +#: cozy/ui/file_not_found_dialog.py:19 +msgid "This file could not be found. Do you want to locate it manually?" +msgstr "Файл не знайдено. Ви хочете знайти його самостійно?" -#: cozy/ui/chapter_element.py:23 -msgid "Play this part" -msgstr "Слухати цю частину" +#: cozy/ui/file_not_found_dialog.py:27 +msgid "Locate" +msgstr "Знайти" -#: cozy/ui/warnings.py:27 cozy/ui/warnings.py:42 +#: cozy/ui/file_not_found_dialog.py:38 +msgid "Locate Missing File" +msgstr "Знайти відсутній файл" + +#: cozy/ui/file_not_found_dialog.py:41 #, python-brace-format -msgid "{storage} is offline." -msgstr "" +msgid "{ext} files" +msgstr "{ext} файли" -#: cozy/ui/widgets/error_reporting.py:12 +#: cozy/ui/file_not_found_dialog.py:44 +msgid "Audio files" +msgstr "Аудіофайли" + +#: cozy/ui/import_failed_dialog.py:8 +msgid "This can have multiple reasons:" +msgstr "Це може бути з кількох причин:" + +#: cozy/ui/import_failed_dialog.py:11 +msgid "The audio format is not supported" +msgstr "Аудіо формат не підтримується" + +#: cozy/ui/import_failed_dialog.py:12 +msgid "The path or filename contains non utf-8 characters" +msgstr "Шлях або ім'я файлу містять символи, які не є utf-8" + +#: cozy/ui/import_failed_dialog.py:13 +msgid "The file(s) are no valid audio files" +msgstr "Файл(и) не є дійсними аудіофайлами" + +#: cozy/ui/import_failed_dialog.py:14 +msgid "The file(s) are corrupt" +msgstr "Файл(и) пошкоджені" + +#: cozy/ui/import_failed_dialog.py:28 +msgid "Some files could not be imported" +msgstr "Деякі файли не можуть бути імпортовані" + +#: cozy/ui/import_failed_dialog.py:35 +msgid "Ok" +msgstr "Так" + +#: cozy/ui/main_view.py:198 +msgid "Patreon Supporters" +msgstr "Підтримали Patreon" + +#: cozy/ui/main_view.py:202 +msgid "m4b chapter support in mutagen" +msgstr "підтримка розділів m4b у mutagen" + +#: cozy/ui/main_view.py:206 +msgid "Open Source Projects" +msgstr "Проєкти з відкритим кодом" + +#. Translators: Replace "translator-credits" with your names, one name per +#. line +#: cozy/ui/main_view.py:211 +msgid "translator-credits" +msgstr "автори перекладу" + +#: cozy/ui/widgets/book_element.py:70 +msgid "Mark as read" +msgstr "Відзначити як прочитане" + +#: cozy/ui/widgets/book_element.py:73 +msgid "Open in file browser" +msgstr "Відкрити у файловому браузері" + +#: cozy/ui/widgets/book_element.py:76 +msgid "Remove from library" +msgstr "Видалити з бібліотеки" + +#: cozy/ui/widgets/book_row.py:25 +msgid "Play this book" +msgstr "Слухати цю аудіокнигу" + +#: cozy/ui/widgets/error_reporting.py:11 msgid "Disabled" -msgstr "" +msgstr "Вимкнено" -#: cozy/ui/widgets/error_reporting.py:13 +#: cozy/ui/widgets/error_reporting.py:12 msgid "Basic error reporting" -msgstr "" +msgstr "Основне повідомлення про помилки" -#: cozy/ui/widgets/error_reporting.py:14 +#: cozy/ui/widgets/error_reporting.py:13 msgid "Detailed error reporting" -msgstr "" +msgstr "Детальне повідомлення про помилки" -#: cozy/ui/widgets/error_reporting.py:15 data/ui/error_reporting.ui:173 +#: cozy/ui/widgets/error_reporting.py:14 data/ui/error_reporting.ui:162 msgid "Detailed error reporting with import errors" -msgstr "" +msgstr "Детальне повідомлення про помилки з помилками імпорту" -#: cozy/ui/widgets/error_reporting.py:19 +#: cozy/ui/widgets/error_reporting.py:18 msgid "No error or crash reporting." -msgstr "" +msgstr "Немає повідомлень про помилки або аварій." -#: cozy/ui/widgets/error_reporting.py:20 data/ui/error_reporting.ui:192 +#: cozy/ui/widgets/error_reporting.py:19 data/ui/error_reporting.ui:174 msgid "The following information will be sent in case of an error or crash:" -msgstr "" +msgstr "У разі помилки або аварії буде надіслано наступну інформацію:" -#: cozy/ui/widgets/error_reporting.py:25 +#: cozy/ui/widgets/error_reporting.py:24 msgid "Which type of error occurred" -msgstr "" +msgstr "Який тип помилки стався" -#: cozy/ui/widgets/error_reporting.py:26 +#: cozy/ui/widgets/error_reporting.py:25 msgid "Line of code where an error occurred" -msgstr "" +msgstr "Рядок коду, де сталася помилка" -#: cozy/ui/widgets/error_reporting.py:27 +#: cozy/ui/widgets/error_reporting.py:26 msgid "Cozy's version" -msgstr "" +msgstr "Версія Cozy" -#: cozy/ui/widgets/error_reporting.py:28 +#: cozy/ui/widgets/error_reporting.py:27 msgid "Linux distribution" -msgstr "" +msgstr "Дистрибутив Linux" -#: cozy/ui/widgets/error_reporting.py:29 +#: cozy/ui/widgets/error_reporting.py:28 msgid "Desktop environment" -msgstr "" +msgstr "Середовище робочого столу" -#: cozy/ui/widgets/error_reporting.py:30 +#: cozy/ui/widgets/error_reporting.py:29 msgid "Media type of files that Cozy couldn't import" -msgstr "" +msgstr "Тип медіафайлів, які Cozy не зміг імпортувати" -#: cozy/ui/widgets/filter_list_box.py:20 -#: cozy/view_model/library_view_model.py:44 -#: cozy/view_model/library_view_model.py:140 +#: cozy/ui/widgets/filter_list_box.py:18 +#: cozy/view_model/library_view_model.py:45 +#: cozy/view_model/library_view_model.py:135 msgid "All" msgstr "Всі" -#: cozy/ui/widgets/filter_list_box.py:21 +#: cozy/ui/widgets/filter_list_box.py:19 msgid "Display all books" msgstr "Відобразити всі книжки" -#: cozy/ui/widgets/search_results.py:73 -msgid "Jump to author " -msgstr "Перейти до автора " +#: cozy/ui/widgets/search_results.py:13 +#, python-brace-format +msgid "Jump to {artist_name}" +msgstr "Перейти до {artist_name}" -#: cozy/ui/widgets/search_results.py:76 -msgid "Jump to reader " -msgstr "Перейти до диктора " +#: cozy/ui/widgets/sleep_timer.py:57 data/ui/timer_popover.ui:53 +msgid "min" +msgstr "хв." -#: cozy/view_model/headerbar_view_model.py:75 -msgid "Importing Audiobooks" -msgstr "Імпорт аудіокниг" +#: cozy/ui/widgets/sleep_timer.py:62 +msgid "Off" +msgstr "Вимк." -#: cozy/view_model/headerbar_view_model.py:84 -#: cozy/view_model/headerbar_view_model.py:100 -msgid "Copying new files…" -msgstr "" +#: cozy/ui/widgets/storages.py:11 +msgid "Set Audiobooks Directory" +msgstr "Встановити каталог аудіокниг" -#: cozy/view_model/headerbar_view_model.py:91 -msgid "Changing audio book location…" -msgstr "Зміна місця розташування книги …" +#: cozy/ui/widgets/storages.py:65 data/ui/storage_locations.ui:18 +msgid "External drive" +msgstr "Зовнішній диск" -#: cozy/model/track.py:38 -msgid "Chapter" -msgstr "" +#: cozy/ui/widgets/storages.py:68 +msgid "Internal drive" +msgstr "Внутрішній диск" -#: cozy/media/files.py:69 -msgid "Cannot copy: Audiobook directory is read only" -msgstr "" +#: cozy/view_model/headerbar_view_model.py:78 +msgid "Refreshing audio book collection" +msgstr "Оновлена колекція аудіокниг" -#: cozy/media/files.py:71 -msgid "Cannot copy: Disk is full" -msgstr "" +#: cozy/view_model/headerbar_view_model.py:87 +#: cozy/view_model/headerbar_view_model.py:103 +msgid "Copying new files…" +msgstr "Копіювання нових файлів…" -#: cozy/media/files.py:73 cozy/media/files.py:89 -msgid "Cannot copy: Permission denied" -msgstr "" +#: cozy/view_model/headerbar_view_model.py:94 +msgid "Changing audio book location…" +msgstr "Зміна місця розташування книги …" -#: data/ui/about.ui:16 -msgid "GitHub" -msgstr "GitHub" +#: data/ui/album_element.ui:47 +msgid "Play" +msgstr "Слухати" -#: data/ui/book_detail.ui:205 +#: data/ui/book_detail.ui:149 msgid "Remaining" msgstr "Залишилось" -#: data/ui/book_detail.ui:260 +#: data/ui/book_detail.ui:195 msgid "Total" msgstr "Тривалість" -#: data/ui/book_detail.ui:276 +#: data/ui/book_detail.ui:208 msgid "Last played" msgstr "Останнє програвання" -#: data/ui/book_detail.ui:292 +#: data/ui/book_detail.ui:221 msgid "Published" msgstr "Опубліковано" -#: data/ui/book_detail.ui:338 +#: data/ui/book_detail.ui:246 msgid "Some or all files of this book cannot be found." -msgstr "" +msgstr "Неможливо знайти деякі або всі файли цієї книги." -#: data/ui/book_detail.ui:361 +#: data/ui/book_detail.ui:259 msgid "unavailable" -msgstr "" +msgstr "недоступно" -#: data/ui/book_detail.ui:472 +#: data/ui/book_detail.ui:363 msgid "Loading chapters, please wait..." -msgstr "" +msgstr "Завантаження розділів, будь ласка, зачекайте..." -#: data/ui/book_detail.ui:527 -msgid "page0" -msgstr "сторінка0" +#: data/ui/book_element.ui:10 +msgid "Open book overview" +msgstr "Відкрити огляд книги" + +#: data/ui/chapter_element.ui:5 +msgid "Play this part" +msgstr "Слухати цю частину" -#: data/ui/error_reporting.ui:23 +#: data/ui/error_reporting.ui:24 data/ui/preferences.ui:124 msgid "User feedback" -msgstr "" +msgstr "Зворотний зв'язок користувачів" -#: data/ui/error_reporting.ui:66 +#: data/ui/error_reporting.ui:67 msgctxt "Error and crash reporting dialog" msgid "" "You can help improve Cozy by contributing information in case of errors and " "crashes. " msgstr "" +"Ви можете допомогти покращити Cozy, надаючи інформацію про випадки помилок " +"та аварійних завершень роботи." -#: data/ui/error_reporting.ui:80 +#: data/ui/error_reporting.ui:75 msgctxt "Error and crash reporting dialog" msgid "" "Contributing this information is optional and completely anonymous. We will " "never collect personal data, files you import or any information that could " "identify you." msgstr "" +"Надавання цієї інформації є добровільним та анонімним. Ми ніколи не " +"збиратимемо персональні дані, файли, які ви імпортуєте, або будь-яку " +"інформацію, яка могла б ідентифікувати вас." -#: data/ui/error_reporting.ui:95 +#: data/ui/error_reporting.ui:84 msgctxt "Error and crash reporting dialog" msgid "" "Cozy is opensource and the user feedback source code can be inspected here: " msgstr "" +"Cozy є відкритим вихідним кодом, і ви можете переглянути вихідний код " +"зворотного зв'язку користувачів тут:" -#: data/ui/file_not_found.ui:19 data/ui/delete_book_dialog.ui:31 -msgid "Cancel" -msgstr "Відміна" +#. Translators: Don't touch the markup. Translate the text "Sourcecode on +#. GitHub" only! +#: data/ui/error_reporting.ui:94 +msgid "" +"Sourcecode" +" on GitHub" +msgstr "" +"Вихідний " +"код на GitHub" -#: data/ui/file_not_found.ui:32 -msgid "Locate" -msgstr "Знайти" +#: data/ui/first_import_button.ui:12 +msgid "Select Folder" +msgstr "Вибрати папку" -#: data/ui/file_not_found.ui:86 -msgid "File not found" -msgstr "Файл не знайдено" +#: data/ui/headerbar.ui:17 +msgid "Toggle Filter Sidebar" +msgstr "Бокова панель перемикання фільтрів" -#: data/ui/file_not_found.ui:119 -msgid "This file could not be found. Do you want to locate it manually?" -msgstr "Файл не знайдено. Ви хочете знайти його самостійно?" +#: data/ui/headerbar.ui:22 +msgid "Options" +msgstr "Налаштування" -#: data/ui/import_failed.ui:27 -msgid "Ok" -msgstr "Так" +#: data/ui/headerbar.ui:26 +msgid "Open the options popover" +msgstr "Відкрити вікно налаштувань" -#: data/ui/import_failed.ui:81 -msgid "Some files could not be imported" -msgstr "Деякі файли не можуть бути імпортовані" +#: data/ui/headerbar.ui:33 +msgid "Search your library" +msgstr "Пошук у вашій аудіобібліотеці" -#: data/ui/import_failed.ui:134 -msgid "" -"This can have multiple reasons:\n" -"- The audio format is not supported\n" -"- The path or filename contains non utf-8 characters\n" -"- The file(s) are no valid audio files\n" -"- The file(s) are corrupt" -msgstr "" +#: data/ui/headerbar.ui:36 +msgid "Open the search popover" +msgstr "Відкрийте пошуковий запит" -#: data/ui/main_window.ui:125 +#: data/ui/headerbar.ui:44 +msgid "Display background task progress" +msgstr "Відображати прогрес фонового завдання" + +#: data/ui/headerbar.ui:67 +msgid "Start typing..." +msgstr "Починайте друкувати..." + +#: data/ui/headerbar.ui:80 +msgid "_Scan Library" +msgstr "_Сканувати бібліотеку" + +#: data/ui/headerbar.ui:86 +msgid "_Hide unavailable books" +msgstr "_Приховати недоступні книги" + +#: data/ui/headerbar.ui:92 +msgid "_Preferences" +msgstr "_Параметри" + +#: data/ui/headerbar.ui:96 +msgid "_About Cozy" +msgstr "_Про програму Cozy" + +#: data/ui/headerbar.ui:102 +msgid "_Quit" +msgstr "_Вихід" + +#: data/ui/main_window.ui:26 +msgid "Drop Audio Books Here to Add Them to Your Library" +msgstr "Додайте аудіокниги сюди, щоб додати їх до своєї бібліотеки" + +#: data/ui/main_window.ui:48 +msgid "Library" +msgstr "Бібліотека" + +#: data/ui/main_window.ui:65 msgid "Recent" msgstr "Останні" -#: data/ui/main_window.ui:145 +#: data/ui/main_window.ui:77 data/ui/search_page.ui:46 +msgid "Author" +msgstr "Автор" + +#: data/ui/main_window.ui:89 msgid "List of authors" msgstr "Список авторів" -#: data/ui/main_window.ui:161 data/ui/main_window.ui:271 -#: data/ui/search_popover.ui:107 -msgid "Author" -msgstr "Автор" +#: data/ui/main_window.ui:108 data/ui/search_page.ui:59 +msgid "Reader" +msgstr "Читач" -#: data/ui/main_window.ui:181 +#: data/ui/main_window.ui:120 msgid "List of readers" msgstr "Список дикторів" -#: data/ui/main_window.ui:197 data/ui/search_popover.ui:201 -msgid "Reader" -msgstr "Диктор" - -#: data/ui/main_window.ui:251 +#: data/ui/main_window.ui:172 msgid "List of books" msgstr "Список книжок" -#: data/ui/main_window.ui:301 -msgid "Stay tuned while Cozy is preparing your library…" -msgstr "" +#: data/ui/main_window.ui:194 +msgid "No Recent Books Yet" +msgstr "Поки що немає нових книг" -#: data/ui/main_window.ui:334 -msgid "" -"Start exploring your library by switching to the Author or Reader view " -"above." -msgstr "" -"Почніть використовувати вашу бібліотеку, перейшовши до вікна \"Автор\" або " -"\"Диктор\"." - -#: data/ui/main_window.ui:379 -msgid "Import your Audiobooks" -msgstr "Імпорт аудіокниг" - -#: data/ui/main_window.ui:395 -msgid "" -"Cozy automatically imports your audiobooks in one directory - your library" +#: data/ui/main_window.ui:195 +msgid "Explore your library by switching to the Author or Reader view" msgstr "" -"Cozy аавтоматично імпортує аудіокниги з зазначеного каталога в бібліотеку" - -#: data/ui/main_window.ui:431 data/ui/main_window.ui:452 -msgid "Automatically import new audiobooks on startup" -msgstr "Автоматично імпортувати нові аудіокниги при запуску програми" +"Досліджуйте вашу бібліотеку, перемикаючись на вигляд Автора або Читача" -#: data/ui/main_window.ui:451 -msgid "Auto scan switch" -msgstr "Перемикач автосканування" - -#: data/ui/main_window.ui:495 -msgid "Drag & Drop" -msgstr "Drag & Drop" +#: data/ui/media_controller.ui:48 +msgid "Currently playing" +msgstr "Зараз програється" -#: data/ui/main_window.ui:512 -msgid "Drag your audiobooks into cozy and they will be automatically imported" -msgstr "Перетягніть аудіокниги в cozy, і вони будуть автоматично імпортовані" +#: data/ui/media_controller.ui:65 +msgid "Title of currently playing book" +msgstr "Назва поточної аудіокниги" -#: data/ui/main_window.ui:535 -msgid "Location of your audiobooks" -msgstr "Розташування аудіокниг" +#: data/ui/media_controller.ui:82 +msgid "Title of the currently playing part" +msgstr "Назва поточної частини" -#: data/ui/main_window.ui:556 -msgid "Set Audiobooks Directory" -msgstr "Встановити каталог аудіокниг" +#: data/ui/media_controller.ui:111 +msgid "Rewind" +msgstr "Перемотати назад" -#: data/ui/main_window.ui:579 -msgid "Load audiobooks from a directory, network drive or an external disk." -msgstr "" +#: data/ui/media_controller.ui:116 +msgid "Rewind playback" +msgstr "Перемотати відтворення назад" -#: data/ui/main_window.ui:597 -msgid "You can add more storage locations later in the settings" -msgstr "" +#: data/ui/media_controller.ui:130 +msgid "Start playback" +msgstr "Почати програвання" -#: data/ui/search_popover.ui:24 -msgid "Search" -msgstr "Пошук" +#: data/ui/media_controller.ui:135 +msgid "Start or pause the playback" +msgstr "Запуск або призупинення програвання" -#: data/ui/search_popover.ui:36 -msgid "Search box" -msgstr "Пошукова строка" +#: data/ui/media_controller.ui:148 +msgid "Forward" +msgstr "Вперед" -#: data/ui/search_popover.ui:37 -msgid "Search your audiobook library" -msgstr "Пошук у вашій аудіобібліотеці" +#: data/ui/media_controller.ui:153 +msgid "Forward Playback" +msgstr "Перемотка вперед" -#: data/ui/search_popover.ui:67 -msgid "Which book are you looking for?" -msgstr "Яку книгу ви шукайте?" +#: data/ui/media_controller.ui:179 +msgid "Volume control" +msgstr "Регулятор гучності" -#: data/ui/search_popover.ui:154 -msgid "Book" -msgstr "Книга" +#: data/ui/media_controller.ui:202 +msgid "Playback speed" +msgstr "Швидкість відтворення" -#: data/ui/search_popover.ui:248 -msgid "Part" -msgstr "Частина" +#: data/ui/media_controller.ui:213 data/ui/preferences.ui:80 +msgid "Sleep Timer" +msgstr "Таймер сну" -#: data/ui/search_popover.ui:295 -msgid "Nothing found :(" -msgstr "Нічого не знайдено :(" +#: data/ui/media_controller.ui:220 +msgid "Open the sleep timer popover" +msgstr "Відкрити вікно таймера сну" -#: data/ui/settings.ui:111 data/ui/settings.ui:382 +#: data/ui/preferences.ui:27 msgid "General" msgstr "Основні" -#: data/ui/settings.ui:156 -msgid "Dark Mode" -msgstr "Темний режим" - -#: data/ui/settings.ui:232 -msgid "Titlebar" -msgstr "Рядок заголовку" - -#: data/ui/settings.ui:277 -msgid "Display the whole book instead of the current chapter" -msgstr "" - -#: data/ui/settings.ui:340 +#: data/ui/preferences.ui:30 msgid "Appearance" msgstr "Зовнішній вигляд" -#: data/ui/settings.ui:425 -msgid "Suspend system on timer" -msgstr "Вимкнення системи по таймеру" - -#: data/ui/settings.ui:485 -msgid "Replay 30 seconds" -msgstr "Автоповернення на 30 секунд" - -#: data/ui/settings.ui:545 -msgid "Automatic media scan" -msgstr "Автоматичне сканування медіа" +#: data/ui/preferences.ui:33 +msgid "Dark Mode" +msgstr "Темний режим" -#: data/ui/settings.ui:604 +#: data/ui/preferences.ui:40 msgid "Tags" -msgstr "" +msgstr "Теги" -#: data/ui/settings.ui:656 -msgid "Swap author and reader" -msgstr "" - -#: data/ui/settings.ui:669 -msgid "Activate this if author and reader are displayed the wrong way" -msgstr "" +#: data/ui/preferences.ui:43 +msgid "Swap Author and Reader" +msgstr "Поміняти автора і читача місцями" -#: data/ui/settings.ui:694 -msgid "switch author and reader assignment" -msgstr "" +#: data/ui/preferences.ui:44 +msgid "Activate if author and reader are displayed the wrong way" +msgstr "Активувати, якщо автор і читач відображаються неправильно" -#: data/ui/settings.ui:743 +#: data/ui/preferences.ui:51 msgid "Playback" -msgstr "" +msgstr "Відтворення" -#: data/ui/settings.ui:789 -msgid "Rewind duration" -msgstr "" +#: data/ui/preferences.ui:54 +msgid "Replay" +msgstr "Автоповернення" -#: data/ui/settings.ui:874 -msgid "Forward duration" -msgstr "" +#: data/ui/preferences.ui:55 +msgid "Rewind 30 seconds of the current book when starting Cozy" +msgstr "Перемотати назад на 30 секунд поточну книгу при запуску Cozy" -#: data/ui/settings.ui:956 data/ui/headerbar.ui:415 -msgid "Sleep timer" -msgstr "Таймер сну" +#: data/ui/preferences.ui:60 +msgid "Rewind Duration" +msgstr "Тривалість перемотування" + +#: data/ui/preferences.ui:69 +msgid "Forward Duration" +msgstr "Тривалість перемотування вперед" -#: data/ui/settings.ui:1001 +#: data/ui/preferences.ui:83 msgid "Fadeout" msgstr "Затухання" -#: data/ui/settings.ui:1063 -msgid "Fadeout duration" +#: data/ui/preferences.ui:88 +msgid "Fadeout Duration" msgstr "Тривалість затухання" -#: data/ui/settings.ui:1144 -msgid "Behaviour" -msgstr "Поведінка" +#: data/ui/preferences.ui:104 +msgid "Storage" +msgstr "Бібліотеки" -#: data/ui/settings.ui:1171 +#: data/ui/preferences.ui:107 msgid "Artwork" msgstr "Обкладинка" -#: data/ui/settings.ui:1223 -msgid "Prefer external images over embedded cover" -msgstr "Перевага зовнішніх зображеннь над вбудованими обкладинками " - -#: data/ui/settings.ui:1236 -msgid "Use images (cover.jpg, *.png, …) when available" -msgstr "Використовувати зображення (cover.jpg, * .png, …), коли вони доступні" - -#: data/ui/settings.ui:1319 -msgid "Audio books location" -msgstr "Розташування аудіокниг" +#: data/ui/preferences.ui:110 +msgid "Prefer External Images Over Embedded Cover" +msgstr "Перевага зовнішніх зображеннь над вбудованими обкладинками" -#: data/ui/settings.ui:1335 -msgid "Storage locations" -msgstr "Місця зберігання" +#: data/ui/preferences.ui:111 +msgid "Always use images (cover.jpg, *.png, …) when available" +msgstr "" +"Завжди використовуйте зображення (cover.jpg, *.png, ...), якщо вони доступні" -#: data/ui/settings.ui:1393 -msgid "Add location" -msgstr "Додати місцеположення" +#: data/ui/preferences.ui:121 +msgid "Feedback" +msgstr "Зворотній зв'язок" -#: data/ui/settings.ui:1418 data/ui/settings.ui:1613 -msgid "Remove location" -msgstr "Видалити місцеположення" +#: data/ui/search_page.ui:9 +msgid "Search in your library" +msgstr "Пошук у бібліотеці" -#: data/ui/settings.ui:1454 -msgid "Toggle this storage location to be internal/external." -msgstr "Тип місця зберігання внутрішнє/зовнішнє." +#: data/ui/search_page.ui:15 +msgid "No results found" +msgstr "Не знайдено результатів" -#: data/ui/settings.ui:1480 -msgid "Set as default storage location for new audiobooks" -msgstr "Встановити за умовчанням для нових аудіокниг" +#: data/ui/search_page.ui:33 +msgid "Book" +msgstr "Книга" -#: data/ui/settings.ui:1532 -msgid "Ignore list" -msgstr "" +#: data/ui/seek_bar.ui:15 +msgid "Elapsed time" +msgstr "Пройдений час" -#: data/ui/settings.ui:1576 -msgid "Path" -msgstr "Шлях" +#: data/ui/seek_bar.ui:21 +msgid "Elapsed time of current part" +msgstr "Час, що минув для поточної частини" -#: data/ui/settings.ui:1659 -msgid "Follow symlinks" -msgstr "Слідувати за символічними посиланнями" +#: data/ui/seek_bar.ui:32 +msgid "Jump to position in current chapter" +msgstr "Перейти до позиції в поточному розділі" -#: data/ui/settings.ui:1691 -msgid "Storage" -msgstr "Бібліотеки" +#: data/ui/seek_bar.ui:39 +msgid "Position of the current part in seconds" +msgstr "Положення поточної частини в секундах" -#: data/ui/settings.ui:1715 -msgid "Database" -msgstr "База даних" +#: data/ui/seek_bar.ui:48 +msgid "Remaining time" +msgstr "Час, що залишився" -#: data/ui/settings.ui:1767 -msgid "Force refresh the database" -msgstr "Примусово оновити базу даних" +#: data/ui/seek_bar.ui:53 +msgid "Remaining time of current part" +msgstr "Час, що залишився для поточної частини" -#: data/ui/settings.ui:1780 -msgid "This will force update the metadata of all imported books" -msgstr "Це оновить метадані всіх імпортованих книг" +#: data/ui/storage_locations.ui:5 +msgid "Storage locations" +msgstr "Місця зберігання" -#: data/ui/settings.ui:1800 -msgid "Force refresh" -msgstr "Примусити оновити" +#: data/ui/storage_locations.ui:24 +msgid "Set as default" +msgstr "Встановити за замовчуванням" -#: data/ui/settings.ui:1856 -msgid "Advanced" -msgstr "Розширені" +#: data/ui/storage_locations.ui:28 +msgid "Remove" +msgstr "Вилучити" -#: data/ui/timer_popover.ui:37 +#: data/ui/timer_popover.ui:30 msgid "Timer duration" msgstr "Тривалість таймера" -#: data/ui/timer_popover.ui:49 -msgid "Timer duration slider" -msgstr "Повзунок тривалості таймера" - -#: data/ui/timer_popover.ui:50 +#: data/ui/timer_popover.ui:40 msgid "Set the sleep timer duration in minutes" msgstr "Установка тривалості таймера сну в хвилинах" -#: data/ui/timer_popover.ui:116 +#: data/ui/timer_popover.ui:86 msgid "Stop after current chapter" msgstr "Зупиніться після поточного розділу" -#: data/ui/timer_popover.ui:164 +#: data/ui/timer_popover.ui:107 msgid "Enable system power control" -msgstr "" +msgstr "Увімкнути керування живленням системи" -#: data/ui/timer_popover.ui:201 +#: data/ui/timer_popover.ui:125 msgid "" "Type of the action when the timer finishes.\n" "\"shutdown\" will attempt to turn your system off (also known as power off)\n" "\"suspend\" will attempt to suspend your system (also known as sleep)." msgstr "" +"Тип дії, що виконується після завершення таймера.\n" +"\"shutdown\" спробує вимкнути вашу систему (також відоме як вимкнення живлення).\n" +"\"suspend\" спробує призупинити роботу вашої системи (також відоме як сплячий режим)." -#: data/ui/timer_popover.ui:205 -msgid "" -"System power action\n" -"to perform" -msgstr "" +#: data/ui/timer_popover.ui:129 +msgid "System power action to perform" +msgstr "Дія з живлення системи для виконання" -#: data/ui/timer_popover.ui:221 +#: data/ui/timer_popover.ui:137 msgid "suspend" -msgstr "" +msgstr "призупинити" -#: data/ui/timer_popover.ui:237 +#: data/ui/timer_popover.ui:143 msgid "shutdown" -msgstr "" - -#: data/ui/titlebar_menu.ui:7 -msgid "_Scan Library" -msgstr "" - -#: data/ui/titlebar_menu.ui:13 -msgid "_Hide unavailable books" -msgstr "" - -#: data/ui/titlebar_menu.ui:19 -msgid "_Preferences" -msgstr "_Параметри" - -#: data/ui/titlebar_menu.ui:25 -msgid "_Help" -msgstr "_Довідка" - -#: data/ui/titlebar_menu.ui:29 -msgid "_About" -msgstr "П_ро програму" - -#: data/ui/titlebar_menu.ui:33 -msgid "_Quit" -msgstr "_Вихід" - -#: data/ui/whats_new.ui:8 -msgid "Whats new?" -msgstr "" - -#: data/ui/whats_new.ui:21 -msgid "Continue" -msgstr "" - -#: data/ui/whats_new_importer.ui:17 data/ui/whats_new_m4b.ui:17 -#: data/ui/whats_new_m4b_chapter.ui:17 data/ui/whats_new_library.ui:17 -msgid "What's new in Cozy" -msgstr "" - -#: data/ui/whats_new_importer.ui:52 -msgid "A completely rewritten and far more reliable media importer." -msgstr "" - -#: data/ui/whats_new_importer.ui:77 -msgid "" -"Did you experience audio files that couldn't be imported? Drag & Drop those " -"files onto Cozy or use the application menu in the titlebar to rescan your " -"audiobook directories!" -msgstr "" - -#: data/ui/whats_new_importer.ui:92 -msgid "Supported media files currently are mp3, m4a, flac, ogg, opus and wav." -msgstr "" - -#: data/ui/whats_new_importer.ui:107 -msgid "More to come in a later update." -msgstr "" - -#: data/ui/whats_new_m4b.ui:52 -msgid "Basic support for m4b audio books." -msgstr "" - -#: data/ui/whats_new_m4b.ui:77 -msgid "" -"Many of you have been waiting for it: Support for m4b audio books! This " -"version features basic support for m4b files without chapter support." -msgstr "" - -#: data/ui/whats_new_m4b.ui:92 -msgid "" -"Drag & Drop your m4b files onto Cozy or use the application menu in the " -"titlebar to rescan your audiobook directories." -msgstr "" - -#: data/ui/whats_new_m4b.ui:107 -msgid "Chapter support will follow in a later update. Stay tuned!" -msgstr "" - -#: data/ui/whats_new_m4b_chapter.ui:52 -msgid "Chapter support for m4b audio books." -msgstr "" - -#: data/ui/whats_new_m4b_chapter.ui:77 -msgid "This version of Cozy features chapter support for m4b audio books!" -msgstr "" - -#: data/ui/whats_new_m4b_chapter.ui:92 -msgid "" -"If you already have m4b files imported you'll need to start a scan of your " -"library from the app menu." -msgstr "" - -#: data/ui/whats_new_m4b_chapter.ui:107 -msgid "The chapters will then be detected." -msgstr "" - -#: data/ui/whats_new_library.ui:52 -msgid "An important change in library management" -msgstr "" - -#: data/ui/whats_new_library.ui:77 -msgid "" -"Previously every file which was imported in your library but couldn't be " -"found anymore was removed from the library during a scan." -msgstr "" - -#: data/ui/whats_new_library.ui:92 -msgid "" -"Now audiobooks are not removed from your library automatically anymore. This" -" prevents accidentally loosing the progress of a audiobook when a file can't" -" be found temporarily." -msgstr "" - -#: data/ui/whats_new_library.ui:107 -msgid "" -"To remove an audiobook from the library simply right-click on it and choose " -"the remove from library option." -msgstr "" - -#: data/ui/seek_bar.ui:20 -msgid "Elapsed time" -msgstr "Пройдений час" - -#: data/ui/seek_bar.ui:28 -msgid "Time elapsed" -msgstr "Пройшло часу" - -#: data/ui/seek_bar.ui:29 -msgid "Elapsed time of current part" -msgstr "Час, що минув для поточної частини" - -#: data/ui/seek_bar.ui:45 -msgid "Jump to position in current chapter" -msgstr "" - -#: data/ui/seek_bar.ui:56 -msgid "Position slider" -msgstr "Повзунок положення" - -#: data/ui/seek_bar.ui:57 -msgid "Position of the current part in seconds" -msgstr "Положення поточної частини в секундах" - -#: data/ui/seek_bar.ui:76 -msgid "Remaining time" -msgstr "Час, що залишився" - -#: data/ui/seek_bar.ui:83 -msgid "Time remaining" -msgstr "Залишилось" - -#: data/ui/seek_bar.ui:84 -msgid "Remaining time of current part" -msgstr "Час, що залишився для поточної частини" - -#: data/ui/headerbar.ui:123 -msgid "Rewind" -msgstr "" - -#: data/ui/headerbar.ui:131 -msgid "Rewind button" -msgstr "Кнопка перемотування" - -#: data/ui/headerbar.ui:132 -msgid "Rewind playback" -msgstr "" - -#: data/ui/headerbar.ui:149 -msgid "Start playback" -msgstr "Почати програвання" - -#: data/ui/headerbar.ui:157 -msgid "Play/Pause Button" -msgstr "Кнопка прогр./паузи" - -#: data/ui/headerbar.ui:158 -msgid "Start or pause the playback" -msgstr "Запуск або призупинення програвання" - -#: data/ui/headerbar.ui:174 -msgid "Forward" -msgstr "" - -#: data/ui/headerbar.ui:182 -msgid "Forward button" -msgstr "" - -#: data/ui/headerbar.ui:183 -msgid "Forward Playback" -msgstr "" - -#: data/ui/headerbar.ui:214 -msgid "Warnings" -msgstr "" - -#: data/ui/headerbar.ui:259 -msgid "Currently playing" -msgstr "Зараз програється" - -#: data/ui/headerbar.ui:275 -msgid "Booktitle" -msgstr "Назва аудіокниги" - -#: data/ui/headerbar.ui:276 -msgid "Title of currently playing book" -msgstr "Назва поточної аудіокниги" - -#: data/ui/headerbar.ui:302 -msgid "Part name" -msgstr "Назва частини" - -#: data/ui/headerbar.ui:303 -msgid "Title of the currently playing part" -msgstr "Назва поточної частини" - -#: data/ui/headerbar.ui:336 -msgid "Working…" -msgstr "Обробка…" - -#: data/ui/headerbar.ui:340 -msgid "Currently working" -msgstr "В даний момент працює" - -#: data/ui/headerbar.ui:357 -msgid "Volume control" -msgstr "Регулятор гучності" - -#: data/ui/headerbar.ui:394 -msgid "Playback speed" -msgstr "Швидкість відтворення" - -#: data/ui/headerbar.ui:425 -msgid "Timer menu button" -msgstr "Кнопка меню таймера" - -#: data/ui/headerbar.ui:426 -msgid "Open the sleep timer popover" -msgstr "Відкрити вікно таймера сну" - -#: data/ui/headerbar.ui:442 -msgid "Search your library" -msgstr "Пошук у вашій аудіобібліотеці" - -#: data/ui/headerbar.ui:452 -msgid "Search menu button" -msgstr "Кнопка меню пошуку" - -#: data/ui/headerbar.ui:453 -msgid "Open the search popover" -msgstr "Відкрийте пошуковий запит" - -#: data/ui/headerbar.ui:468 -msgid "Options" -msgstr "Налаштування" - -#: data/ui/headerbar.ui:479 -msgid "Options menu button" -msgstr "Кнопка меню налаштувань" - -#: data/ui/headerbar.ui:480 -msgid "Open the options popover" -msgstr "Відкрити вікно налаштувань" - -#: data/ui/delete_book_dialog.ui:45 -msgid "Delete Audiobook" -msgstr "" - -#: data/ui/delete_book_dialog.ui:105 -msgid "Are you sure you want to delete the selected audiobook?" -msgstr "" - -#: data/ui/delete_book_dialog.ui:126 -msgid "The audiobook will be removed from your disk and from Cozy's library." -msgstr "" - -#: data/ui/db_migration_failed.ui:31 -msgid "Close Cozy" -msgstr "" - -#: data/ui/db_migration_failed.ui:47 -msgid "Recieve help on GitHub" -msgstr "" - -#: data/ui/db_migration_failed.ui:108 -msgid "An error occured while updating the database" -msgstr "" - -#: data/ui/db_migration_failed.ui:129 -msgid "" -"During an update of the database an error occurred and Cozy will not be able to startup.\n" -"A backup of the database was created before the update and has been restored now.\n" -"Until this issue is resolved please use version 0.9.5 of Cozy.\n" -"You can help resolve this problem by reporting an issue on GitHub." -msgstr "" +msgstr "вимкнути" From 513c5c75ea68d9c97ba41ba46c68f723b7d0e7f3 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:25:30 +0000 Subject: [PATCH 14/15] Translate po/com.github.geigi.cozy.pot in uk 100% translated source file: 'po/com.github.geigi.cozy.pot' on 'uk'. --- po/uk.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/po/uk.po b/po/uk.po index 03e0a864..92372cb2 100644 --- a/po/uk.po +++ b/po/uk.po @@ -136,10 +136,10 @@ msgid "" "been restored now. Until this issue is resolved please use version 0.9.5 of " "Cozy. You can help resolve this problem by reporting an issue on GitHub." msgstr "" -"\"Під час оновлення бази даних сталася помилка і Cozy не зможе запуститися.\\n\"\n" -"\"Перед оновленням було створено резервну копію бази даних, яку було відновлено.\\n\"\n" -"\"До вирішення цієї проблеми, будь ласка, використовуйте версію 0.9.5 Cozy.\\n\"\n" -"\"Ви можете допомогти вирішити цю проблему, повідомивши про неї на GitHub.\"" +"Під час оновлення бази даних сталася помилка і Cozy не зможе запуститися.\n" +"Перед оновленням було створено резервну копію бази даних, яку було відновлено.\n" +"До вирішення цієї проблеми, будь ласка, використовуйте версію 0.9.5 Cozy.\n" +"Ви можете допомогти вирішити цю проблему, повідомивши про неї на GitHub." #: cozy/ui/db_migration_failed_view.py:15 msgid "Failed to Update Database" From a5a00e2fdd3983b29f0582057f47dc5e4284ddce Mon Sep 17 00:00:00 2001 From: Julian Geywitz Date: Fri, 12 Jul 2024 13:35:28 +0200 Subject: [PATCH 15/15] Add uk language to extra translations --- po/extra/LINGUAS | 1 + 1 file changed, 1 insertion(+) diff --git a/po/extra/LINGUAS b/po/extra/LINGUAS index 96608f2f..26845129 100644 --- a/po/extra/LINGUAS +++ b/po/extra/LINGUAS @@ -20,3 +20,4 @@ ru sv te tr +uk