From 11279622168705bfa9f638a6cb43a12a4de98475 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:15 +0200 Subject: [PATCH 01/30] Update to new Nemo import path --- qml/harbour-seriesfinale.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qml/harbour-seriesfinale.qml b/qml/harbour-seriesfinale.qml index ccea258..83127ce 100644 --- a/qml/harbour-seriesfinale.qml +++ b/qml/harbour-seriesfinale.qml @@ -4,7 +4,7 @@ import "pages" import "cover" import io.thp.pyotherside 1.3 -import org.nemomobile.notifications 1.0 +import Nemo.Notifications 1.0 ApplicationWindow { From 5b7532808df7b3b7faa46f8085fb70972cf43b11 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:25 +0200 Subject: [PATCH 02/30] Load survey page with bindings to series page to fix lookup errors --- qml/pages/SeriesPage.qml | 9 ++++++--- qml/pages/SurveyPage.qml | 11 +++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/qml/pages/SeriesPage.qml b/qml/pages/SeriesPage.qml index 67dd411..09eecb7 100644 --- a/qml/pages/SeriesPage.qml +++ b/qml/pages/SeriesPage.qml @@ -38,14 +38,17 @@ Page { }) } - - Component { id: surveyPage; SurveyPage {} } onStatusChanged: { if (status === PageStatus.Activating && hasChanged) { update(); } + if (status === PageStatus.Active) { - pageStack.pushAttached(surveyPage); + pageStack.pushAttached(Qt.resolvedUrl("SurveyPage.qml"), { + isUpdating: Qt.binding(function(){return isUpdating}), + hasChanged: Qt.binding(function(){return hasChanged}), + doHighlight: Qt.binding(function(){return doHighlight}), + }); } } diff --git a/qml/pages/SurveyPage.qml b/qml/pages/SurveyPage.qml index 3ccec57..cd6a65d 100644 --- a/qml/pages/SurveyPage.qml +++ b/qml/pages/SurveyPage.qml @@ -7,7 +7,9 @@ Page { id: surveyPage property bool isLoading: false - property bool hasChanged: true + property bool isUpdating: false + property bool doHighlight: false + property bool hasChanged: false function update() { python.call('seriesfinale.seriesfinale.series_manager.get_series_list_by_prio', [], function(result) { @@ -65,7 +67,7 @@ Page { MenuItem { text: qsTr("Add Show") - visible: !seriesPage.isUpdating + visible: !isUpdating onClicked: { pageStack.push(addShowComponent.createObject(pageStack)) } Component { id: addShowComponent; AddShow {} } } @@ -207,4 +209,9 @@ Page { } } } + + Component.onCompleted: { + update() + } + } From 7f79a8ef018f839c8d1a1ed4707996c42ed98f5b Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:29 +0200 Subject: [PATCH 03/30] Only load survey page once --- qml/pages/SeriesPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qml/pages/SeriesPage.qml b/qml/pages/SeriesPage.qml index 09eecb7..c223ff2 100644 --- a/qml/pages/SeriesPage.qml +++ b/qml/pages/SeriesPage.qml @@ -43,7 +43,7 @@ Page { update(); } - if (status === PageStatus.Active) { + if (status === PageStatus.Active && !canNavigateForward) { pageStack.pushAttached(Qt.resolvedUrl("SurveyPage.qml"), { isUpdating: Qt.binding(function(){return isUpdating}), hasChanged: Qt.binding(function(){return hasChanged}), From b3ddd5cf5a12d146a1c4ccbd3f54a69a824e4f24 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:36 +0200 Subject: [PATCH 04/30] Use MenuLabel for labels in pulley menus --- qml/pages/SeriesPage.qml | 10 +++++++--- qml/pages/SurveyPage.qml | 5 +++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/qml/pages/SeriesPage.qml b/qml/pages/SeriesPage.qml index c223ff2..f9a379e 100644 --- a/qml/pages/SeriesPage.qml +++ b/qml/pages/SeriesPage.qml @@ -124,9 +124,8 @@ Page { Component { id: settingsComponent; SettingsPage {} } } MenuItem { - text: seriesPage.isUpdating ? qsTr("Refreshing...") : qsTr("Refresh") - visible: seriesList.count != 0 - enabled: !seriesPage.isUpdating + text: qsTr("Refresh") + visible: seriesList.count != 0 && !isUpdating onClicked: { python.call('seriesfinale.seriesfinale.settingsWrapper.setLastCompleteUpdate', [new Date().toISOString().slice(0, 10)]); python.call('seriesfinale.seriesfinale.series_manager.update_all_shows_episodes', []); @@ -138,6 +137,11 @@ Page { onClicked: { pageStack.push(addShowComponent.createObject(pageStack)) } Component { id: addShowComponent; AddShow {} } } + + MenuLabel { + visible: isUpdating + text: qsTr("Refreshing...") + } } header: PageHeader { diff --git a/qml/pages/SurveyPage.qml b/qml/pages/SurveyPage.qml index cd6a65d..4d21c92 100644 --- a/qml/pages/SurveyPage.qml +++ b/qml/pages/SurveyPage.qml @@ -71,6 +71,11 @@ Page { onClicked: { pageStack.push(addShowComponent.createObject(pageStack)) } Component { id: addShowComponent; AddShow {} } } + + MenuLabel { + visible: isUpdating + text: qsTr("Refreshing...") + } } header: PageHeader { From 133b2c9b46f629de82a5eb16a91c1daff89317ad Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:42 +0200 Subject: [PATCH 05/30] Add id for app window to access it from anywhere --- qml/harbour-seriesfinale.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/qml/harbour-seriesfinale.qml b/qml/harbour-seriesfinale.qml index 83127ce..1099222 100644 --- a/qml/harbour-seriesfinale.qml +++ b/qml/harbour-seriesfinale.qml @@ -8,6 +8,7 @@ import Nemo.Notifications 1.0 ApplicationWindow { + id: app initialPage: Component { id: seriesPage; SeriesPage {} } cover: Component { id: coverPage; CoverPage {} } From 1b19d14d4670dbf81aaefda912472e03e18c3399 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:50 +0200 Subject: [PATCH 06/30] Remove unnecessary ids from initial page and cover page components --- qml/harbour-seriesfinale.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/qml/harbour-seriesfinale.qml b/qml/harbour-seriesfinale.qml index 1099222..f0f4a4a 100644 --- a/qml/harbour-seriesfinale.qml +++ b/qml/harbour-seriesfinale.qml @@ -9,8 +9,9 @@ import Nemo.Notifications 1.0 ApplicationWindow { id: app - initialPage: Component { id: seriesPage; SeriesPage {} } - cover: Component { id: coverPage; CoverPage {} } + + initialPage: Component { SeriesPage {} } + cover: Component { CoverPage {} } allowedOrientations: Orientation.All _defaultPageOrientations: Orientation.All From c8df3ce1ea71d51edaf5ec76a338aaeac3aa05cd Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:58 +0200 Subject: [PATCH 07/30] Use page stack with urls instead of components --- qml/pages/AboutPage.qml | 5 ++--- qml/pages/SeasonPage.qml | 14 +++++--------- qml/pages/SeriesPage.qml | 15 ++++----------- qml/pages/SettingsPage.qml | 1 - qml/pages/ShowPage.qml | 9 ++++----- qml/pages/SurveyPage.qml | 9 ++------- 6 files changed, 17 insertions(+), 36 deletions(-) diff --git a/qml/pages/AboutPage.qml b/qml/pages/AboutPage.qml index e3242ea..fcd95f8 100644 --- a/qml/pages/AboutPage.qml +++ b/qml/pages/AboutPage.qml @@ -86,10 +86,9 @@ Page { } } - Component { id: statisticsComponent; StatisticsPage {} } onStatusChanged: { - if (status === PageStatus.Active) { - pageStack.pushAttached(statisticsComponent); + if (status === PageStatus.Active && !canNavigateForward) { + pageStack.pushAttached(Qt.resolvedUrl("StatisticsPage.qml")); } } } diff --git a/qml/pages/SeasonPage.qml b/qml/pages/SeasonPage.qml index 5433947..375a13b 100644 --- a/qml/pages/SeasonPage.qml +++ b/qml/pages/SeasonPage.qml @@ -69,15 +69,11 @@ Page { delegate: EpisodeListRowDelegate { episode: model - Component { - id: episodePageComponent - EpisodePage { - show: seasonPage.show; - episode: model; - seasonImg: season.seasonImage - } - } - onClicked: pageStack.push(episodePageComponent.createObject(pageStack)) + onClicked: pageStack.push(Qt.resolvedUrl("EpisodePage.qml"), { + show: seasonPage.show, + episode: model, + seasonImg: season.seasonImage, + }) onWatchToggled: { python.call('seriesfinale.seriesfinale.series_manager.set_episode_watched', [watched, seasonPage.show.showName, model.episodeName]); } diff --git a/qml/pages/SeriesPage.qml b/qml/pages/SeriesPage.qml index f9a379e..edb4f02 100644 --- a/qml/pages/SeriesPage.qml +++ b/qml/pages/SeriesPage.qml @@ -115,13 +115,11 @@ Page { MenuItem { text: qsTr("About") - onClicked: pageStack.push(aboutComponent.createObject(pageStack)) - Component { id: aboutComponent; AboutPage {} } + onClicked: pageStack.push(Qt.resolvedUrl("AboutPage.qml")) } MenuItem { text: qsTr("Settings") - onClicked: pageStack.push(settingsComponent.createObject(pageStack)) - Component { id: settingsComponent; SettingsPage {} } + onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml")) } MenuItem { text: qsTr("Refresh") @@ -134,8 +132,7 @@ Page { MenuItem { text: qsTr("Add Show") visible: !seriesPage.isUpdating - onClicked: { pageStack.push(addShowComponent.createObject(pageStack)) } - Component { id: addShowComponent; AddShow {} } + onClicked: { pageStack.push(Qt.resolvedUrl("AddShow.qml")) } } MenuLabel { @@ -169,10 +166,6 @@ Page { subtitle: model.infoMarkup iconSource: model.coverImage priority: model.priority - Component { - id: showPageComponent - ShowPage { show: model } - } Component { id: contextMenu @@ -211,7 +204,7 @@ Page { } onClicked: { - pageStack.push(showPageComponent.createObject(pageStack)); + pageStack.push(Qt.resolvedUrl("ShowPage.qml"), {show: model}); } } diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml index baf5158..5fe58e4 100644 --- a/qml/pages/SettingsPage.qml +++ b/qml/pages/SettingsPage.qml @@ -42,7 +42,6 @@ Dialog { python.call('seriesfinale.seriesfinale.settingsWrapper.getHighlightSpecial', [], function(result) { highlightSpecialSwitch.checked = result; }) - seriesPage.hasChanged = true } SilicaFlickable { diff --git a/qml/pages/ShowPage.qml b/qml/pages/ShowPage.qml index 580f1a7..aa3bb4d 100644 --- a/qml/pages/ShowPage.qml +++ b/qml/pages/ShowPage.qml @@ -154,10 +154,6 @@ Page { subtitle: model.seasonInfoMarkup iconSource: model.seasonImage - Component { - id: seasonPageComponent - SeasonPage { show: showPage.show; season: model } - } Component { id: contextMenu ContextMenu { @@ -188,7 +184,10 @@ Page { }) } - onClicked: pageStack.push(seasonPageComponent.createObject(pageStack)) + onClicked: pageStack.push(Qt.resolvedUrl("SeasonPage.qml"), { + show: showPage.show, + season: model, + }) } ViewPlaceholder { diff --git a/qml/pages/SurveyPage.qml b/qml/pages/SurveyPage.qml index 4d21c92..c477c48 100644 --- a/qml/pages/SurveyPage.qml +++ b/qml/pages/SurveyPage.qml @@ -68,8 +68,7 @@ Page { MenuItem { text: qsTr("Add Show") visible: !isUpdating - onClicked: { pageStack.push(addShowComponent.createObject(pageStack)) } - Component { id: addShowComponent; AddShow {} } + onClicked: { pageStack.push(Qt.resolvedUrl("AddShow.qml")) } } MenuLabel { @@ -103,10 +102,6 @@ Page { subtitle: model.infoMarkup priority: model.priority iconSource: model.coverImage - Component { - id: showPageComponent - ShowPage { show: model } - } Component { id: contextMenu @@ -135,7 +130,7 @@ Page { } onClicked: { - pageStack.push(showPageComponent.createObject(pageStack)); + pageStack.push(Qt.resolvedUrl("ShowPage.qml"), {show: model}); } } From 3e3bb0d714b5d7561e79fc55dc3874f1615f3ad9 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:07:59 +0200 Subject: [PATCH 08/30] Add Opal items to gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 582ec9e..fd60946 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,15 @@ *.user* build/ +build-release/ dist/ __pycache__ rpm/*.rpm TODO *~ MANIFEST + +icons-src/raw +icons-src/*/raw + +libs/opal-translations +libs/opal-docs From e446dfa4ce73f4b9869d39942e678001526b2a30 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:06 +0200 Subject: [PATCH 09/30] Update svg files and more them to icons-src --- data/seriesfinale.svg | 171 ---------------------------- data/seriesfinale_cover.svg | 174 ----------------------------- icons-src/harbour-seriesfinale.svg | 3 + icons-src/seriesfinale_cover.svg | 36 ++++++ 4 files changed, 39 insertions(+), 345 deletions(-) delete mode 100644 data/seriesfinale.svg delete mode 100644 data/seriesfinale_cover.svg create mode 100644 icons-src/harbour-seriesfinale.svg create mode 100644 icons-src/seriesfinale_cover.svg diff --git a/data/seriesfinale.svg b/data/seriesfinale.svg deleted file mode 100644 index 00cd763..0000000 --- a/data/seriesfinale.svg +++ /dev/null @@ -1,171 +0,0 @@ - - - -image/svg+xmlimage/svg+xml \ No newline at end of file diff --git a/data/seriesfinale_cover.svg b/data/seriesfinale_cover.svg deleted file mode 100644 index 200a6ca..0000000 --- a/data/seriesfinale_cover.svg +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/icons-src/harbour-seriesfinale.svg b/icons-src/harbour-seriesfinale.svg new file mode 100644 index 0000000..e80e086 --- /dev/null +++ b/icons-src/harbour-seriesfinale.svg @@ -0,0 +1,3 @@ + + +image/svg+xmlimage/svg+xml diff --git a/icons-src/seriesfinale_cover.svg b/icons-src/seriesfinale_cover.svg new file mode 100644 index 0000000..de82471 --- /dev/null +++ b/icons-src/seriesfinale_cover.svg @@ -0,0 +1,36 @@ + + + + + + + image/svg+xml + + + + + + +   + + + + + image/svg+xml + + + + + + + + + + + + + + + + + From d565aec6af89f4f2230f7e643da036744ff6ca51 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:07 +0200 Subject: [PATCH 10/30] Add svg source for placeholder image --- icons-src/placeholderimage.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 icons-src/placeholderimage.svg diff --git a/icons-src/placeholderimage.svg b/icons-src/placeholderimage.svg new file mode 100644 index 0000000..4ed7e02 --- /dev/null +++ b/icons-src/placeholderimage.svg @@ -0,0 +1,3 @@ + + +image/svg+xmlMirian Margiani From 006cff5c4b7f15ed0ff9eb1594b248bbf4c74d8b Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:09 +0200 Subject: [PATCH 11/30] Use standard icon sizes --- harbour-seriesfinale.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harbour-seriesfinale.pro b/harbour-seriesfinale.pro index 56a0563..1c39430 100644 --- a/harbour-seriesfinale.pro +++ b/harbour-seriesfinale.pro @@ -29,7 +29,7 @@ OTHER_FILES += qml/harbour-seriesfinale.qml \ translations/*.ts \ harbour-seriesfinale.desktop -SAILFISHAPP_ICONS = 86x86 108x108 128x128 256x256 +SAILFISHAPP_ICONS = 86x86 108x108 128x128 172x172 INSTALLS += src From d697dbc4656d43850e3ac86a2dcba922fe506fe8 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:11 +0200 Subject: [PATCH 12/30] Add opal-render-icons and render all images --- icons-src/render-icons.sh | 63 ++++++++ icons/108x108/harbour-seriesfinale.png | Bin 3775 -> 2191 bytes icons/128x128/harbour-seriesfinale.png | Bin 4681 -> 2630 bytes icons/172x172/harbour-seriesfinale.png | Bin 0 -> 3568 bytes icons/256x256/harbour-seriesfinale.png | Bin 9875 -> 0 bytes icons/86x86/harbour-seriesfinale.png | Bin 3028 -> 1796 bytes libs/opal-render-icons.sh | 197 +++++++++++++++++++++++++ qml/cover/seriesfinale_cover.png | Bin 2349 -> 0 bytes qml/images/harbour-seriesfinale.png | Bin 0 -> 5582 bytes qml/images/seriesfinale_cover.png | Bin 0 -> 1484 bytes src/SeriesFinale/placeholderimage.png | Bin 4184 -> 4146 bytes 11 files changed, 260 insertions(+) create mode 100755 icons-src/render-icons.sh create mode 100644 icons/172x172/harbour-seriesfinale.png delete mode 100644 icons/256x256/harbour-seriesfinale.png create mode 100644 libs/opal-render-icons.sh delete mode 100644 qml/cover/seriesfinale_cover.png create mode 100644 qml/images/harbour-seriesfinale.png create mode 100644 qml/images/seriesfinale_cover.png diff --git a/icons-src/render-icons.sh b/icons-src/render-icons.sh new file mode 100755 index 0000000..da4e6da --- /dev/null +++ b/icons-src/render-icons.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# +# This file is part of Opal and has been released into the public domain. +# SPDX-License-Identifier: CC0-1.0 +# SPDX-FileCopyrightText: 2021-2023 Mirian Margiani +# +# See https://github.com/Pretty-SFOS/opal/blob/main/snippets/opal-render-icons.md +# for documentation. +# +# @@@ keep this line: based on template v1.0.0 +# +c__FOR_RENDER_LIB__="1.0.0" + +# Run this script from the same directory where your icon sources are located, +# e.g. /icons-src. +source ../libs/opal-render-icons.sh +cFORCE=false + +for i in raw/*.svg; do + if [[ "$i" -nt "${i#raw/}" ]]; then + scour "$i" > "${i#raw/}" + fi +done + +cMY_APP=harbour-seriesfinale + +cNAME="app icons" +cITEMS=("$cMY_APP") +cRESOLUTIONS=(86 108 128 172) +cTARGETS=(../icons/RESXxRESY) +render_batch + +cNAME="status icons" + +cITEMS=("placeholderimage") +cRESOLUTIONS=(400x578) +cTARGETS=(../src/SeriesFinale) +render_batch + +cITEMS=("$cMY_APP@256") +cRESOLUTIONS=(F1) +cTARGETS=(../qml/images) +render_batch + +cITEMS=("seriesfinale_cover") +cRESOLUTIONS=(204x230) +cTARGETS=(../qml/images) +render_batch + +# cNAME="store icon" +# cITEMS=("$cMY_APP") +# cRESOLUTIONS=(172) +# cTARGETS=(../dist) +# render_batch + +# cNAME="banner image" +# cITEMS=(../dist/banner) +# cRESOLUTIONS=( +# 1080x540++-large +# 540x270++-small +# ) +# cTARGETS=(../dist) +# render_batch diff --git a/icons/108x108/harbour-seriesfinale.png b/icons/108x108/harbour-seriesfinale.png index 0d3323f1237a3849a0ce79a729be98cd81026094..0e84f624d21fa7c542901e7cefea59055af52b00 100644 GIT binary patch delta 2154 zcmV-w2$lE09gh)^865-w001R#pGE)x010qNS#tmY5{du-5{dzP!K)&XMkjv=97#k$ zRCwCmoNH_p*A>Tq=kBgC*bdkZYE7|uCN`zyWg-`B2pHu->{^7#E|g%Dw30udG!-gI z8~Pz>RaI$F)ru%lKcs2thbAEv#Q`;u5)66BHIF2asw6yQ2U0;wOr2sJ@MEVRyk75P zW_M=i&h9vOKX`Wkdw1r4|L1?4d(N4W#lXw)WM1CfaETPCX-1(cB&7PKk1K(Gqi?9^ zu`j$lvv@)5@v2~*RH-T|Wwrzbg_ylAsE_2Nd@P5iA8H=-HL;bvN;)&_|bm^v@J0)Kk&Jzo%O36!sqR#|^7Ax9de!ah(t z13O!Lb4aW$GPLfT=&s4b%jVzEsc}e~Jfzw$fw)s2q zjH<}M%$(92QqSdWYwphqv9@`E9kSXJjm(ixWy|+=c}%P=q_**xj9udi^MrKIo z$amMB(?+aq%HYe=kRuaJM9v3R-*+tiHLLVr*-(7#bsE5kyv#-xk+PAF-E|s>Z7d5O zpe{!w%#q^o8@t!KB=*2eI=Lyw8YLr>jF-|;OG&I{s_bKyPfUL>9t-l9-FIe4tYva& zuW^&J3o2$26^LUJ`7GpiW~P}FhvmsD?YCwS6fUHZ>vpW zZK2^8jZ)`v>lnk)cON)flJ{dMo^c#Ijc50K(-yHy+gO@OSpJNiTn69*Z#i0$e{z*! zhB(Wfh}MqWpdj$)U4gVwv1NYvLnrl?N_bbwDsJOxzHon#3oc?6ukwkD43dW%pGl+G z(C^64d{Z^(BPH5TaMVq0%z?%9amsb_B^&lFvm~Z|kgz{yNbdqCSZZR?X4~yNuII3h zl1PjvEQo)#h1jAiZQV~kHFh#SZs#%|=}DdI+iOjUo!?~4(v_8;;|#Tg(kfBT4303O zA^!(ZKQSTJ65vstMMnpPEKWP?+YIobzVfDVUv(0(t82JHXXSL7PgqVM<*YI)ILffb z>Mi`EWK-OP#=;N`4l!0{p z)2QNDq+rq7A6c=dJW8x-PD}uEZGz)in71iQh)H8}mH?;lsJKFL;Hm|!e& zgg$>(njnRIi{tzcFYLsqj}nuWx-?20BfLvFvy+e-6kVEIbmPW&AQ&NLtk9=XB65f; zEKfita|{3Czj{q@d=w2-gM!8dd?U4oxmndAI=LZwf>ES~JUX?TV9YjM4+>Om`WC+% zdYxQld2D~0YEJSW?V&1W)PVw7pjV?rZd)TA4SXiKdN^eYXY}^?~3j%zdI*&rt*j{#do@&WswwE4O z%gV&wD{u$Zo`k9>vr2V!E1C{4A-J4uP8g$)N;#%+HT zBM_rP@{z<4E3&kMe)=uvB_9oNjx%u)z{>XkWVi6*F6fvAX63p5+vS9%O&zR>%OS_#2-^KCiHMrXpobvKQp92jDRKJxE*a z+Rg-_m8^RFvaZpk;zZHNGat*25_Xqgx%~nEXcRw7rK8|qKT5qdsEMPIv#V3?yvwg1 zmZ6XN#g9@U$}c4JT0=O!V#Wler~K$)I?`a}M-NMnxhOR8g+`ep${!x4|4g10n))@$ zS)rK?jWiUR6TQi!{H{@^h?;*m8hMli`=P@2FbSSGeMX1Gf;kKmN^cSzZ{HO;)Tq?U zB)EYM1nG#|XdTY|d%@ov_WQYAbjUiD)6}sg7=xsU8lq^VpX&>2g3UC;v(&(^*|UzuV$rp*c~TJg(|7KR4pkS4X3)7n**k-f}|Eo8?lu@UU!{v~ogZ zB6UI3SIq=nwBII1FIYkuJ=ycH>}?w19(h6?{ROKeXpc_xKc2)LsiaTrV9Mm%vH6}e gED-z2>Clh=4@4f7fDaccoB#j-07*qoM6N<$f@+oo!2kdN delta 3750 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 Q9RL6T07*qoM6N<$g3c^BP5=M^ diff --git a/icons/128x128/harbour-seriesfinale.png b/icons/128x128/harbour-seriesfinale.png index 4d45810d92a55c33e7d0e5acf659cef85d7bf535..63ee8439632679ca36fe4e5a8b839b56b353793e 100644 GIT binary patch delta 2596 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 diff --git a/icons/172x172/harbour-seriesfinale.png b/icons/172x172/harbour-seriesfinale.png new file mode 100644 index 0000000000000000000000000000000000000000..f926415c08cc69cca2726dd92d2f466e4f1eb899 GIT binary patch literal 3568 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 OL262xie(C@*Z%{^N}?P9 diff --git a/icons/86x86/harbour-seriesfinale.png b/icons/86x86/harbour-seriesfinale.png index 3fd38ce0520868e582f940b441856b3e63bec242..3b7b15cff33ed0a81d8c0d2ceadc8a6d1c20506b 100644 GIT binary patch delta 1756 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 diff --git a/libs/opal-render-icons.sh b/libs/opal-render-icons.sh new file mode 100644 index 0000000..0199e49 --- /dev/null +++ b/libs/opal-render-icons.sh @@ -0,0 +1,197 @@ +#!/bin/bash +# +# This file is part of Opal and has been released under the Creative Commons +# Attribution-ShareAlike 4.0 International License. +# SPDX-License-Identifier: CC-BY-SA-4.0 +# SPDX-FileCopyrightText: 2018-2023 Mirian Margiani +# +# See https://github.com/Pretty-SFOS/opal/blob/main/snippets/opal-render-icons.md +# for documentation. +# +# @@@ FILE VERSION $c__OPAL_RENDER_ICONS_VERSION__ +# + +c__OPAL_RENDER_ICONS_VERSION__="1.0.0" +# c__FOR_RENDER_LIB__=version must be set in module release scripts + +shopt -s extglob + +cFIELD_INDICATOR="F" +cFILE_SUFFIX="svg" +cRESOLUTION_CHECK='^[0-9]+$' +cDEPENDENCIES=(inkscape pngcrush) + +function check_dependencies() { + for dep in "${cDEPENDENCIES[@]}"; do + if ! which "$dep" 2> /dev/null >&2; then + printf "error: %s is required\n" "$dep" >&2 + exit 1 + fi + done +} + +function log() { + IFS=' ' printf -- "%s\n" "$*" >&2 +} + +function verify_version() { + # @@@ shared function version: 1.1.1 + local user_version_var="c__FOR_RENDER_LIB__" + local opal_version_var="c__OPAL_RENDER_ICONS_VERSION__" + + if [[ -z "${!user_version_var}" ]]; then + log "error: script compatibility cannot be verified" + log " make sure $user_version_var is set" + exit 1 + fi + + if [[ ! "${!user_version_var}" =~ ^[0-9]+.[0-9]+.[0-9]+$ ]] && [[ ! "${!user_version_var}" =~ ^[0-9]+.[0-9]+.[0-9]+[-+] ]]; then + # we don't verify pre-release versions and build metadata (i.e. everything after "-" or "+") + log "error: variable $user_version_var='${!user_version_var}' does not contain a valid version number" + exit 1 + fi + + local major="${!user_version_var%%.*}" + local minor="${!user_version_var#*.}"; minor="${minor%.*}" + # shellcheck disable=SC2034 + local patch="${!user_version_var##*.}" + + local opal_major="${!opal_version_var%%.*}" + local opal_minor="${!opal_version_var#*.}"; opal_minor="${opal_minor%.*}" + # shellcheck disable=SC2034 + local opal_patch="${!opal_version_var##*.}" + + if [[ "$opal_major" == 0 && "$major" == "$opal_major" && "$minor" != "$opal_minor" ]]; then + log "module script: ${!user_version_var}, opal library script: ${!opal_version_var}" + log "warning: unstable API has changed, please check the script" + log " if everything is fine, update $user_version_var" + exit 1 + fi + + if (( "$opal_major" > "$major" )); then + log "module script: ${!user_version_var}, opal library script: ${!opal_version_var}" + log "error: please update the script for the current major library version ($opal_major vs. $major)" + exit 1 + fi + + if (( "$opal_major" < "$major" || "$opal_minor" < "$minor" )); then + log "module script: ${!user_version_var}, opal library script: ${!opal_version_var}" + log "warning: the script expects a newer public API ($opal_major.$opal_minor vs. $major.$minor)" + log " please update the library" + exit 1 + fi +} + +# make sure script and library are compatible +verify_version + +# check dependencies immediately after loading the script +# If the user changes cDEPENDENCIES later, they can re-run this command. +check_dependencies + +function do_render_single() { # 1: input, 2: width, 3: height, 4: output + printf "rendering %s to %s at %sx%s" "$1" "$4" "$2" "$3" + # replace '-o' by '-z -e' for inkscape < 1.0 + inkscape -o "$4" -w "$2" -h "$3" "$1" && pngcrush -ow "$4" +} + +function split_at_sign() { # 1: string with values separated by @, |, + + unset OPAL_SPLIT_RES + + if [[ -n "$2" ]]; then + if [[ "$2" =~ ^[@|+]$ ]]; then + split="$2" + else + printf "error: invalid split character '%s'" "$2" + exit 255 + fi + else + split="@" + fi + + mapfile -d $'\0' -t OPAL_SPLIT_RES < <(printf "%s" "$@" | sed "s/\\\\$split/__SIGN_REPLACED__/g;" |\ + tr "$split" '\0' | sed "s/__SIGN_REPLACED__/$split/g") +} + +function render_batch() { # 1: keep or unset config after rendering? + # no arguments required, all info has to be set as variables + keep_config="$1" # 'keep' or empty + + printf "rendering %s...\n" "$cNAME" + local use_res use_loc source target + + for item in "${cITEMS[@]}"; do + split_at_sign "$item" "@" + item_split=("${OPAL_SPLIT_RES[@]}") + source="${item_split[0]}.$cFILE_SUFFIX" + + if [[ ! -f "$source" ]]; then + printf "error: source item '%s' not found\n" "$source" + continue + fi + + if [[ "$cRESOLUTIONS" == ${cFIELD_INDICATOR}* ]]; then + split_at_sign "${item_split[${cRESOLUTIONS#$cFIELD_INDICATOR}]}" "|" # format: res[|res[|...]] + use_res=("${OPAL_SPLIT_RES[@]}") + else + use_res=("${cRESOLUTIONS[@]}") + fi + + if [[ "$cTARGETS" == ${cFIELD_INDICATOR}* ]]; then + split_at_sign "${item_split[${cTARGETS#$cFIELD_INDICATOR}]}" "|" # format: loc[|loc[|...]] + use_loc=("${OPAL_SPLIT_RES[@]}") + else + use_loc=("${cTARGETS[@]}") + fi + + for res in "${use_res[@]}"; do + split_at_sign "$res" "+" # format: X[xY][+prefix[+suffix]] + res_split=("${OPAL_SPLIT_RES[@]}") + local res_x="${res_split[0]}" + local res_y="${res_split[0]}" + + if [[ "${res_split[0]}" == *x* ]]; then + res_x="${res_split[0]%%x*}" + res_y="${res_split[0]##*x}" + fi + + if [[ ! "$res_x" =~ $cRESOLUTION_CHECK ]]; then + printf "error: x-resolution '$res_x' is not a number\n" + continue + fi + + if [[ ! "$res_y" =~ $cRESOLUTION_CHECK ]]; then + printf "error: y-resolution '$res_y' is not a number\n" + continue + fi + + for loc in "${use_loc[@]}"; do + loc="$(printf "%s" "$loc" | sed "s/RESX/${res_x}/g; s/RESY/${res_y}/g")" + + mkdir -p "$loc" || { + printf "error: failed to create target directory '%s'\n" "$loc" + continue + } + + # target =
.png + local prefix="${res_split[1]}" + local suffix="${res_split[2]}" + target="$(printf "%s" "$loc/$cPREFIX$prefix$(basename "$source")" | sed "s/\.$cFILE_SUFFIX$//I")$suffix$cSUFFIX.png" + if [[ "$source" -nt "$target" ]] || [[ "$cFORCE" == true ]]; then + do_render_single "$source" "$res_x" "$res_y" "$target" || { + printf "error: failed to render '%s' at %sx%s\n" "$source" "$res_x" "$res_y" + continue + } + else + printf "nothing to be done for '%s' at %sx%s\n" "$source" "$res_x" "$res_y" + continue + fi + done + done + done + + if [[ "$keep_config" != "keep" ]]; then + unset cNAME cITEMS cRESOLUTIONS cTARGETS cSUFFIX cPREFIX + # cFORCE is always preserved + fi +} diff --git a/qml/cover/seriesfinale_cover.png b/qml/cover/seriesfinale_cover.png deleted file mode 100644 index 316de387478aeeb9edf5b38caeec53d3b49e7154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 zcmd5;_fykp6Auw2AgG8^Y~iQ}gct$kRcS|)NQoe#1VWMCf1gLJv22OXKz2$_;6Ox)#7M{6AUz-wAwYueO73!39lhcueBMu$viX&AUE);7 z*ui9$z!0Z10xspd3~J&23i^lmH}p8n&j8`pQxA#=nbyv?n9g zw@q9`63vgXnF$twvG`mZOn}%7g9`@OMe`TAaPV>#4sjy~XAo{Bu9ih!3Q6!Qdy&&7 zR#oiyFc2aHK*@jB82Td zvayCiAoa@R)hP_<+@}G+1bOyOpI|r9D~E1Bol4Hra<;g;h2?zbCwx&Vh+V<;HS|7L z)e4rA5N4nyvTvDoMt96zR=zH1gO};EKhBvg9}hXnLu5Bm^-MCDDHTcuJdBKQ@`t~q z4ghE9Fi-n*2-}do;5L86W00Jp0uRLrL}Gkq{+4kggR{DlHk55vFxJela-zSR@Pk=# z^arSk?_R*lTL-)j6BE+`K3!Z$O3br0`l7A!b;7xRo|rdnvYwCjP4D-*zR^-dvZXxK z-AWluSqY87yy2rvVVgOm;XW&`AlgxCz%9|cD(Hv=r{ zy7s%uW8!W&k|;$kl!;U zB4TBT>Tc)=_jXn(O@r4&=aztdx+{@bH=S>*}D9i$3k}% zqP~`uBZ|}2Q#n1@095<|QIjL;YZyhEF9OEsb3QeWJ7cQg8?VhKx|0CiT&+K}o^$ z+H_VL#QDfZp7T(@v1hC6+-h+X=5PJJ0|fv>oSDb}Jjs7zYQ7NW*R2YKL%5A3jNj3= z&9;{_36Hj6oJ#I?(^lxWnt-(E`nO9%>@5SgLsJgvm3m3_9ToW%?jtRL%`+B9zZ9>wP$Z4c!KG?T$-1^y-q~qaEQthCkM2MiI93_ZA2U+@)JL zqB>ma4HY45ZH~E9Z#oPhS(hNdCYj6Gehtmf`cS*p_tR;!C?2Tipzhil7quuxPucj4 z`y9hphV!pr1;zQ?k$xyHJV@Zv&9q-$y%LyBrlO&`G2cNrk%?kJINkNZ+;5z0Pmyle znl(fN8o59Pt!2GN!q)jAh$&QjN= zWH0=j9{#`9Lv6DQ^Fw^H?fB#Hjmudg_T*+&8UN}d zItdvw2Tkgr(n$8{lmFpXuACaw#?<_G$i+pa3)g*PnUvb;X_N{x}0RVINh4Whalk~uGjp%z8YMsGha zNs?2bSS++;gKg90B9ds*Ex8V_=<7BMI*2HbRxy43L9(0z56-B|7;MY$1i5G+tU*L6 zFhpUmwSOuIyhD1gnnr3TNJ@GqG0o|Yf+eD~?5I66#j>Qn(v`f#FCP@9- z!*}7tE}kA4a`MmOx96jk@HMVkui^LKpZ}7$sEK&_9s`fy)l+@JT1d$^RE?2-liRg~ zDfH=ZydmR2hEEo{Htv|b;b(g}D}uK#_BzzfVw%117JXa4E$SB(m6r7LbA#ifca^Tag&Zn~dhgEB3 zW{MM}!Uh7JcAPQVSq_-Vy0q0{tf`fqr7>j6__e3%Z~;9*iB=BI^|=SX{i+!_5x=Q< zLaktB=jL;aY*jL%ku`2#69Gq%gF-~)6fSiK*Su=zSburGZkxECq`s+pJ5v*@y%`Z6 z1mofSOSe6nijb!-ZW}6pJIzBJOb8CiZq7(VEfafbVj>A^+cS0~9*L?=*#GZ)!vBc0 Ze7i~SGzDrC>y>{-Anjf4s5bt${sE1+F(Uu~ diff --git a/qml/images/harbour-seriesfinale.png b/qml/images/harbour-seriesfinale.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8dc0d535578e89685851ba371b04b4a6365c97 GIT binary patch literal 5582 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 literal 0 HcmV?d00001 diff --git a/qml/images/seriesfinale_cover.png b/qml/images/seriesfinale_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..a63c801db5f0eb3771c2115d95862303f3e7bd4c GIT binary patch literal 1484 zcmchXX;2af6o5fRO+4C#Ra47$GG|*!Nk#J*wLDRzBum9a(X^#RQz*|ouuKbcGEF8U zHx(0C$xJXj5Up%+i4wd(Sl7)c!J}i+EYW4B*?;?Ef9;R=y*F>>{djNYedUMI!6rsl zMgRc71Q`;5(Pp7Gl!kg*y4W=A(WWhDLSje&fa#;Z1Nbz(<%G7mjT{(FK9Zh7&cbIV z1G2KR90_TsNlExK$&TrnC+n8HtpET}3^L$AWVUQkF`e50hnCJ_B3CF_=+frFNt-hI zwQ#jP{#e!W+VhHM4t8x#bN)VM!!JPmtqDcn^8x-}0W8&4TId=B^(}S20R zAo!+|biZ-I_*X$69ED8auu+ zP_cg{ExG*F2&G%SFIc;eO!m4Sh92%Om0~r4%dYWGvM4xlqq))n=8z3eN{4p%QgV38 z!p^Rs%nt8@95d2+@k2}8E^f`bJHM|tG-;*0FJ^X|Ade>egn*bKI`_iuS=&gz*iG)W z3|17f!SJ=iB3Jg#$@!SG8P@hzobVGtKJA@-w5?l(M30{l6gdHVHe&x2!j}x2I0BW0 zaV`RID!;Acz{{{iK~r`A7zXL+m2s-EsuErgUasdFvx_Gb1J8)G{C7|M`eVU@f@dS9 zz75Ck-O{76(-Rl(!TP>dlWWa zrA;N5DZ*I@KaGpy(}=SL9+GZ)cTYm=Xf3!Tndb*3P?!jwZ6RZUNOf-J$?-Kw-*&M~ z6pvEbL(t+us+o5L_`06KgDl+?hz)8BRRra0Ul9I(z;tkdQo@uM2`D85c@cq9!hHyo zfXE?&OQ`3f2ry&<0SUkQ7-I|(ms>s+4EnUtUXUJuR#{qGB^Z8%R&9px|KzuS#`yp0!_iy52Jz-I THh@EJS`!11f#?9%!34@*y$6{g literal 0 HcmV?d00001 diff --git a/src/SeriesFinale/placeholderimage.png b/src/SeriesFinale/placeholderimage.png index 92b2aaed2198139c8d752d421ae397f19638b240..a407fc7e8b140483e8e8568a6427a36972da9427 100644 GIT binary patch literal 4146 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 o+Y Date: Tue, 12 Aug 2025 15:08:15 +0200 Subject: [PATCH 13/30] Add (disabled) Sailjail profile and backup section --- harbour-seriesfinale.desktop | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/harbour-seriesfinale.desktop b/harbour-seriesfinale.desktop index e88fdc4..43a00dd 100644 --- a/harbour-seriesfinale.desktop +++ b/harbour-seriesfinale.desktop @@ -4,3 +4,16 @@ X-Nemo-Application-Type=silica-qt5 Icon=harbour-seriesfinale Exec=sailfish-qml harbour-seriesfinale Name=SeriesFinale + +[X-Sailjail] +Sandboxing=Disabled + +## Enabling Sailjail would require migrating data from +## .local/share/harbour-seriesfinale/ to .local/share/harbour-seriesfinale/harbour-seriesfinale +# Permissions=Internet +# OrganizationName=harbour-seriesfinale +# ApplicationName=harbour-seriesfinale + +[X-HarbourBackup] +BackupPathList=.local/share/harbour-seriesfinale/:.cache/harbour-seriesfinale:.config/harbour-seriesfinale +BackupConfigList=/apps/harbour-seriesfinale/ From e5f1b929176e79314162bf43cac2606203b30ff1 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:16 +0200 Subject: [PATCH 14/30] Update placeholder image --- src/SeriesFinale/placeholderimage.png | Bin 4146 -> 4185 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/SeriesFinale/placeholderimage.png b/src/SeriesFinale/placeholderimage.png index a407fc7e8b140483e8e8568a6427a36972da9427..5aca7c78375f60236f286ee6f33882f6cd470e87 100644 GIT binary patch delta 3504 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 From abbf5f2fd81c70fb7b1b0b521b617ee18b1ea1da Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:17 +0200 Subject: [PATCH 15/30] Rewrite cover page --- qml/cover/CoverPage.qml | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/qml/cover/CoverPage.qml b/qml/cover/CoverPage.qml index f55dd7e..dbf69d3 100644 --- a/qml/cover/CoverPage.qml +++ b/qml/cover/CoverPage.qml @@ -4,19 +4,36 @@ import Sailfish.Silica 1.0 CoverBackground { id: coverPage - Image { - source: coverImage - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width - height: parent.height - fillMode: Image.PreserveAspectCrop - clip: true - opacity: 0.5 + Item { + anchors.fill: parent + opacity: 0.9 + + Image { + id: backgroundImage + source: coverImage + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + height: parent.height + fillMode: Image.PreserveAspectCrop + clip: true + } + + OpacityRampEffect { + sourceItem: backgroundImage + direction: OpacityRamp.TopToBottom + slope: 2.0 + offset: 0.3 + } } Label { id: label - anchors.centerIn: parent + anchors { + bottom: parent.bottom + bottomMargin: Theme.paddingMedium + horizontalCenter: parent.horizontalCenter + } + text: 'SeriesFinale' font.pixelSize: Theme.fontSizeLarge color: Theme.highlightColor From 4bba322067da79abae778807ef1717d60557377b Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:25 +0200 Subject: [PATCH 16/30] Add Opal modules: About, Delegates, LinkHandler, MenuSwitch, SmartScrollbar --- harbour-seriesfinale.pro | 1 + libs/module_opal-about.txt | 21 +++ libs/module_opal-delegates.txt | 21 +++ libs/module_opal-linkhandler.txt | 21 +++ libs/module_opal-menuswitch.txt | 21 +++ libs/module_opal-smartscrollbar.txt | 21 +++ qml/modules/Opal/About/AboutPageBase.qml | 143 ++++++++++++++++ qml/modules/Opal/About/Attribution.qml | 21 +++ qml/modules/Opal/About/ChangelogItem.qml | 14 ++ qml/modules/Opal/About/ChangelogList.qml | 10 ++ qml/modules/Opal/About/ChangelogNews.qml | 64 +++++++ qml/modules/Opal/About/ContributionGroup.qml | 10 ++ .../Opal/About/ContributionSection.qml | 8 + qml/modules/Opal/About/DonationService.qml | 8 + qml/modules/Opal/About/InfoButton.qml | 9 + qml/modules/Opal/About/InfoSection.qml | 106 ++++++++++++ qml/modules/Opal/About/License.qml | 39 +++++ .../Opal/About/OpalAboutAttribution.qml | 11 ++ .../About/private/ChangelogItemsLoader.qml | 18 ++ .../Opal/About/private/ChangelogPage.qml | 18 ++ .../Opal/About/private/ChangelogView.qml | 79 +++++++++ .../ContributorsAttributionRepeater.qml | 27 +++ .../Opal/About/private/ContributorsPage.qml | 43 +++++ qml/modules/Opal/About/private/DetailList.qml | 22 +++ .../Opal/About/private/DonationsGroup.qml | 12 ++ .../Opal/About/private/LicenseListPart.qml | 121 +++++++++++++ .../About/private/LicenseListRepeater.qml | 18 ++ .../Opal/About/private/LicensePage.qml | 59 +++++++ .../About/private/OpalAttributionsLoader.qml | 60 +++++++ .../Opal/About/private/ScrollbarType.qml | 11 ++ qml/modules/Opal/About/private/functions.js | 6 + qml/modules/Opal/About/private/qmldir | 18 ++ qml/modules/Opal/About/private/worker_spdx.js | 5 + qml/modules/Opal/About/qmldir | 17 ++ .../Attributions/OpalAboutAttribution.qml | 11 ++ .../Attributions/OpalDelegatesAttribution.qml | 11 ++ .../OpalLinkHandlerAttribution.qml | 11 ++ .../OpalMenuSwitchAttribution.qml | 11 ++ .../OpalSmartScrollbarAttribution.qml | 11 ++ qml/modules/Opal/Delegates/DelegateColumn.qml | 12 ++ .../Opal/Delegates/DelegateIconButton.qml | 57 +++++++ .../Opal/Delegates/DelegateIconItem.qml | 12 ++ .../Opal/Delegates/DelegateInfoItem.qml | 121 +++++++++++++ .../Opal/Delegates/OneLineDelegate.qml | 21 +++ qml/modules/Opal/Delegates/OptionalLabel.qml | 20 +++ qml/modules/Opal/Delegates/PaddedDelegate.qml | 159 ++++++++++++++++++ .../Opal/Delegates/ThreeLineDelegate.qml | 38 +++++ .../Opal/Delegates/TwoLineDelegate.qml | 30 ++++ .../Delegates/private/OptionalDragHandle.qml | 22 +++ .../Opal/Delegates/private/PaddingData.qml | 21 +++ qml/modules/Opal/Delegates/qmldir | 14 ++ qml/modules/Opal/LinkHandler/LinkHandler.js | 5 + .../LinkHandler/private/ExternalUrlPage.qml | 63 +++++++ qml/modules/Opal/LinkHandler/private/qmldir | 5 + qml/modules/Opal/LinkHandler/qmldir | 5 + qml/modules/Opal/MenuSwitch/MenuSwitch.qml | 32 ++++ qml/modules/Opal/MenuSwitch/qmldir | 5 + .../Opal/SmartScrollbar/SmartScrollbar.qml | 30 ++++ qml/modules/Opal/SmartScrollbar/qmldir | 5 + 59 files changed, 1815 insertions(+) create mode 100644 libs/module_opal-about.txt create mode 100644 libs/module_opal-delegates.txt create mode 100644 libs/module_opal-linkhandler.txt create mode 100644 libs/module_opal-menuswitch.txt create mode 100644 libs/module_opal-smartscrollbar.txt create mode 100644 qml/modules/Opal/About/AboutPageBase.qml create mode 100644 qml/modules/Opal/About/Attribution.qml create mode 100644 qml/modules/Opal/About/ChangelogItem.qml create mode 100644 qml/modules/Opal/About/ChangelogList.qml create mode 100644 qml/modules/Opal/About/ChangelogNews.qml create mode 100644 qml/modules/Opal/About/ContributionGroup.qml create mode 100644 qml/modules/Opal/About/ContributionSection.qml create mode 100644 qml/modules/Opal/About/DonationService.qml create mode 100644 qml/modules/Opal/About/InfoButton.qml create mode 100644 qml/modules/Opal/About/InfoSection.qml create mode 100644 qml/modules/Opal/About/License.qml create mode 100644 qml/modules/Opal/About/OpalAboutAttribution.qml create mode 100644 qml/modules/Opal/About/private/ChangelogItemsLoader.qml create mode 100644 qml/modules/Opal/About/private/ChangelogPage.qml create mode 100644 qml/modules/Opal/About/private/ChangelogView.qml create mode 100644 qml/modules/Opal/About/private/ContributorsAttributionRepeater.qml create mode 100644 qml/modules/Opal/About/private/ContributorsPage.qml create mode 100644 qml/modules/Opal/About/private/DetailList.qml create mode 100644 qml/modules/Opal/About/private/DonationsGroup.qml create mode 100644 qml/modules/Opal/About/private/LicenseListPart.qml create mode 100644 qml/modules/Opal/About/private/LicenseListRepeater.qml create mode 100644 qml/modules/Opal/About/private/LicensePage.qml create mode 100644 qml/modules/Opal/About/private/OpalAttributionsLoader.qml create mode 100644 qml/modules/Opal/About/private/ScrollbarType.qml create mode 100644 qml/modules/Opal/About/private/functions.js create mode 100644 qml/modules/Opal/About/private/qmldir create mode 100644 qml/modules/Opal/About/private/worker_spdx.js create mode 100644 qml/modules/Opal/About/qmldir create mode 100644 qml/modules/Opal/Attributions/OpalAboutAttribution.qml create mode 100644 qml/modules/Opal/Attributions/OpalDelegatesAttribution.qml create mode 100644 qml/modules/Opal/Attributions/OpalLinkHandlerAttribution.qml create mode 100644 qml/modules/Opal/Attributions/OpalMenuSwitchAttribution.qml create mode 100644 qml/modules/Opal/Attributions/OpalSmartScrollbarAttribution.qml create mode 100644 qml/modules/Opal/Delegates/DelegateColumn.qml create mode 100644 qml/modules/Opal/Delegates/DelegateIconButton.qml create mode 100644 qml/modules/Opal/Delegates/DelegateIconItem.qml create mode 100644 qml/modules/Opal/Delegates/DelegateInfoItem.qml create mode 100644 qml/modules/Opal/Delegates/OneLineDelegate.qml create mode 100644 qml/modules/Opal/Delegates/OptionalLabel.qml create mode 100644 qml/modules/Opal/Delegates/PaddedDelegate.qml create mode 100644 qml/modules/Opal/Delegates/ThreeLineDelegate.qml create mode 100644 qml/modules/Opal/Delegates/TwoLineDelegate.qml create mode 100644 qml/modules/Opal/Delegates/private/OptionalDragHandle.qml create mode 100644 qml/modules/Opal/Delegates/private/PaddingData.qml create mode 100644 qml/modules/Opal/Delegates/qmldir create mode 100644 qml/modules/Opal/LinkHandler/LinkHandler.js create mode 100644 qml/modules/Opal/LinkHandler/private/ExternalUrlPage.qml create mode 100644 qml/modules/Opal/LinkHandler/private/qmldir create mode 100644 qml/modules/Opal/LinkHandler/qmldir create mode 100644 qml/modules/Opal/MenuSwitch/MenuSwitch.qml create mode 100644 qml/modules/Opal/MenuSwitch/qmldir create mode 100644 qml/modules/Opal/SmartScrollbar/SmartScrollbar.qml create mode 100644 qml/modules/Opal/SmartScrollbar/qmldir diff --git a/harbour-seriesfinale.pro b/harbour-seriesfinale.pro index 1c39430..9ca4461 100644 --- a/harbour-seriesfinale.pro +++ b/harbour-seriesfinale.pro @@ -56,6 +56,7 @@ DISTFILES += \ qml/pages/SeriesPage.qml \ qml/pages/SettingsPage.qml \ qml/pages/ShowPage.qml \ + qml/pages/*.qml \ qml/util.js \ src/seriesfinale.py \ src/SeriesFinale/placeholderimage.png \ diff --git a/libs/module_opal-about.txt b/libs/module_opal-about.txt new file mode 100644 index 0000000..c75914b --- /dev/null +++ b/libs/module_opal-about.txt @@ -0,0 +1,21 @@ +# Store this file to keep track of packaged module versions. +# It is not necessary to ship this in your app's final RPM package. +# SPDX-FileCopyrightText: 2018-2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later + +# Attribution using Opal.About: +# Opal attributions are automatically added since version 3.0.0. +# Check the "autoAddOpalAttributions" property on your About page. +# +# Manual attribution: +# 1. Import "../modules/Opal/Attributions" in your "About" page. +# 2. Attribute this module by adding "OpalAboutAttribution {}" +# to the "attributions" list property of the "About" page. + +module: Opal.About (opal-about) +version: 3.0.0 (git:1110030) +description: This module provides AboutPageBase for building customizable application information pages. +maintainers: Mirian Margiani +attribution: 2018-2024 Mirian Margiani +license: GPL-3.0-or-later +sources: https://github.com/Pretty-SFOS/opal-about diff --git a/libs/module_opal-delegates.txt b/libs/module_opal-delegates.txt new file mode 100644 index 0000000..dfb128b --- /dev/null +++ b/libs/module_opal-delegates.txt @@ -0,0 +1,21 @@ +# Store this file to keep track of packaged module versions. +# It is not necessary to ship this in your app's final RPM package. +# SPDX-FileCopyrightText: 2024-2025 Mirian Margiani (ichthyosaurus):2023 Peter G. (nephros) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Attribution using Opal.About: +# Opal attributions are automatically added since version 3.0.0. +# Check the "autoAddOpalAttributions" property on your About page. +# +# Manual attribution: +# 1. Import "../modules/Opal/Attributions" in your "About" page. +# 2. Attribute this module by adding "OpalDelegatesAttribution {}" +# to the "attributions" list property of the "About" page. + +module: Opal.Delegates (opal-delegates) +version: 3.5.1 (git:6cac9fd) +description: This module provides list items for views, so you can concentrate on handling the data, not formatting the presentation. +maintainers: Mirian Margiani +attribution: 2024-2025 Mirian Margiani (ichthyosaurus):2023 Peter G. (nephros) +license: GPL-3.0-or-later +sources: https://github.com/Pretty-SFOS/opal-delegates diff --git a/libs/module_opal-linkhandler.txt b/libs/module_opal-linkhandler.txt new file mode 100644 index 0000000..286fb71 --- /dev/null +++ b/libs/module_opal-linkhandler.txt @@ -0,0 +1,21 @@ +# Store this file to keep track of packaged module versions. +# It is not necessary to ship this in your app's final RPM package. +# SPDX-FileCopyrightText: 2020-2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later + +# Attribution using Opal.About: +# Opal attributions are automatically added since version 3.0.0. +# Check the "autoAddOpalAttributions" property on your About page. +# +# Manual attribution: +# 1. Import "../modules/Opal/Attributions" in your "About" page. +# 2. Attribute this module by adding "OpalLinkHandlerAttribution {}" +# to the "attributions" list property of the "About" page. + +module: Opal.LinkHandler (opal-linkhandler) +version: 2.3.0 (git:dec5c79) +description: This module provides a link handler to open or copy external links. +maintainers: Mirian Margiani +attribution: 2020-2024 Mirian Margiani +license: GPL-3.0-or-later +sources: https://github.com/Pretty-SFOS/opal-linkhandler diff --git a/libs/module_opal-menuswitch.txt b/libs/module_opal-menuswitch.txt new file mode 100644 index 0000000..e15de65 --- /dev/null +++ b/libs/module_opal-menuswitch.txt @@ -0,0 +1,21 @@ +# Store this file to keep track of packaged module versions. +# It is not necessary to ship this in your app's final RPM package. +# SPDX-FileCopyrightText: 2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later + +# Attribution using Opal.About: +# Opal attributions are automatically added since version 3.0.0. +# Check the "autoAddOpalAttributions" property on your About page. +# +# Manual attribution: +# 1. Import "../modules/Opal/Attributions" in your "About" page. +# 2. Attribute this module by adding "OpalMenuSwitchAttribution {}" +# to the "attributions" list property of the "About" page. + +module: Opal.MenuSwitch (opal-menuswitch) +version: 1.0.1 (git:66ab90b) +description: This module provides a toggle button to be used in Sailfish-style menus. +maintainers: Mirian Margiani +attribution: 2024 Mirian Margiani +license: GPL-3.0-or-later +sources: https://github.com/Pretty-SFOS/opal-menuswitch diff --git a/libs/module_opal-smartscrollbar.txt b/libs/module_opal-smartscrollbar.txt new file mode 100644 index 0000000..86764a9 --- /dev/null +++ b/libs/module_opal-smartscrollbar.txt @@ -0,0 +1,21 @@ +# Store this file to keep track of packaged module versions. +# It is not necessary to ship this in your app's final RPM package. +# SPDX-FileCopyrightText: 2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later + +# Attribution using Opal.About: +# Opal attributions are automatically added since version 3.0.0. +# Check the "autoAddOpalAttributions" property on your About page. +# +# Manual attribution: +# 1. Import "../modules/Opal/Attributions" in your "About" page. +# 2. Attribute this module by adding "OpalSmartScrollbarAttribution {}" +# to the "attributions" list property of the "About" page. + +module: Opal.SmartScrollbar (opal-smartscrollbar) +version: 1.0.0 (git:a0e025a) +description: This module provides a Harbour-compatible smart scroll bar for long lists. +maintainers: Mirian Margiani +attribution: 2024 Mirian Margiani +license: GPL-3.0-or-later +sources: https://github.com/Pretty-SFOS/opal-smartscrollbar diff --git a/qml/modules/Opal/About/AboutPageBase.qml b/qml/modules/Opal/About/AboutPageBase.qml new file mode 100644 index 0000000..af1669a --- /dev/null +++ b/qml/modules/Opal/About/AboutPageBase.qml @@ -0,0 +1,143 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import"../LinkHandler"as L +import"private/functions.js"as Func +import"private" +Page{id:page +property string appName:"" +property string appIcon:"" +property string appVersion:"" +property string appRelease:"1" +property string appReleaseType:"" +property string description:"" +property var mainAttributions:[] +property var authors:[] +property var __effectiveMainAttribs:Func.makeStringListConcat(authors,mainAttributions,false) +property string sourcesUrl:"" +property string translationsUrl:"" +property string homepageUrl:"" +property listchangelogItems +property url changelogList +property listlicenses +property bool allowDownloadingLicenses:false +property listattributions +property bool autoAddOpalAttributions:true +readonly property DonationsGroup donations:DonationsGroup{} +property listextraSections +property listcontributionSections +property alias flickable:_flickable +property alias _pageHeaderItem:_pageHeader +property alias _iconItem:_icon +property alias _develInfoSection:_develInfo +property alias _licenseInfoSection:_licenseInfo +property alias _donationsInfoSection:_donationsInfo +readonly property Attribution _effectiveSelfAttribution:Attribution{name:appName +entries:__effectiveMainAttribs +licenses:page.licenses +homepage:homepageUrl +sources:sourcesUrl +} +function openOrCopyUrl(externalUrl,title){L.LinkHandler.openOrCopyUrl(externalUrl,title) +}allowedOrientations:Orientation.All +SilicaFlickable{id:_flickable +contentHeight:column.height +anchors.fill:parent +VerticalScrollDecorator{}onContentHeightChanged:{if(_flickable.contentHeight>page.height&&_flickable.contentHeight-_pageHeader.origHeight+Theme.paddingMedium0||attributions.length>0 +text:__effectiveMainAttribs.join(", ") +showMoreLabel:qsTranslate("Opal.About","show contributors") +onClicked:{pageStack.animatorPush("private/ContributorsPage.qml",{"appName":appName,"sections":contributionSections,"attributions":attributions,"mainAttributions":__effectiveMainAttribs,"allowDownloadingLicenses":allowDownloadingLicenses,"autoAddOpalAttributions":autoAddOpalAttributions}) +}buttons:[InfoButton{text:qsTranslate("Opal.About","Homepage") +onClicked:openOrCopyUrl(homepageUrl,text) +enabled:homepageUrl!=="" +},InfoButton{text:qsTranslate("Opal.About","Changelog") +onClicked:pageStack.animatorPush(Qt.resolvedUrl("private/ChangelogPage.qml"),{appName:appName,changelogItems:changelogItems,changelogList:changelogList}) +enabled:changelogItems.length>0||changelogList!="" +},InfoButton{text:qsTranslate("Opal.About","Translations") +onClicked:openOrCopyUrl(translationsUrl,text) +enabled:translationsUrl!=="" +},InfoButton{text:qsTranslate("Opal.About","Source Code") +onClicked:openOrCopyUrl(sourcesUrl,text) +enabled:sourcesUrl!=="" +}]}Column{width:parent.width +spacing:parent.spacing +children:extraSections +}InfoSection{id:_donationsInfo +visible:donations.services.length>0||donations.text!=="" +width:parent.width +title:qsTranslate("Opal.About","Donations") +enabled:false +text:donations.text===""?donations.defaultTextGeneral:donations.text +__donationButtons:donations.services +}InfoSection{id:_licenseInfo +width:parent.width +title:qsTranslate("Opal.About","License") +enabled:licenses.length>0 +onClicked:pageStack.animatorPush("private/LicensePage.qml",{"mainAttribution":_effectiveSelfAttribution,"attributions":attributions,"allowDownloadingLicenses":allowDownloadingLicenses,"enableSourceHint":true,"includeOpal":autoAddOpalAttributions}) +text:enabled===false?"This component has been improperly configured. Please report this bug.":((licenses[0].name!==""&&licenses[0].error!==true)?licenses[0].name:licenses[0].spdxId) +smallPrint:licenses[0].customShortText +showMoreLabel:qsTranslate("Opal.About","show license(s)","",licenses.length+attributions.length) +clip:true +Behavior on height{SmoothedAnimation{duration:80 +}}}Item{id:bottomVerticalSpacing +width:parent.width +height:Theme.paddingMedium +}}}Component.onCompleted:{if(__silica_applicationwindow_instance&&__silica_applicationwindow_instance.hasOwnProperty("_defaultPageOrientations")){__silica_applicationwindow_instance._defaultPageOrientations=Orientation.All +}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/Attribution.qml b/qml/modules/Opal/About/Attribution.qml new file mode 100644 index 0000000..41e9880 --- /dev/null +++ b/qml/modules/Opal/About/Attribution.qml @@ -0,0 +1,21 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021-2022 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import"private/functions.js"as Func +QtObject{property string name +property var entries:[] +property listlicenses +property string description +property string homepage +property string sources +property var __effectiveEntries:Func.makeStringList(entries,false) +property var _spdxList:null +function _getSpdxList(force){var upd=Func.updateSpdxList(licenses,_spdxList,force) +if(upd!==null){_spdxList=upd.spdx +}return _spdxList +}function _getSpdxString(append,force){var str=_getSpdxList(force).join(", ") +if(str!==""&&append)str=str+" "+append +return str +}} \ No newline at end of file diff --git a/qml/modules/Opal/About/ChangelogItem.qml b/qml/modules/Opal/About/ChangelogItem.qml new file mode 100644 index 0000000..0508b40 --- /dev/null +++ b/qml/modules/Opal/About/ChangelogItem.qml @@ -0,0 +1,14 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import"private/functions.js"as Func +QtObject{property string version +property date date:new Date(NaN) +property string author +property var paragraphs +property int textFormat:Text.StyledText +property var __effectiveEntries:Func.makeStringList(paragraphs,false) +property string __effectiveSection:version+(isNaN(date.valueOf())?"":"|"+Qt.formatDate(date,Qt.DefaultLocaleShortDate)) +} \ No newline at end of file diff --git a/qml/modules/Opal/About/ChangelogList.qml b/qml/modules/Opal/About/ChangelogList.qml new file mode 100644 index 0000000..3e4a0b4 --- /dev/null +++ b/qml/modules/Opal/About/ChangelogList.qml @@ -0,0 +1,10 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +QtObject{id:root +default property alias content:root.changelogItems +property listchangelogItems +readonly property int __is_opal_about_changelog_list:0 +} \ No newline at end of file diff --git a/qml/modules/Opal/About/ChangelogNews.qml b/qml/modules/Opal/About/ChangelogNews.qml new file mode 100644 index 0000000..64545bd --- /dev/null +++ b/qml/modules/Opal/About/ChangelogNews.qml @@ -0,0 +1,64 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Sailfish.Silica 1.0 +import Nemo.Configuration 1.0 +import"private/functions.js"as Func +import"private" +Item{id:root +property listchangelogItems +property url changelogList +property string _applicationName:Qt.application.name +property string _organizationName:Qt.application.organization +readonly property string __lastVersion:!!configLoader.item?configLoader.item.lastVersion:"" +readonly property string __configPath:"/settings/opal/opal-about/"+"changelog-overlay/%1/%2".arg(_organizationName).arg(_applicationName) +property list__filteredItems +property int __ready:(configLoader.status===Loader.Ready?1:0)+(itemsLoader.effectiveItems.length>0?1:0) +function show(){showTimer.stop() +pageStack.completeAnimation() +pageStack.push(dialogComponent) +}function _markAsRead(){if(__filteredItems.length===0){return +}var latestChangelogVersion=__filteredItems[0].version +configLoader.item.lastVersion=latestChangelogVersion +}Component.onCompleted:{if(!_applicationName||!_organizationName){console.warn("[Opal.About] both application name and organisation name "+"must be set in order to use the changelog overlay") +console.warn("[Opal.About] note that these properties are also required "+"for Sailjail sandboxing") +console.warn("[Opal.About] see: https://github.com/sailfishos/"+"sailjail-permissions#desktop-file-changes") +}}on__ReadyChanged:{if(__ready<2||itemsLoader.effectiveItems.length===0||__filteredItems.length>0)return +if(!!__lastVersion){var loadedItems=[] +for(var i in itemsLoader.effectiveItems){if(itemsLoader.effectiveItems[i]===null){continue +}var v=itemsLoader.effectiveItems[i].version +if(v===__lastVersion){break +}console.log("[Opal.About] showing changelog for:",v) +loadedItems.push(itemsLoader.effectiveItems[i]) +}if(loadedItems.length>0){__filteredItems=loadedItems +showTimer.start() +}else{__filteredItems=itemsLoader.effectiveItems +}}else{__filteredItems=itemsLoader.effectiveItems +_markAsRead() +__ready=-1 +}}Loader{id:configLoader +sourceComponent:!!_applicationName&&!!_organizationName?configComponent:null +asynchronous:true +}ChangelogItemsLoader{id:itemsLoader +changelogItems:root.changelogItems +changelogList:root.changelogList +}Timer{id:showTimer +interval:10 +repeat:true +running:false +onTriggered:{if(pageStack.busy||pageStack.depth===0)return +show() +}}Component{id:configComponent +ConfigurationGroup{path:root.__configPath +property string lastVersion:"" +}}Component{id:dialogComponent +Dialog{allowedOrientations:Orientation.All +onDone:_markAsRead() +ChangelogView{anchors.fill:parent +changelogItems:root.__filteredItems +header:PageHeader{title:qsTranslate("Opal.About","News") +description:qsTranslate("Opal.About","Changes since version %1").arg(__lastVersion) +descriptionWrapMode:Text.Wrap +}}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/ContributionGroup.qml b/qml/modules/Opal/About/ContributionGroup.qml new file mode 100644 index 0000000..e6b5873 --- /dev/null +++ b/qml/modules/Opal/About/ContributionGroup.qml @@ -0,0 +1,10 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2021 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import"private/functions.js"as Func +QtObject{property string title +property var entries:[] +property var __effectiveEntries:Func.makeStringList(entries) +} \ No newline at end of file diff --git a/qml/modules/Opal/About/ContributionSection.qml b/qml/modules/Opal/About/ContributionSection.qml new file mode 100644 index 0000000..a84e24e --- /dev/null +++ b/qml/modules/Opal/About/ContributionSection.qml @@ -0,0 +1,8 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2021 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +QtObject{property string title +property listgroups +} \ No newline at end of file diff --git a/qml/modules/Opal/About/DonationService.qml b/qml/modules/Opal/About/DonationService.qml new file mode 100644 index 0000000..9dbfa84 --- /dev/null +++ b/qml/modules/Opal/About/DonationService.qml @@ -0,0 +1,8 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +QtObject{property string name +property string url +} \ No newline at end of file diff --git a/qml/modules/Opal/About/InfoButton.qml b/qml/modules/Opal/About/InfoButton.qml new file mode 100644 index 0000000..b519727 --- /dev/null +++ b/qml/modules/Opal/About/InfoButton.qml @@ -0,0 +1,9 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +QtObject{property string text:"" +property bool enabled:true +signal clicked +} \ No newline at end of file diff --git a/qml/modules/Opal/About/InfoSection.qml b/qml/modules/Opal/About/InfoSection.qml new file mode 100644 index 0000000..3876574 --- /dev/null +++ b/qml/modules/Opal/About/InfoSection.qml @@ -0,0 +1,106 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import"../LinkHandler"as L +Column{id:root +spacing:0 +width:parent.width +height:childrenRect.height +function openOrCopyUrl(externalUrl,title){L.LinkHandler.openOrCopyUrl(externalUrl,title) +}property alias title:_titleLabel.text +property string text:"" +property string smallPrint:"" +property string showMoreLabel:qsTranslate("Opal.About","show details") +property listbuttons +property alias enabled:_bgItem.enabled +default property alias contentItem:_contents.children +signal clicked +property alias _backgroundItem:_bgItem +property alias _titleItem:_titleLabel +property alias _textItem:_textLabel +property alias _smallPrintItem:_smallPrintLabel +property alias _showMoreLabelItem:_showMoreLabel +property list__donationButtons +BackgroundItem{id:_bgItem +enabled:false +width:parent.width +height:column.height +onClicked:root.clicked() +Column{id:column +width:parent.width-2*Theme.horizontalPageMargin +height:childrenRect.height +anchors.horizontalCenter:parent.horizontalCenter +spacing:0 +Item{width:1 +height:Theme.paddingSmall +}Label{id:_titleLabel +width:parent.width +horizontalAlignment:Text.AlignRight +wrapMode:Text.Wrap +font.pixelSize:Theme.fontSizeMedium +visible:text!=="" +height:visible?implicitHeight+Theme.paddingSmall:0 +color:Theme.highlightColor +}Item{id:_contents +width:parent.width +height:childrenRect.height +}Column{width:parent.width +spacing:Theme.paddingMedium +visible:root.text!==""||root.smallPrint!=="" +Label{id:_textLabel +visible:root.text!=="" +width:parent.width +horizontalAlignment:Text.AlignLeft +wrapMode:Text.Wrap +text:root.text +textFormat:Text.StyledText +linkColor:palette.secondaryColor +palette.primaryColor:Theme.highlightColor +onLinkActivated:openOrCopyUrl(link) +}Label{id:_smallPrintLabel +visible:smallPrint!=="" +width:parent.width +horizontalAlignment:Text.AlignLeft +wrapMode:Text.Wrap +text:smallPrint +textFormat:Text.StyledText +linkColor:palette.secondaryColor +palette.primaryColor:Theme.highlightColor +font.pixelSize:Theme.fontSizeSmall +onLinkActivated:openOrCopyUrl(link) +}Row{id:showMoreRow +anchors.right:parent.right +spacing:Theme.paddingSmall +visible:root.enabled&&showMoreLabel!=="" +height:visible?_showMoreLabel.height:0 +Label{id:_showMoreLabel +font.pixelSize:Theme.fontSizeExtraSmall +textFormat:Text.StyledText +text:"%1".arg(showMoreLabel) +}Label{anchors.verticalCenter:_showMoreLabel.verticalCenter +text:" • • •" +}}}Item{width:1 +height:root.text!==""?Theme.paddingMedium:0 +}}}Item{width:1 +height:(buttons.length>0||__donationButtons.length>0)?Theme.paddingMedium:0 +}Column{width:parent.width +height:childrenRect.height +spacing:Theme.paddingMedium +Repeater{model:buttons +delegate:Button{anchors.horizontalCenter:parent.horizontalCenter +width:parent.width/4*3 +height:visible?implicitHeight:0 +visible:modelData.text!==""&&modelData.enabled===true +text:modelData.text +onClicked:modelData.clicked() +}}Repeater{model:__donationButtons +delegate:Button{anchors.horizontalCenter:parent.horizontalCenter +width:parent.width/4*3 +height:visible?implicitHeight:0 +visible:modelData.name!==""&&modelData.url!=="" +text:modelData.name +onClicked:openOrCopyUrl(modelData.url) +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/License.qml b/qml/modules/Opal/About/License.qml new file mode 100644 index 0000000..cd287c9 --- /dev/null +++ b/qml/modules/Opal/About/License.qml @@ -0,0 +1,39 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2022 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +QtObject{id:root +property string spdxId +property string customShortText:"" +readonly property bool error:__error +readonly property string name:__name +readonly property string fullText:__fullText +property bool __online:false +property string __localUrl:"%1/%2.json".arg(StandardPaths.temporary).arg(spdxId) +property string __remoteUrl:"https://spdx.org/licenses/%1.json".arg(spdxId) +property string __name:"" +property string __fullText:"" +property bool __error:false +property bool __initialized:false +property WorkerScript __worker:WorkerScript{source:"private/worker_spdx.js" +onMessage:{if(messageObject.spdxId!==spdxId)return +__name=messageObject.name +__fullText=messageObject.fullText +__error=messageObject.error +if(customShortText==="")customShortText=messageObject.shortText +}Component.onCompleted:{_load() +__initialized=true +}} +onSpdxIdChanged:{if(__initialized)_load(true) +}on__OnlineChanged:{_load() +}function _load(force){if(fullText!==""&&force!==true)return +if(spdxId===undefined||spdxId===""){__error=true +console.error("[Opal.About] cannot load license without spdxId") +return +}__name="" +__fullText="" +__error=false +__worker.sendMessage({spdxId:spdxId,localUrl:__localUrl,remoteUrl:__remoteUrl,shortText:customShortText,online:!!__online}) +}} \ No newline at end of file diff --git a/qml/modules/Opal/About/OpalAboutAttribution.qml b/qml/modules/Opal/About/OpalAboutAttribution.qml new file mode 100644 index 0000000..c9ab9d3 --- /dev/null +++ b/qml/modules/Opal/About/OpalAboutAttribution.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2018-2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import"../../Opal/About"as A +A.Attribution{name:"Opal.About (v3.0.0)" +entries:["2018-2024 Mirian Margiani"] +licenses:A.License{spdxId:"GPL-3.0-or-later" +}sources:"https://github.com/Pretty-SFOS/opal-about" +homepage:"https://github.com/Pretty-SFOS/opal" +} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/ChangelogItemsLoader.qml b/qml/modules/Opal/About/private/ChangelogItemsLoader.qml new file mode 100644 index 0000000..4f7c5e3 --- /dev/null +++ b/qml/modules/Opal/About/private/ChangelogItemsLoader.qml @@ -0,0 +1,18 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import".." +Loader{id:root +property listchangelogItems +property url changelogList +property listeffectiveItems +asynchronous:true +source:changelogList +onStatusChanged:{if(status===Loader.Ready){if(!item.hasOwnProperty("__is_opal_about_changelog_list")||!item.hasOwnProperty("changelogItems")){console.error("[Opal.About] programming error: changelogList must be "+"a reference to a valid ChangelogList component") +}else{effectiveItems=item.changelogItems +}}}Component.onCompleted:{if(changelogItems.length>0){if(changelogList!=""){console.error("[Opal.About] programming error: it is not allowed to define "+"both changelogItems and changelogList. Changelog items in "+"the changelog list '%1' will not be shown.".arg(changelogList)) +changelogList="" +}effectiveItems=changelogItems +}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/ChangelogPage.qml b/qml/modules/Opal/About/private/ChangelogPage.qml new file mode 100644 index 0000000..76d3cc7 --- /dev/null +++ b/qml/modules/Opal/About/private/ChangelogPage.qml @@ -0,0 +1,18 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Sailfish.Silica 1.0 +import".." +Page{id:root +property string appName +property alias changelogItems:view.changelogItems +property alias changelogList:view.changelogList +property alias scrollbarType:view.scrollbarType +allowedOrientations:Orientation.All +ChangelogView{id:view +anchors.fill:parent +header:PageHeader{title:qsTranslate("Opal.About","Changelog") +description:appName +}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/ChangelogView.qml b/qml/modules/Opal/About/private/ChangelogView.qml new file mode 100644 index 0000000..00ceb2a --- /dev/null +++ b/qml/modules/Opal/About/private/ChangelogView.qml @@ -0,0 +1,79 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Sailfish.Silica 1.0 +import"../../LinkHandler"as L +import".." +import"." +SilicaListView{id:root +property listchangelogItems +property url changelogList +property int scrollbarType:ScrollbarType.auto +property Item _scrollbar:null +function _reloadScrollbar(){if(scrollbarType===ScrollbarType.plain){_scrollbar=null +return +}else if(scrollbarType===ScrollbarType.auto){var paragraphCount=0 +var useAdvanced=false +for(var i in itemsLoader.effectiveItems){paragraphCount+=itemsLoader.effectiveItems[i].__effectiveEntries.length +if(paragraphCount>=20){useAdvanced=true +break +}}}if(useAdvanced===true||scrollbarType===ScrollbarType.advanced){try{_scrollbar=Qt.createQmlObject("\n import QtQuick 2.0\n import %1 1.0 as Private\n Private.Scrollbar {\n text: root.currentSection.split('|')[0]\n description: root.currentSection.split('|').slice(1).join('|')\n headerHeight: root.headerItem ? root.headerItem.height : 0\n }".arg("Sailfish.Silica.private"),root,"Scrollbar") +}catch(e){if(!_scrollbar){console.warn(e) +console.warn("[Opal.About] bug: failed to load customized scrollbar") +console.warn("[Opal.About] bug: this probably means the private API has changed") +}}}}model:itemsLoader.effectiveItems +spacing:Theme.paddingMedium +quickScroll:!_scrollbar +section.property:"__effectiveSection" +onScrollbarTypeChanged:_reloadScrollbar() +footer:Item{width:parent.width +height:Theme.horizontalPageMargin +}delegate:Column{id:item +width:root.width +height:childrenRect.height +spacing:Theme.paddingSmall +property int textFormat:model.textFormat +property var paragraphs:model.__effectiveEntries +Item{width:1 +height:Theme.paddingMedium +}Label{width:parent.width-2*x +x:Theme.horizontalPageMargin +horizontalAlignment:Text.AlignRight +font.pixelSize:Theme.fontSizeSmall +truncationMode:TruncationMode.Fade +color:palette.highlightColor +text:model.version +}Label{width:parent.width-2*x +x:Theme.horizontalPageMargin +horizontalAlignment:Text.AlignRight +font.pixelSize:Theme.fontSizeSmall +font.italic:true +truncationMode:TruncationMode.Fade +color:palette.secondaryHighlightColor +visible:haveAuthor||haveDate +property bool haveAuthor:!!model.author +property bool haveDate:!isNaN(model.date.valueOf()) +text:{if(haveAuthor&&haveDate){Qt.formatDate(model.date,Qt.DefaultLocaleShortDate)+", "+model.author +}else if(haveAuthor){model.author +}else if(haveDate){Qt.formatDate(model.date,Qt.DefaultLocaleShortDate) +}else{"" +}}}Repeater{model:item.paragraphs +Label{width:parent.width-2*x +x:Theme.horizontalPageMargin +font.pixelSize:Theme.fontSizeSmall +color:Theme.highlightColor +wrapMode:Text.Wrap +textFormat:item.textFormat +text:modelData +linkColor:Theme.primaryColor +onLinkActivated:L.LinkHandler.openOrCopyUrl(link) +bottomPadding:Theme.paddingMedium +}}}ChangelogItemsLoader{id:itemsLoader +changelogItems:root.changelogItems +changelogList:root.changelogList +onEffectiveItemsChanged:_reloadScrollbar() +}VerticalScrollDecorator{flickable:root +visible:!root._scrollbar||scrollbarType===ScrollbarType.none +}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/ContributorsAttributionRepeater.qml b/qml/modules/Opal/About/private/ContributorsAttributionRepeater.qml new file mode 100644 index 0000000..b384b56 --- /dev/null +++ b/qml/modules/Opal/About/private/ContributorsAttributionRepeater.qml @@ -0,0 +1,27 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Sailfish.Silica 1.0 +import"functions.js"as Func +Repeater{delegate:DetailList{property string spdxString:modelData._getSpdxString(" • • •") +property bool showLicensePage:false +activeLastValue:spdxString!==""||modelData.sources!==""||modelData.homepage!==""||modelData.description!=="" +label:(modelData.__effectiveEntries.length===0&&spdxString==="")?qsTranslate("Opal.About","Thank you!"):modelData.name +values:{var vals=Func.makeStringListConcat(modelData.__effectiveEntries,spdxString,false) +if(vals.length===0){vals=[modelData.name] +}if(spdxString===""){var append="" +if(modelData.description!==""||(modelData.sources!==""&&modelData.homepage!=="")){append=qsTranslate("Opal.About","Details") +if(modelData.description!==""){showLicensePage=true +}}else if(modelData.sources!==""){append=qsTranslate("Opal.About","Source Code") +}else if(modelData.homepage!==""){append=qsTranslate("Opal.About","Homepage") +}if(append!==""){vals.push(append+" • • •") +}}else{showLicensePage=true +}return vals +}onClicked:{if(showLicensePage){pageStack.animatorPush("LicensePage.qml",{"mainAttribution":modelData,"attributions":[],"allowDownloadingLicenses":allowDownloadingLicenses,"enableSourceHint":true}) +}else{var urls=[] +if(modelData.homepage!==""){urls.push({externalUrl:modelData.homepage,title:qsTranslate("Opal.About","Homepage")}) +}if(modelData.sources!==""){urls.push({externalUrl:modelData.sources,title:qsTranslate("Opal.About","Source Code")}) +}L.LinkHandler.openOrCopyMultipleUrls(urls) +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/ContributorsPage.qml b/qml/modules/Opal/About/private/ContributorsPage.qml new file mode 100644 index 0000000..b3d224d --- /dev/null +++ b/qml/modules/Opal/About/private/ContributorsPage.qml @@ -0,0 +1,43 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2022 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Sailfish.Silica 1.0 +import".." +Page{id:root +property listsections +property listattributions +property var mainAttributions:[] +property string appName +property bool allowDownloadingLicenses:false +property bool autoAddOpalAttributions:false +allowedOrientations:Orientation.All +OpalAttributionsLoader{id:opalAttributions +enabled:autoAddOpalAttributions +}SilicaFlickable{anchors.fill:parent +contentHeight:column.height+2*Theme.paddingLarge +VerticalScrollDecorator{}Column{id:column +width:parent.width +spacing:Theme.paddingMedium +PageHeader{title:qsTranslate("Opal.About","Contributors") +}SectionHeader{text:qsTranslate("Opal.About","Development") +visible:mainAttributions.length>0 +}DetailList{visible:mainAttributions.length>0 +label:appName +values:mainAttributions +}Repeater{model:sections +delegate:Column{width:parent.width +spacing:column.spacing +SectionHeader{text:modelData.title +visible:modelData.title!==""&&modelData.groups.length>0&&!(index===0&&(modelData.title==="Development"||modelData.title===qsTranslate("Opal.About","Development"))) +}Repeater{model:modelData.groups +delegate:DetailList{label:modelData.title +values:modelData.__effectiveEntries +}}}}Column{width:parent.width +spacing:column.spacing +SectionHeader{text:qsTranslate("Opal.About","Acknowledgements") +visible:attributions.length>0||opalAttributions.loadedAttributions.length>0 +}ContributorsAttributionRepeater{model:attributions +}ContributorsAttributionRepeater{model:opalAttributions.loadedAttributions +}}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/DetailList.qml b/qml/modules/Opal/About/private/DetailList.qml new file mode 100644 index 0000000..54bd7fe --- /dev/null +++ b/qml/modules/Opal/About/private/DetailList.qml @@ -0,0 +1,22 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2021 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Sailfish.Silica 1.0 +BackgroundItem{id:root +property string label +property var values +property bool activeLastValue:false +enabled:activeLastValue +width:parent.width +height:column.height +Column{id:column +width:parent.width +spacing:0 +Repeater{model:values.length +delegate:DetailItem{label:index===0?root.label:"" +value:root.values[index] +palette{secondaryHighlightColor:Theme.secondaryHighlightColor +highlightColor:(index===values.length-1&&activeLastValue)?(root.highlighted?Theme.secondaryHighlightColor:Theme.secondaryColor):Theme.highlightColor +}}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/DonationsGroup.qml b/qml/modules/Opal/About/private/DonationsGroup.qml new file mode 100644 index 0000000..71848ed --- /dev/null +++ b/qml/modules/Opal/About/private/DonationsGroup.qml @@ -0,0 +1,12 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import".." +QtObject{readonly property string defaultTextCoffee:qsTranslate("Opal.About.Common","If you want to support my work, you can buy me a cup of coffee.") +readonly property string defaultTextGeneral:qsTranslate("Opal.About.Common","You can support this project by contributing, or by donating using any of these services.") +readonly property string defaultTextContribInstead:qsTranslate("Opal.About.Common","Your contributions to translations or code would be most welcome.") +property string text:"" +property listservices +} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/LicenseListPart.qml b/qml/modules/Opal/About/private/LicenseListPart.qml new file mode 100644 index 0000000..7ec8113 --- /dev/null +++ b/qml/modules/Opal/About/private/LicenseListPart.qml @@ -0,0 +1,121 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021-2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import"../../LinkHandler"as L +import".." +Column{property string title +property bool headerVisible:title!=="" +property listlicenses +property var extraTexts:[] +property bool initiallyExpanded:false +property string description:"" +property string homepage:"" +property string sources:"" +visible:licenses.length>0||description!="" +width:parent.width +height:childrenRect.height +spacing:Theme.paddingSmall +SectionHeader{visible:headerVisible +text:title +}Label{x:Theme.horizontalPageMargin +visible:description!=="" +width:parent.width-2*x +wrapMode:Text.Wrap +text:description +font.pixelSize:Theme.fontSizeSmall +color:Theme.highlightColor +bottomPadding:Theme.paddingSmall +textFormat:Text.StyledText +onLinkActivated:L.LinkHandler.openOrCopyUrl(link) +linkColor:palette.secondaryHighlightColor +palette.primaryColor:Theme.highlightColor +}Label{x:Theme.horizontalPageMargin +visible:text!=="" +width:parent.width-2*x +wrapMode:Text.Wrap +text:extraTexts.join(", ") +font.pixelSize:Theme.fontSizeSmall +color:Theme.highlightColor +linkColor:Theme.primaryColor +onLinkActivated:L.LinkHandler.openOrCopyUrl(link) +bottomPadding:Theme.paddingSmall +}ButtonLayout{visible:homepage!==""||sources!=="" +Button{visible:homepage!=="" +text:qsTranslate("Opal.About","Homepage") +onClicked:L.LinkHandler.openOrCopyUrl(homepage,text) +}Button{visible:sources!=="" +text:qsTranslate("Opal.About","Source Code") +onClicked:L.LinkHandler.openOrCopyUrl(sources,text) +}}Repeater{model:licenses +delegate:Column{id:licenseColumn +width:parent.width +spacing:Theme.paddingSmall +property bool expanded:initiallyExpanded +Behavior on height{SmoothedAnimation{duration:150 +}}BackgroundItem{height:Math.max(titleColumn.height,moreIcon.height+2*Theme.paddingSmall) +width:parent.width +onClicked:licenseColumn.expanded=!licenseColumn.expanded +Row{width:parent.width-Theme.horizontalPageMargin-Theme.paddingMedium +x:Theme.horizontalPageMargin +height:parent.height +spacing:Theme.paddingSmall +Column{id:titleColumn +width:parent.width-moreIcon.width-parent.spacing +spacing:Theme.paddingSmall +anchors.verticalCenter:parent.verticalCenter +Label{text:modelData.name!==""?modelData.name:modelData.spdxId +topPadding:subtitle.visible?Theme.paddingMedium:0 +height:implicitHeight +width:parent.width +horizontalAlignment:Text.AlignRight +font.pixelSize:Theme.fontSizeExtraSmall +wrapMode:Text.Wrap +}Label{id:subtitle +text:modelData.spdxId +visible:modelData.name!=="" +width:parent.width +horizontalAlignment:Text.AlignRight +font.pixelSize:Theme.fontSizeExtraSmall +wrapMode:Text.Wrap +palette.primaryColor:Theme.secondaryColor +bottomPadding:Theme.paddingMedium +}}HighlightImage{id:moreIcon +anchors.verticalCenter:parent.verticalCenter +source:"image://theme/icon-m-right" +transformOrigin:Item.Center +rotation:licenseColumn.expanded?90:0 +Behavior on rotation{SmoothedAnimation{duration:25 +}}}}}Item{id:licenseTextContainer +height:licenseColumn.expanded?textLoader.height:0 +width:parent.width-2*Theme.horizontalPageMargin +anchors.horizontalCenter:parent.horizontalCenter +opacity:height>0?1.0:0.0 +Behavior on opacity{FadeAnimation{duration:150 +}}clip:true +Loader{id:textLoader +asynchronous:true +sourceComponent:Component{Column{width:licenseTextContainer.width +spacing:Theme.paddingMedium +Label{visible:modelData.customShortText!=="" +text:modelData.customShortText+" ―" +width:parent.width +wrapMode:Text.Wrap +font.pixelSize:Theme.fontSizeSmall +textFormat:Text.StyledText +palette.primaryColor:Theme.highlightColor +linkColor:Theme.primaryColor +onLinkActivated:L.LinkHandler.openOrCopyUrl(link) +}Label{id:licenseTextLabel +property bool error:modelData.error===true||modelData.fullText==="" +width:parent.width +wrapMode:Text.Wrap +font.pixelSize:Theme.fontSizeExtraSmall +textFormat:error?Text.StyledText:Text.PlainText +palette.primaryColor:Theme.highlightColor +linkColor:Theme.primaryColor +onLinkActivated:L.LinkHandler.openOrCopyUrl(link,error?qsTr("License text"):"") +text:error?qsTranslate("Opal.About","Please refer to %1").arg("https://spdx.org/licenses/%1.html".arg(modelData.spdxId)):modelData.fullText +}}}}}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/LicenseListRepeater.qml b/qml/modules/Opal/About/private/LicenseListRepeater.qml new file mode 100644 index 0000000..a237a68 --- /dev/null +++ b/qml/modules/Opal/About/private/LicenseListRepeater.qml @@ -0,0 +1,18 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +Repeater{id:root +property bool initiallyExpanded +property string mainModule +delegate:LicenseListPart{title:modelData.name +headerVisible:title!==""&&title!==mainModule +licenses:modelData.licenses +extraTexts:modelData.__effectiveEntries +description:modelData.description +initiallyExpanded:root.initiallyExpanded +homepage:modelData.homepage +sources:modelData.sources +}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/LicensePage.qml b/qml/modules/Opal/About/private/LicensePage.qml new file mode 100644 index 0000000..c25b3b7 --- /dev/null +++ b/qml/modules/Opal/About/private/LicensePage.qml @@ -0,0 +1,59 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2020-2022 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import".." +Page{id:root +property Attribution mainAttribution +property listattributions +property bool enableSourceHint:true +property alias pageDescription:pageHeader.description +property bool allowDownloadingLicenses:false +property listlicenses +property string appName +property string mainSources +property string mainHomepage +property bool includeOpal:false +function _downloadLicenses(){for(var lic in mainAttribution.licenses){mainAttribution.licenses[lic].__online=true +}for(var attr in attributions){for(var lic in attributions[attr].licenses){attributions[attr].licenses[lic].__online=true +}}}allowedOrientations:Orientation.All +OpalAttributionsLoader{id:opalAttributions +enabled:includeOpal +}SilicaFlickable{anchors.fill:parent +contentHeight:column.height+Theme.horizontalPageMargin +VerticalScrollDecorator{}PullDownMenu{visible:allowDownloadingLicenses +enabled:visible +MenuItem{text:qsTranslate("Opal.About","Download license texts") +onClicked:_downloadLicenses() +}}Column{id:column +width:parent.width +spacing:Theme.paddingMedium +PageHeader{id:pageHeader +title:(!includeOpal&&root.mainAttribution.licenses.length+attributions.length===0)?qsTranslate("Opal.About","Details"):qsTranslate("Opal.About","License(s)","",root.mainAttribution.licenses.length+attributions.length) +description:mainAttribution.name +}Label{visible:enableSourceHint +width:parent.width-2*Theme.horizontalPageMargin +height:visible?implicitHeight+Theme.paddingLarge:0 +anchors.horizontalCenter:parent.horizontalCenter +horizontalAlignment:Text.AlignLeft +wrapMode:Text.Wrap +font.pixelSize:Theme.fontSizeExtraSmall +color:Theme.highlightColor +text:qsTranslate("Opal.About","Note: please check the source code for most accurate information.") +}LicenseListPart{visible:root.mainAttribution.licenses.length>0||root.mainAttribution.__effectiveEntries.length>0||root.mainAttribution.description!=="" +title:root.mainAttribution.name +headerVisible:root.mainAttribution.name!==""&&root.attributions.length>0 +licenses:root.mainAttribution.licenses +extraTexts:root.mainAttribution.__effectiveEntries +description:root.mainAttribution.description +initiallyExpanded:root.mainAttribution.licenses.length===1&&root.attributions.length===0 +homepage:root.mainAttribution.homepage +sources:root.mainAttribution.sources +}LicenseListRepeater{model:attributions +mainModule:root.pageDescription +initiallyExpanded:root.licenses.length===0&&root.attributions.length===1&&root.attributions[0].licenses.length===1&&!root.includeOpal +}LicenseListRepeater{model:opalAttributions.loadedAttributions +initiallyExpanded:false +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/OpalAttributionsLoader.qml b/qml/modules/Opal/About/private/OpalAttributionsLoader.qml new file mode 100644 index 0000000..814d789 --- /dev/null +++ b/qml/modules/Opal/About/private/OpalAttributionsLoader.qml @@ -0,0 +1,60 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.2 +import Qt.labs.folderlistmodel 2.1 +FolderListModel{id:root +property var loadedAttributions:([]) +property bool enabled:false +property int _expectedCount:0 +property int _objectsCreated:0 +property int _round:0 +folder:enabled?Qt.resolvedUrl("../../Attributions"):"" +rootFolder:folder +showDirs:false +showFiles:true +showHidden:false +showOnlyReadable:true +sortField:FolderListModel.Unsorted +nameFilters:["Opal*Attribution.qml"] +onCountChanged:{console.log("[Opal.About] loading",root.count,"Opal attributions | round",_round) +var count=root.count +loadedAttributions=[] +_expectedCount=count +_objectsCreated=0 +_round+=1 +var round=_round +var i=0 +while(i=_expectedCount){loadedAttributions.sort(function(a,b){return a.name.localeCompare(b.name) +}) +loadedAttributions=loadedAttributions +}}) +i+=1 +}}function createObjectAsync(url,name,properties,parent,callback){var comp=Qt.createComponent(Qt.resolvedUrl(url),Component.Asynchronous,root) +function _finishComponent(){if(comp.status===Component.Error){console.log("[Opal] Failed to create component “%1”:".arg(name),comp.errorString) +callback(null,url,name) +return true +}else if(comp.status===Component.Ready){var incubator=comp.incubateObject(parent,properties,Qt.Asynchronous) +function _finishObject(){if(incubator.status===Component.Error){console.log("[Opal] Failed to create object “%1”".arg(name)) +console.log(incubator.errorString) +callback(null,url,name) +return true +}else if(incubator.status===Component.Ready){callback(incubator.object,url,name) +return true +}return false +} +if(!_finishObject()){incubator.onStatusChanged=function(status){_finishObject() +} +}return true +}return false +} +if(!_finishComponent()){comp.statusChanged.connect(_finishComponent) +}}} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/ScrollbarType.qml b/qml/modules/Opal/About/private/ScrollbarType.qml new file mode 100644 index 0000000..77b3ecb --- /dev/null +++ b/qml/modules/Opal/About/private/ScrollbarType.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +pragma Singleton +import QtQuick 2.0 +QtObject{readonly property int none:0 +readonly property int plain:1 +readonly property int advanced:2 +readonly property int auto:3 +} \ No newline at end of file diff --git a/qml/modules/Opal/About/private/functions.js b/qml/modules/Opal/About/private/functions.js new file mode 100644 index 0000000..83e99c4 --- /dev/null +++ b/qml/modules/Opal/About/private/functions.js @@ -0,0 +1,6 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021-2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +.pragma library +function updateSpdxList(licenses,spdxTarget,force){if(spdxTarget!==null&&force!==true){return null;}var spdx=[];for(var i in licenses){spdx.push(licenses[i].spdxId);}return{spdx:spdx};};function makeStringListConcat(first,second,allowEmpty){var a=makeStringList(first,allowEmpty);var b=makeStringList(second,allowEmpty);return a.concat(b);};function makeStringList(listOrString,allowEmpty){if(!(listOrString instanceof Array))listOrString=[listOrString];var ae=(allowEmpty===true?1:0);var ret=[];for(var i in listOrString){var val=listOrString[i];var str=(typeof val==="string"?val:(!val?"":String(val))).trim();if(ae===0&&!val)continue;ret.push(val);}return ret;};function formatAppVersion(version,release,releaseType){var versionString=version;if(!!release&&release!==""&&release!=="1"){versionString+="-"+release;}if(!!releaseType&&releaseType!==""){versionString+=" (%1)".arg(releaseType);}return versionString;}; \ No newline at end of file diff --git a/qml/modules/Opal/About/private/qmldir b/qml/modules/Opal/About/private/qmldir new file mode 100644 index 0000000..fb828d8 --- /dev/null +++ b/qml/modules/Opal/About/private/qmldir @@ -0,0 +1,18 @@ +module Opal.About.private +# This file is part of Opal.About. +# SPDX-FileCopyrightText: 2020-2025 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +singleton ScrollbarType 1.0 ScrollbarType.qml +Functions 1.0 functions.js +WorkerSpdx 1.0 worker_spdx.js +ChangelogItemsLoader 1.0 ChangelogItemsLoader.qml +ChangelogPage 1.0 ChangelogPage.qml +ChangelogView 1.0 ChangelogView.qml +ContributorsAttributionRepeater 1.0 ContributorsAttributionRepeater.qml +ContributorsPage 1.0 ContributorsPage.qml +DetailList 1.0 DetailList.qml +DonationsGroup 1.0 DonationsGroup.qml +LicenseListPart 1.0 LicenseListPart.qml +LicenseListRepeater 1.0 LicenseListRepeater.qml +LicensePage 1.0 LicensePage.qml +OpalAttributionsLoader 1.0 OpalAttributionsLoader.qml diff --git a/qml/modules/Opal/About/private/worker_spdx.js b/qml/modules/Opal/About/private/worker_spdx.js new file mode 100644 index 0000000..3aa2f11 --- /dev/null +++ b/qml/modules/Opal/About/private/worker_spdx.js @@ -0,0 +1,5 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2021-2022 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +var LOG_SCOPE="[Opal.About]";function getShortText(origShortText,spdxId){if(!!origShortText)return origShortText;if(/^[AL]?GPL-/ .test(spdxId)){return"This is free software: you are welcome to redistribute it under certain conditions. "+"There is NO WARRANTY, to the extent permitted by law.";}return origShortText;};function sendError(spdxId,shortText){WorkerScript.sendMessage({spdxId:spdxId,name:"",fullText:"",shortText:shortText,error:true});};function sendSuccess(spdxId,name,fullText,shortText){WorkerScript.sendMessage({spdxId:spdxId,name:name,fullText:fullText,shortText:shortText,error:false});};function request(type,url,onSuccess,onFailure,postData){var xhr=new XMLHttpRequest;xhr.open(type,url);xhr.onreadystatechange=function(){if(xhr.readyState===XMLHttpRequest.DONE){var response=xhr.responseText;if(response===""){onFailure(xhr);}else{onSuccess(xhr);}}};if(postData!==undefined&&type==="PUT"){xhr.send(postData);}else{xhr.send();}};function loadRemote(spdxId,localUrl,remoteUrl,origShortText){request("GET",remoteUrl,function(xhr){try{var o=JSON.parse(xhr.responseText);if(!o||typeof o!=="object")throw 1;console.log(LOG_SCOPE,"license loaded remotely from",remoteUrl);sendSuccess(spdxId,o["name"],o["licenseText"],getShortText(origShortText,spdxId));request("PUT",localUrl,function(x){console.log(LOG_SCOPE,"saved license with status",x.status,"to",localUrl);},function(x){},xhr.responseText);}catch(e){console.log(LOG_SCOPE,"failed to load license remotely from",remoteUrl);sendError(spdxId,getShortText(origShortText,spdxId));}},function(xhr){console.log(LOG_SCOPE,"failed to load license remotely from",remoteUrl);sendError(spdxId,getShortText(origShortText,spdxId));});};WorkerScript.onMessage=function(message){if(message.spdxId===undefined||message.spdxId===""){console.error(LOG_SCOPE,"cannot load license without spdx id");sendError("");return;}request("GET",message.localUrl,function(xhr){try{var o=JSON.parse(xhr.responseText);if(!o||typeof o!=="object")throw 1;console.log(LOG_SCOPE,"license loaded locally from",message.localUrl);sendSuccess(message.spdxId,o["name"],o["licenseText"],getShortText(message.shortText,message.spdxId));}catch(e){if(!!message.online){loadRemote(message.spdxId,message.localUrl,message.remoteUrl,message.shortText);}else{console.log(LOG_SCOPE,"license not cached at "+message.localUrl+", skipping download in offline mode");sendError(message.spdxId,getShortText(message.shortText,message.spdxId));}}},function(xhr){if(!!message.online){loadRemote(message.spdxId,message.localUrl,message.remoteUrl,message.shortText);}else{console.log(LOG_SCOPE,"license not cached at "+message.localUrl+", skipping download in offline mode");sendError(message.spdxId,getShortText(message.shortText,message.spdxId));}});}; \ No newline at end of file diff --git a/qml/modules/Opal/About/qmldir b/qml/modules/Opal/About/qmldir new file mode 100644 index 0000000..43f607d --- /dev/null +++ b/qml/modules/Opal/About/qmldir @@ -0,0 +1,17 @@ +module Opal.About +# This file is part of Opal.About. +# SPDX-FileCopyrightText: 2020-2023 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +AboutPageBase 1.0 AboutPageBase.qml +Attribution 1.0 Attribution.qml +ContributionGroup 1.0 ContributionGroup.qml +ContributionSection 1.0 ContributionSection.qml +DonationService 1.0 DonationService.qml +InfoButton 1.0 InfoButton.qml +InfoSection 1.0 InfoSection.qml +License 1.0 License.qml +ChangelogItem 1.0 ChangelogItem.qml +ChangelogList 1.0 ChangelogList.qml +ChangelogNews 1.0 ChangelogNews.qml +# generated files: +OpalAboutAttribution 1.0 OpalAboutAttribution.qml diff --git a/qml/modules/Opal/Attributions/OpalAboutAttribution.qml b/qml/modules/Opal/Attributions/OpalAboutAttribution.qml new file mode 100644 index 0000000..c9ab9d3 --- /dev/null +++ b/qml/modules/Opal/Attributions/OpalAboutAttribution.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-about. +//@ https://github.com/Pretty-SFOS/opal-about +//@ SPDX-FileCopyrightText: 2018-2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import"../../Opal/About"as A +A.Attribution{name:"Opal.About (v3.0.0)" +entries:["2018-2024 Mirian Margiani"] +licenses:A.License{spdxId:"GPL-3.0-or-later" +}sources:"https://github.com/Pretty-SFOS/opal-about" +homepage:"https://github.com/Pretty-SFOS/opal" +} \ No newline at end of file diff --git a/qml/modules/Opal/Attributions/OpalDelegatesAttribution.qml b/qml/modules/Opal/Attributions/OpalDelegatesAttribution.qml new file mode 100644 index 0000000..ccc883b --- /dev/null +++ b/qml/modules/Opal/Attributions/OpalDelegatesAttribution.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024-2025 Mirian Margiani (ichthyosaurus):2023 Peter G. (nephros) +//@ SPDX-License-Identifier: GPL-3.0-or-later +import"../../Opal/About"as A +A.Attribution{name:"Opal.Delegates (v3.5.1)" +entries:["2024-2025 Mirian Margiani (ichthyosaurus)","2023 Peter G. (nephros)"] +licenses:A.License{spdxId:"GPL-3.0-or-later" +}sources:"https://github.com/Pretty-SFOS/opal-delegates" +homepage:"https://github.com/Pretty-SFOS/opal" +} \ No newline at end of file diff --git a/qml/modules/Opal/Attributions/OpalLinkHandlerAttribution.qml b/qml/modules/Opal/Attributions/OpalLinkHandlerAttribution.qml new file mode 100644 index 0000000..959cce9 --- /dev/null +++ b/qml/modules/Opal/Attributions/OpalLinkHandlerAttribution.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-linkhandler. +//@ https://github.com/Pretty-SFOS/opal-linkhandler +//@ SPDX-FileCopyrightText: 2020-2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import"../../Opal/About"as A +A.Attribution{name:"Opal.LinkHandler (v2.3.0)" +entries:["2020-2024 Mirian Margiani"] +licenses:A.License{spdxId:"GPL-3.0-or-later" +}sources:"https://github.com/Pretty-SFOS/opal-linkhandler" +homepage:"https://github.com/Pretty-SFOS/opal" +} \ No newline at end of file diff --git a/qml/modules/Opal/Attributions/OpalMenuSwitchAttribution.qml b/qml/modules/Opal/Attributions/OpalMenuSwitchAttribution.qml new file mode 100644 index 0000000..419350c --- /dev/null +++ b/qml/modules/Opal/Attributions/OpalMenuSwitchAttribution.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-menuswitch. +//@ https://github.com/Pretty-SFOS/opal-menuswitch +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import"../../Opal/About"as A +A.Attribution{name:"Opal.MenuSwitch (v1.0.1)" +entries:["2024 Mirian Margiani"] +licenses:A.License{spdxId:"GPL-3.0-or-later" +}sources:"https://github.com/Pretty-SFOS/opal-menuswitch" +homepage:"https://github.com/Pretty-SFOS/opal" +} \ No newline at end of file diff --git a/qml/modules/Opal/Attributions/OpalSmartScrollbarAttribution.qml b/qml/modules/Opal/Attributions/OpalSmartScrollbarAttribution.qml new file mode 100644 index 0000000..feb4c9b --- /dev/null +++ b/qml/modules/Opal/Attributions/OpalSmartScrollbarAttribution.qml @@ -0,0 +1,11 @@ +//@ This file is part of opal-smartscrollbar. +//@ https://github.com/Pretty-SFOS/opal-smartscrollbar +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import"../../Opal/About"as A +A.Attribution{name:"Opal.SmartScrollbar (v1.0.0)" +entries:["2024 Mirian Margiani"] +licenses:A.License{spdxId:"GPL-3.0-or-later" +}sources:"https://github.com/Pretty-SFOS/opal-smartscrollbar" +homepage:"https://github.com/Pretty-SFOS/opal" +} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/DelegateColumn.qml b/qml/modules/Opal/Delegates/DelegateColumn.qml new file mode 100644 index 0000000..50f593d --- /dev/null +++ b/qml/modules/Opal/Delegates/DelegateColumn.qml @@ -0,0 +1,12 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +Column{id:root +width:parent.width +property alias model:repeater.model +property alias delegate:repeater.delegate +Repeater{id:repeater +}} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/DelegateIconButton.qml b/qml/modules/Opal/Delegates/DelegateIconButton.qml new file mode 100644 index 0000000..0d5b0d5 --- /dev/null +++ b/qml/modules/Opal/Delegates/DelegateIconButton.qml @@ -0,0 +1,57 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +SilicaItem{id:root +property url iconSource +property alias iconSize:button.width +property alias text:label.text +property alias icon:button.icon +property alias iconButton:button +property alias textLabel:label +property Item _delegate:!!parent&&parent._delegate?parent._delegate:(__padded_delegate||null) +signal clicked(var mouse) +signal pressAndHold(var mouse) +width:Math.max(label.implicitWidth,button.width) +height:Math.max(button.height+label.effectiveHeight,(!!_delegate&&_delegate.minContentHeight?_delegate.minContentHeight:0)) +highlighted:area.pressed||button.down||(!!_delegate&&_delegate.interactive&&_delegate.down)||(!!_delegate&&_delegate.menuOpen) +enabled:!!_delegate?_delegate.enabled:true +MouseArea{id:area +z:-100 +anchors.fill:parent +enabled:root.enabled +onClicked:{root.clicked(mouse) +}onPressAndHold:{root.clicked(mouse) +}}SilicaItem{id:body +width:parent.width +height:button.height+label.effectiveHeight +anchors.verticalCenter:parent.verticalCenter +IconButton{id:button +width:!!iconSource.toString()?Theme.iconSizeMedium:0 +height:width +anchors.horizontalCenter:parent.horizontalCenter +icon.fillMode:Image.PreserveAspectFit +icon.source:iconSource +enabled:root.enabled +onClicked:{root.clicked(mouse) +}onPressAndHold:{root.clicked(mouse) +}Binding on highlighted{when:area.pressed||root.highlighted +value:true +}}OptionalLabel{id:label +property int effectiveHeight:0 +width:parent.width +font.pixelSize:Theme.fontSizeExtraSmall +fontSizeMode:Text.HorizontalFit +minimumPixelSize:0.8*Theme.fontSizeTiny +wrapped:true +highlighted:root.highlighted +horizontalAlignment:Text.AlignHCenter +anchors{top:button.bottom +topMargin:!!text?Theme.paddingSmall:0 +horizontalCenter:parent.horizontalCenter +}onLineLaidOut:{if(line.isLast&&!!text){effectiveHeight=line.y+line.height+anchors.topMargin +}}Binding on effectiveHeight{when:text=="" +value:0 +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/DelegateIconItem.qml b/qml/modules/Opal/Delegates/DelegateIconItem.qml new file mode 100644 index 0000000..cb4b289 --- /dev/null +++ b/qml/modules/Opal/Delegates/DelegateIconItem.qml @@ -0,0 +1,12 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +HighlightImage{width:Theme.iconSizeMedium +height:width +fillMode:Image.PreserveAspectFit +color:Theme.primaryColor +highlighted:parent.highlighted +} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/DelegateInfoItem.qml b/qml/modules/Opal/Delegates/DelegateInfoItem.qml new file mode 100644 index 0000000..18ab2cc --- /dev/null +++ b/qml/modules/Opal/Delegates/DelegateInfoItem.qml @@ -0,0 +1,121 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.5 +import Sailfish.Silica 1.0 +Item{id:root +width:Math.max(column.width,minWidth) +height:Math.max(parent.height,column.height) +property int minWidth:Theme.itemSizeMedium +property int fixedWidth:0 +property int alignment:Qt.AlignHCenter +property int __textAlignment:{if(alignment==Qt.AlignHCenter)Text.AlignHCenter +else if(alignment==Qt.AlignLeft)Text.AlignLeft +else if(alignment==Qt.AlignRight)Text.AlignRight +else Text.AlignHCenter +}property string title +property string text +property string description +readonly property alias titleLabel:_line0 +readonly property alias textLabel:_line1 +readonly property alias descriptionLabel:_line2 +Column{id:column +width:Math.max(_line0.width,_line1.width,_line2.width) +height:Math.max(root.parent.height,_line0.height+_line1.height+_line2.height) +anchors{horizontalCenter:parent.horizontalCenter +verticalCenter:parent.verticalCenter +}OptionalLabel{id:_line0 +anchors.horizontalCenter:parent.horizontalCenter +font.pixelSize:Theme.fontSizeExtraSmall +text:root.title +palette{primaryColor:Theme.secondaryColor +highlightColor:Theme.secondaryHighlightColor +}}OptionalLabel{id:_line1 +anchors.horizontalCenter:parent.horizontalCenter +font.pixelSize:Theme.fontSizeLarge +text:root.text +palette{primaryColor:Theme.primaryColor +highlightColor:Theme.highlightColor +}}OptionalLabel{id:_line2 +anchors.horizontalCenter:parent.horizontalCenter +font.pixelSize:Theme.fontSizeExtraSmall +text:root.description +palette{primaryColor:Theme.secondaryColor +highlightColor:Theme.secondaryHighlightColor +}}states:[State{name:"alignLeft" +when:alignment==Qt.AlignLeft +AnchorChanges{target:column +anchors.horizontalCenter:undefined +anchors.left:parent.left +anchors.right:undefined +}PropertyChanges{target:_line0 +horizontalAlignment:Text.AlignLeft +}AnchorChanges{target:_line0 +anchors.horizontalCenter:undefined +anchors.left:parent.left +anchors.right:undefined +}PropertyChanges{target:_line1 +horizontalAlignment:Text.AlignLeft +}AnchorChanges{target:_line1 +anchors.horizontalCenter:undefined +anchors.left:parent.left +anchors.right:undefined +}PropertyChanges{target:_line2 +horizontalAlignment:Text.AlignLeft +}AnchorChanges{target:_line2 +anchors.horizontalCenter:undefined +anchors.left:parent.left +anchors.right:undefined +}},State{name:"alignRight" +when:alignment==Qt.AlignRight +AnchorChanges{target:column +anchors.horizontalCenter:undefined +anchors.left:undefined +anchors.right:parent.right +}PropertyChanges{target:_line0 +horizontalAlignment:Text.AlignRight +}AnchorChanges{target:_line0 +anchors.horizontalCenter:undefined +anchors.left:undefined +anchors.right:parent.right +}PropertyChanges{target:_line1 +horizontalAlignment:Text.AlignRight +}AnchorChanges{target:_line1 +anchors.horizontalCenter:undefined +anchors.left:undefined +anchors.right:parent.right +}PropertyChanges{target:_line2 +horizontalAlignment:Text.AlignRight +}AnchorChanges{target:_line2 +anchors.horizontalCenter:undefined +anchors.left:undefined +anchors.right:parent.right +}}]}states:[State{name:"fixedWidth" +when:fixedWidth>0 +PropertyChanges{target:root +width:fixedWidth +}PropertyChanges{target:column +width:fixedWidth +}PropertyChanges{target:_line0 +width:fixedWidth +wrapped:false +horizontalAlignment:_line0.contentWidth>fixedWidth?Text.AlignLeft:__textAlignment +}AnchorChanges{target:_line0 +anchors.horizontalCenter:undefined +anchors.left:parent.left +}PropertyChanges{target:_line1 +width:fixedWidth +wrapped:false +horizontalAlignment:_line1.contentWidth>fixedWidth?Text.AlignLeft:__textAlignment +}AnchorChanges{target:_line1 +anchors.horizontalCenter:undefined +anchors.left:parent.left +}PropertyChanges{target:_line2 +width:fixedWidth +wrapped:false +horizontalAlignment:_line2.contentWidth>fixedWidth?Text.AlignLeft:__textAlignment +}AnchorChanges{target:_line2 +anchors.horizontalCenter:undefined +anchors.left:parent.left +}}]} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/OneLineDelegate.qml b/qml/modules/Opal/Delegates/OneLineDelegate.qml new file mode 100644 index 0000000..26dc77f --- /dev/null +++ b/qml/modules/Opal/Delegates/OneLineDelegate.qml @@ -0,0 +1,21 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +PaddedDelegate{id:root +minContentHeight:Theme.itemSizeSmall-padding.effectiveTop-padding.effectiveBottom +centeredContainer:contentColumn +property string text +readonly property alias textLabel:_line1 +readonly property alias bodyColumn:contentColumn +Column{id:contentColumn +width:parent.width +OptionalLabel{id:_line1 +width:parent.width +text:root.text +font.pixelSize:Theme.fontSizeMedium +palette{primaryColor:Theme.primaryColor +highlightColor:Theme.highlightColor +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/OptionalLabel.qml b/qml/modules/Opal/Delegates/OptionalLabel.qml new file mode 100644 index 0000000..b32d5ad --- /dev/null +++ b/qml/modules/Opal/Delegates/OptionalLabel.qml @@ -0,0 +1,20 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.5 +import Sailfish.Silica 1.0 +Label{id:root +property bool wrapped:false +Binding on height{when:text=="" +value:0 +}height:implicitHeight +wrapMode:Text.NoWrap +truncationMode:TruncationMode.Fade +states:[State{name:"wrapped" +when:root.wrapped||text.indexOf("\n")>-1 +PropertyChanges{target:root +wrapMode:Text.Wrap +elide:Text.ElideNone +truncationMode:TruncationMode.None +}}]} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/PaddedDelegate.qml b/qml/modules/Opal/Delegates/PaddedDelegate.qml new file mode 100644 index 0000000..8378fbc --- /dev/null +++ b/qml/modules/Opal/Delegates/PaddedDelegate.qml @@ -0,0 +1,159 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2023 Peter G. (nephros) +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import"private" +ListItem{id:root +property bool showOddEven:false +property color oddColor:"transparent" +property color evenColor:Theme.rgba(Theme.highlightBackgroundColor,Theme.opacityLow) +property alias emphasisBackground:emphasisBackground +property bool _isOddRow:typeof index!=="undefined"&&(index%2!=0) +readonly property int _modelIndex:typeof index!=="undefined"?index:-1 +property bool interactive:true +property Component leftItem:null +readonly property alias leftItemLoader:leftItemLoader +readonly property alias centerItem:centerItem +property Component rightItem:null +readonly property alias rightItemLoader:rightItemLoader +property bool loadSideItemsAsync:false +default property alias contents:centerItem.data +property var centeredContainer +property int minContentHeight:Theme.itemSizeMedium +property int spacing:Theme.paddingMedium +property int rightItemAlignment:Qt.AlignVCenter +property int leftItemAlignment:Qt.AlignVCenter +readonly property PaddingData padding:PaddingData{readonly property int __defaultLeftRight:Theme.horizontalPageMargin +readonly property int __defaultTopBottom:Theme.paddingSmall +leftRight:all===_undefinedValue&&(left===_undefinedValue||right===_undefinedValue)?__defaultLeftRight:NaN +topBottom:all===_undefinedValue&&(top===_undefinedValue||bottom===_undefinedValue)?__defaultTopBottom:NaN +} +property Item dragHandler:null +readonly property Item _effectiveDragHandler:!!dragHandler&&dragHandler.hasOwnProperty("__opal_view_drag_handler")?dragHandler:null +property int dragHandleAlignment:leftItemAlignment===Qt.AlignTop||rightItemAlignment===Qt.AlignTop?Qt.AlignTop:Qt.AlignVCenter +property bool enableDefaultGrabHandle:true +property bool hideRightItemWhileDragging:enableDefaultGrabHandle +readonly property bool draggable:!!_effectiveDragHandler&&!!_effectiveDragHandler.active +function toggleWrappedText(label){label.wrapped=!label.wrapped +}opacity:enabled?1.0:Theme.opacityLow +Binding on highlighted{when:!interactive +value:true +}Binding on _backgroundColor{when:!interactive +value:"transparent" +}contentHeight:hidden?0:Math.max(topPaddingItem.height+bottomPaddingItem.height+Math.max(leftItemLoader.height,rightItemLoader.height,centerItem.height),minContentHeight) +Item{id:topPaddingItem +anchors.bottom:centerItem.top +width:root.width +height:padding.effectiveTop +}Item{id:bottomPaddingItem +anchors.top:centerItem.bottom +width:root.width +height:padding.effectiveBottom +}Item{id:leftPaddingItem +anchors.left:parent.left +width:padding.effectiveLeft +height:contentHeight +}Item{id:rightPaddingItem +anchors.right:parent.right +width:padding.effectiveRight +height:contentHeight +}Loader{id:leftItemLoader +sourceComponent:leftItem +asynchronous:loadSideItemsAsync +anchors{left:leftPaddingItem.right +verticalCenter:parent.verticalCenter +}property Item __padded_delegate:root +Binding{target:!!leftItemLoader.item&&leftItemLoader.item.hasOwnProperty("_delegate")?leftItemLoader.item:null +property:"_delegate" +value:root +}states:[State{when:leftItemAlignment==Qt.AlignVCenter +AnchorChanges{target:leftItemLoader +anchors.verticalCenter:leftItemLoader.parent.verticalCenter +anchors.top:undefined +anchors.bottom:undefined +}},State{when:leftItemAlignment==Qt.AlignTop +AnchorChanges{target:leftItemLoader +anchors.verticalCenter:undefined +anchors.top:topPaddingItem.bottom +anchors.bottom:undefined +}},State{when:leftItemAlignment==Qt.AlignBottom +AnchorChanges{target:leftItemLoader +anchors.verticalCenter:undefined +anchors.top:undefined +anchors.bottom:bottomPaddingItem.top +}}]}Loader{id:rightItemLoader +visible:!hideRightItemWhileDragging||!dragHandleLoader.visible +sourceComponent:rightItem +asynchronous:loadSideItemsAsync +anchors{right:rightPaddingItem.left +verticalCenter:parent.verticalCenter +}property Item __padded_delegate:root +Binding{target:!!rightItemLoader.item&&rightItemLoader.item.hasOwnProperty("_delegate")?rightItemLoader.item:null +property:"_delegate" +value:root +}states:[State{when:rightItemAlignment==Qt.AlignVCenter +AnchorChanges{target:rightItemLoader +anchors.verticalCenter:rightItemLoader.parent.verticalCenter +anchors.top:undefined +anchors.bottom:undefined +}},State{when:rightItemAlignment==Qt.AlignTop +AnchorChanges{target:rightItemLoader +anchors.verticalCenter:undefined +anchors.top:topPaddingItem.bottom +anchors.bottom:undefined +}},State{when:rightItemAlignment==Qt.AlignBottom +AnchorChanges{target:rightItemLoader +anchors.verticalCenter:undefined +anchors.top:undefined +anchors.bottom:bottomPaddingItem.top +}}]}Loader{id:dragHandleLoader +visible:enableDefaultGrabHandle&&status===Loader.Ready&&draggable +property QtObject viewHandler:_effectiveDragHandler +property Item handledItem:root +property int modelIndex:root._modelIndex +source:!!_effectiveDragHandler&&enableDefaultGrabHandle?Qt.resolvedUrl("private/OptionalDragHandle.qml"):"" +asynchronous:false +height:contentHeight +anchors{right:rightItemLoader.left +rightMargin:rightItemLoader.width>0?root.spacing:0 +top:parent.top +}Binding{target:!!dragHandleLoader.item&&dragHandleLoader.item.hasOwnProperty("_delegate")?dragHandleLoader.item:null +property:"_delegate" +value:root +}states:[State{when:!rightItemLoader.visible +AnchorChanges{target:dragHandleLoader +anchors.right:rightPaddingItem.left +}PropertyChanges{target:dragHandleLoader +anchors.rightMargin:0 +}}]}SilicaItem{id:centerItem +height:Math.max(minContentHeight,childrenRect.height) +anchors{left:leftItemLoader.right +leftMargin:leftItemLoader.width>0?spacing:0 +right:rightItemLoader.left +rightMargin:rightItemLoader.width>0?spacing:0 +verticalCenter:parent.verticalCenter +}states:State{when:dragHandleLoader.visible +AnchorChanges{target:centerItem +anchors.right:dragHandleLoader.left +}PropertyChanges{target:centerItem +anchors.rightMargin:dragHandleLoader.width>0?spacing:0 +}}}Rectangle{id:emphasisBackground +anchors.fill:parent +visible:showOddEven +radius:0 +opacity:Theme.opacityFaint +color:_isOddRow?oddColor:evenColor +}states:[State{name:"tall" +when:!!centeredContainer&&(centeredContainer.height>minContentHeight||centeredContainer.implicitHeight>minContentHeight||centeredContainer.childrenRect.height>minContentHeight) +AnchorChanges{target:centeredContainer +anchors{verticalCenter:undefined +top:centeredContainer.parent.top +}}},State{name:"short" +when:!!centeredContainer&&(centeredContainer.height<=minContentHeight||centeredContainer.implicitHeight<=minContentHeight||centeredContainer.childrenRect.height<=minContentHeight) +AnchorChanges{target:centeredContainer +anchors{top:undefined +verticalCenter:centeredContainer.parent.verticalCenter +}}}]} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/ThreeLineDelegate.qml b/qml/modules/Opal/Delegates/ThreeLineDelegate.qml new file mode 100644 index 0000000..2acf249 --- /dev/null +++ b/qml/modules/Opal/Delegates/ThreeLineDelegate.qml @@ -0,0 +1,38 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2023 Peter G. (nephros) +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +PaddedDelegate{id:root +minContentHeight:Theme.itemSizeLarge-padding.effectiveTop-padding.effectiveBottom +centeredContainer:contentColumn +property string title +property string text +property string description +readonly property alias titleLabel:_line0 +readonly property alias textLabel:_line1 +readonly property alias descriptionLabel:_line2 +readonly property alias bodyColumn:contentColumn +Column{id:contentColumn +width:parent.width +OptionalLabel{id:_line0 +width:parent.width +text:root.title +font.pixelSize:Theme.fontSizeSmall +palette{primaryColor:Theme.secondaryHighlightColor +highlightColor:Theme.highlightColor +}}OptionalLabel{id:_line1 +width:parent.width +text:root.text +font.pixelSize:Theme.fontSizeMedium +palette{primaryColor:Theme.primaryColor +highlightColor:Theme.highlightColor +}}OptionalLabel{id:_line2 +width:parent.width +text:root.description +font.pixelSize:Theme.fontSizeSmall +palette{primaryColor:Theme.secondaryColor +highlightColor:Theme.secondaryHighlightColor +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/TwoLineDelegate.qml b/qml/modules/Opal/Delegates/TwoLineDelegate.qml new file mode 100644 index 0000000..ce6b989 --- /dev/null +++ b/qml/modules/Opal/Delegates/TwoLineDelegate.qml @@ -0,0 +1,30 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2023 Peter G. (nephros) +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +import Sailfish.Silica 1.0 +PaddedDelegate{id:root +minContentHeight:Theme.itemSizeMedium-padding.effectiveTop-padding.effectiveBottom +centeredContainer:contentColumn +property string text +property string description +readonly property alias textLabel:_line1 +readonly property alias descriptionLabel:_line2 +readonly property alias bodyColumn:contentColumn +Column{id:contentColumn +width:parent.width +OptionalLabel{id:_line1 +width:parent.width +text:root.text +font.pixelSize:Theme.fontSizeMedium +palette{primaryColor:Theme.primaryColor +highlightColor:Theme.highlightColor +}}OptionalLabel{id:_line2 +width:parent.width +text:root.description +font.pixelSize:Theme.fontSizeSmall +palette{primaryColor:Theme.secondaryColor +highlightColor:Theme.secondaryHighlightColor +}}}} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/private/OptionalDragHandle.qml b/qml/modules/Opal/Delegates/private/OptionalDragHandle.qml new file mode 100644 index 0000000..c3680ec --- /dev/null +++ b/qml/modules/Opal/Delegates/private/OptionalDragHandle.qml @@ -0,0 +1,22 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.6 +import"../../DragDrop" +DragHandle{id:root +property QtObject __viewHandler:viewHandler +property Item __handledItem:handledItem +property int __modelIndex:modelIndex +property var _delegate +verticalPadding:{if(!_delegate){return 0 +}else if(_delegate.dragHandleAlignment===Qt.AlignTop){return _delegate.padding.effectiveTop +}else if(_delegate.dragHandleAlignment===Qt.AlignBottom){return _delegate.padding.effectiveBottom +}else{return 0 +}}verticalAlignment:!!_delegate?_delegate.dragHandleAlignment:Qt.AlignVCenter +highlighted:!!_delegate&&((_delegate.interactive&&_delegate.down)||(_delegate.menuOpen)) +moveHandler:DelegateDragHandler{id:handler +viewHandler:__viewHandler +handledItem:__handledItem +modelIndex:__modelIndex +}} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/private/PaddingData.qml b/qml/modules/Opal/Delegates/private/PaddingData.qml new file mode 100644 index 0000000..7d200dd --- /dev/null +++ b/qml/modules/Opal/Delegates/private/PaddingData.qml @@ -0,0 +1,21 @@ +//@ This file is part of opal-delegates. +//@ https://github.com/Pretty-SFOS/opal-delegates +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.0 +QtObject{property int _undefinedValue:-9999 +property int all:_undefinedValue +property int leftRight:_undefinedValue +property int topBottom:_undefinedValue +property int top:_undefinedValue +property int bottom:_undefinedValue +property int left:_undefinedValue +property int right:_undefinedValue +readonly property int effectiveTop:top!==_undefinedValue?top:_topBottom +readonly property int effectiveBottom:bottom!==_undefinedValue?bottom:_topBottom +readonly property int effectiveLeft:left!==_undefinedValue?left:_leftRight +readonly property int effectiveRight:right!==_undefinedValue?right:_leftRight +readonly property int _all:all!==_undefinedValue?all:0 +readonly property int _topBottom:topBottom!==_undefinedValue?topBottom:_all +readonly property int _leftRight:leftRight!==_undefinedValue?leftRight:_all +} \ No newline at end of file diff --git a/qml/modules/Opal/Delegates/qmldir b/qml/modules/Opal/Delegates/qmldir new file mode 100644 index 0000000..0ca6ce3 --- /dev/null +++ b/qml/modules/Opal/Delegates/qmldir @@ -0,0 +1,14 @@ +module Opal.Delegates +# This file is part of Opal.Delegates. +# SPDX-FileCopyrightText: 2023 Peter G. (nephros) +# SPDX-FileCopyrightText: 2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +PaddedDelegate 1.0 PaddedDelegate.qml +OptionalLabel 1.0 OptionalLabel.qml +DelegateColumn 1.0 DelegateColumn.qml +OneLineDelegate 1.0 OneLineDelegate.qml +TwoLineDelegate 1.0 TwoLineDelegate.qml +ThreeLineDelegate 1.0 ThreeLineDelegate.qml +DelegateIconItem 1.0 DelegateIconItem.qml +DelegateInfoItem 1.0 DelegateInfoItem.qml +DelegateIconButton 1.0 DelegateIconButton.qml diff --git a/qml/modules/Opal/LinkHandler/LinkHandler.js b/qml/modules/Opal/LinkHandler/LinkHandler.js new file mode 100644 index 0000000..b9b9862 --- /dev/null +++ b/qml/modules/Opal/LinkHandler/LinkHandler.js @@ -0,0 +1,5 @@ +//@ This file is part of opal-linkhandler. +//@ https://github.com/Pretty-SFOS/opal-linkhandler +//@ SPDX-FileCopyrightText: 2020-2023 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +function openOrCopyUrl(externalUrl,title){pageStack.push(Qt.resolvedUrl("private/ExternalUrlPage.qml"),{"externalUrl":externalUrl,"title":!!title?title:""});};function openOrCopyMultipleUrls(sets){var pages=[];for(var i=0;iScreen.Medium)?Theme.buttonWidthLarge:Theme.buttonWidthSmall +Button{text:qsTranslate("Opal.LinkHandler","Copy text to clipboard") +visible:title +onClicked:{Clipboard.text=title +copyNotification.publish() +pageStack.pop() +}}Button{ButtonLayout.newLine:root.isPortrait||Screen.sizeCategory>Screen.Medium +text:qsTranslate("Opal.LinkHandler","Copy to clipboard") +onClicked:{Clipboard.text=externalUrl +copyNotification.publish() +pageStack.pop() +}}}ButtonLayout{preferredWidth:firstRow.preferredWidth +Button{text:qsTranslate("Opal.LinkHandler","Share") +onClicked:{shareHandler.resources=[{"type":"text/x-url","linkTitle":title,"status":externalUrl.toString()}] +shareHandler.trigger() +pageStack.pop() +}}Button{ButtonLayout.newLine:root.isPortrait||Screen.sizeCategory>Screen.Medium +text:/^http[s]?:\/\// .test(externalUrl)?qsTranslate("Opal.LinkHandler","Open in browser"):qsTranslate("Opal.LinkHandler","Open externally") +onClicked:{Qt.openUrlExternally(externalUrl) +pageStack.pop() +}}}}} \ No newline at end of file diff --git a/qml/modules/Opal/LinkHandler/private/qmldir b/qml/modules/Opal/LinkHandler/private/qmldir new file mode 100644 index 0000000..84be712 --- /dev/null +++ b/qml/modules/Opal/LinkHandler/private/qmldir @@ -0,0 +1,5 @@ +module Opal.LinkHandler.private +# This file is part of Opal.LinkHandler. +# SPDX-FileCopyrightText: 2023 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +ExternalUrlPage 1.0 ExternalUrlPage.qml diff --git a/qml/modules/Opal/LinkHandler/qmldir b/qml/modules/Opal/LinkHandler/qmldir new file mode 100644 index 0000000..e1b28af --- /dev/null +++ b/qml/modules/Opal/LinkHandler/qmldir @@ -0,0 +1,5 @@ +module Opal.LinkHandler +# This file is part of Opal.LinkHandler. +# SPDX-FileCopyrightText: 2023 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +LinkHandler 1.0 LinkHandler.js diff --git a/qml/modules/Opal/MenuSwitch/MenuSwitch.qml b/qml/modules/Opal/MenuSwitch/MenuSwitch.qml new file mode 100644 index 0000000..6b7d042 --- /dev/null +++ b/qml/modules/Opal/MenuSwitch/MenuSwitch.qml @@ -0,0 +1,32 @@ +//@ This file is part of opal-menuswitch. +//@ https://github.com/Pretty-SFOS/opal-menuswitch +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.6 +import Sailfish.Silica 1.0 as S +S.MenuItem{id:root +property alias automaticCheck:toggle.automaticCheck +property alias checked:toggle.checked +property alias busy:toggle.busy +readonly property alias switchItem:toggle +Binding on enabled{when:busy +value:false +}Binding on color{when:busy +value:_enabledColor +}S.TextSwitch{id:toggle +checked:false +automaticCheck:true +text:"" +highlighted:parent.highlighted +height:S.Theme.itemSizeSmall +width:S.Theme.iconSizeMedium+S.Theme.paddingSmall +anchors.verticalCenter:parent.verticalCenter +onClicked:{if(!!mouse&&!automaticCheck){root.clicked() +}}}TextMetrics{id:metrics +font:root.font +text:root.text +}text:"" +property int __marginsWidth:(root.width-metrics.width)/2 +leftPadding:__marginsWidth>=toggle.width?0:toggle.width+S.Theme.paddingLarge-(Math.max(root.width-metrics.width,1.5*S.Theme.paddingLarge)/2) +onClicked:{toggle.clicked(null) +}} \ No newline at end of file diff --git a/qml/modules/Opal/MenuSwitch/qmldir b/qml/modules/Opal/MenuSwitch/qmldir new file mode 100644 index 0000000..979a901 --- /dev/null +++ b/qml/modules/Opal/MenuSwitch/qmldir @@ -0,0 +1,5 @@ +module Opal.MenuSwitch +# This file is part of Opal.MenuSwitch. +# SPDX-FileCopyrightText: 2023-2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +MenuSwitch 1.0 MenuSwitch.qml diff --git a/qml/modules/Opal/SmartScrollbar/SmartScrollbar.qml b/qml/modules/Opal/SmartScrollbar/SmartScrollbar.qml new file mode 100644 index 0000000..4a32b8c --- /dev/null +++ b/qml/modules/Opal/SmartScrollbar/SmartScrollbar.qml @@ -0,0 +1,30 @@ +//@ This file is part of opal-smartscrollbar. +//@ https://github.com/Pretty-SFOS/opal-smartscrollbar +//@ SPDX-FileCopyrightText: 2024 Mirian Margiani +//@ SPDX-License-Identifier: GPL-3.0-or-later +import QtQuick 2.6 +import Sailfish.Silica 1.0 +QtObject{id:root +property Flickable flickable:null +property string text +property string description +property bool smartWhen:true +property bool quickScrollWhen:true +readonly property bool usingFallback:_fallback.visible +function reload(){try{_scrollbar=Qt.createQmlObject("\n import QtQuick 2.0\n import %1 1.0 as Private\n Private.Scrollbar {\n visible: root.smartWhen\n enabled: visible\n text: root.text\n description: root.description\n headerHeight: root._headerHeight\n }".arg("Sailfish.Silica.private"),flickable,"SmartScrollbar") +}catch(e){if(!_scrollbar){console.warn(e) +console.warn("[BUG] failed to load smart scrollbar") +console.warn("[BUG] this probably means the private API has changed") +}}}property int _headerHeight:!!flickable&&flickable.headerItem?flickable.headerItem.height:0 +property VerticalScrollDecorator _fallback:VerticalScrollDecorator{parent:root.flickable +flickable:root.flickable +visible:(!root._scrollbar||!root.smartWhen)&&!!flickable&&flickable.contentHeight>Screen.height +} +property Item _scrollbar:null +property Binding __quickScroll:Binding{target:flickable +property:"quickScroll" +value:false +when:!quickScrollWhen +} +Component.onCompleted:{reload() +}} \ No newline at end of file diff --git a/qml/modules/Opal/SmartScrollbar/qmldir b/qml/modules/Opal/SmartScrollbar/qmldir new file mode 100644 index 0000000..cf6cf58 --- /dev/null +++ b/qml/modules/Opal/SmartScrollbar/qmldir @@ -0,0 +1,5 @@ +module Opal.SmartScrollbar +# This file is part of Opal.SmartScrollbar. +# SPDX-FileCopyrightText: 2023-2024 Mirian Margiani +# SPDX-License-Identifier: GPL-3.0-or-later +SmartScrollbar 1.0 SmartScrollbar.qml From 086535cfe3f12cf60297885e50a3d8e48983fb24 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:31 +0200 Subject: [PATCH 17/30] Update translations --- translations/harbour-seriesfinale-de.ts | 221 +++++++++++++++++++++--- translations/harbour-seriesfinale-es.ts | 221 +++++++++++++++++++++--- translations/harbour-seriesfinale-sv.ts | 221 +++++++++++++++++++++--- translations/harbour-seriesfinale.ts | 209 ++++++++++++++++++++-- 4 files changed, 797 insertions(+), 75 deletions(-) diff --git a/translations/harbour-seriesfinale-de.ts b/translations/harbour-seriesfinale-de.ts index 8c07a53..83b748d 100644 --- a/translations/harbour-seriesfinale-de.ts +++ b/translations/harbour-seriesfinale-de.ts @@ -15,24 +15,189 @@ Search Suchen + + No description available. + + EpisodePage - Air date: - Sendedatum: + Watched + Gesehen - Rating: - Bewertung: + Air date + - Overview: - Beschreibung: + Rating + - Watched - Gesehen + Description + + + + + LicenseListPart + + License text + + + + + Opal.About + + About + Über + + + Version %1 + + + + Development + + + + show contributors + + + + Homepage + + + + Changelog + + + + Translations + + + + Source Code + + + + Donations + + + + License + + + + show license(s) + + + + + + + News + + + + Changes since version %1 + + + + show details + + + + Thank you! + + + + Details + + + + Contributors + + + + Acknowledgements + + + + Please refer to <a href="%1">%1</a> + + + + Download license texts + + + + License(s) + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + If you want to support my work, you can buy me a cup of coffee. + + + + You can support this project by contributing, or by donating using any of these services. + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + Share link + + + + Copied to clipboard: %1 + + + + External Link + + + + Copy text to clipboard + + + + Copy to clipboard + + + + Share + + + + Open in browser + + + + Open externally + + + + + PrioritySelectionDialog + + Select a priority + @@ -95,10 +260,6 @@ Delete show Serie löschen - - Deleting - Löschen - No shows Keine Serien @@ -167,6 +328,30 @@ Nach Priorität sortieren + + ShowInfoDialog + + Links + + + + Runtime + + + + %1 min + as in “this episode is 30 minutes long + + + + Genre + + + + Description + + + ShowPage @@ -193,10 +378,6 @@ Delete season Staffel löschen - - Deleting - Löschen - No seasons Keine Staffeln @@ -251,10 +432,6 @@ Delete show Serie löschen - - Deleting - Löschen - No shows Keine Serien @@ -263,6 +440,10 @@ Change show priority Priorität ändern + + Refreshing... + Aktualisieren ... + harbour-seriesfinale diff --git a/translations/harbour-seriesfinale-es.ts b/translations/harbour-seriesfinale-es.ts index 56adb33..c53cf61 100644 --- a/translations/harbour-seriesfinale-es.ts +++ b/translations/harbour-seriesfinale-es.ts @@ -15,24 +15,189 @@ Search Buscar + + No description available. + + EpisodePage - Air date: - Fecha de emisión: + Watched + Visto - Rating: - Calificación: + Air date + - Overview: - Resumen: + Rating + - Watched - Visto + Description + + + + + LicenseListPart + + License text + + + + + Opal.About + + About + Acerca de + + + Version %1 + + + + Development + + + + show contributors + + + + Homepage + + + + Changelog + + + + Translations + + + + Source Code + + + + Donations + + + + License + + + + show license(s) + + + + + + + News + + + + Changes since version %1 + + + + show details + + + + Thank you! + + + + Details + + + + Contributors + + + + Acknowledgements + + + + Please refer to <a href="%1">%1</a> + + + + Download license texts + + + + License(s) + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + If you want to support my work, you can buy me a cup of coffee. + + + + You can support this project by contributing, or by donating using any of these services. + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + Share link + + + + Copied to clipboard: %1 + + + + External Link + + + + Copy text to clipboard + + + + Copy to clipboard + + + + Share + + + + Open in browser + + + + Open externally + + + + + PrioritySelectionDialog + + Select a priority + @@ -95,10 +260,6 @@ Delete show Borrar programa - - Deleting - Borrando - No shows No hay programas @@ -167,6 +328,30 @@ Ordenar por preferencia + + ShowInfoDialog + + Links + + + + Runtime + + + + %1 min + as in “this episode is 30 minutes long + + + + Genre + + + + Description + + + ShowPage @@ -193,10 +378,6 @@ Delete season Borrar temporada - - Deleting - Borrando - No seasons No hay temporadas @@ -251,10 +432,6 @@ Delete show Borrar programa - - Deleting - Borrando - No shows No hay programas @@ -263,6 +440,10 @@ Change show priority Cambiar preferencia del programa + + Refreshing... + Actualizando... + harbour-seriesfinale diff --git a/translations/harbour-seriesfinale-sv.ts b/translations/harbour-seriesfinale-sv.ts index 25608ac..d4c6611 100644 --- a/translations/harbour-seriesfinale-sv.ts +++ b/translations/harbour-seriesfinale-sv.ts @@ -15,24 +15,189 @@ Search Sök + + No description available. + + EpisodePage - Air date: - Sändningsdatum: + Watched + Sedd - Rating: - Betyg: + Air date + - Overview: - Översikt: + Rating + - Watched - Sedd + Description + + + + + LicenseListPart + + License text + + + + + Opal.About + + About + Om + + + Version %1 + + + + Development + + + + show contributors + + + + Homepage + + + + Changelog + + + + Translations + + + + Source Code + + + + Donations + + + + License + + + + show license(s) + + + + + + + News + + + + Changes since version %1 + + + + show details + + + + Thank you! + + + + Details + + + + Contributors + + + + Acknowledgements + + + + Please refer to <a href="%1">%1</a> + + + + Download license texts + + + + License(s) + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + If you want to support my work, you can buy me a cup of coffee. + + + + You can support this project by contributing, or by donating using any of these services. + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + Share link + + + + Copied to clipboard: %1 + + + + External Link + + + + Copy text to clipboard + + + + Copy to clipboard + + + + Share + + + + Open in browser + + + + Open externally + + + + + PrioritySelectionDialog + + Select a priority + @@ -95,10 +260,6 @@ Delete show Ta bort serien - - Deleting - Tar bort - No shows Inga serier @@ -167,6 +328,30 @@ Sortera efter prioritet + + ShowInfoDialog + + Links + + + + Runtime + + + + %1 min + as in “this episode is 30 minutes long + + + + Genre + + + + Description + + + ShowPage @@ -193,10 +378,6 @@ Delete season Ta bort säsong - - Deleting - Tar bort - No seasons Inga säsonger @@ -251,10 +432,6 @@ Delete show Ta bort serien - - Deleting - Tar bort - No shows Inga serier @@ -263,6 +440,10 @@ Change show priority Ändra TV-serieprioritet + + Refreshing... + Uppdaterar... + harbour-seriesfinale diff --git a/translations/harbour-seriesfinale.ts b/translations/harbour-seriesfinale.ts index 521edb9..3963608 100644 --- a/translations/harbour-seriesfinale.ts +++ b/translations/harbour-seriesfinale.ts @@ -15,23 +15,186 @@ Search + + No description available. + + EpisodePage - Air date: + Watched - Rating: + Air date - Overview: + Rating - Watched + Description + + + + + LicenseListPart + + License text + + + + + Opal.About + + About + + + + Version %1 + + + + Development + + + + show contributors + + + + Homepage + + + + Changelog + + + + Translations + + + + Source Code + + + + Donations + + + + License + + + + show license(s) + + + + + + News + + + + Changes since version %1 + + + + show details + + + + Thank you! + + + + Details + + + + Contributors + + + + Acknowledgements + + + + Please refer to <a href="%1">%1</a> + + + + Download license texts + + + + License(s) + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + If you want to support my work, you can buy me a cup of coffee. + + + + You can support this project by contributing, or by donating using any of these services. + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + Share link + + + + Copied to clipboard: %1 + + + + External Link + + + + Copy text to clipboard + + + + Copy to clipboard + + + + Share + + + + Open in browser + + + + Open externally + + + + + PrioritySelectionDialog + + Select a priority @@ -95,10 +258,6 @@ Delete show - - Deleting - - No shows @@ -167,6 +326,30 @@ + + ShowInfoDialog + + Links + + + + Runtime + + + + %1 min + as in “this episode is 30 minutes long + + + + Genre + + + + Description + + + ShowPage @@ -193,10 +376,6 @@ Delete season - - Deleting - - No seasons @@ -252,15 +431,15 @@ - Deleting + No shows - No shows + Change show priority - Change show priority + Refreshing... From 1639dc594fc20eea35aeabd19612447eeb6ee4e3 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:35 +0200 Subject: [PATCH 18/30] Make the rpm validator script happy - disable shebangs - disable Opal "provides" --- rpm/harbour-seriesfinale.spec | 3 ++- rpm/harbour-seriesfinale.yaml | 5 ++++- src/SeriesFinale/lib/connectionmanager.py | 2 +- src/seriesfinale.py | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/rpm/harbour-seriesfinale.spec b/rpm/harbour-seriesfinale.spec index 6a99927..366afbe 100644 --- a/rpm/harbour-seriesfinale.spec +++ b/rpm/harbour-seriesfinale.spec @@ -1,12 +1,13 @@ # # Do NOT Edit the Auto-generated Part! -# Generated by: spectacle version 0.27 +# Generated by: spectacle version 0.32 # Name: harbour-seriesfinale # >> macros # << macros +%define __provides_exclude_from ^%{_datadir}/.*$ %{!?qtc_qmake:%define qtc_qmake %qmake} %{!?qtc_qmake5:%define qtc_qmake5 %qmake5} diff --git a/rpm/harbour-seriesfinale.yaml b/rpm/harbour-seriesfinale.yaml index 51b02e4..f677dde 100644 --- a/rpm/harbour-seriesfinale.yaml +++ b/rpm/harbour-seriesfinale.yaml @@ -23,6 +23,9 @@ Configure: none # control over qmake/make execution Builder: qtc5 +Macros: + - __provides_exclude_from;^%{_datadir}/.*$ + # This section specifies build dependencies that are resolved using pkgconfig. # This is the preferred way of specifying build dependencies for your package. PkgConfigBR: @@ -37,7 +40,7 @@ PkgConfigBR: # Runtime dependencies which are not automatically detected Requires: - - sailfishsilica-qt5 >= 0.10.9 + - sailfishsilica-qt5 >= 0.10.9 - libsailfishapp-launcher - pyotherside-qml-plugin-python3-qt5 >= 1.3.0 diff --git a/src/SeriesFinale/lib/connectionmanager.py b/src/SeriesFinale/lib/connectionmanager.py index ad0d6ad..fa48df3 100644 --- a/src/SeriesFinale/lib/connectionmanager.py +++ b/src/SeriesFinale/lib/connectionmanager.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +# @@@ !/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################### diff --git a/src/seriesfinale.py b/src/seriesfinale.py index afda72b..507d3b8 100644 --- a/src/seriesfinale.py +++ b/src/seriesfinale.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +# @@@ !/usr/bin/env python3 # -*- coding: utf-8 -*- ########################################################################### From 4df3bb27580375fa97c8a49fd1d1bd249ae5c633 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:40 +0200 Subject: [PATCH 19/30] Refactor search page --- qml/pages/AddShow.qml | 106 +++++++++++++++++++++++------ src/SeriesFinale/lib/thetvdbapi.py | 28 +++++++- src/SeriesFinale/series.py | 15 ++-- 3 files changed, 121 insertions(+), 28 deletions(-) diff --git a/qml/pages/AddShow.qml b/qml/pages/AddShow.qml index 357d393..b34ab54 100644 --- a/qml/pages/AddShow.qml +++ b/qml/pages/AddShow.qml @@ -1,13 +1,26 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + * SPDX-FileCopyrightText: 2015-2017 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 +import "../modules/Opal/Delegates" 1.0 as D + Page { - id: searchPage + id: root property bool isSearching: false property string searchLanguage: 'en' - Component.onCompleted: searchField.forceActiveFocus() + readonly property int _limit: 15 + + Component.onCompleted: { + searchField.forceActiveFocus() + } onStatusChanged: { if (status === PageStatus.Activating) { @@ -19,21 +32,27 @@ Page { function search() { parent.focus = true //Make sure the keyboard closes and the text is updated - python.call('seriesfinale.seriesfinale.series_manager.search_shows', [searchField.text, searchLanguage], function() {}); + python.call('seriesfinale.seriesfinale.series_manager.search_shows', + [searchField.text, searchLanguage], function() {}); } Connections { target: python onSearchingChanged: { - searchPage.isSearching = searching; + root.isSearching = searching; if(!searching) { python.call('seriesfinale.seriesfinale.series_manager.search_result_model', [], function(result) { // Clear the data in the list model listModel.clear(); + // Load the received data into the list model for (var i=0; i _limit) { + break + } } }); } @@ -42,7 +61,7 @@ Page { SilicaFlickable { anchors.fill: parent - contentHeight: column.height + contentHeight: column.height + Theme.horizontalPageMargin VerticalScrollDecorator {} @@ -53,10 +72,9 @@ Page { } } - Column { id: column - width: searchPage.width + width: root.width PageHeader { title: qsTr("Add show") @@ -87,30 +105,76 @@ Page { id: listModel } - delegate: ListItem { - Label { + delegate: D.TwoLineDelegate { + id: item + text: model.series_name + description: model.start_year + + padding { + right: 0 + topBottom: 0 + } + + textLabel.font.bold: true + descriptionLabel.font.bold: true + + onClicked: { + python.call('seriesfinale.seriesfinale.series_manager.get_complete_show', + [model.series_name, searchLanguage], function() {}); + pageStack.pop() + } + + menu: Component { + ContextMenu { + MenuLabel { + text: model.series_name + } + + MenuLabel { + text: model.blurb || qsTr("No description available.") + truncationMode: TruncationMode.Elide + } + } + } + + Item { + z: -1 + opacity: Theme.opacityLow anchors { left: parent.left + leftMargin: -item.padding.effectiveLeft right: parent.right - leftMargin: searchField.textLeftMargin - rightMargin: searchField.textRightMargin - verticalCenter: parent.verticalCenter + top: parent.top + bottom: parent.bottom + } + + Image { + id: banner + anchors.fill: parent + fillMode: Image.PreserveAspectCrop + source: model.banner_url + sourceSize { + width: width + height: height + } + } + + OpacityRampEffect { + sourceItem: banner + direction: OpacityRamp.RightToLeft + slope: 2.0 + offset: 0.3 } - text: model.data - truncationMode: TruncationMode.Fade - } - onClicked: { - python.call('seriesfinale.seriesfinale.series_manager.get_complete_show', [model.data, searchLanguage], function() {}); - pageStack.pop() } } } } + BusyIndicator { - size: BusyIndicatorSize.Medium + size: BusyIndicatorSize.Large anchors { - top: parent.top - topMargin: 10*Theme.paddingLarge + verticalCenterOffset: -Theme.itemSizeLarge + verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } visible: isSearching diff --git a/src/SeriesFinale/lib/thetvdbapi.py b/src/SeriesFinale/lib/thetvdbapi.py index 15d1337..c1e511b 100644 --- a/src/SeriesFinale/lib/thetvdbapi.py +++ b/src/SeriesFinale/lib/thetvdbapi.py @@ -25,6 +25,31 @@ import xml.etree.cElementTree as ET +from dataclasses import dataclass + + +@dataclass +class SearchResult: + series_id: str + series_name: str + banner_url: str + blurb: str + start_year: str + + @staticmethod + def from_xml(xml): + mirror = "https://www.thetvdb.com/" + banner = xml.findtext("banner") + + return SearchResult( + series_id=xml.findtext("seriesid"), + series_name=xml.findtext("SeriesName"), + banner_url=mirror + banner.lstrip('/') if banner else '', + blurb=xml.findtext("Overview"), + start_year=(xml.findtext("FirstAired").split('-') or [''])[0], + ) + + class TheTVDB(object): def __init__(self, api_key): self.api_key = api_key @@ -183,7 +208,8 @@ def get_matching_shows(self, show_name, language = "en"): if data: try: tree = ET.parse(data) - show_list = [(show.findtext("seriesid"), show.findtext("SeriesName")) for show in tree.getiterator("Series") if show.findtext("language") == language] + show_list = [SearchResult.from_xml(show) + for show in tree.getiterator("Series") if show.findtext("language") == language] except SyntaxError: pass diff --git a/src/SeriesFinale/series.py b/src/SeriesFinale/series.py index 46b5ae1..3ba3bc7 100644 --- a/src/SeriesFinale/series.py +++ b/src/SeriesFinale/series.py @@ -30,6 +30,8 @@ from datetime import datetime from datetime import timedelta from xml.sax import saxutils +from typing import List +import dataclasses import gettext import locale import logging @@ -599,7 +601,7 @@ def __init__(self): # Searching self.searching = False - self.search_results = [] + self.search_results: List[thetvdbapi.SearchResult] = [] # Languages # self.languages = self.thetvdb.get_available_languages() @@ -659,7 +661,8 @@ def _save_languages(self, file_path): save_file.write(serialized) save_file.close() - def get_searching(self): return self.searching + def get_searching(self): + return self.searching def search_shows(self, terms, language = "en"): if not terms: @@ -677,13 +680,13 @@ def search_shows(self, terms, language = "en"): def search_result_model(self): search_results_list = [] for item in self.search_results: - search_results_list.append({'data': item}) + search_results_list.append(dataclasses.asdict(item)) return search_results_list - def _search_finished_callback(self, tvdbshows, error): + def _search_finished_callback(self, tvdbshows: List['SearchResult'], error): if not error: - for show_id, show in tvdbshows: - self._cached_tvdb_shows[show_id] = show + for show in tvdbshows: + self._cached_tvdb_shows[show.series_id] = show.series_name self.search_results.append(show) self.searching = False pyotherside.send('searching', self.searching) From ba7301d8819ba3416fe672e0286f867763e7f4f9 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:49 +0200 Subject: [PATCH 20/30] Use https for network requests --- src/SeriesFinale/lib/thetvdbapi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SeriesFinale/lib/thetvdbapi.py b/src/SeriesFinale/lib/thetvdbapi.py index c1e511b..89e4afe 100644 --- a/src/SeriesFinale/lib/thetvdbapi.py +++ b/src/SeriesFinale/lib/thetvdbapi.py @@ -53,10 +53,10 @@ def from_xml(xml): class TheTVDB(object): def __init__(self, api_key): self.api_key = api_key - self.mirror_url = "http://www.thetvdb.com" + self.mirror_url = "https://www.thetvdb.com" self.base_url = self.mirror_url + "/api" self.base_key_url = "%s/%s" % (self.base_url, self.api_key) - + class Show(object): """A python object representing a thetvdb.com show record.""" def __init__(self, node, mirror_url): From 2b35a7a38b2382ba3e5f07ab2c230bb3a124db8b Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:08:54 +0200 Subject: [PATCH 21/30] Clear trailing spaces --- src/SeriesFinale/lib/thetvdbapi.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/SeriesFinale/lib/thetvdbapi.py b/src/SeriesFinale/lib/thetvdbapi.py index 89e4afe..18d182a 100644 --- a/src/SeriesFinale/lib/thetvdbapi.py +++ b/src/SeriesFinale/lib/thetvdbapi.py @@ -72,12 +72,12 @@ def __init__(self, node, mirror_url): self.runtime = node.findtext("Runtime") self.status = node.findtext("Status") self.language = node.findtext("Language") - + # Air details self.first_aired = TheTVDB.convert_date(node.findtext("FirstAired")) self.airs_day = node.findtext("Airs_DayOfWeek") self.airs_time = TheTVDB.convert_time(node.findtext("Airs_Time")) - + # Main show artwork self.banner_url = "%s/banners/%s" % (mirror_url, node.findtext("banner")) self.poster_url = "%s/banners/%s" % (mirror_url, node.findtext("poster")) @@ -90,7 +90,7 @@ def __init__(self, node, mirror_url): # When this show was last updated self.last_updated = datetime.datetime.fromtimestamp(int(node.findtext("lastupdated"))) - + def __str__(self): import pprint return pprint.saferepr(self) @@ -113,7 +113,7 @@ def __init__(self, node, mirror_url): # Air date self.first_aired = TheTVDB.convert_date(node.findtext("FirstAired")) - + # DVD Information self.dvd_chapter = node.findtext("DVD_chapter") self.dvd_disc_id = node.findtext("DVD_discid") @@ -219,23 +219,23 @@ def get_show(self, show_id): """Get the show object matching this show_id.""" url = "%s/series/%s/" % (self.base_key_url, show_id) data = urllib.request.urlopen(url) - + show = None try: tree = ET.parse(data) show_node = tree.find("Series") - + show = TheTVDB.Show(show_node, self.mirror_url) except SyntaxError: pass - + return show def get_episode(self, episode_id): """Get the episode object matching this episode_id.""" url = "%s/episodes/%s/" % (self.base_key_url, episode_id) data = urllib.request.urlopen(url) - + episode = None try: tree = ET.parse(data) @@ -244,32 +244,32 @@ def get_episode(self, episode_id): episode = TheTVDB.Episode(episode_node, self.mirror_url) except SyntaxError: pass - + return episode - + def get_show_and_episodes(self, show_id, language = "en"): """Get the show object and all matching episode objects for this show_id.""" url = "%s/series/%s/all/" % (self.base_key_url, show_id) if language: url += '%s.xml' % language data = urllib.request.urlopen(url) - + show_and_episodes = None try: tree = ET.parse(data) show_node = tree.find("Series") - + show = TheTVDB.Show(show_node, self.mirror_url) episodes = [] - + episode_nodes = tree.getiterator("Episode") for episode_node in episode_nodes: episodes.append(TheTVDB.Episode(episode_node, self.mirror_url)) - + show_and_episodes = (show, episodes) except SyntaxError: pass - + return show_and_episodes def get_updated_shows(self, period = "day"): From c335d171cb89d921aeebad84f53a07c2daa59088 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:03 +0200 Subject: [PATCH 22/30] Rewrite most of the GUI - a new smart scrollbar allows you to scroll quickly to any position - you can now swipe through episodes and seasons from the info page - search results include more details and cover images to make it easier to find the right entry (search result covers are not cached) - major performance improvements everywhere (mostly due to fixes in the code architecture by removing inlined components, inlined pages, inlined remorse handlers, unnecessary page reloads, etc.) - design changes are only to make things cleaner and more Sailfish-aligned; otherwise no major new features - code architecture changes kept to a minimum (could use some love) --- harbour-seriesfinale.pro | 3 + qml/cover/CoverPage.qml | 12 +- qml/harbour-seriesfinale.qml | 7 +- qml/pages/AboutPage.qml | 184 ++++++++++-------- qml/pages/AddShow.qml | 22 +-- qml/pages/EpisodeListRowDelegate.qml | 100 +++++----- qml/pages/EpisodePage.qml | 266 ++++++++++++++++---------- qml/pages/ListRowDelegate.qml | 120 +++++------- qml/pages/PrioritySelectionDialog.qml | 54 ++++++ qml/pages/SeasonPage.qml | 53 ++++- qml/pages/SeriesPage.qml | 82 +++++--- qml/pages/SettingsPage.qml | 1 + qml/pages/ShowInfoDialog.qml | 109 +++++++++++ qml/pages/ShowPage.qml | 145 +++++--------- qml/pages/StatisticsPage.qml | 152 +++++---------- qml/pages/SurveyPage.qml | 121 +++++------- qml/pages/components/InfoBox.qml | 38 ++++ qml/pages/components/InfoGrid.qml | 21 ++ qml/pages/components/InfoGridItem.qml | 63 ++++++ 19 files changed, 935 insertions(+), 618 deletions(-) create mode 100644 qml/pages/PrioritySelectionDialog.qml create mode 100644 qml/pages/ShowInfoDialog.qml create mode 100644 qml/pages/components/InfoBox.qml create mode 100644 qml/pages/components/InfoGrid.qml create mode 100644 qml/pages/components/InfoGridItem.qml diff --git a/harbour-seriesfinale.pro b/harbour-seriesfinale.pro index 9ca4461..40942cb 100644 --- a/harbour-seriesfinale.pro +++ b/harbour-seriesfinale.pro @@ -46,6 +46,9 @@ TRANSLATIONS += translations/harbour-seriesfinale-de.ts \ translations/harbour-seriesfinale-sv.ts DISTFILES += \ + qml/pages/PrioritySelectionDialog.qml \ + qml/pages/ShowInfoDialog.qml \ + qml/pages/components/OpalAboutAttribution.qml \ qml/pages/AboutPage.qml \ qml/pages/AddShow.qml \ qml/pages/EpisodeListRowDelegate.qml \ diff --git a/qml/cover/CoverPage.qml b/qml/cover/CoverPage.qml index dbf69d3..9cd6281 100644 --- a/qml/cover/CoverPage.qml +++ b/qml/cover/CoverPage.qml @@ -1,3 +1,9 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 @@ -10,10 +16,14 @@ CoverBackground { Image { id: backgroundImage - source: coverImage + source: app.coverImage anchors.horizontalCenter: parent.horizontalCenter width: parent.width height: parent.height + sourceSize { + width: parent.width + height: parent.height + } fillMode: Image.PreserveAspectCrop clip: true } diff --git a/qml/harbour-seriesfinale.qml b/qml/harbour-seriesfinale.qml index f0f4a4a..2b7aad6 100644 --- a/qml/harbour-seriesfinale.qml +++ b/qml/harbour-seriesfinale.qml @@ -6,8 +6,7 @@ import "cover" import io.thp.pyotherside 1.3 import Nemo.Notifications 1.0 -ApplicationWindow -{ +ApplicationWindow { id: app initialPage: Component { SeriesPage {} } @@ -16,7 +15,7 @@ ApplicationWindow allowedOrientations: Orientation.All _defaultPageOrientations: Orientation.All - property string coverImage: 'seriesfinale_cover.png' + property string coverImage: Qt.resolvedUrl("images/seriesfinale_cover.png") property var prioListModel: [ { name: qsTr("None"), color: "#93a1a1" }, @@ -47,6 +46,8 @@ ApplicationWindow property bool ready: false property string version + signal settingsChanged() + signal searchingChanged(bool searching) signal updatingChanged(bool updating) signal showUpdatingChanged(bool updating) diff --git a/qml/pages/AboutPage.qml b/qml/pages/AboutPage.qml index fcd95f8..9f92fc5 100644 --- a/qml/pages/AboutPage.qml +++ b/qml/pages/AboutPage.qml @@ -1,94 +1,122 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-FileCopyrightText: 2024-2025 Mirian Margiani + * SPDX-License-Identifier: GPL-3.0-or-later + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 +import "../modules/Opal/About" 1.0 -Page { - id: aboutPage - - property string license: 'SeriesFinale is free software: you can redistribute it ' + - 'and/or modify it under the terms of the GNU General Public License as published by ' + - 'the Free Software Foundation, either version 3 of the License, or ' + - '(at your option) any later version.

' + - - 'SeriesFinale is distributed in the hope that it will be useful, ' + - 'but WITHOUT ANY WARRANTY; without even the implied warranty of ' + - 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' + - 'GNU General Public License for more details.

' + +AboutPageBase { + id: root + allowedOrientations: Orientation.All - 'You should have received a copy of the GNU General Public License ' + - 'along with SeriesFinale. If not, see http://www.gnu.org/licenses/.' + appName: "SeriesFinale" + appIcon: Qt.resolvedUrl("../images/harbour-seriesfinale.png") + appVersion: python.version + appRelease: "1" + description: qsTr("A TV series database app that helps you " + + "keep track of what you are watching.") + sourcesUrl: "https://github.com/corecomic/seriesfinale" + // translationsUrl: "https://weblate.org" - SilicaFlickable { - id: flickableText - anchors.fill: parent + authors: [ + "2015-%1 Core Comic and contributors".arg((new Date()).getFullYear()), + ] + licenses: License { spdxId: "GPL-3.0-or-later" } - contentHeight: contents.height - contentWidth: contents.width + PullDownMenu { + parent: root.flickable - VerticalScrollDecorator {} - - Column { - id: contents - width: aboutPage.width - spacing: Theme.paddingLarge + MenuItem { + text: qsTr("Statistics") + onClicked: pageStack.push(Qt.resolvedUrl("StatisticsPage.qml")) + } + } - PageHeader { - title: 'SeriesFinale ' + python.version - } + property string tvdbLink: "https://www.thetvdb.com" + extraSections: InfoSection { + title: qsTr("Data") + text: qsTr("SeriesFinale uses TheTVDB API but is not endorsed or certified by TheTVDB. " + + "Please contribute to it if you can.", "Note: “TheTVDB” is a trademark, so don't translate that."). + arg(tvdbLink) + buttons: InfoButton { + text: "TheTVDB" + onClicked: openOrCopyUrl(tvdbLink) + } + } - Column { - anchors { - left: parent.left - right: parent.right - leftMargin: Theme.horizontalPageMargin - rightMargin: Theme.horizontalPageMargin - } - spacing: Theme.paddingLarge + /*changelogItems: [ + // add new items at the top of the list + ChangelogItem { + version: "1.0.0-1" + date: "2023-01-02" // optional + author: "Au Thor" // optional + paragraphs: "A short paragraph describing this initial version." + } + ]*/ - Label { - font.pixelSize: Theme.fontSizeSmall - text: 'Copyright © 2016 Core Comic' - color: Theme.primaryColor - anchors.horizontalCenter: parent.horizontalCenter - } + /*donations.text: donations.defaultTextCoffee + donations.services: DonationService { + name: "LiberaPay" + url: "liberapay.com" + }*/ - Label { - font.pixelSize: Theme.fontSizeSmall - text: 'Special thanks to:
  Joaquim Rocha\ -
  Juan Suarez Romero\ -
  Micke Prag' - color: Theme.primaryColor - anchors.left: parent.left - onLinkActivated: Qt.openUrlExternally(link) - } + attributions: [ + Attribution { + name: "SeriesFinale (Python)" + entries: ["2009 Joaquim Rocha"] + licenses: License { spdxId: "GPL-3.0-or-later" } + }, + Attribution { + name: "PyOtherSide" + entries: ["2011, 2013-2020 Thomas Perl"] + licenses: License { spdxId: "ISC" } + sources: "https://github.com/thp/pyotherside" + homepage: "https://thp.io/2011/pyotherside/" + } + ] - Label { - font.pixelSize: Theme.fontSizeTiny - text: "" + 'SeriesFinale uses TheTVDB API but is not endorsed or certified by TheTVDB. Please contribute to it if you can.' - textFormat: Text.RichText - color: Theme.primaryColor - wrapMode: Text.WordWrap - width: parent.width - anchors.horizontalCenter: parent.horizontalCenter - onLinkActivated: Qt.openUrlExternally(link) + contributionSections: [ + ContributionSection { + groups: [ + ContributionGroup { + title: qsTr("Programming") + entries: [ + "Core Comic", + "Joaquim Rocha", + "Juan Suarez Romero", + "Micke Prag", + "Mirian Margiani", + ] + }, + ContributionGroup { + title: qsTr("Icon Design") + entries: ["Core Comic"] } - - Label { - font.pixelSize: Theme.fontSizeTiny - text: "" + license - textFormat: Text.RichText - color: Theme.primaryColor - wrapMode: Text.WordWrap - width: parent.width - anchors.horizontalCenter: parent.horizontalCenter - onLinkActivated: Qt.openUrlExternally(link) + ] + }, + ContributionSection { + title: qsTr("Translations") + groups: [ + ContributionGroup { + title: qsTr("English") + entries: ["Core Comic"] + }, + ContributionGroup { + title: qsTr("Spanish") + entries: ["Carmen F. B."] + }, + ContributionGroup { + title: qsTr("Swedish") + entries: ["Åke Engelbrektson"] + }, + ContributionGroup { + title: qsTr("German") + entries: ["Core Comic", "Mirian Margiani"] } - } + ] } - } - - onStatusChanged: { - if (status === PageStatus.Active && !canNavigateForward) { - pageStack.pushAttached(Qt.resolvedUrl("StatisticsPage.qml")); - } - } + ] } diff --git a/qml/pages/AddShow.qml b/qml/pages/AddShow.qml index b34ab54..6a57437 100644 --- a/qml/pages/AddShow.qml +++ b/qml/pages/AddShow.qml @@ -78,6 +78,17 @@ Page { PageHeader { title: qsTr("Add show") + + BusyIndicator { + size: BusyIndicatorSize.Large + anchors { + horizontalCenter: parent.horizontalCenter + top: parent.bottom + topMargin: searchField.height + Theme.itemSizeLarge + } + visible: isSearching + running: visible + } } SearchField { @@ -169,16 +180,5 @@ Page { } } } - - BusyIndicator { - size: BusyIndicatorSize.Large - anchors { - verticalCenterOffset: -Theme.itemSizeLarge - verticalCenter: parent.verticalCenter - horizontalCenter: parent.horizontalCenter - } - visible: isSearching - running: visible - } } } diff --git a/qml/pages/EpisodeListRowDelegate.qml b/qml/pages/EpisodeListRowDelegate.qml index 7e085b6..5593b63 100644 --- a/qml/pages/EpisodeListRowDelegate.qml +++ b/qml/pages/EpisodeListRowDelegate.qml @@ -1,54 +1,60 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 -BackgroundItem { - id: epListItem - width: parent.width - contentHeight: Theme.itemSizeSmall +import "../modules/Opal/Delegates" as D - signal watchToggled(bool watched) +D.TwoLineDelegate { + id: root property bool switchVisible: true - property alias title: title.text - property alias subtitle: subtitle.text - property variant episode: undefined - - Row { - anchors.fill: parent - anchors.leftMargin: switchVisible ? 0 : Theme.horizontalPageMargin - - Switch { - id: markItem - anchors.verticalCenter: parent.verticalCenter - checked: episode.isWatched - visible: switchVisible - - onClicked: { - epListItem.watchToggled(checked) - } - } - - Column { - id: column - anchors.verticalCenter: parent.verticalCenter - width: switchVisible ? parent.width - markItem.width - Theme.horizontalPageMargin - : parent.width - Theme.horizontalPageMargin - - Label { - id: title - width: parent.width - font.pixelSize: Theme.fontSizeSmall - color: episode.isWatched ? Theme.secondaryColor : episode.hasAired ? Theme.primaryColor : Theme.secondaryColor - text: episode.episodeName - truncationMode: TruncationMode.Fade - } - - Label { - id: subtitle - font.pixelSize: Theme.fontSizeTiny - color: Theme.secondaryColor - text: episode.airDate - visible: text != "" - } - } + property string title: episode.episodeName + property string subtitle: episode.airDate + property var episode: undefined + + property bool _isWatched: episode.isWatched || false + property bool _isAired: episode.hasAired || false + + signal watchToggled(bool watched) + + text: title + description: subtitle + + leftItem: Switch { + height: minContentHeight + width: minContentHeight + visible: switchVisible + checked: episode.isWatched + onClicked: root.watchToggled(checked) + } + + padding.topBottom: Theme.paddingSmall + minContentHeight: Theme.itemSizeSmall - padding.effectiveTop - padding.effectiveBottom + descriptionLabel.font.pixelSize: Theme.fontSizeTiny + + textLabel.palette { + primaryColor: root.palette.primaryColor + highlightColor: root.palette.highlightColor + } + descriptionLabel.palette { + primaryColor: root.palette.secondaryColor + highlightColor: root.palette.secondaryHighlightColor + } + + palette { + primaryColor: (_isWatched || !_isAired) ? + Theme.secondaryColor : Theme.primaryColor + secondaryColor: (_isWatched || !_isAired) ? + Theme.rgba(Theme.secondaryColor, Theme.opacityHigh) : + Theme.secondaryColor + highlightColor: (_isWatched || !_isAired) ? + Theme.secondaryHighlightColor : Theme.highlightColor + secondaryHighlightColor: (_isWatched || !_isAired) ? + Theme.rgba(Theme.secondaryHighlightColor, Theme.opacityHigh) : + Theme.secondaryHighlightColor } } diff --git a/qml/pages/EpisodePage.qml b/qml/pages/EpisodePage.qml index 6eebf74..f587d5f 100644 --- a/qml/pages/EpisodePage.qml +++ b/qml/pages/EpisodePage.qml @@ -1,115 +1,181 @@ -import QtQuick 2.0 +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + +import QtQuick 2.6 import Sailfish.Silica 1.0 -Page { - id: episodePage - property variant show: undefined - property variant episode: undefined - property string seasonImg: '' +import "../modules/Opal/MenuSwitch" 1.0 as M +import "../modules/Opal/LinkHandler" 1.0 as L +import "components" - PageHeader { - id: header - title: episode.episodeName - } +Dialog { + id: root + + property var show: ({showName: ""}) + property var episode: ({episodeName: ""}) + property string seasonCover + + property ListModel model: null + property int index: -1 + + readonly property var _nextEpisode: model.get(index + 1) || null - Item { - id: dataItem - anchors.top: header.bottom - anchors.left: parent.left - width: episodePage.isPortrait ? parent.width : grid.width + Theme.paddingLarge - anchors.margins: Theme.paddingLarge - anchors.leftMargin: Theme.horizontalPageMargin - anchors.rightMargin: Theme.horizontalPageMargin - height: grid.height - - Grid { - id: grid - columns: 2 - spacing: 10 - - Text { - text: qsTr("Air date:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - text: episode.airDate - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Rating:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - text: episode.episodeRating - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - } + function ratingToStars(rating) { + var y = '★' + var n = '☆' + var ret = '' + + for (var i = 1; i <= 5; ++i) { + if (rating >= i) { + ret += y + } else { + ret += n + } + } + + return ret } - Item { - id: overviewItem - anchors.top: episodePage.isPortrait ? dataItem.bottom : header.bottom - anchors.left: episodePage.isPortrait ? parent.left : dataItem.right - anchors.right: episodePage.isPortrait ? parent.right : parent.right - anchors.bottom: episodePage.isPortrait ? watched.top : parent.bottom - anchors.margins: Theme.paddingLarge - anchors.leftMargin: Theme.horizontalPageMargin - anchors.rightMargin: Theme.horizontalPageMargin - - Flickable { - id: flickableText - height: parent.height + acceptDestination: !!_nextEpisode ? Qt.resolvedUrl("EpisodePage.qml") : null + acceptDestinationProperties: ({ + show: show, + episode: _nextEpisode, + model: model, + index: index + 1, + seasonCover: seasonCover, + }) + acceptDestinationAction: PageStackAction.Replace + + SilicaFlickable { + anchors.fill: parent + contentHeight: column.height + Theme.horizontalPageMargin + + PullDownMenu { + M.MenuSwitch { + text: qsTr("Watched") + checked: episode.isWatched + automaticCheck: false + onClicked: { + python.call('seriesfinale.seriesfinale.series_manager.set_episode_watched', + [!checked, show.showName, episode.episodeName]) + } + } + } + + Column { + id: column width: parent.width - contentHeight: text.height + overviewTitle.height + 10 - clip: true - -// onMovingChanged: { -// if (horizontalVelocity == 0){ -// // do nothing -// } else if (horizontalVelocity < 0){ -// if (!moving) -// episode = show.get_previous_episode(episode) -// } else { -// if (!moving) -// episode = show.get_next_episode(episode) -// } -// } - - Text { - id: overviewTitle - font.pixelSize: Theme.fontSizeSmall - text: qsTr('Overview:') - color: Theme.highlightColor + + PageHeader { + title: episode.episodeName + description: show.showName + wrapMode: Text.Wrap + descriptionWrapMode: Text.Wrap + _titleItem.horizontalAlignment: Text.AlignRight } - Text { - id: text - anchors.top: overviewTitle.bottom - anchors.topMargin: Theme.paddingMedium + Item { width: parent.width - text: episode.overviewText - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - wrapMode: Text.Wrap + height: Theme.paddingLarge } - } - //VerticalScrollDecorator {} - } - TextSwitch { - id: watched - anchors.bottom: parent.bottom - anchors.bottomMargin: Theme.paddingLarge - anchors.left: parent.left - anchors.leftMargin: Theme.horizontalPageMargin - text: qsTr("Watched") - onCheckedChanged: { - python.call('seriesfinale.seriesfinale.series_manager.set_episode_watched', [checked, show.showName, episode.episodeName]) + InfoBox { + x: Theme.horizontalPageMargin + width: parent.width - 2*x + + /* + // vvv Details page with season cover vvv + // Disabled because it takes a lot of vertical screen space + // and looks quite cramped. + + Row { + width: parent.width + height: childrenRect.height + spacing: Theme.paddingLarge + + Image { + id: cover + source: seasonCover + height: 1.5*Theme.itemSizeExtraLarge + sourceSize.height: height + fillMode: Image.PreserveAspectFit + smooth: true + + MouseArea { + anchors.fill: parent + onClicked: Qt.openUrlExternally(show.coverImage) + } + } + + InfoGrid { + width: parent.width - parent.spacing - cover.paintedWidth + anchors.verticalCenter: cover.verticalCenter + + InfoGridItem { + grid: parent + label: qsTr("Runtime") + value: qsTr("%1 min", "as in “this episode is 30 minutes long").arg(show.runtime) + } + InfoGridItem { + grid: parent + label: qsTr("Air date") + value: episode.airDate + } + InfoGridItem { + grid: parent + label: qsTr("Rating") + value: ratingToStars(Math.ceil(episode.episodeRating/2)) + } + } + } + */ + + InfoGrid { + id: grid + columns: widthMetrics.width > width ? 2 : 4 + + TextMetrics { + id: widthMetrics + text: [dateInfo.label, dateInfo.value, + rateInfo.label, rateInfo.value].join(" ") + font: dateInfo.valueLabel.font + } + + InfoGridItem { + id: dateInfo + grid: parent + label: qsTr("Air date") + value: episode.airDate + visible: !!episode.airDate + } + InfoGridItem { + id: rateInfo + grid: parent + label: qsTr("Rating") + value: ratingToStars(Math.ceil(episode.episodeRating/2)) + } + } + } + + SectionHeader { + text: qsTr("Description") + visible: !!episode.overviewText + } + + Label { + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width - 2*Theme.horizontalPageMargin + font.pixelSize: Theme.fontSizeMedium + color: Theme.secondaryHighlightColor + wrapMode: Text.Wrap + text: episode.overviewText + + linkColor: Theme.primaryColor + onLinkActivated: L.LinkHandler.openOrCopyUrl(link) + } } } - onEpisodeChanged: watched.checked = episode.isWatched } diff --git a/qml/pages/ListRowDelegate.qml b/qml/pages/ListRowDelegate.qml index 5c63691..c7a357f 100644 --- a/qml/pages/ListRowDelegate.qml +++ b/qml/pages/ListRowDelegate.qml @@ -1,102 +1,74 @@ -import QtQuick 2.0 -import Sailfish.Silica 1.0 +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ -ListItem { - id: listItem - contentHeight: Screen.sizeCategory >= Screen.Large ? Theme.itemSizeExtraLarge : Theme.itemSizeLarge +import QtQuick 2.6 +import Sailfish.Silica 1.0 - menu: contextMenu +import "../modules/Opal/Delegates" as D - property alias title: title.text - property alias subtitle: subtitle.text - property alias iconSource: icon.source +D.TwoLineDelegate { + id: root + text: "" + description: "" + property string iconSource property bool isUpdating: false property bool isPremiere: false property bool isShowPremiere: false - property int priority: -1 + property int infoLines: 3 + + minContentHeight: 2*Theme.paddingMedium + + Theme.fontSizeMedium + + Theme.paddingSmall + + infoLines*Theme.fontSizeTiny - anchors { - left: parent.left - right: parent.right + textLabel.font { + bold: isPremiere + underline: isShowPremiere } - Rectangle { - anchors.fill: parent - color: "transparent" + descriptionLabel { + _elideText: false + font.pixelSize: Theme.fontSizeTiny + } - Image { - id: icon - visible: source != '' + leftItem: Item { + height: minContentHeight + width: Math.max(height / 1.445, childrenRect.width) + Image { anchors { left: parent.left - leftMargin: Screen.sizeCategory >= Screen.Large ? Theme.horizontalPageMargin : Theme.paddingSmall - verticalCenter: parent.verticalCenter + leftMargin: Theme.paddingSmall } - - height: listItem.contentHeight - 6 - width: height - + height: parent.height + sourceSize.height: height + fillMode: Image.PreserveAspectFit asynchronous: true - fillMode: "PreserveAspectFit" smooth: false - sourceSize.height: height - source: '' - opacity: isUpdating ? 0.2 : - String(source).indexOf('placeholderimage') > -1 ? 0.5 : 1.0 - - - } + source: root.iconSource + opacity: root.isUpdating ? + 0.2 : String(source).indexOf('placeholderimage') > -1 ? 0.5 : 1.0 - Rectangle { - anchors { - left: icon.left - leftMargin: (icon.width - icon.paintedWidth) / 2 - verticalCenter: parent.verticalCenter - } - visible: priority > 0 - color: priority != -1 ? prioListModel[priority].color : "grey" - height: icon.height - width: Theme.paddingSmall / 2 } BusyIndicator { - anchors.centerIn: icon - visible: isUpdating + anchors.centerIn: parent + visible: root.isUpdating running: visible } - Column { - id: column - anchors { - left: icon.right - leftMargin: Theme.paddingSmall - rightMargin: Theme.horizontalPageMargin - right: parent.right - verticalCenter: parent.verticalCenter - } - - Label { - id: title - width: parent.width - font.pixelSize: Theme.fontSizeMedium - font.bold: isPremiere - font.underline: isShowPremiere - color: highlighted ? Theme.highlightColor : Theme.primaryColor - truncationMode: TruncationMode.Fade - } - - Label { - id: subtitle - font.pixelSize: Theme.fontSizeTiny - font.bold: isPremiere - color: highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor - visible: text != "" - } + Rectangle { + anchors.left: parent.left + visible: priority >= 0 + color: app.prioListModel.hasOwnProperty(root.priority) ? + app.prioListModel[priority].color : "grey" + height: parent.height + width: Theme.paddingSmall / 2 } } - - } diff --git a/qml/pages/PrioritySelectionDialog.qml b/qml/pages/PrioritySelectionDialog.qml new file mode 100644 index 0000000..c3cf499 --- /dev/null +++ b/qml/pages/PrioritySelectionDialog.qml @@ -0,0 +1,54 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + +import QtQuick 2.6 +import Sailfish.Silica 1.0 + +import "../modules/Opal/Delegates" 1.0 as D + +Dialog { + id: root + + property string showName: '' + property int selectedIndex: -1 + + canAccept: false + + SilicaListView { + id: view + anchors.fill: parent + model: prioListModel + + header: DialogHeader { + title: qsTr("Select a priority") + } + + VerticalScrollDecorator { flickable: view } + + delegate: D.OneLineDelegate { + minContentHeight: Theme.itemSizeSmall + text: modelData.name + spacing: Theme.paddingLarge + + leftItem: Rectangle { + color: modelData.color + height: Theme.itemSizeExtraSmall + radius: Math.round(width / 3) + width: Theme.paddingSmall + } + + onClicked: { + root.selectedIndex = index; + root.canAccept = true; + root.accept(); + + python.call('seriesfinale.seriesfinale.series_manager.set_show_priority', + [root.selectedIndex, root.showName], + function() { python.settingsChanged() }) + } + } + } +} diff --git a/qml/pages/SeasonPage.qml b/qml/pages/SeasonPage.qml index 375a13b..3d7675a 100644 --- a/qml/pages/SeasonPage.qml +++ b/qml/pages/SeasonPage.qml @@ -1,9 +1,16 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + * SPDX-FileCopyrightText: 2015-2016 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 import '../util.js' as Util -Page { +Dialog { id: seasonPage property variant season: undefined property variant show: undefined @@ -11,6 +18,11 @@ Page { property bool isUpdating: false property bool isWatched: season.isWatched + property ListModel model: null + property int index: -1 + + readonly property var _nextSeason: model.get(index + 1) || null + function update() { python.call('seriesfinale.seriesfinale.series_manager.get_episodes_list', [show.showName, season.seasonNumber], function(result) { // Load the received data into the list model @@ -18,6 +30,15 @@ Page { }); } + acceptDestination: !!_nextSeason ? Qt.resolvedUrl("SeasonPage.qml") : null + acceptDestinationProperties: ({ + show: show, + season: _nextSeason, + model: model, + index: index + 1, + }) + acceptDestinationAction: PageStackAction.Replace + Component.onCompleted: update() onSeasonChanged:{} @@ -60,22 +81,36 @@ Page { header: PageHeader { id: header - title: show.showName + ' - ' + season.seasonName + title: season.seasonName + description: show.showName + wrapMode: Text.Wrap + descriptionWrapMode: Text.Wrap + _titleItem.horizontalAlignment: Text.AlignRight + } + + footer: Item { + width: parent.width + height: Theme.horizontalPageMargin } model: ListModel { - id:episodesList + id: episodesList } // show.get_sorted_episode_list_by_season(season) delegate: EpisodeListRowDelegate { episode: model - onClicked: pageStack.push(Qt.resolvedUrl("EpisodePage.qml"), { - show: seasonPage.show, - episode: model, - seasonImg: season.seasonImage, - }) + onClicked: { + pageStack.push(Qt.resolvedUrl("EpisodePage.qml"), { + show: seasonPage.show, + episode: model, + model: episodesList, + index: index, + seasonCover: season.seasonImage, + }) + } onWatchToggled: { - python.call('seriesfinale.seriesfinale.series_manager.set_episode_watched', [watched, seasonPage.show.showName, model.episodeName]); + python.call('seriesfinale.seriesfinale.series_manager.set_episode_watched', + [watched, seasonPage.show.showName, model.episodeName]); } } diff --git a/qml/pages/SeriesPage.qml b/qml/pages/SeriesPage.qml index edb4f02..f612a63 100644 --- a/qml/pages/SeriesPage.qml +++ b/qml/pages/SeriesPage.qml @@ -1,11 +1,23 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + * SPDX-FileCopyrightText: 2015-2016 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 +import "../modules/Opal/SmartScrollbar" as S import '../util.js' as Util Page { id: seriesPage + Component.onCompleted: { + update() + } + property bool isUpdating: false property bool isLoading: false property bool hasChanged: false @@ -22,7 +34,12 @@ Page { isLoading = false; hasChanged = false; - coverImage = seriesList.get(getRandomNumber(0, result.length)).coverImage; + + var random = seriesList.get(getRandomNumber(0, result.length)) + + if (!!random) { + coverImage = random.coverImage + } }); python.call('seriesfinale.seriesfinale.settingsWrapper.getSortByGenre', [], function(result) { @@ -55,6 +72,11 @@ Page { Connections { target: python + onSettingsChanged: { + hasChanged = true + update() + } + onLoadingChanged: { seriesPage.isLoading = true; if(!loading) { @@ -107,7 +129,6 @@ Page { SilicaListView { id: listView anchors.fill: parent - spacing: Theme.paddingMedium // PullDownMenu PullDownMenu { @@ -146,6 +167,11 @@ Page { title: "SeriesFinale" } + footer: Item { + width: parent.width + height: Theme.horizontalPageMargin + } + model: ListModel { id: seriesList } @@ -157,52 +183,47 @@ Page { } delegate: ListRowDelegate { - id: listDelegate - + id: item + text: model.showName + description: model.infoMarkup + iconSource: model.coverImage isUpdating: model.isUpdating isPremiere: model.nextIsPremiere && doHighlight isShowPremiere: model.isShowPremiere && doHighlight - title: model.showName - subtitle: model.infoMarkup - iconSource: model.coverImage priority: model.priority + infoLines: 3 - Component { - id: contextMenu + menu: Component { ContextMenu { MenuItem { - id: markNextItem visible: !model.isWatched text: qsTr('Mark next episode') onClicked: { - python.call('seriesfinale.seriesfinale.series_manager.mark_next_episode_watched', [true, model.showName]) - seriesPage.update() + python.call('seriesfinale.seriesfinale.series_manager.mark_next_episode_watched', [true, model.showName], + function(){seriesPage.update()}) } } MenuItem { - id: markAllItem visible: !model.isWatched text: qsTr('Mark show as watched') onClicked: { - python.call('seriesfinale.seriesfinale.series_manager.mark_all_episodes_watched', [true, model.showName]) - seriesPage.update() + python.call('seriesfinale.seriesfinale.series_manager.mark_all_episodes_watched', [true, model.showName], + function(){seriesPage.update()}) } } MenuItem { text: qsTr("Delete show") - onClicked: showRemorseItem() + onClicked: { + item.remorseDelete((function(){ + this.python.call('seriesfinale.seriesfinale.series_manager.delete_show_by_name', + [this.model.showName]) + this.item.animateRemoval(this.item) + }).bind({python: python, item: item, model: model})) + } } } } - RemorseItem { id: remorse } - function showRemorseItem() { - remorse.execute(listDelegate, qsTr("Deleting"), function() { - python.call('seriesfinale.seriesfinale.series_manager.delete_show_by_name', [model.showName]); - //seriesList.remove(index); - }) - } - onClicked: { pageStack.push(Qt.resolvedUrl("ShowPage.qml"), {show: model}); } @@ -222,6 +243,17 @@ Page { size: BusyIndicatorSize.Large } - VerticalScrollDecorator {} + S.SmartScrollbar { + flickable: listView + readonly property int scrollIndex: { + var idx = flickable.indexAt(flickable.contentX, flickable.contentY) + if (idx < 0) idx = flickable.indexAt(flickable.contentX, flickable.contentY + + Theme.itemSizeMedium) + return idx + } + + text: listView.currentSection + description: "%1 / %2".arg(scrollIndex+2).arg(flickable.count) + } } } diff --git a/qml/pages/SettingsPage.qml b/qml/pages/SettingsPage.qml index 5fe58e4..089f9b3 100644 --- a/qml/pages/SettingsPage.qml +++ b/qml/pages/SettingsPage.qml @@ -15,6 +15,7 @@ Dialog { python.call('seriesfinale.seriesfinale.settingsWrapper.setUpdateEndedShows', [updateEndedShowsSwitch.checked]) python.call('seriesfinale.seriesfinale.settingsWrapper.setHighlightSpecial', [highlightSpecialSwitch.checked]) python.call('seriesfinale.seriesfinale.saveSettings', []) + python.settingsChanged() } Component.onCompleted: { diff --git a/qml/pages/ShowInfoDialog.qml b/qml/pages/ShowInfoDialog.qml new file mode 100644 index 0000000..8ee6646 --- /dev/null +++ b/qml/pages/ShowInfoDialog.qml @@ -0,0 +1,109 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import Sailfish.Silica 1.0 + +import "../modules/Opal/LinkHandler" 1.0 as L +import '../util.js' as Util +import "components" + +Dialog { + id: root + + property var show + + SilicaFlickable { + anchors.fill: parent + contentWidth: column.width + contentHeight: column.height + Theme.horizontalPageMargin + + VerticalScrollDecorator { flickable: flickable } + + Column { + id: column + + width: root.width + spacing: Theme.paddingLarge + + PageHeader { + title: show.showName + } + + InfoBox { + x: Theme.horizontalPageMargin + width: parent.width - 2*x + + Row { + width: parent.width + height: childrenRect.height + spacing: Theme.paddingLarge + + Image { + id: cover + source: show.coverImage + height: 1.5*Theme.itemSizeExtraLarge + sourceSize.height: height + fillMode: Image.PreserveAspectFit + smooth: true + + MouseArea { + anchors.fill: parent + onClicked: Qt.openUrlExternally(show.coverImage) + } + } + + InfoGrid { + width: parent.width - parent.spacing - cover.paintedWidth + anchors.verticalCenter: cover.verticalCenter + + InfoGridItem { + grid: parent + label: qsTr("Links") + value: 'IMDB' + + valueLabel { + linkColor: Theme.primaryColor + onLinkActivated: { + var imdbUrl = 'http://www.imdb.com/title/' + show.imdbId + L.LinkHandler.openOrCopyUrl(imdbUrl) + } + } + } + InfoGridItem { + grid: parent + label: qsTr("Runtime") + value: qsTr("%1 min", "as in “this episode is 30 minutes long").arg(show.runtime) + } + InfoGridItem { + grid: parent + label: qsTr("Genre") + value: show.showGenre + } + } + } + } + + SectionHeader { + text: qsTr("Description") + visible: !!show.showOverview + } + + Label { + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width - 2*Theme.horizontalPageMargin + font.pixelSize: Theme.fontSizeMedium + color: Theme.secondaryHighlightColor + wrapMode: Text.Wrap + text: show.showOverview + + linkColor: Theme.primaryColor + onLinkActivated: L.LinkHandler.openOrCopyUrl(link) + } + } + } +} diff --git a/qml/pages/ShowPage.qml b/qml/pages/ShowPage.qml index aa3bb4d..d505329 100644 --- a/qml/pages/ShowPage.qml +++ b/qml/pages/ShowPage.qml @@ -1,9 +1,15 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + * SPDX-FileCopyrightText: 2015-2016 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 import '../util.js' as Util - Page { id: showPage property variant show: undefined @@ -11,7 +17,6 @@ Page { property bool isUpdating: false property bool hasChanged: false - function update() { python.call('seriesfinale.seriesfinale.series_manager.get_seasons_list', [show.showName], function(result) { // Load the received data into the list model @@ -29,7 +34,6 @@ Page { } } - Connections { target: python @@ -42,7 +46,6 @@ Page { onInfoMarkupChanged: hasChanged = true - onShowArtChanged: { python.call('seriesfinale.seriesfinale.series_manager.get_seasons_list', [show.showName], function(result) { Util.updateModelWith(seasonList, 'seasonImage', '', result); @@ -55,71 +58,6 @@ Page { //} } - Dialog { - id: showInfoDialog - - SilicaFlickable { - id: content - anchors.fill: parent - - contentWidth: grid.width - contentHeight: grid.height - - VerticalScrollDecorator { flickable: flickable } - - Column { - id: grid - - width: showInfoDialog.width - spacing: Theme.paddingLarge - - PageHeader { - title: show.showName - } - - MouseArea{ - width: showCover.width - height: showCover.height + imdbBanner.height - anchors.horizontalCenter: parent.horizontalCenter - - Image { - id: showCover - source: show.coverImage - height: 300 - fillMode: "PreserveAspectFit" - smooth: true - } - - Image { - id: imdbBanner - anchors.top: showCover.bottom - source: '../../src/SeriesFinale/imdb_banner.png' - width: showCover.width - fillMode: "PreserveAspectFit" - smooth: true - } - - onClicked: { - Qt.openUrlExternally('http://www.imdb.com/title/' + show.imdbId ) - } - - } - - - Text { - id: showInfoDescription - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width - 2*Theme.horizontalPageMargin - text: show.showOverview - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - wrapMode: Text.Wrap - } - } - } - } - - SilicaListView { id: listView anchors.fill: parent @@ -127,20 +65,32 @@ Page { // PullDownMenu PullDownMenu { MenuItem { - text: showPage.isUpdating ? qsTr("Refreshing...") : qsTr("Refresh") - visible: seasonList.count != 0 - enabled: !showPage.isUpdating - onClicked: python.call('seriesfinale.seriesfinale.series_manager.update_show_by_name', [show.showName]) + text: qsTr("Refresh") + visible: seasonList.count != 0 && !isUpdating + onClicked: { + python.call('seriesfinale.seriesfinale.series_manager.update_show_by_name', [show.showName]) + } } MenuItem { text: qsTr("Info") - onClicked: showInfoDialog.open() + onClicked: pageStack.push(Qt.resolvedUrl("ShowInfoDialog.qml"), {show: showPage.show}) + } + MenuLabel { + visible: isUpdating + text: qsTr("Refreshing...") } } header: PageHeader { id: header title: show.showName + wrapMode: Text.Wrap + _titleItem.horizontalAlignment: Text.AlignRight + } + + footer: Item { + width: parent.width + height: Theme.horizontalPageMargin } model: ListModel { @@ -148,52 +98,59 @@ Page { } //show.get_seasons_model() delegate: ListRowDelegate { - id: listDelegate + id: item - title: model.seasonName - subtitle: model.seasonInfoMarkup + text: model.seasonName + description: model.seasonInfoMarkup iconSource: model.seasonImage + infoLines: 2 - Component { - id: contextMenu + menu: Component { ContextMenu { MenuItem { id: markAllItem text: model.isWatched ? qsTr('Mark None') : qsTr('Mark All') onClicked: { if (model.isWatched) { - python.call('seriesfinale.seriesfinale.series_manager.mark_all_episodes_watched', [false, showPage.show.showName, model.seasonNumber]) + python.call('seriesfinale.seriesfinale.series_manager.mark_all_episodes_watched', + [false, showPage.show.showName, model.seasonNumber]) } else { - python.call('seriesfinale.seriesfinale.series_manager.mark_all_episodes_watched', [true, showPage.show.showName, model.seasonNumber]) + python.call('seriesfinale.seriesfinale.series_manager.mark_all_episodes_watched', + [true, showPage.show.showName, model.seasonNumber]) } showPage.update() } } MenuItem { text: qsTr("Delete season"); - onClicked: showRemorseItem() + onClicked: { + item.remorseDelete((function(){ + this.python.call('seriesfinale.seriesfinale.series_manager.delete_season', + [this.showPage.show.showName, this.model.seasonNumber]) + this.item.animateRemoval(this.item) + }).bind({python: python, item: item, showPage: showPage, model: model})) + } } } } - RemorseItem { id: remorse } - function showRemorseItem() { - remorse.execute(listDelegate, qsTr("Deleting"), function() { - python.call('seriesfinale.seriesfinale.series_manager.delete_season', [showPage.show.showName, model.seasonNumber]); - seasonList.remove(index); - }) + onClicked: { + pageStack.push(Qt.resolvedUrl("SeasonPage.qml"), { + show: showPage.show, + season: model, + model: seasonList, + index: index, + }) } - - onClicked: pageStack.push(Qt.resolvedUrl("SeasonPage.qml"), { - show: showPage.show, - season: model, - }) } ViewPlaceholder { id: emptyText text: qsTr('No seasons') - enabled: seasonList.count == 0 && !showPage.isUpdating + enabled: showPage.status == PageStatus.Active && + !showPage.isLoading && + !showPage.isUpdating && + seasonList.count == 0 } BusyIndicator { diff --git a/qml/pages/StatisticsPage.qml b/qml/pages/StatisticsPage.qml index 5eed268..0e79e14 100644 --- a/qml/pages/StatisticsPage.qml +++ b/qml/pages/StatisticsPage.qml @@ -1,127 +1,81 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + * SPDX-FileCopyrightText: 2015-2016 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 Page { id: statisticsPage + property string numShows + property string watchedShows + property string endedShows + property string numEpisodes + property string watchedEpisodes + property string timeWatched + property string lastUpdate + Component.onCompleted: { python.call('seriesfinale.seriesfinale.getStatistics', [], function(result) { - numShows.text = result.numSeries; - watchedShows.text = result.numSeriesWatched + ' (' + Math.round(100*result.numSeriesWatched/result.numSeries) + '%)'; - endedShows.text = result.numSeriesEnded; - numEpisodes.text = result.numEpisodes; - watchedEpisodes.text = result.numEpisodesWatched + ' (' + Math.round(100*result.numEpisodesWatched/result.numEpisodes) + '%)'; - timeWatched.text = Math.round(result.timeWatched/14.4)/100; + numShows = result.numSeries; + watchedShows = result.numSeriesWatched + ' (' + Math.round(100*result.numSeriesWatched/result.numSeries) + '%)'; + endedShows = result.numSeriesEnded; + numEpisodes = result.numEpisodes; + watchedEpisodes = result.numEpisodesWatched + ' (' + Math.round(100*result.numEpisodesWatched/result.numEpisodes) + '%)'; + timeWatched = Math.round(result.timeWatched/14.4)/100; }) python.call('seriesfinale.seriesfinale.settingsWrapper.getLastCompleteUpdate', [], function(result) { - lastUpdate.text = result; + lastUpdate = result; }) - } - SilicaFlickable { - id: flickableText anchors.fill: parent - - contentHeight: contents.height + contentHeight: column.height VerticalScrollDecorator {} - anchors.leftMargin: Theme.horizontalPageMargin - anchors.rightMargin: Theme.horizontalPageMargin - Column { - id: contents - width: statisticsPage.width - Theme.horizontalPageMargin + id: column + x: Theme.horizontalPageMargin + width: parent.width - 2*x spacing: Theme.paddingLarge PageHeader { title: qsTr("Statistics") } - Grid { - id: grid - columns: 2 - spacing: Theme.paddingLarge - - Text { - text: qsTr("Number of shows:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: numShows - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Ended shows:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: endedShows - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Watched shows:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: watchedShows - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Number of episodes:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: numEpisodes - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Watched episodes:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: watchedEpisodes - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Days spent watching:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: timeWatched - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } - Text { - text: qsTr("Last refresh:") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primaryColor - } - Text { - id: lastUpdate - text: "" - font.pixelSize: Theme.fontSizeSmall - color: Theme.secondaryColor - } + DetailItem { + label: qsTr("Number of shows:") + value: numShows + } + DetailItem { + label: qsTr("Ended shows:") + value: endedShows + } + DetailItem { + label: qsTr("Watched shows:") + value: watchedShows + } + DetailItem { + label: qsTr("Number of episodes:") + value: numEpisodes + } + DetailItem { + label: qsTr("Watched episodes:") + value: watchedEpisodes + } + DetailItem { + label: qsTr("Days spent watching:") + value: timeWatched + } + DetailItem { + label: qsTr("Last refresh:") + value: lastUpdate } } } diff --git a/qml/pages/SurveyPage.qml b/qml/pages/SurveyPage.qml index c477c48..e6fd7b3 100644 --- a/qml/pages/SurveyPage.qml +++ b/qml/pages/SurveyPage.qml @@ -1,6 +1,14 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + * SPDX-FileCopyrightText: 2015-2017 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 +import "../modules/Opal/SmartScrollbar" as S import '../util.js' as Util Page { @@ -30,6 +38,10 @@ Page { Connections { target: python + onSettingsChanged: { + update() + } + onLoadingChanged: { surveyPage.isLoading = true; if(!loading) { @@ -59,7 +71,6 @@ Page { SilicaListView { id: listView anchors.fill: parent - spacing: Theme.paddingMedium // PullDownMenu PullDownMenu { @@ -82,6 +93,11 @@ Page { title: qsTr("Survey Page") } + footer: Item { + width: parent.width + height: Theme.horizontalPageMargin + } + model: ListModel { id: seriesListByPrio } @@ -93,42 +109,40 @@ Page { } delegate: ListRowDelegate { - id: listDelegate + id: item + text: model.showName + description: model.infoMarkup isUpdating: model.isUpdating isPremiere: model.nextIsPremiere && doHighlight isShowPremiere: model.isShowPremiere && doHighlight - title: model.showName - subtitle: model.infoMarkup priority: model.priority iconSource: model.coverImage + infoLines: 3 - Component { - id: contextMenu + menu: Component { ContextMenu { MenuItem { text: qsTr('Change show priority') onClicked: { - selectionDialog.showName = model.showName; - selectionDialog.open(); + pageStack.push(Qt.resolvedUrl("PrioritySelectionDialog.qml"), + {showName: model.showName}) } } MenuItem { text: qsTr("Delete show") - onClicked: showRemorseItem() + onClicked: { + item.remorseDelete((function(){ + this.python.call('seriesfinale.seriesfinale.series_manager.delete_show_by_name', + [this.model.showName]) + this.item.animateRemoval(this.item) + }).bind({python: python, item: item, model: model})) + } } } } - RemorseItem { id: remorse } - function showRemorseItem() { - remorse.execute(listDelegate, qsTr("Deleting"), function() { - python.call('seriesfinale.seriesfinale.series_manager.delete_show_by_name', [model.showName]); - //seriesList.remove(index); - }) - } - onClicked: { pageStack.push(Qt.resolvedUrl("ShowPage.qml"), {show: model}); } @@ -137,7 +151,9 @@ Page { ViewPlaceholder { id: emptyText text: qsTr('No shows') - enabled: seriesListByPrio.count == 0 && !surveyPage.isLoading + enabled: surveyPage.status == PageStatus.Active && + !surveyPage.isLoading && + seriesListByPrio.count == 0 } BusyIndicator { @@ -148,70 +164,21 @@ Page { size: BusyIndicatorSize.Large } - VerticalScrollDecorator {} - } - - Dialog { - id: selectionDialog - - property string showName: '' - property int selectedIndex: -1 - - canAccept: false - - DialogHeader { - id: dialogHeader - anchors { top: parent.top; left: parent.left; right: parent.right } - } - - ListView { - id: dialogList - anchors { top: dialogHeader.bottom; left: parent.left; right: parent.right; bottom: parent.bottom } - - model: prioListModel - - delegate: BackgroundItem { - height: Theme.itemSizeMedium - - Label { - text: model.modelData.name - - anchors { - left: parent.left - verticalCenter: parent.verticalCenter - margins: Theme.paddingLarge - } - } - - Rectangle { - anchors { - right: parent.right - rightMargin: Theme.paddingLarge - verticalCenter: parent.verticalCenter - } - color: model.modelData.color - height: Theme.itemSizeExtraSmall - radius: Math.round(width / 3) - width: Theme.paddingSmall - } - - - onClicked: { - selectionDialog.selectedIndex = index; - selectionDialog.canAccept = true; - selectionDialog.accept(); - - python.call('seriesfinale.seriesfinale.series_manager.set_show_priority', [selectionDialog.selectedIndex, selectionDialog.showName]) - seriesPage.update() - surveyPage.update() - //console.log("Show: ", selectionDialog.showName, "|| Selected: ", selectionDialog.selectedIndex) - } + S.SmartScrollbar { + flickable: listView + readonly property int scrollIndex: { + var idx = flickable.indexAt(flickable.contentX, flickable.contentY) + if (idx < 0) idx = flickable.indexAt(flickable.contentX, flickable.contentY + + Theme.itemSizeMedium) + return idx } + + text: !!listView.currentSection ? prioListModel[listView.currentSection].name : " " + description: "%1 / %2".arg(scrollIndex+2).arg(flickable.count) } } Component.onCompleted: { update() } - } diff --git a/qml/pages/components/InfoBox.qml b/qml/pages/components/InfoBox.qml new file mode 100644 index 0000000..f24fedd --- /dev/null +++ b/qml/pages/components/InfoBox.qml @@ -0,0 +1,38 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import Sailfish.Silica 1.0 + +Rectangle { + id: root + + default property alias contents: container.data + property int padding: Theme.paddingLarge + + width: parent.width + height: childrenRect.height + 2*padding + + color: Theme.rgba(Theme.highlightDimmerColor, Theme.opacityFaint) + radius: 50 + border { + color: Theme.highlightColor + width: 1 + } + + Item { + id: container + + anchors { + top: parent.top + topMargin: parent.padding + } + x: parent.padding + width: parent.width - 2*x + height: childrenRect.height + } +} diff --git a/qml/pages/components/InfoGrid.qml b/qml/pages/components/InfoGrid.qml new file mode 100644 index 0000000..4fbbc2f --- /dev/null +++ b/qml/pages/components/InfoGrid.qml @@ -0,0 +1,21 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 Mirian Margiani + */ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import Sailfish.Silica 1.0 + +GridLayout { + id: root + + width: parent.width + columns: 2 + columnSpacing: Theme.paddingMedium + rowSpacing: Theme.paddingMedium + + // note: GridLayout items are added upside down, + // from bottom to top. +} diff --git a/qml/pages/components/InfoGridItem.qml b/qml/pages/components/InfoGridItem.qml new file mode 100644 index 0000000..17e9cc4 --- /dev/null +++ b/qml/pages/components/InfoGridItem.qml @@ -0,0 +1,63 @@ +/* + * This file is part of harbour-seriesfinale. + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2024-2025 Mirian Margiani + */ + +import QtQuick 2.2 +import Sailfish.Silica 1.0 +import QtQuick.Layouts 1.1 + +Item { + id: root + + property GridLayout grid + property string label + property string value + property bool busy: false + + property alias valueLabel: valueLabel + property alias labelLabel: labelLabel + + // note: GridLayout items are added upside down, + // from bottom to top. + + Label { + id: valueLabel + parent: grid + visible: root.visible + enabled: root.enabled + leftPadding: root.busy ? spinner.width + Theme.paddingMedium : 0 + Layout.fillWidth: true + Layout.alignment: Qt.AlignLeft | Qt.AlignTop + text: value + color: Theme.highlightColor + font.pixelSize: Theme.fontSizeMedium + wrapMode: Text.Wrap + + BusyIndicator { + id: spinner + anchors { + left: parent.left + bottom: parent.baseline + } + visible: root.busy + size: BusyIndicatorSize.ExtraSmall + running: visible + } + } + + Label { + id: labelLabel + parent: grid + visible: root.visible + enabled: root.enabled + Layout.fillWidth: false + Layout.alignment: Qt.AlignRight + anchors.baseline: valueLabel.baseline + text: label + color: Theme.secondaryHighlightColor + font.pixelSize: Theme.fontSizeSmall + horizontalAlignment: Text.AlignRight + } +} From b43707f2df13f3498832ebf99b86a691950c730b Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:09 +0200 Subject: [PATCH 23/30] Implement "make update" to update Python translation catalogs --- Makefile | 58 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 8c4c4f7..7c13d3c 100644 --- a/Makefile +++ b/Makefile @@ -1,37 +1,71 @@ ########################################################################## # Makefile for SeriesFinale - -# This is a helper Makefile to build the python translation files -# since that is not automatically done with qtcreator. -# The .ls files are converted to .po files with lconvert. A tool -# that comes with the Qt distribution. -# The .po files are compiled to binary .mo format with msgfmt. +# +# This is a helper Makefile to build the Python translation files +# since that is not automatically done with QtCreator. +# +# Dependencies: +# - lconvert: a language file conversion tool that comes with +# the Qt distribution +# - pybabel: a Python tool for managing gettext translations, +# https://pypi.org/project/babel +# - msgfmt: a tool for compiling gettext translations from .po to .mo, +# comes with the gettext distribution ########################################################################## TSFILES = $(wildcard translations/python-messages-*.ts) -POFILES = $(subst .ts,.po,$(subst python-messages-,,$(TSFILES))) +POFILES = $(patsubst translations/python-messages-%.ts,translations/%/LC_MESSAGES/python-messages.po, $(TSFILES)) +TSFAKES = $(patsubst translations/python-messages-%.ts,translations/python-messages-%-fake.ts, $(TSFILES)) LOCALEDIR = src/SeriesFinale/locale -MOFILES = $(patsubst translations/%.po,$(LOCALEDIR)/%/LC_MESSAGES/seriesfinale.mo, $(POFILES)) +MOFILES = $(patsubst translations/%/LC_MESSAGES/python-messages.po,$(LOCALEDIR)/%/LC_MESSAGES/seriesfinale.mo, $(POFILES)) -LCONVERT = /opt/Qt/6.7.0/gcc_64/bin/lconvert +LCONVERT = /usr/bin/lconvert6 +PYBABEL = pybabel MSGFMT = msgfmt .PHONY: help clean help: @echo "" - @echo " make translations Convert and build python translation files" + @echo " ** Manage Python translations **" + @echo "" + @echo " make update Update translation catalogs for translating" + @echo " make translations Convert and build Python translation files" @echo " make clean Remove generated and compiled files" @echo "" + @echo " Note: Qt translations are built automatically when building the app" + @echo "" translations: $(MOFILES) -translations/%.po: translations/python-messages-%.ts +translations/%/LC_MESSAGES/python-messages.po: translations/python-messages-%.ts + @mkdir -p $(@D) $(LCONVERT) $< -o $@ -$(LOCALEDIR)/%/LC_MESSAGES/seriesfinale.mo: translations/%.po +$(LOCALEDIR)/%/LC_MESSAGES/seriesfinale.mo: translations/%/LC_MESSAGES/python-messages.po @mkdir -p $(@D) $(MSGFMT) $< -o $@ + @rm -r $(subst LC_MESSAGES/python-messages.po,,$<) + +update-pot: + $(PYBABEL) extract \ + --project "harbour-seriesfinale" \ + --copyright-holder "harbour-seriesfinale contributors" \ + -c "TRANSLATORS" --no-wrap \ + src/SeriesFinale/series.py \ + -o translations/python-messages.pot + +translations/python-messages-%-fake.ts: translations/%/LC_MESSAGES/python-messages.po + $(LCONVERT) $< -o $(subst -fake.ts,.ts,$@) \ + -target-language $(subst -fake.ts,,$(subst translations/python-messages-,,$@)) \ + -no-obsolete -locations absolute + @rm -r $(subst LC_MESSAGES/python-messages.po,,$<) + +update-po: update-pot $(POFILES) + $(PYBABEL) update --no-wrap -D python-messages -i translations/python-messages.pot -d translations + +update: update-po $(TSFAKES) + $(LCONVERT) translations/python-messages.pot -o translations/python-messages.ts -drop-translations clean: rm -f $(POFILES) From c997ddbada0f6afcfc3c65e76684c9d1efce739e Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:13 +0200 Subject: [PATCH 24/30] Make date formats translatable --- src/SeriesFinale/series.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/SeriesFinale/series.py b/src/SeriesFinale/series.py index 3ba3bc7..7709eab 100644 --- a/src/SeriesFinale/series.py +++ b/src/SeriesFinale/series.py @@ -499,9 +499,19 @@ def get_air_date_text(self): return _('Tomorrow') if today - timedelta(days = 1) == self.air_date: return _('Yesterday') - next_air_date_str = self.air_date.strftime('%d %b') + if self.air_date.year != datetime.today().year: - next_air_date_str += self.air_date.strftime(' %Y') + # TRANSLATORS: + # This is a Python-formatted date (day, month, year). + # Translate it to the form preferred in your language. + # See: https://strftime.org + next_air_date_str = self.air_date.strftime(_('%d %b %Y')) + else: + # TRANSLATORS: This is a Python-formatted date (day and month only). + # Translate it to the form preferred in your language. + # See: https://strftime.org + next_air_date_str = self.air_date.strftime(_('%d %b')) + return next_air_date_str def already_aired(self): From 5637ff34ccd9e1844b795f5fc7d035c3e8ad225f Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:21 +0200 Subject: [PATCH 25/30] Update Python translations --- .../locale/de/LC_MESSAGES/seriesfinale.mo | Bin 1072 -> 1387 bytes .../locale/es/LC_MESSAGES/seriesfinale.mo | Bin 1097 -> 1319 bytes .../locale/sv/LC_MESSAGES/seriesfinale.mo | Bin 1053 -> 1278 bytes translations/python-messages-de.ts | 60 +++++++++++----- translations/python-messages-es.ts | 66 +++++++++++------ translations/python-messages-sv.ts | 64 +++++++++++------ translations/python-messages.pot | 67 +++++++++++------- translations/python-messages.ts | 64 ++++++++++++----- 8 files changed, 219 insertions(+), 102 deletions(-) diff --git a/src/SeriesFinale/locale/de/LC_MESSAGES/seriesfinale.mo b/src/SeriesFinale/locale/de/LC_MESSAGES/seriesfinale.mo index c542b362e53df43902fab151c7b1e2eacd344260..eab1a9bc0f114d9d01a05f6817ffe60b0075bcf5 100644 GIT binary patch delta 734 zcmZwDzfaph6bJB22n9?jKSiNX=@w7rEMNgyf#Ng`6eV2R2< zzD@cR>hC}cl zRM4LdpxXpCCLm2X2Zv!6Qllco!>U*w!R?#k=KM6hwX`N1GD3UId93rCwjA#sJkNz5oT#`2g6N z(2-D>_yi`F@B&mc)c&(5lgxd4w>!5pOYb8VF4FEuh(oeKzL8m78y-X#%hR1)>Uv1>v({7xGNHh&mzi)HpcJ?^mx-Fe)M*U*&Qk^V2j~WR zfi9yXw17UKOXxGIqA%zw`i3r`A3ymM&0}870bn((pz~-E#Sv`gV7jLG%BU^lE74D> zIiOu3lOT>X(srE_cIc5Vb33NfQeANq%aq!Q9}H+?=qJ>RHNtG&wCcKHxUADr+YWWb zZ7?gK22X`X&YA8~+o6U|jvdW5OFgH>REsAm^(2pykf*V1YNUB;S)`@gj8y+s)^IoS zhup_5k^Bbg34T3$Ayvz&he0`(er@ue*_n(pz3n3r35ney0ysMtk LzkSm}wxWCktx8>> delta 170 zcmZ3^b&_Mkocieu3=B<73=G;pT8bHnfwUWtmIcy@Kw1$<*8^!0AiWSsO91I@Kw20` zp9j)hK>9I|mITu8fHV(~=3s&FMS(O2kgpG?>K$;y$+W=`GVsK$$*euPM&N#W4 hIcl;8v$kM_u1{iKdTC;Ms+B@&alC8r=5Ne~i~y6D7drp| diff --git a/src/SeriesFinale/locale/sv/LC_MESSAGES/seriesfinale.mo b/src/SeriesFinale/locale/sv/LC_MESSAGES/seriesfinale.mo index 81ad044bce7732a5c242b3e01431b8e40da3672f..a4d5799d24ae13bf82bcace79669659f692b7db6 100644 GIT binary patch delta 378 zcmY+;u}Z^G6b9g%w$>UaQK_ilom})5bt!~WnwnH2NfXjou-nyMLQ0!Rk`|l_eFCAl z>EQ0xCvf)-TpXQTbrS!A2u>gW;qagHQ21WDy&n%HLM9nPb_pS0Swf0%Cr8KzEW>T+ zz!f-v>u?O0;T@FWBV2<|zxf%iBEP^z_y!l?J1oEtn1`P^GTV}TY3#&NPh6$U=(4tm zlOPHe>bUlqe(ceQmAgJhFMcJ&DC2i*|C``M!~#* zX*?AQz0g&cSvJ#DdTJ|{vDdMix@__!WnRp~q|ehRZYZ>IZkn{IS~{)#tE^%-^oQI> zS2Fqw%oBVtpU{eF*7`vyiv8;JHM2jRWICHCA`~&sFA)1%U1xpXkgXN%Gg Do~&C4 delta 152 zcmeyzIhSL?ocbvY3=B<73=C>OTAUe(fwUcvmH^UWKw1V!=L2a$Al(C`MS=7@Ak7V= zw*YA_AbkKxiva15P+$ QnWH9qFl%pq!7RoI0A!I8W&i*H diff --git a/translations/python-messages-de.ts b/translations/python-messages-de.ts index 46d6243..d6e6183 100644 --- a/translations/python-messages-de.ts +++ b/translations/python-messages-de.ts @@ -1,10 +1,20 @@ + Babel 2.17.0 + de + de <LL@li.org> + FULL NAME <EMAIL@ADDRESS> + nplurals=2; plural=(n != 1); + YEAR-MO-DA HO:MI+ZONE + 2025-08-12 12:51+0000 + PROJECT VERSION + EMAIL@ADDRESS + Project-Id-Version,Report-Msgid-Bugs-To,POT-Creation-Date,PO-Revision-Date,Last-Translator,Language,Language-Team,Plural-Forms,MIME-Version,Content-Type,Content-Transfer-Encoding,Generated-By - + %s season %s Staffel @@ -14,19 +24,19 @@ %s seasons - - + + Completely watched Komplett gesehen - + Show has ended Serie ist beendet - - + + %s episode not watched %s Folge nicht gesehen @@ -36,66 +46,80 @@ %s episodes not watched - - + + No episodes to watch Keine ungesehenen Folgen - + <i>Next:</i> %s, %s <i>Nächste:</i> %s, %s python-format - + <i>Next:</i> %s <i>Nächste:</i> %s python-format - + Special Spezial - + Season %s Staffel %s python-format - + <i>Next episode:</i> %s, %s <i>Nächste Folge:</i> %s, %s python-format - + <i>Next episode:</i> %s <i>Nächste Folge:</i> %s python-format - + Ep. %s: %s Ep. %s: %s python-format - + Today Heute - + Tomorrow Morgen - + Yesterday Gestern + + + %d %b %Y + TRANSLATORS:This is a Python-formatted date (day, month, year).Translate it to the form preferred in your language.See: https://strftime.org + %-d. %B %Y + python-format + + + + %d %b + TRANSLATORS: This is a Python-formatted date (day and month only).Translate it to the form preferred in your language.See: https://strftime.org + %-d. %B + python-format + diff --git a/translations/python-messages-es.ts b/translations/python-messages-es.ts index e548be5..301fc24 100644 --- a/translations/python-messages-es.ts +++ b/translations/python-messages-es.ts @@ -1,101 +1,125 @@ - + + Babel 2.17.0 + es + es <LL@li.org> + FULL NAME <EMAIL@ADDRESS> + nplurals=2; plural=(n != 1); + YEAR-MO-DA HO:MI+ZONE + 2025-08-12 12:51+0000 + PROJECT VERSION + EMAIL@ADDRESS + Project-Id-Version,Report-Msgid-Bugs-To,POT-Creation-Date,PO-Revision-Date,Last-Translator,Language,Language-Team,Plural-Forms,MIME-Version,Content-Type,Content-Transfer-Encoding,Generated-By - + %s season %s temporada %s temporadas - %s seasons python-format + %s seasons - - + + Completely watched Visto completamente - + Show has ended El programa ha finalizado - - + + %s episode not watched %s episodio no visto %s episodios no vistos - %s episodes not watched python-format + %s episodes not watched - - + + No episodes to watch No hay episodios para ver - + <i>Next:</i> %s, %s <i>Siguiente:</i> %s, %s python-format - + <i>Next:</i> %s <i>Siguiente:</i> %s python-format - + Special Especial - + Season %s Temporada %s python-format - + <i>Next episode:</i> %s, %s <i>Siguiente episodio:</i> %s, %s python-format - + <i>Next episode:</i> %s <i>Siguiente episodio:</i> %s python-format - + Ep. %s: %s Ep. %s: %s python-format - + Today Hoy - + Tomorrow Mañana - + Yesterday Ayer + + + %d %b %Y + TRANSLATORS:This is a Python-formatted date (day, month, year).Translate it to the form preferred in your language.See: https://strftime.org + + python-format + + + + %d %b + TRANSLATORS: This is a Python-formatted date (day and month only).Translate it to the form preferred in your language.See: https://strftime.org + + python-format + diff --git a/translations/python-messages-sv.ts b/translations/python-messages-sv.ts index 0d99372..503e36c 100644 --- a/translations/python-messages-sv.ts +++ b/translations/python-messages-sv.ts @@ -1,101 +1,125 @@ + Babel 2.17.0 + sv + sv <LL@li.org> + FULL NAME <EMAIL@ADDRESS> + nplurals=2; plural=(n != 1); + YEAR-MO-DA HO:MI+ZONE + 2025-08-12 12:51+0000 + PROJECT VERSION + EMAIL@ADDRESS + Project-Id-Version,Report-Msgid-Bugs-To,POT-Creation-Date,PO-Revision-Date,Last-Translator,Language,Language-Team,Plural-Forms,MIME-Version,Content-Type,Content-Transfer-Encoding,Generated-By - + %s season %s säsong %s säsonger - %s seasons python-format + %s seasons - - + + Completely watched Färdigsedd - + Show has ended Serien är avslutad - - + + %s episode not watched %s episod ej sedd %s episoder ej sedda - %s episodes not watched python-format + %s episodes not watched - - + + No episodes to watch Inga episoder att se - + <i>Next:</i> %s, %s <i>Nästa:</i> %s, %s python-format - + <i>Next:</i> %s <i>Nästa:</i> %s python-format - + Special Special - + Season %s Säsong %s python-format - + <i>Next episode:</i> %s, %s <i>Nästa episod:</i> %s, %s python-format - + <i>Next episode:</i> %s <i>Nästa episod:</i> %s python-format - + Ep. %s: %s Ep. %s: %s python-format - + Today I dag - + Tomorrow I morgon - + Yesterday I går + + + %d %b %Y + TRANSLATORS:This is a Python-formatted date (day, month, year).Translate it to the form preferred in your language.See: https://strftime.org + + python-format + + + + %d %b + TRANSLATORS: This is a Python-formatted date (day and month only).Translate it to the form preferred in your language.See: https://strftime.org + + python-format + diff --git a/translations/python-messages.pot b/translations/python-messages.pot index 2300ee2..22298a1 100644 --- a/translations/python-messages.pot +++ b/translations/python-messages.pot @@ -1,91 +1,108 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. +# Translations template for harbour-seriesfinale. +# Copyright (C) 2025 harbour-seriesfinale contributors +# This file is distributed under the same license as the harbour-seriesfinale project. +# FIRST AUTHOR , 2025. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-05 22:16+0100\n" +"Project-Id-Version: harbour-seriesfinale VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-08-12 12:51+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Generated-By: Babel 2.17.0\n" -#: src/SeriesFinale/series.py:268 +#: src/SeriesFinale/series.py:298 #, python-format msgid "%s season" msgid_plural "%s seasons" msgstr[0] "" msgstr[1] "" -#: src/SeriesFinale/series.py:271 src/SeriesFinale/series.py:309 +#: src/SeriesFinale/series.py:301 src/SeriesFinale/series.py:339 msgid "Completely watched" msgstr "" -#: src/SeriesFinale/series.py:273 +#: src/SeriesFinale/series.py:303 msgid "Show has ended" msgstr "" -#: src/SeriesFinale/series.py:277 src/SeriesFinale/series.py:313 +#: src/SeriesFinale/series.py:307 src/SeriesFinale/series.py:343 #, python-format msgid "%s episode not watched" msgid_plural "%s episodes not watched" msgstr[0] "" msgstr[1] "" -#: src/SeriesFinale/series.py:282 src/SeriesFinale/series.py:318 +#: src/SeriesFinale/series.py:312 src/SeriesFinale/series.py:348 msgid "No episodes to watch" msgstr "" -#: src/SeriesFinale/series.py:286 +#: src/SeriesFinale/series.py:316 #, python-format msgid "Next: %s, %s" msgstr "" -#: src/SeriesFinale/series.py:290 +#: src/SeriesFinale/series.py:320 #, python-format msgid "Next: %s" msgstr "" -#: src/SeriesFinale/series.py:298 +#: src/SeriesFinale/series.py:328 msgid "Special" msgstr "" -#: src/SeriesFinale/series.py:300 +#: src/SeriesFinale/series.py:330 #, python-format msgid "Season %s" msgstr "" -#: src/SeriesFinale/series.py:322 +#: src/SeriesFinale/series.py:352 #, python-format msgid "Next episode: %s, %s" msgstr "" -#: src/SeriesFinale/series.py:326 +#: src/SeriesFinale/series.py:356 #, python-format msgid "Next episode: %s" msgstr "" -#: src/SeriesFinale/series.py:420 +#: src/SeriesFinale/series.py:450 #, python-format msgid "Ep. %s: %s" msgstr "" -#: src/SeriesFinale/series.py:467 +#: src/SeriesFinale/series.py:497 msgid "Today" msgstr "" -#: src/SeriesFinale/series.py:469 +#: src/SeriesFinale/series.py:499 msgid "Tomorrow" msgstr "" -#: src/SeriesFinale/series.py:471 +#: src/SeriesFinale/series.py:501 msgid "Yesterday" msgstr "" + +#. TRANSLATORS: +#. This is a Python-formatted date (day, month, year). +#. Translate it to the form preferred in your language. +#. See: https://strftime.org +#: src/SeriesFinale/series.py:508 +#, python-format +msgid "%d %b %Y" +msgstr "" + +#. TRANSLATORS: This is a Python-formatted date (day and month only). +#. Translate it to the form preferred in your language. +#. See: https://strftime.org +#: src/SeriesFinale/series.py:513 +#, python-format +msgid "%d %b" +msgstr "" + diff --git a/translations/python-messages.ts b/translations/python-messages.ts index 2ce6874..e672a25 100644 --- a/translations/python-messages.ts +++ b/translations/python-messages.ts @@ -1,10 +1,24 @@ + Babel 2.17.0 + LANGUAGE <LL@li.org> + FULL NAME <EMAIL@ADDRESS> + YEAR-MO-DA HO:MI+ZONE + 2025-08-12 12:51+0000 + harbour-seriesfinale VERSION + EMAIL@ADDRESS + # Translations template for harbour-seriesfinale. +# Copyright (C) 2025 harbour-seriesfinale contributors +# This file is distributed under the same license as the harbour-seriesfinale project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2025. +# +#, fuzzy + Project-Id-Version,Report-Msgid-Bugs-To,POT-Creation-Date,PO-Revision-Date,Last-Translator,Language-Team,MIME-Version,Content-Type,Content-Transfer-Encoding,Generated-By - + %s season @@ -13,19 +27,19 @@ %s seasons - - + + Completely watched - + Show has ended - - + + %s episode not watched @@ -34,66 +48,80 @@ %s episodes not watched - - + + No episodes to watch - + <i>Next:</i> %s, %s python-format - + <i>Next:</i> %s python-format - + Special - + Season %s python-format - + <i>Next episode:</i> %s, %s python-format - + <i>Next episode:</i> %s python-format - + Ep. %s: %s python-format - + Today - + Tomorrow - + Yesterday + + + %d %b %Y + TRANSLATORS:This is a Python-formatted date (day, month, year).Translate it to the form preferred in your language.See: https://strftime.org + + python-format + + + + %d %b + TRANSLATORS: This is a Python-formatted date (day and month only).Translate it to the form preferred in your language.See: https://strftime.org + + python-format + From f38554816c54e1d0e359582b374d044ae99dbbfc Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:29 +0200 Subject: [PATCH 26/30] Update Qt translations --- translations/harbour-seriesfinale-de.ts | 172 ++++++++++++++++++++++++ translations/harbour-seriesfinale-es.ts | 172 ++++++++++++++++++++++++ translations/harbour-seriesfinale-sv.ts | 172 ++++++++++++++++++++++++ translations/harbour-seriesfinale.ts | 172 ++++++++++++++++++++++++ 4 files changed, 688 insertions(+) diff --git a/translations/harbour-seriesfinale-de.ts b/translations/harbour-seriesfinale-de.ts index 83b748d..da9980d 100644 --- a/translations/harbour-seriesfinale-de.ts +++ b/translations/harbour-seriesfinale-de.ts @@ -1,21 +1,84 @@ + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + Statistik + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + AddShow + Search options Suchoptionen + Add show Serie hinzufügen + Search Suchen + No description available. @@ -23,18 +86,22 @@ EpisodePage + Watched Gesehen + Air date + Rating + Description @@ -42,6 +109,7 @@ LicenseListPart + License text @@ -49,46 +117,66 @@ Opal.About + About Über + Version %1 + + + Development + show contributors + + + + Homepage + + Changelog + Translations + + + + Source Code + Donations + License + show license(s) @@ -96,42 +184,53 @@ + News + Changes since version %1 + show details + Thank you! + + Details + Contributors + Acknowledgements + Please refer to <a href="%1">%1</a> + Download license texts + License(s) @@ -139,6 +238,7 @@ + Note: please check the source code for most accurate information. @@ -146,14 +246,17 @@ Opal.About.Common + If you want to support my work, you can buy me a cup of coffee. + You can support this project by contributing, or by donating using any of these services. + Your contributions to translations or code would be most welcome. @@ -161,34 +264,42 @@ Opal.LinkHandler + Share link + Copied to clipboard: %1 + External Link + Copy text to clipboard + Copy to clipboard + Share + Open in browser + Open externally @@ -196,6 +307,7 @@ PrioritySelectionDialog + Select a priority @@ -203,10 +315,12 @@ SearchSettingsPage + Search options Suchoptionen + Language Sprache @@ -214,14 +328,17 @@ SeasonPage + Mark all Alle markieren + Mark none Keine markieren + No episodes Keine Folgen @@ -229,38 +346,47 @@ SeriesPage + About Über + Settings Einstellungen + Refreshing... Aktualisieren ... + Refresh Aktualisieren + Add Show Serie hinzufügen + Mark next episode Nächste Folge markieren + Mark show as watched Ganze Serie markieren + Delete show Serie löschen + No shows Keine Serien @@ -268,62 +394,77 @@ SettingsPage + Settings Einstellungen + Save Speichern + Show sorting Serien sortieren + Seasons sorting Staffeln sortieren + Episode sorting Folgen sortieren + Sort by genre Nach Genre sortieren + Add special seasons Spezialstaffeln hinzufügen + Sorting Sortierung + By title Nach Titel + By next episode date Nach nächstem Sendedatum + By last aired episode Nach letztem Sendedatum + Update ended shows Beendete Serien aktualisieren + Other Anderes + Highlight season premiere Staffel-Premiere hervorheben + Sort by priority Nach Priorität sortieren @@ -331,23 +472,28 @@ ShowInfoDialog + Links + Runtime + %1 min as in “this episode is 30 minutes long + Genre + Description @@ -355,30 +501,37 @@ ShowPage + Refreshing... Aktualisieren ... + Refresh Aktualisieren + Info Informationen + Mark None Keine markieren + Mark All Alle markieren + Delete season Staffel löschen + No seasons Keine Staffeln @@ -386,34 +539,42 @@ StatisticsPage + Statistics Statistik + Number of shows: Anzahl Serien: + Watched shows: Gesehene Serien: + Number of episodes: Anzahl Folgen: + Watched episodes: Gesehene Folgen: + Days spent watching: Tage mit Zuschauen verbracht: + Ended shows: Beendete Serien: + Last refresh: Zuletzt aktualisiert: @@ -421,26 +582,32 @@ SurveyPage + Add Show Serie hinzufügen + Survey Page Erkunden + Delete show Serie löschen + No shows Keine Serien + Change show priority Priorität ändern + Refreshing... Aktualisieren ... @@ -448,22 +615,27 @@ harbour-seriesfinale + None Keine + Pilot Pilot + Episode Episode + Season Staffel + Finale Finale diff --git a/translations/harbour-seriesfinale-es.ts b/translations/harbour-seriesfinale-es.ts index c53cf61..71cdc01 100644 --- a/translations/harbour-seriesfinale-es.ts +++ b/translations/harbour-seriesfinale-es.ts @@ -1,21 +1,84 @@ + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + Estadísticas + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + AddShow + Search options Opciones de búsqueda + Add show Añadir programa + Search Buscar + No description available. @@ -23,18 +86,22 @@ EpisodePage + Watched Visto + Air date + Rating + Description @@ -42,6 +109,7 @@ LicenseListPart + License text @@ -49,46 +117,66 @@ Opal.About + About Acerca de + Version %1 + + + Development + show contributors + + + + Homepage + + Changelog + Translations + + + + Source Code + Donations + License + show license(s) @@ -96,42 +184,53 @@ + News + Changes since version %1 + show details + Thank you! + + Details + Contributors + Acknowledgements + Please refer to <a href="%1">%1</a> + Download license texts + License(s) @@ -139,6 +238,7 @@ + Note: please check the source code for most accurate information. @@ -146,14 +246,17 @@ Opal.About.Common + If you want to support my work, you can buy me a cup of coffee. + You can support this project by contributing, or by donating using any of these services. + Your contributions to translations or code would be most welcome. @@ -161,34 +264,42 @@ Opal.LinkHandler + Share link + Copied to clipboard: %1 + External Link + Copy text to clipboard + Copy to clipboard + Share + Open in browser + Open externally @@ -196,6 +307,7 @@ PrioritySelectionDialog + Select a priority @@ -203,10 +315,12 @@ SearchSettingsPage + Search options Opciones de búsqueda + Language Idioma @@ -214,14 +328,17 @@ SeasonPage + Mark all Marcar todo + Mark none Desmarcar todo + No episodes No hay episodios @@ -229,38 +346,47 @@ SeriesPage + About Acerca de + Settings Ajustes + Refreshing... Actualizando... + Refresh Actualizar + Add Show Añadir programa + Mark next episode Marcar siguiente episodio + Mark show as watched Marcar programa como visto + Delete show Borrar programa + No shows No hay programas @@ -268,62 +394,77 @@ SettingsPage + Settings Ajustes + Save Guardar + Sorting Orden + Show sorting Orden de los programas + By title Por título + By next episode date Por fecha del siguiente episodio + By last aired episode Por último episodio emitido + Seasons sorting Orden de las temporadas + Episode sorting Orden de los episodios + Sort by genre Ordenar por género + Add special seasons Añadir temporadas especiales + Update ended shows Actualizar programas finalizados + Other Otro + Highlight season premiere Resaltar temporadas con estrenos + Sort by priority Ordenar por preferencia @@ -331,23 +472,28 @@ ShowInfoDialog + Links + Runtime + %1 min as in “this episode is 30 minutes long + Genre + Description @@ -355,30 +501,37 @@ ShowPage + Refreshing... Actualizando... + Refresh Actualizar + Info Información + Mark None Desmarcar todo + Mark All Marcar todo + Delete season Borrar temporada + No seasons No hay temporadas @@ -386,34 +539,42 @@ StatisticsPage + Statistics Estadísticas + Number of shows: Número de programas: + Watched shows: Programas vistos: + Number of episodes: Número de episodios: + Watched episodes: Episodios vistos: + Days spent watching: Días dedicados a ver programas: + Ended shows: Programas finalizados: + Last refresh: Última actualización: @@ -421,26 +582,32 @@ SurveyPage + Add Show Añadir programa + Survey Page Página de valoración + Delete show Borrar programa + No shows No hay programas + Change show priority Cambiar preferencia del programa + Refreshing... Actualizando... @@ -448,22 +615,27 @@ harbour-seriesfinale + None Ninguno + Pilot Piloto + Episode Episodio + Season Temporada + Finale Final diff --git a/translations/harbour-seriesfinale-sv.ts b/translations/harbour-seriesfinale-sv.ts index d4c6611..5d0a5f2 100644 --- a/translations/harbour-seriesfinale-sv.ts +++ b/translations/harbour-seriesfinale-sv.ts @@ -1,21 +1,84 @@ + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + Statistik + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + AddShow + Search options Sökalternativ + Add show Lägg till TV-serie + Search Sök + No description available. @@ -23,18 +86,22 @@ EpisodePage + Watched Sedd + Air date + Rating + Description @@ -42,6 +109,7 @@ LicenseListPart + License text @@ -49,46 +117,66 @@ Opal.About + About Om + Version %1 + + + Development + show contributors + + + + Homepage + + Changelog + Translations + + + + Source Code + Donations + License + show license(s) @@ -96,42 +184,53 @@ + News + Changes since version %1 + show details + Thank you! + + Details + Contributors + Acknowledgements + Please refer to <a href="%1">%1</a> + Download license texts + License(s) @@ -139,6 +238,7 @@ + Note: please check the source code for most accurate information. @@ -146,14 +246,17 @@ Opal.About.Common + If you want to support my work, you can buy me a cup of coffee. + You can support this project by contributing, or by donating using any of these services. + Your contributions to translations or code would be most welcome. @@ -161,34 +264,42 @@ Opal.LinkHandler + Share link + Copied to clipboard: %1 + External Link + Copy text to clipboard + Copy to clipboard + Share + Open in browser + Open externally @@ -196,6 +307,7 @@ PrioritySelectionDialog + Select a priority @@ -203,10 +315,12 @@ SearchSettingsPage + Search options Sökalternativ + Language Språk @@ -214,14 +328,17 @@ SeasonPage + Mark all Märk alla + Mark none Avmarkera alla + No episodes Inga avsnitt @@ -229,38 +346,47 @@ SeriesPage + About Om + Settings Inställningar + Refreshing... Uppdaterar... + Refresh Uppdatera + Add Show Lägg till TV-serie + Mark next episode Märk nästa avsnitt + Mark show as watched Märk serien som sedd + Delete show Ta bort serien + No shows Inga serier @@ -268,62 +394,77 @@ SettingsPage + Settings Inställningar + Save Spara + Sorting Sortering + Show sorting Visa sortering + By title Efter titel + By next episode date Efter nästa avsnittsdatum + By last aired episode Efter senast sända avsnitt + Seasons sorting Säsongsortering + Episode sorting Avsnittssortering + Sort by genre Sortera efter genre + Add special seasons Lägg till specialsäsonger + Update ended shows Uppdatera avslutade serier + Other Annat + Highlight season premiere Belys säsongspremiär + Sort by priority Sortera efter prioritet @@ -331,23 +472,28 @@ ShowInfoDialog + Links + Runtime + %1 min as in “this episode is 30 minutes long + Genre + Description @@ -355,30 +501,37 @@ ShowPage + Refreshing... Uppdaterar... + Refresh Uppdatera + Info Info + Mark None Märk ingen + Mark All Märk alla + Delete season Ta bort säsong + No seasons Inga säsonger @@ -386,34 +539,42 @@ StatisticsPage + Statistics Statistik + Number of shows: Antal serier: + Watched shows: Sedda serier: + Number of episodes: Antal avsnitt: + Watched episodes: Sedda avsnitt: + Days spent watching: Dagar som gått åt till att titta: + Ended shows: Avslutade serier: + Last refresh: Senaste uppdatering: @@ -421,26 +582,32 @@ SurveyPage + Add Show Lägg till TV-serie + Survey Page Enkätsida + Delete show Ta bort serien + No shows Inga serier + Change show priority Ändra TV-serieprioritet + Refreshing... Uppdaterar... @@ -448,22 +615,27 @@ harbour-seriesfinale + None Ingen + Pilot Pilotavsnitt + Episode Avsnitt + Season Säsong + Finale Säsongsfinal diff --git a/translations/harbour-seriesfinale.ts b/translations/harbour-seriesfinale.ts index 3963608..f7cc7f8 100644 --- a/translations/harbour-seriesfinale.ts +++ b/translations/harbour-seriesfinale.ts @@ -1,21 +1,84 @@ + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + AddShow + Search options + Add show + Search + No description available. @@ -23,18 +86,22 @@ EpisodePage + Watched + Air date + Rating + Description @@ -42,6 +109,7 @@ LicenseListPart + License text @@ -49,94 +117,126 @@ Opal.About + About + Version %1 + + + Development + show contributors + + + + Homepage + + Changelog + Translations + + + + Source Code + Donations + License + show license(s) + News + Changes since version %1 + show details + Thank you! + + Details + Contributors + Acknowledgements + Please refer to <a href="%1">%1</a> + Download license texts + License(s) + Note: please check the source code for most accurate information. @@ -144,14 +244,17 @@ Opal.About.Common + If you want to support my work, you can buy me a cup of coffee. + You can support this project by contributing, or by donating using any of these services. + Your contributions to translations or code would be most welcome. @@ -159,34 +262,42 @@ Opal.LinkHandler + Share link + Copied to clipboard: %1 + External Link + Copy text to clipboard + Copy to clipboard + Share + Open in browser + Open externally @@ -194,6 +305,7 @@ PrioritySelectionDialog + Select a priority @@ -201,10 +313,12 @@ SearchSettingsPage + Search options + Language @@ -212,14 +326,17 @@ SeasonPage + Mark all + Mark none + No episodes @@ -227,38 +344,47 @@ SeriesPage + About + Settings + Refreshing... + Refresh + Add Show + Mark next episode + Mark show as watched + Delete show + No shows @@ -266,62 +392,77 @@ SettingsPage + Settings + Save + Sorting + Show sorting + By title + By next episode date + By last aired episode + Seasons sorting + Episode sorting + Sort by genre + Add special seasons + Update ended shows + Other + Highlight season premiere + Sort by priority @@ -329,23 +470,28 @@ ShowInfoDialog + Links + Runtime + %1 min as in “this episode is 30 minutes long + Genre + Description @@ -353,30 +499,37 @@ ShowPage + Refreshing... + Refresh + Info + Mark None + Mark All + Delete season + No seasons @@ -384,34 +537,42 @@ StatisticsPage + Statistics + Number of shows: + Watched shows: + Number of episodes: + Watched episodes: + Days spent watching: + Ended shows: + Last refresh: @@ -419,26 +580,32 @@ SurveyPage + Add Show + Survey Page + Delete show + No shows + Change show priority + Refreshing... @@ -446,22 +613,27 @@ harbour-seriesfinale + None + Pilot + Episode + Season + Finale From bb0690f8cdbad12d816ec934af8e97143c7d6e09 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:34 +0200 Subject: [PATCH 27/30] Merge Opal translations --- translations/harbour-seriesfinale-ab.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-af.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-ar.ts | 651 +++++++++++++++++++++ translations/harbour-seriesfinale-be.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-cs.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-de.ts | 92 +-- translations/harbour-seriesfinale-el.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-en.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-es.ts | 92 +-- translations/harbour-seriesfinale-et.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-fa.ts | 641 ++++++++++++++++++++ translations/harbour-seriesfinale-fi.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-fr.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-hu.ts | 641 ++++++++++++++++++++ translations/harbour-seriesfinale-id.ts | 641 ++++++++++++++++++++ translations/harbour-seriesfinale-it.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-ko.ts | 641 ++++++++++++++++++++ translations/harbour-seriesfinale-lt.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-ms.ts | 641 ++++++++++++++++++++ translations/harbour-seriesfinale-nb_NO.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-nl.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-nl_BE.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-nn.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-pl.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-pt.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-pt_BR.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-ro.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-ru.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-sk.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-sr.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-sv.ts | 92 +-- translations/harbour-seriesfinale-ta.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-tr.ts | 641 ++++++++++++++++++++ translations/harbour-seriesfinale-ug.ts | 643 ++++++++++++++++++++ translations/harbour-seriesfinale-uk.ts | 645 ++++++++++++++++++++ translations/harbour-seriesfinale-zh_CN.ts | 641 ++++++++++++++++++++ 36 files changed, 21369 insertions(+), 138 deletions(-) create mode 100644 translations/harbour-seriesfinale-ab.ts create mode 100644 translations/harbour-seriesfinale-af.ts create mode 100644 translations/harbour-seriesfinale-ar.ts create mode 100644 translations/harbour-seriesfinale-be.ts create mode 100644 translations/harbour-seriesfinale-cs.ts create mode 100644 translations/harbour-seriesfinale-el.ts create mode 100644 translations/harbour-seriesfinale-en.ts create mode 100644 translations/harbour-seriesfinale-et.ts create mode 100644 translations/harbour-seriesfinale-fa.ts create mode 100644 translations/harbour-seriesfinale-fi.ts create mode 100644 translations/harbour-seriesfinale-fr.ts create mode 100644 translations/harbour-seriesfinale-hu.ts create mode 100644 translations/harbour-seriesfinale-id.ts create mode 100644 translations/harbour-seriesfinale-it.ts create mode 100644 translations/harbour-seriesfinale-ko.ts create mode 100644 translations/harbour-seriesfinale-lt.ts create mode 100644 translations/harbour-seriesfinale-ms.ts create mode 100644 translations/harbour-seriesfinale-nb_NO.ts create mode 100644 translations/harbour-seriesfinale-nl.ts create mode 100644 translations/harbour-seriesfinale-nl_BE.ts create mode 100644 translations/harbour-seriesfinale-nn.ts create mode 100644 translations/harbour-seriesfinale-pl.ts create mode 100644 translations/harbour-seriesfinale-pt.ts create mode 100644 translations/harbour-seriesfinale-pt_BR.ts create mode 100644 translations/harbour-seriesfinale-ro.ts create mode 100644 translations/harbour-seriesfinale-ru.ts create mode 100644 translations/harbour-seriesfinale-sk.ts create mode 100644 translations/harbour-seriesfinale-sr.ts create mode 100644 translations/harbour-seriesfinale-ta.ts create mode 100644 translations/harbour-seriesfinale-tr.ts create mode 100644 translations/harbour-seriesfinale-ug.ts create mode 100644 translations/harbour-seriesfinale-uk.ts create mode 100644 translations/harbour-seriesfinale-zh_CN.ts diff --git a/translations/harbour-seriesfinale-ab.ts b/translations/harbour-seriesfinale-ab.ts new file mode 100644 index 0000000..d58b25c --- /dev/null +++ b/translations/harbour-seriesfinale-ab.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + + + + + + + Development + + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-af.ts b/translations/harbour-seriesfinale-af.ts new file mode 100644 index 0000000..3ebe523 --- /dev/null +++ b/translations/harbour-seriesfinale-af.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + + + + + + + Development + + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-ar.ts b/translations/harbour-seriesfinale-ar.ts new file mode 100644 index 0000000..16baba2 --- /dev/null +++ b/translations/harbour-seriesfinale-ar.ts @@ -0,0 +1,651 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + برمجة + + + + Icon Design + تصميم الأيقونات + + + + Translations + الترجمات + + + + English + الانجليزية + + + + Spanish + الاسبانية + + + + Swedish + السويدية + + + + German + الالمانية + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + نص الرخصة + + + + Opal.About + + + About + عن + + + + Version %1 + النسخة %1 + + + + + + Development + تطوير + + + + show contributors + عرض المساهمين + + + + + + + Homepage + الصفحة الرئيسية + + + + + Changelog + سجل التغييرات + + + + Translations + الترجمات + + + + + + + Source Code + كود المصدر + + + + Donations + التبرعات + + + + License + الرخصة + + + + show license(s) + + + + + + + + + + + + News + الأخبار + + + + Changes since version %1 + التغييرات منذ الإصدار %1 + + + + show details + اظهر التفاصيل + + + + Thank you! + شكرا لك! + + + + + Details + تفاصيل + + + + Contributors + المساهمين + + + + Acknowledgements + مع الشكر والتقدير + + + + Please refer to <a href="%1">%1</a> + يرجى الرجوع إلى <a href="%1">%1</a> + + + + Download license texts + تحميل نصوص الترخيص + + + + License(s) + + صفر + واحد + اثنين + + + + + + + + Note: please check the source code for most accurate information. + ملاحظة: يرجى فحص كود المصدر لمعلومات اكثر دقة. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + إذا أحببت دعم عملي، يمكنك شراء فنجان قهوة لي + + + + You can support this project by contributing, or by donating using any of these services. + يمكنك دعم هذا المشروع من خلال التطوع أو التبرع باستخدام أي من هذه الخدمات. + + + + Your contributions to translations or code would be most welcome. + مساهمتك في الترجمات أو البرمجة ستكون محل ترحيب كبير. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + تم النسخ الى الحافظة: %1 + + + + External Link + رابط خارجي + + + + Copy text to clipboard + + + + + Copy to clipboard + انسخ الى الحافظة + + + + Share + + + + + Open in browser + افتح في المتصفح + + + + Open externally + الفتح عبر برنامج آخر + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + عن + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-be.ts b/translations/harbour-seriesfinale-be.ts new file mode 100644 index 0000000..ba2d867 --- /dev/null +++ b/translations/harbour-seriesfinale-be.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + + + + + + + Development + Распрацоўка + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-cs.ts b/translations/harbour-seriesfinale-cs.ts new file mode 100644 index 0000000..5200105 --- /dev/null +++ b/translations/harbour-seriesfinale-cs.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programování + + + + Icon Design + Design ikon + + + + Translations + Překlady + + + + English + Angličtina + + + + Spanish + Španělština + + + + Swedish + Švédština + + + + German + Němčina + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Text licence + + + + Opal.About + + + About + O aplikaci + + + + Version %1 + Verze %1 + + + + + + Development + Vývoj + + + + show contributors + zobrazit přispěvatele + + + + + + + Homepage + Domovská stránka + + + + + Changelog + Seznam změn + + + + Translations + Překlady + + + + + + + Source Code + Zdrojový kód + + + + Donations + Dary + + + + License + Licence + + + + show license(s) + + zobrazit licenci + zobrazit licence + zobrazit licence + + + + + News + Novinky + + + + Changes since version %1 + Změny od verze %1 + + + + show details + zobrazit podrobnosti + + + + Thank you! + Děkuji vám! + + + + + Details + Podrobnosti + + + + Contributors + Přispěvatelé + + + + Acknowledgements + Poděkování + + + + Please refer to <a href="%1">%1</a> + Pro více informací se podívejte na <a href="%1">%1</a> + + + + Download license texts + Stáhnout licenční ujednání + + + + License(s) + + Licence + Licence + Licencí + + + + + Note: please check the source code for most accurate information. + Poznámka: Prosím, zkontrolujte zdrojový kód pro přesnější informace. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Pokud chcete podpořit moji práci, můžete mi koupit kafe. + + + + You can support this project by contributing, or by donating using any of these services. + Tento projekt můžete podpořit přispíváním kódu, nebo dary pomocí některé z následujících služeb. + + + + Your contributions to translations or code would be most welcome. + Vaše příspěvky ke kódu nebo překladům jsou vítány. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + Zkopírováno do schránky: %1 + + + + External Link + Externí odkaz + + + + Copy text to clipboard + + + + + Copy to clipboard + Zkopírovat do schránky + + + + Share + + + + + Open in browser + Otevřít v prohlížeči + + + + Open externally + Otevřít externě + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + O aplikaci + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-de.ts b/translations/harbour-seriesfinale-de.ts index da9980d..7e0f280 100644 --- a/translations/harbour-seriesfinale-de.ts +++ b/translations/harbour-seriesfinale-de.ts @@ -16,7 +16,7 @@ Data - + Daten @@ -27,37 +27,37 @@ Programming - + Programmierung Icon Design - + Symbol-Design Translations - + Übersetzungen English - + Englisch Spanish - + Spanisch Swedish - + Schwedisch German - + Deutsch @@ -111,7 +111,7 @@ License text - + Lizenztext @@ -119,24 +119,24 @@ About - Über + Über Version %1 - + Version %1 Development - + Entwicklung show contributors - + Mitwirkende zeigen @@ -144,18 +144,18 @@ Homepage - + Webseite Changelog - + Änderungsverlauf Translations - + Übersetzungen @@ -163,84 +163,84 @@ Source Code - + Quellcode Donations - + Spenden License - + Lizenz show license(s) - - - + + Lizenz zeigen + Lizenzen zeigen News - + Neuigkeiten Changes since version %1 - + Änderungen seit Version %1 show details - + Details zeigen Thank you! - + Vielen Dank! Details - + Details Contributors - + Mitwirkende Acknowledgements - + Danksagungen Please refer to <a href="%1">%1</a> - + Bitte beachten Sie <a href="%1">%1</a> Download license texts - + Lizenztexte herunterladen License(s) - - - + + Lizenz + Lizenzen Note: please check the source code for most accurate information. - + Hinweis: Bitte prüfen Sie den Quellcode für alle Einzelheiten. @@ -248,17 +248,17 @@ If you want to support my work, you can buy me a cup of coffee. - + Sie können mir gerne einen Kaffee spendieren, wenn Sie meine Arbeit unterstützen möchten. You can support this project by contributing, or by donating using any of these services. - + Sie können dieses Projekt durch Ihre Mitarbeit oder durch eine Spende über einen dieser Dienste unterstützen. Your contributions to translations or code would be most welcome. - + Ihre Mitarbeit bei Übersetzungen oder der Programmierung wäre eine große Hilfe. @@ -266,42 +266,42 @@ Share link - + Link teilen Copied to clipboard: %1 - + In die Zwischenablage kopiert: %1 External Link - + Externer Link Copy text to clipboard - + Text kopieren Copy to clipboard - + In die Zwischenablage kopieren Share - + Teilen Open in browser - + Im Browser öffnen Open externally - + Extern öffnen diff --git a/translations/harbour-seriesfinale-el.ts b/translations/harbour-seriesfinale-el.ts new file mode 100644 index 0000000..e2b12a1 --- /dev/null +++ b/translations/harbour-seriesfinale-el.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Προγραμματισμός + + + + Icon Design + Σχεδιασμός εικονιδίων + + + + Translations + Μεταφράσεις + + + + English + Αγγλικά + + + + Spanish + Ισπανικά + + + + Swedish + Σουηδικά + + + + German + Γερμανικά + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + Έκδοση %1 + + + + + + Development + Ανάπτυξη + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + Μεταφράσεις + + + + + + + Source Code + + + + + Donations + Δωρεές + + + + License + + + + + show license(s) + + + + + + + + News + Ειδήσεις + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + Εξωτερικός σύνδεσμος + + + + Copy text to clipboard + + + + + Copy to clipboard + Αντιγραφή στο πρόχειρο + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-en.ts b/translations/harbour-seriesfinale-en.ts new file mode 100644 index 0000000..147089f --- /dev/null +++ b/translations/harbour-seriesfinale-en.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Data + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programming + + + + Icon Design + Icon Design + + + + Translations + Translations + + + + English + English + + + + Spanish + Spanish + + + + Swedish + Swedish + + + + German + German + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + License text + + + + Opal.About + + + About + About + + + + Version %1 + Version %1 + + + + + + Development + Development + + + + show contributors + show contributors + + + + + + + Homepage + Homepage + + + + + Changelog + Changelog + + + + Translations + Translations + + + + + + + Source Code + Source Code + + + + Donations + Donations + + + + License + License + + + + show license(s) + + show license + show licenses + + + + + News + News + + + + Changes since version %1 + Changes since version %1 + + + + show details + show details + + + + Thank you! + Thank you! + + + + + Details + Details + + + + Contributors + Contributors + + + + Acknowledgements + Acknowledgements + + + + Please refer to <a href="%1">%1</a> + Please refer to <a href="%1">%1</a> + + + + Download license texts + Download license texts + + + + License(s) + + License + Licenses + + + + + Note: please check the source code for most accurate information. + Note: please check the source code for most accurate information. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + If you want to support my work, you can buy me a cup of coffee. + + + + You can support this project by contributing, or by donating using any of these services. + You can support this project by contributing, or by donating using any of these services. + + + + Your contributions to translations or code would be most welcome. + Your contributions to translations or code would be most welcome. + + + + Opal.LinkHandler + + + Share link + Share link + + + + Copied to clipboard: %1 + Copied to clipboard: %1 + + + + External Link + External Link + + + + Copy text to clipboard + Copy text to clipboard + + + + Copy to clipboard + Copy to clipboard + + + + Share + Share + + + + Open in browser + Open in browser + + + + Open externally + Open externally + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + About + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-es.ts b/translations/harbour-seriesfinale-es.ts index 71cdc01..1d33b65 100644 --- a/translations/harbour-seriesfinale-es.ts +++ b/translations/harbour-seriesfinale-es.ts @@ -16,7 +16,7 @@ Data - + Datos @@ -27,37 +27,37 @@ Programming - + Programación Icon Design - + Diseño de icono Translations - + Traducciones English - + Inglés Spanish - + Español Swedish - + Sueco German - + Alemán @@ -111,7 +111,7 @@ License text - + Texto de la licencia @@ -119,24 +119,24 @@ About - Acerca de + Acerca de Version %1 - + Versión %1 Development - + Desarrollo show contributors - + Mostrar contribuidores @@ -144,18 +144,18 @@ Homepage - + Página web Changelog - + Registro de cambios Translations - + Traducciones @@ -163,84 +163,84 @@ Source Code - + Código Fuente Donations - + Donaciones License - + Licencia show license(s) - - - + + Mostrar licencia + Mostrar licencias News - + Novedades Changes since version %1 - + Cambios desde la versión %1 show details - + Mostrar detalles Thank you! - + ¡Gracias! Details - + Detalles Contributors - + Colaboradores Acknowledgements - + Reconocimientos Please refer to <a href="%1">%1</a> - + Vea <a href="%1">%1</a> Download license texts - + Descargar los textos de las licencias License(s) - - - + + Licencia + Licencias Note: please check the source code for most accurate information. - + Nota: compruebe el código fuente para la información más precisa. @@ -248,17 +248,17 @@ If you want to support my work, you can buy me a cup of coffee. - + Si quieres apoyar mi trabajo, puedes comprarme un café. You can support this project by contributing, or by donating using any of these services. - + Puedes apoyar este proyecto contribuyendo o donando por cualquiera de estos servicios. Your contributions to translations or code would be most welcome. - + Tus contribuciones a traducir o escribir código serán bien recibidas. @@ -266,42 +266,42 @@ Share link - + Compartir enlace Copied to clipboard: %1 - + Copiado al portapapeles: %1 External Link - + Enlace externo Copy text to clipboard - + Copiar texto al portapapeles Copy to clipboard - + Copiar al portapapeles Share - + Compartir Open in browser - + Abrir en el navegador Open externally - + Abrir externamente diff --git a/translations/harbour-seriesfinale-et.ts b/translations/harbour-seriesfinale-et.ts new file mode 100644 index 0000000..c0f49c8 --- /dev/null +++ b/translations/harbour-seriesfinale-et.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Andmed + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Koodi kirjutamine + + + + Icon Design + Ikooni kujundus + + + + Translations + Tõlked + + + + English + inglise keel + + + + Spanish + hispaania keel + + + + Swedish + rootsi keel + + + + German + saksa keel + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Litsentsi tekst + + + + Opal.About + + + About + Rakenduse teave + + + + Version %1 + Versioon %1 + + + + + + Development + Arendus + + + + show contributors + näita kaasautoreid + + + + + + + Homepage + Avaleht + + + + + Changelog + Muudatuste logi + + + + Translations + Tõlked + + + + + + + Source Code + Lähtekood + + + + Donations + Rahalised toetused + + + + License + Litsents + + + + show license(s) + + näita litsentsi + näita litsentse + + + + + News + Uudised + + + + Changes since version %1 + Muudatused alates versioonist %1 + + + + show details + näita üksikasju + + + + Thank you! + Täname! + + + + + Details + Lisateave + + + + Contributors + Kaasautorid + + + + Acknowledgements + Tänuavaldused + + + + Please refer to <a href="%1">%1</a> + Palun vaata siia: <a href="%1">%1</a> + + + + Download license texts + Laadi alla litsentside tekstid + + + + License(s) + + Litsents + Litsentsid + + + + + Note: please check the source code for most accurate information. + Märkus: kõige täpsema teabe saamiseks palun vaata lähtekoodi. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Kui sa soovid mu tööd toetada, võid mulle tassi kohvi osta. + + + + You can support this project by contributing, or by donating using any of these services. + Sa võid seda arendusprojekti toetada kas kaastööd tehes või toetada rahaliselt järgmiste teenuste abil. + + + + Your contributions to translations or code would be most welcome. + Sinu panus tõlgete või rakenduse koodi näol oleks väga teretulnud. + + + + Opal.LinkHandler + + + Share link + Jaga linki + + + + Copied to clipboard: %1 + Kopeerisin lõikelauale: %1 + + + + External Link + Väline link + + + + Copy text to clipboard + Kopeeri tekst lõikelauale + + + + Copy to clipboard + Kopeeri lõikelauale + + + + Share + Jaga + + + + Open in browser + Ava veebibrauseris + + + + Open externally + Ava välise rakendusega + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Rakenduse teave + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-fa.ts b/translations/harbour-seriesfinale-fa.ts new file mode 100644 index 0000000..332481b --- /dev/null +++ b/translations/harbour-seriesfinale-fa.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + برنامه نویسی + + + + Icon Design + طراحی آیکون + + + + Translations + ترجمه ها + + + + English + انگلیسی + + + + Spanish + + + + + Swedish + سوئدی + + + + German + آلمانی + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + درباره + + + + Version %1 + + + + + + + Development + توسعه + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + ترجمه ها + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + درباره + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-fi.ts b/translations/harbour-seriesfinale-fi.ts new file mode 100644 index 0000000..9dbb139 --- /dev/null +++ b/translations/harbour-seriesfinale-fi.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Data + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Ohjelmointi + + + + Icon Design + Kuvakesuunnittelu + + + + Translations + Käännökset + + + + English + Englanti + + + + Spanish + Espanja + + + + Swedish + Ruotsi + + + + German + Saksa + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Lisenssiteksti + + + + Opal.About + + + About + Tietoja + + + + Version %1 + Versio %1 + + + + + + Development + Kehitys + + + + show contributors + näytä osallistujat + + + + + + + Homepage + Kotisivu + + + + + Changelog + Muutosloki + + + + Translations + Käännökset + + + + + + + Source Code + Lähdekoodi + + + + Donations + Lahjoitukset + + + + License + Lisenssi + + + + show license(s) + + näytä lisenssi + näytä lisenssit + + + + + News + Uutiset + + + + Changes since version %1 + Muutoksia versiosta %1 + + + + show details + näytä lisätietoja + + + + Thank you! + Kiitos! + + + + + Details + Tiedot + + + + Contributors + Osallistujat + + + + Acknowledgements + Tunnustukset + + + + Please refer to <a href="%1">%1</a> + Katso lisätietoja <a href="%1">%1</a> + + + + Download license texts + Lataa lisenssitekstit + + + + License(s) + + Lisenssi + Lisenssit + + + + + Note: please check the source code for most accurate information. + Huom: Tarkimman tiedon löydät suoraan lähdekoodista. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Jos haluat tukea työtäni, voit ostaa minulle kupin kahvia. + + + + You can support this project by contributing, or by donating using any of these services. + Voit tukea tätä projektia joko osallistumalla koodin kehittämiseen tai tekemällä lahjoituksen johonkin seuraavista palveluista. + + + + Your contributions to translations or code would be most welcome. + Koodipäivityksesi ja käännöksesi ovat mitä tervetulleimpia. + + + + Opal.LinkHandler + + + Share link + Jaa linkki + + + + Copied to clipboard: %1 + Kopioitu leikepöydälle: %1 + + + + External Link + Ulkoinen linkki + + + + Copy text to clipboard + Kopioi teksti leikepöydälle + + + + Copy to clipboard + Kopioi leiikepöydälle + + + + Share + Jaa + + + + Open in browser + Avaa selaimessa + + + + Open externally + Avaa ulkoisesti + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Tietoja + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-fr.ts b/translations/harbour-seriesfinale-fr.ts new file mode 100644 index 0000000..19872ac --- /dev/null +++ b/translations/harbour-seriesfinale-fr.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Données + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programmation + + + + Icon Design + Design de l'icône + + + + Translations + Traductions + + + + English + anglais + + + + Spanish + espagnol + + + + Swedish + suédois + + + + German + allemand + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Texte de la licence + + + + Opal.About + + + About + À propos + + + + Version %1 + Version %1 + + + + + + Development + Développement + + + + show contributors + afficher les contributeurs + + + + + + + Homepage + Page d'accueil + + + + + Changelog + Journal des modifications + + + + Translations + Traductions + + + + + + + Source Code + Code source + + + + Donations + Dons + + + + License + Licence + + + + show license(s) + + Afficher la licence + Afficher les licences + + + + + News + Nouveautés + + + + Changes since version %1 + Changements depuis la version %1 + + + + show details + afficher les détails + + + + Thank you! + Merci&nbsp;! + + + + + Details + Détails + + + + Contributors + Contributeurs + + + + Acknowledgements + Remerciements + + + + Please refer to <a href="%1">%1</a> + Veuillez vous référer à <a href="%1">%1</a> + + + + Download license texts + Télécharger les textes des licences + + + + License(s) + + Licence + Licences + + + + + Note: please check the source code for most accurate information. + Note&nbsp;: veuillez consulter le code source pour obtenir des informations plus précises. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Si vous souhaitez soutenir mon travail, vous pouvez m'offrir une tasse de café. + + + + You can support this project by contributing, or by donating using any of these services. + Vous pouvez soutenir ce projet en contribuant, ou en faisant un don en utilisant l'un de ces services. + + + + Your contributions to translations or code would be most welcome. + Vos contributions aux traductions ou au code seront les bienvenues. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + Copié dans le presse-papiers&nbsp;: %1 + + + + External Link + Lien externe + + + + Copy text to clipboard + + + + + Copy to clipboard + Copier dans le presse-papiers + + + + Share + Partager + + + + Open in browser + Ouvrir dans le navigateur + + + + Open externally + Ouvrir extérieurement + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + À propos + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-hu.ts b/translations/harbour-seriesfinale-hu.ts new file mode 100644 index 0000000..d8dffe6 --- /dev/null +++ b/translations/harbour-seriesfinale-hu.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programozás + + + + Icon Design + Ikon design + + + + Translations + Fordítások + + + + English + angol + + + + Spanish + spanyol + + + + Swedish + svéd + + + + German + német + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Licencszöveg + + + + Opal.About + + + About + Névjegy + + + + Version %1 + %1 verzió + + + + + + Development + Fejlesztés + + + + show contributors + közreműködők megjelenítése + + + + + + + Homepage + Honlap + + + + + Changelog + Változásnapló + + + + Translations + Fordítások + + + + + + + Source Code + Forráskód + + + + Donations + Adományok + + + + License + Licenc + + + + show license(s) + + Licenc megjelenítése + + + + + News + Hírek + + + + Changes since version %1 + A %1 verzió óta bekövetkezett változások + + + + show details + részletek megjelenítése + + + + Thank you! + Köszönöm! + + + + + Details + Részletek + + + + Contributors + Közreműködők + + + + Acknowledgements + Köszönetnyilvánítás + + + + Please refer to <a href="%1">%1</a> + Lásd itt <a href="%1">%1</a> + + + + Download license texts + Licencszövegek letöltése + + + + License(s) + + Licenc + + + + + Note: please check the source code for most accurate information. + Megjegyzés: Kérlek ellenőrizd a forráskódot a legpontosabb információért. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Ha támogatni szeretnéd a munkámat, vehetsz nekem egy csésze kávét. + + + + You can support this project by contributing, or by donating using any of these services. + Támogathatod ezt a projektet közreműködéssel, vagy ezen szolgáltatásokon keresztüli adományozással. + + + + Your contributions to translations or code would be most welcome. + A hozzájárulásod a fordításokhoz, vagy a kódhoz nagy segítség lenne. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + A vágólapra másolva: %1 + + + + External Link + Külső hivatkozás + + + + Copy text to clipboard + + + + + Copy to clipboard + Másolás a vágólapra + + + + Share + + + + + Open in browser + Megnyitás böngészőben + + + + Open externally + Megnyitás külső alkalmazással + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Névjegy + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-id.ts b/translations/harbour-seriesfinale-id.ts new file mode 100644 index 0000000..7491c50 --- /dev/null +++ b/translations/harbour-seriesfinale-id.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Data + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Pemrograman + + + + Icon Design + Desain Ikon + + + + Translations + Terjemahan + + + + English + Bahasa Inggris + + + + Spanish + Bahasa Spanyol + + + + Swedish + Bahasa Swedia + + + + German + Bahasa Jerman + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Teks lisensi + + + + Opal.About + + + About + Tentang + + + + Version %1 + Versi %1 + + + + + + Development + Pengembangan + + + + show contributors + tampilkan kontributor + + + + + + + Homepage + Beranda + + + + + Changelog + Daftar perubahan + + + + Translations + Terjemahan + + + + + + + Source Code + Kode Sumber + + + + Donations + Donasi + + + + License + Lisensi + + + + show license(s) + + tampilkan lisensi + + + + + News + Berita + + + + Changes since version %1 + Perubahan sejak versi %1 + + + + show details + Tampilkan rincian + + + + Thank you! + Terima kasih! + + + + + Details + Detil + + + + Contributors + Kontributor-kontributor + + + + Acknowledgements + Pengakuan + + + + Please refer to <a href="%1">%1</a> + Silakan mengacu <a href="%1">%1</a> + + + + Download license texts + Unduh teks lisensi + + + + License(s) + + Lisensi + + + + + Note: please check the source code for most accurate information. + Catatan: silakan periksa kode sumber untuk informasi yang paling akurat. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Jika Anda ingin mendukung pekerjaan saya, Anda dapat mentraktir secangkir kopi. + + + + You can support this project by contributing, or by donating using any of these services. + Anda dapat mendukung proyek ini dengan berkontribusi, atau dengan berdonasi menggunakan salah satu layanan ini. + + + + Your contributions to translations or code would be most welcome. + Kontribusi Anda terhadap terjemahan atau kode akan sangat disambut baik. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + Disalin ke papan klip: %1 + + + + External Link + Tautan luar + + + + Copy text to clipboard + + + + + Copy to clipboard + Salin ke papan klip + + + + Share + + + + + Open in browser + Buka di browser + + + + Open externally + Buka di luar + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Tentang + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-it.ts b/translations/harbour-seriesfinale-it.ts new file mode 100644 index 0000000..eb4b1b2 --- /dev/null +++ b/translations/harbour-seriesfinale-it.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Dati + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programmazione + + + + Icon Design + Stile Icone + + + + Translations + Traduzioni + + + + English + Inglese + + + + Spanish + spagnolo + + + + Swedish + Svedese + + + + German + Tedesco + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Testo della licenza + + + + Opal.About + + + About + In riguardo + + + + Version %1 + Versione %1 + + + + + + Development + Sviluppo + + + + show contributors + mostra i collaboratori + + + + + + + Homepage + Pagina iniziale + + + + + Changelog + Registro delle modifiche + + + + Translations + Traduzioni + + + + + + + Source Code + Codice sorgente + + + + Donations + Donazioni + + + + License + Licenza + + + + show license(s) + + mostra licenza + mostra licenze + + + + + News + Notizie + + + + Changes since version %1 + Modifiche dalla versione %1 + + + + show details + mostra dettagli + + + + Thank you! + Grazie mille! + + + + + Details + Dettagli + + + + Contributors + Collaboratori + + + + Acknowledgements + Ringraziamenti + + + + Please refer to <a href="%1">%1</a> + Fare riferimento a <a href="%1">%1</a> + + + + Download license texts + Scarica i testi delle licenze + + + + License(s) + + Licenza + Licenze + + + + + Note: please check the source code for most accurate information. + Nota: per informazioni più accurate, controllare il codice sorgente. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Se vuoi sostenere il mio lavoro, puoi offrirmi una tazza di caffè. + + + + You can support this project by contributing, or by donating using any of these services. + Puoi sostenere questo progetto contribuendo o effettuando una donazione tramite uno di questi servizi. + + + + Your contributions to translations or code would be most welcome. + I vostri contributi alle traduzioni o al codice saranno molto graditi. + + + + Opal.LinkHandler + + + Share link + Condividi collegamento + + + + Copied to clipboard: %1 + Copiato negli appunti: %1 + + + + External Link + Collegamento esterno + + + + Copy text to clipboard + Copia testo negli appunti + + + + Copy to clipboard + Copia negli appunti + + + + Share + Condividi + + + + Open in browser + Apri nel browser + + + + Open externally + Apri esternamente + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + In riguardo + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-ko.ts b/translations/harbour-seriesfinale-ko.ts new file mode 100644 index 0000000..5f37537 --- /dev/null +++ b/translations/harbour-seriesfinale-ko.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + + + + + + + Development + 개발 + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-lt.ts b/translations/harbour-seriesfinale-lt.ts new file mode 100644 index 0000000..004e00a --- /dev/null +++ b/translations/harbour-seriesfinale-lt.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + Vertimai + + + + English + Anglų + + + + Spanish + + + + + Swedish + Švedų + + + + German + Vokiečių + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + Apie + + + + Version %1 + Versija %1 + + + + + + Development + + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + Vertimai + + + + + + + Source Code + + + + + Donations + + + + + License + Licencija + + + + show license(s) + + + + + + + + + News + Naujienos + + + + Changes since version %1 + Pokyčiai nuo %1 versijos + + + + show details + Detaliau + + + + Thank you! + Ačiū! + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + Nukopijuota: %1 + + + + External Link + Išorinė nuoroda + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + Atidaryti naršyklėje + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Apie + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-ms.ts b/translations/harbour-seriesfinale-ms.ts new file mode 100644 index 0000000..1361f35 --- /dev/null +++ b/translations/harbour-seriesfinale-ms.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + + + + + + + Development + + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-nb_NO.ts b/translations/harbour-seriesfinale-nb_NO.ts new file mode 100644 index 0000000..fee0c82 --- /dev/null +++ b/translations/harbour-seriesfinale-nb_NO.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programmering + + + + Icon Design + Ikondesign + + + + Translations + Oversettelser + + + + English + Engelsk + + + + Spanish + Spansk + + + + Swedish + Svensk + + + + German + Tysk + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Lisenstekst + + + + Opal.About + + + About + Om + + + + Version %1 + Versjon %1 + + + + + + Development + Utvikling + + + + show contributors + vis bidragsytere + + + + + + + Homepage + Hjemmeside + + + + + Changelog + Endringslogg + + + + Translations + Oversettelser + + + + + + + Source Code + Kildekode + + + + Donations + Donasjoner + + + + License + Lisens + + + + show license(s) + + vis lisens + vis lisenser + + + + + News + Nyheter + + + + Changes since version %1 + Endringer siden versjon %1 + + + + show details + vis detaljer + + + + Thank you! + Takk. + + + + + Details + Detaljer + + + + Contributors + Bidragsytere + + + + Acknowledgements + Kunngjøringer + + + + Please refer to <a href="%1">%1</a> + Henvend dem til <a href="%1">%1</a> + + + + Download license texts + Last ned lisenstekstene + + + + License(s) + + Lisens + Lisenser + + + + + Note: please check the source code for most accurate information. + Merk: Kildekoden er den mest nøyaktige kilden til info. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Spander en kopp kaffe hvis du vil støtte arbeidet mitt. + + + + You can support this project by contributing, or by donating using any of these services. + Du kan støtte dette prosjektet ved å bidra, eller ved å donere ved bruk av disse tjenestene. + + + + Your contributions to translations or code would be most welcome. + Bistå gjerne oversettelsen eller bidra til kildekoden. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + Kopiert til utklippstavlen: %1 + + + + External Link + Ekstern lenke + + + + Copy text to clipboard + + + + + Copy to clipboard + Kopier til utklippstavlen + + + + Share + + + + + Open in browser + Åpne i nettleser + + + + Open externally + Åpne med annet program + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Om + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-nl.ts b/translations/harbour-seriesfinale-nl.ts new file mode 100644 index 0000000..6bf51a4 --- /dev/null +++ b/translations/harbour-seriesfinale-nl.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programmering + + + + Icon Design + Pictogramontwèrp + + + + Translations + Vertalingen + + + + English + Engels + + + + Spanish + Spaans + + + + Swedish + Zweeds + + + + German + Duits + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + Versie %1 + + + + + + Development + Ontwikkeling + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + Vertalingen + + + + + + + Source Code + + + + + Donations + + + + + License + Licentie + + + + show license(s) + + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + Informatie + + + + Contributors + Bijdragers + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + Licentie + Licenties + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-nl_BE.ts b/translations/harbour-seriesfinale-nl_BE.ts new file mode 100644 index 0000000..966574d --- /dev/null +++ b/translations/harbour-seriesfinale-nl_BE.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programmering + + + + Icon Design + Pictogramontwèrp + + + + Translations + Vertalingen + + + + English + Engels + + + + Spanish + Spaans + + + + Swedish + Zweeds + + + + German + Duits + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + Versie %1 + + + + + + Development + Ontwikkeling + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + Vertalingen + + + + + + + Source Code + + + + + Donations + + + + + License + Licentie + + + + show license(s) + + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + Informatie + + + + Contributors + Bijdragers + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + Licentie + Licenties + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-nn.ts b/translations/harbour-seriesfinale-nn.ts new file mode 100644 index 0000000..64ae308 --- /dev/null +++ b/translations/harbour-seriesfinale-nn.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programmering + + + + Icon Design + + + + + Translations + Omsetjingar + + + + English + Engelsk + + + + Spanish + + + + + Swedish + Svensk + + + + German + Tysk + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + Om + + + + Version %1 + Versjon %1 + + + + + + Development + Utvikling + + + + show contributors + vis bidragsytar + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + Omsetjingar + + + + + + + Source Code + Kjeldekode + + + + Donations + + + + + License + Lisens + + + + show license(s) + + vis lisens + vis lisensar + + + + + News + + + + + Changes since version %1 + + + + + show details + vis detaljar + + + + Thank you! + + + + + + Details + + + + + Contributors + Bidragsytarar + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + Lisens + Lisensar + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Om + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-pl.ts b/translations/harbour-seriesfinale-pl.ts new file mode 100644 index 0000000..51a128f --- /dev/null +++ b/translations/harbour-seriesfinale-pl.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Dane + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programowanie + + + + Icon Design + Projekt ikon + + + + Translations + Tłumaczenia + + + + English + angielski + + + + Spanish + hiszpański + + + + Swedish + szwedzki + + + + German + niemiecki + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Tekst licencji + + + + Opal.About + + + About + O tej aplikacji + + + + Version %1 + Wersja %1 + + + + + + Development + Rozwój + + + + show contributors + pokaż współtwórców + + + + + + + Homepage + Strona główna + + + + + Changelog + Dziennik zmian + + + + Translations + Tłumaczenia + + + + + + + Source Code + Kod źródłowy + + + + Donations + Darowizny + + + + License + Licencja + + + + show license(s) + + pokaż licencję + pokaż licencje + pokaż licencje + + + + + News + Nowości + + + + Changes since version %1 + Zmiany od wersji %1 + + + + show details + pokaż szczegóły + + + + Thank you! + Dziękuję! + + + + + Details + Szczegóły + + + + Contributors + Współtwórcy + + + + Acknowledgements + Podziękowanie + + + + Please refer to <a href="%1">%1</a> + Zapoznaj się z <a href="%1">%1</a> + + + + Download license texts + Pobierz tekst licencji + + + + License(s) + + Licencja + Licencje + Licencji + + + + + Note: please check the source code for most accurate information. + Uwaga: sprawdź kod źródłowy, aby uzyskać najdokładniejsze informacje. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Jeśli chcesz wesprzeć moją pracę, możesz postawić mi kawę. + + + + You can support this project by contributing, or by donating using any of these services. + Możesz wesprzeć ten projekt, przekazując darowiznę lub korzystając z dowolnej z tych usług. + + + + Your contributions to translations or code would be most welcome. + Twój wkład w tłumaczenia lub kod będzie bardzo mile widziany. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + Skopiowano do schowka: %1 + + + + External Link + Link Zewnętrzny + + + + Copy text to clipboard + + + + + Copy to clipboard + Kopiuj do schowka + + + + Share + + + + + Open in browser + Otwórz w przeglądarce + + + + Open externally + Otwórz za pomocą innej aplikacji + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + O tej aplikacji + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-pt.ts b/translations/harbour-seriesfinale-pt.ts new file mode 100644 index 0000000..9c62424 --- /dev/null +++ b/translations/harbour-seriesfinale-pt.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Dados + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programação + + + + Icon Design + Design de Ícone + + + + Translations + Traduções + + + + English + Inglês + + + + Spanish + Espanhól + + + + Swedish + Suéco + + + + German + Alemão + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Texto de licença + + + + Opal.About + + + About + Sobre + + + + Version %1 + Versão %1 + + + + + + Development + Desenvolvimento + + + + show contributors + exibir contribuidores + + + + + + + Homepage + Página inicial + + + + + Changelog + Registro de mudanças + + + + Translations + Traduções + + + + + + + Source Code + Código Fonte + + + + Donations + Doações + + + + License + Licença + + + + show license(s) + + exibir licença + exibir licenças + + + + + News + Novidades + + + + Changes since version %1 + Mudanças desde a veesão %1 + + + + show details + exibir detalhes + + + + Thank you! + Obrigado! + + + + + Details + Detalhes + + + + Contributors + Contribuidores + + + + Acknowledgements + Agradecimentos + + + + Please refer to <a href="%1">%1</a> + Por favor, consulte <a href="%1">%1</a> + + + + Download license texts + Baixar textos de licença + + + + License(s) + + Licença + Licenças + + + + + Note: please check the source code for most accurate information. + Nota: por favor, cheque o código fonte para informações mais precisas. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Se você deseja apoiar o meu trabalho, você pode me pagar um copo de café. + + + + You can support this project by contributing, or by donating using any of these services. + Você pode apoiar este projeto contribuindo, ou doando usando um desses serviços. + + + + Your contributions to translations or code would be most welcome. + Sua contribuição com traduções ou códigos serão muito bem-vindas. + + + + Opal.LinkHandler + + + Share link + Compartilhar link + + + + Copied to clipboard: %1 + Copiado para a área de transferência: %1 + + + + External Link + Ligação externa + + + + Copy text to clipboard + Copiar texto para a área de transferência + + + + Copy to clipboard + Copiar para a área de transferência + + + + Share + Compartilhar + + + + Open in browser + Abrir no navegador + + + + Open externally + Abrir externamente + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Sobre + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-pt_BR.ts b/translations/harbour-seriesfinale-pt_BR.ts new file mode 100644 index 0000000..e992534 --- /dev/null +++ b/translations/harbour-seriesfinale-pt_BR.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Dados + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programação + + + + Icon Design + Design de ícones + + + + Translations + Traduções + + + + English + Inglês + + + + Spanish + Espanhol + + + + Swedish + Sueco + + + + German + Alemão + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Texto da licença + + + + Opal.About + + + About + Sobre + + + + Version %1 + Versão %1 + + + + + + Development + Desenvolvimento + + + + show contributors + exibir contribuidores + + + + + + + Homepage + Página inicial + + + + + Changelog + Registro de mudanças + + + + Translations + Traduções + + + + + + + Source Code + Código Fonte + + + + Donations + Doações + + + + License + Licença + + + + show license(s) + + exibir licença + exibir licenças + + + + + News + Novidades + + + + Changes since version %1 + Mudanças desde a veesão %1 + + + + show details + exibir detalhes + + + + Thank you! + Obrigado! + + + + + Details + Detalhes + + + + Contributors + Contribuidores + + + + Acknowledgements + Agradecimentos + + + + Please refer to <a href="%1">%1</a> + Por favor, consulte <a href="%1">%1</a> + + + + Download license texts + Baixar os textos de licença + + + + License(s) + + Licença + Licenças + + + + + Note: please check the source code for most accurate information. + Nota: por favor, cheque o código fonte para informações mais precisas. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Se você deseja apoiar o meu trabalho, você pode me pagar um copo de café. + + + + You can support this project by contributing, or by donating using any of these services. + Você pode apoiar esse projeto contribuindo ou doando por um desses serviços. + + + + Your contributions to translations or code would be most welcome. + Sua contribuição com traduções ou códigos serão sempre muito bem-vindas. + + + + Opal.LinkHandler + + + Share link + Compartilhar link + + + + Copied to clipboard: %1 + Copiado para a área de transferência: %1 + + + + External Link + Link Externo + + + + Copy text to clipboard + Copiar texto para a área de transferência + + + + Copy to clipboard + Copiar para a área de transferência + + + + Share + Compartilhar + + + + Open in browser + Abrir no navegador + + + + Open externally + Abrir externamente + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Sobre + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-ro.ts b/translations/harbour-seriesfinale-ro.ts new file mode 100644 index 0000000..4c9d633 --- /dev/null +++ b/translations/harbour-seriesfinale-ro.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + date + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programare + + + + Icon Design + Design pictograme + + + + Translations + Traduceri + + + + English + Engleză + + + + Spanish + Spaniolă + + + + Swedish + Suedeză + + + + German + Germană + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Textul licenta + + + + Opal.About + + + About + Despre + + + + Version %1 + Versiune%1 + + + + + + Development + Dezvoltare + + + + show contributors + Arata contributori + + + + + + + Homepage + Pagina principala + + + + + Changelog + Jurnalul modificărilor + + + + Translations + Traduceri + + + + + + + Source Code + Codul Sursa + + + + Donations + Donații + + + + License + Licență + + + + show license(s) + + arată licența + arată licențele + arată licențe + + + + + News + Noutăți + + + + Changes since version %1 + Modificări de la versiunea %1 + + + + show details + Arata detali + + + + Thank you! + Multumesc! + + + + + Details + Datali + + + + Contributors + Contributori + + + + Acknowledgements + Realizari + + + + Please refer to <a href="%1">%1</a> + Consultați <a href="%1">%1</a> + + + + Download license texts + Descarca textle licentei + + + + License(s) + + Licență + Licențe + Licențe + + + + + Note: please check the source code for most accurate information. + Notă: vă rugăm să verificați codul sursă pentru informațiile cele mai exacte. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Dacă vrei să-mi susții munca, poți să-mi cumperi o ceașcă de cafea. + + + + You can support this project by contributing, or by donating using any of these services. + Puteți sprijini acest proiect contribuind sau donând folosind oricare dintre aceste servicii. + + + + Your contributions to translations or code would be most welcome. + Contribuțiile tale la traduceri sau cod ar fi binevenite. + + + + Opal.LinkHandler + + + Share link + Distribuie link + + + + Copied to clipboard: %1 + Copiat în clipboard:%1 + + + + External Link + Link extern + + + + Copy text to clipboard + Copiază textul în clipboard + + + + Copy to clipboard + Copiaza in clipboard + + + + Share + Distribuie + + + + Open in browser + Deschide în browser + + + + Open externally + Deschide in mod extern + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Despre + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-ru.ts b/translations/harbour-seriesfinale-ru.ts new file mode 100644 index 0000000..9d1636f --- /dev/null +++ b/translations/harbour-seriesfinale-ru.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Данные + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Программирование + + + + Icon Design + Дизайн иконок + + + + Translations + Перевод + + + + English + Английский + + + + Spanish + Испанский + + + + Swedish + Шведский + + + + German + Немецкий + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Текст лицензии + + + + Opal.About + + + About + О программе + + + + Version %1 + Версия %1 + + + + + + Development + Разработка + + + + show contributors + Показать участников + + + + + + + Homepage + Домашняя страница + + + + + Changelog + Список изменений + + + + Translations + Перевод + + + + + + + Source Code + Исходный код + + + + Donations + Пожертвования + + + + License + Лицензия + + + + show license(s) + + показать лицензию + показать лицензии + показать лицензии + + + + + News + Новости + + + + Changes since version %1 + Изменения начиная с версии %1 + + + + show details + Показать детали + + + + Thank you! + Спасибо вам! + + + + + Details + Подробности + + + + Contributors + Участники + + + + Acknowledgements + Благодарности + + + + Please refer to <a href="%1">%1</a> + См. <a href="%1">%1</a> + + + + Download license texts + Скачать тексты лицензий + + + + License(s) + + Лицензия + Лицензии + Лицензий + + + + + Note: please check the source code for most accurate information. + Примечание: для получения наиболее точной информации обращайтесь к исходному коду. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Если вы хотите поддержать мою работу, вы можете купить мне чашку кофе. + + + + You can support this project by contributing, or by donating using any of these services. + Вы можете поддержать этот проект, внеся свой вклад, или пожертвовать, используя любой из этих сервисов. + + + + Your contributions to translations or code would be most welcome. + Ваш вклад в перевод или код будет только приветствоваться. + + + + Opal.LinkHandler + + + Share link + Поделиться ссылкой + + + + Copied to clipboard: %1 + Скопировано в буфер обмена: %1 + + + + External Link + Внешняя ссылка + + + + Copy text to clipboard + Скопировать текст в буфер обмена + + + + Copy to clipboard + Скопировать в буфер обмена + + + + Share + Поделиться + + + + Open in browser + Открыть в браузере + + + + Open externally + Открыть снаружи + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + О программе + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-sk.ts b/translations/harbour-seriesfinale-sk.ts new file mode 100644 index 0000000..2471482 --- /dev/null +++ b/translations/harbour-seriesfinale-sk.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Dáta + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programovanie + + + + Icon Design + Návrh ikon + + + + Translations + Preklady + + + + English + Angličtina + + + + Spanish + Španielčina + + + + Swedish + Švédčina + + + + German + Nemčina + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Znenie licencie + + + + Opal.About + + + About + O aplikácii + + + + Version %1 + Verzia %1 + + + + + + Development + Vývoj + + + + show contributors + zobraziť prispievateľov + + + + + + + Homepage + Domovská stránka + + + + + Changelog + Protokol zmien + + + + Translations + Preklady + + + + + + + Source Code + Zdrojový text + + + + Donations + Dary + + + + License + Licencia + + + + show license(s) + + zobraziť licenciu + zobraziť licencie + zobraziť licencií + + + + + News + Správy + + + + Changes since version %1 + Zmeny od verzie %1 + + + + show details + zobraziť podrobnosti + + + + Thank you! + Ďakujeme! + + + + + Details + Podrobnosti + + + + Contributors + Prispievatelia + + + + Acknowledgements + Poďakovania + + + + Please refer to <a href="%1">%1</a> + Pozrite si prosím <a href="%1">%1</a> + + + + Download license texts + Stiahnuť text licencie + + + + License(s) + + Licencia + Licencie + Licencií + + + + + Note: please check the source code for most accurate information. + Poznámka: Najpresnejšie informácie nájdete v zdrojovom texte. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Ak chcete podporiť moju prácu, môžete mi kúpiť šálku kávy. + + + + You can support this project by contributing, or by donating using any of these services. + Tento projekt môžete podporiť príspevkom alebo darom pomocou ktorejkoľvek z týchto služieb. + + + + Your contributions to translations or code would be most welcome. + Vaša pomoc s prekladom alebo programovaním by bola veľmi vítaná. + + + + Opal.LinkHandler + + + Share link + Zdieľať odkaz + + + + Copied to clipboard: %1 + Kopírovať do schránky: %1 + + + + External Link + Externý odkaz + + + + Copy text to clipboard + Kopírovať text na klipboard + + + + Copy to clipboard + Kopírovať do schránky + + + + Share + Zdielať + + + + Open in browser + Otvoriť v prehliadači + + + + Open externally + Otvoriť zvonku + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + O aplikácii + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-sr.ts b/translations/harbour-seriesfinale-sr.ts new file mode 100644 index 0000000..3a82657 --- /dev/null +++ b/translations/harbour-seriesfinale-sr.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + programiranje + + + + Icon Design + dizajn ikona + + + + Translations + prevodi + + + + English + engleski + + + + Spanish + španski + + + + Swedish + švedski + + + + German + nemački + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Licenciran tekst + + + + Opal.About + + + About + o + + + + Version %1 + verzija%1 + + + + + + Development + razvitak + + + + show contributors + prikaži saradnike + + + + + + + Homepage + glavna strana + + + + + Changelog + changelog + + + + Translations + prevodi + + + + + + + Source Code + kod + + + + Donations + donacije + + + + License + licenca + + + + show license(s) + + prikaži licencu + prikeži nekoliko licenci + prikaži mnogo licenci + + + + + News + vesti + + + + Changes since version %1 + promeni verziju%1 + + + + show details + prikaži detalje + + + + Thank you! + Hvala! + + + + + Details + detalji + + + + Contributors + saradnici + + + + Acknowledgements + priznanja + + + + Please refer to <a href="%1">%1</a> + molim vas povežite na <a href="%1">%1</a> + + + + Download license texts + preuzmi licenciran tekst + + + + License(s) + + licenca + licenci + licenca + + + + + Note: please check the source code for most accurate information. + napomena: molim proverite izvorni kod za najtačnije informacije. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Ako želiš da podržiš moj posao, možeš mi kupiti šolju kafe. + + + + You can support this project by contributing, or by donating using any of these services. + Možeš podržati ovaj projekat sarađivajući, ili donirajući koristeći bilo koji od ovih servisa. + + + + Your contributions to translations or code would be most welcome. + Tvoja saradnja u prevodu ili kodu će biti dobrodošla. + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + kopirano u ostavu:%1 + + + + External Link + spoljna veza + + + + Copy text to clipboard + + + + + Copy to clipboard + kopiraj u ostavu + + + + Share + + + + + Open in browser + otvori u pretraživaču + + + + Open externally + otvori spoljašnje + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + o + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-sv.ts b/translations/harbour-seriesfinale-sv.ts index 5d0a5f2..2dc871b 100644 --- a/translations/harbour-seriesfinale-sv.ts +++ b/translations/harbour-seriesfinale-sv.ts @@ -16,7 +16,7 @@ Data - + Data @@ -27,37 +27,37 @@ Programming - + Programmering Icon Design - + Ikondesign Translations - + Översättningar English - + Engelska Spanish - + Spanska Swedish - + Svenska German - + Tyska @@ -111,7 +111,7 @@ License text - + Licenstext @@ -119,24 +119,24 @@ About - Om + Om Version %1 - + Version %1 Development - + Utveckling show contributors - + visa medverkande @@ -144,18 +144,18 @@ Homepage - + Hemsida Changelog - + Ändringslogg Translations - + Översättningar @@ -163,84 +163,84 @@ Source Code - + Källkod Donations - + Donationer License - + Licens show license(s) - - - + + visa licens + visa licenser News - + Nyheter Changes since version %1 - + Ändrat sedan version %1 show details - + visa detaljerat Thank you! - + Tack! Details - + Detaljerat Contributors - + Medverkande Acknowledgements - + Bekräftelser Please refer to <a href="%1">%1</a> - + Se <a href="%1">%1</a> Download license texts - + Ladda ner licenstexter License(s) - - - + + Licens + Licenser Note: please check the source code for most accurate information. - + Notis: Kontrollera källkoden för mest korrekt information. @@ -248,17 +248,17 @@ If you want to support my work, you can buy me a cup of coffee. - + Om du vill stödja mitt arbete, kan du bjuda mig på en kopp kaffe. You can support this project by contributing, or by donating using any of these services. - + Du kan stödja projektet genom kodbidrag eller donation med hjälp av dessa tjänster. Your contributions to translations or code would be most welcome. - + Kodbidrag eller översättningar är väldigt välkommet. @@ -266,42 +266,42 @@ Share link - + Dela länk Copied to clipboard: %1 - + Kopierat till urklipp: %1 External Link - + Extern länk Copy text to clipboard - + Kopiera text till urklipp Copy to clipboard - + Kopiera till urklipp Share - + Dela Open in browser - + Öppna i webbläsare Open externally - + Öppna externt diff --git a/translations/harbour-seriesfinale-ta.ts b/translations/harbour-seriesfinale-ta.ts new file mode 100644 index 0000000..be38e33 --- /dev/null +++ b/translations/harbour-seriesfinale-ta.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + தகவல்கள் + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + நிரலாக்க + + + + Icon Design + படவுரு வடிவமைப்பு + + + + Translations + மொழிபெயர்ப்புகள் + + + + English + ஆங்கிலம் + + + + Spanish + ச்பானிச் + + + + Swedish + ச்வீடிச் + + + + German + செர்மன் + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + உரிம உரை + + + + Opal.About + + + About + பற்றி + + + + Version %1 + பதிப்பு %1 + + + + + + Development + வளர்ச்சி + + + + show contributors + பங்களிப்பாளர்களைக் காட்டு + + + + + + + Homepage + முகப்புப்பக்கம் + + + + + Changelog + மாற்றபதிவு + + + + Translations + மொழிபெயர்ப்புகள் + + + + + + + Source Code + மூலக் குறியீடு + + + + Donations + நன்கொடைகள் + + + + License + உரிமம் + + + + show license(s) + + உரிமத்தைக் காட்டு + உரிமங்களைக் காட்டு + + + + + News + செய்தி + + + + Changes since version %1 + பதிப்பு %1 முதல் மாற்றங்கள் + + + + show details + விவரங்களைக் காட்டு + + + + Thank you! + நன்றி! + + + + + Details + விவரங்கள் + + + + Contributors + பங்களிப்பாளர்கள் + + + + Acknowledgements + ஒப்புதல்கள் + + + + Please refer to <a href="%1">%1</a> + தயவுசெய்து <a href="%1">%1 </a> ஐப் பார்க்கவும் + + + + Download license texts + உரிம உரைகளைப் பதிவிறக்கவும் + + + + License(s) + + உரிமம் + உரிமங்கள் + + + + + Note: please check the source code for most accurate information. + குறிப்பு: மிகவும் துல்லியமான தகவல்களுக்கு மூலக் குறியீட்டைச் சரிபார்க்கவும். + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + நீங்கள் எனது வேலையை ஆதரிக்க விரும்பினால், நீங்கள் எனக்கு ஒரு கப் காபி வாங்கலாம். + + + + You can support this project by contributing, or by donating using any of these services. + இந்த திட்டத்தை பங்களிப்பதன் மூலம் அல்லது இந்த சேவைகளில் ஏதேனும் ஒன்றைப் பயன்படுத்தி நன்கொடை அளிப்பதன் மூலம் நீங்கள் ஆதரிக்கலாம். + + + + Your contributions to translations or code would be most welcome. + மொழிபெயர்ப்புகள் அல்லது குறியீட்டிற்கான உங்கள் பங்களிப்புகள் மிகவும் வரவேற்கப்படும். + + + + Opal.LinkHandler + + + Share link + இணைப்பைப் பகிரவும் + + + + Copied to clipboard: %1 + கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது: %1 + + + + External Link + வெளிப்புற இணைப்பு + + + + Copy text to clipboard + கிளிப்போர்டுக்கு உரையை நகலெடுக்கவும் + + + + Copy to clipboard + கிளிப்போர்டுக்கு நகலெடுக்கவும் + + + + Share + பங்கு + + + + Open in browser + உலாவியில் திற + + + + Open externally + வெளிப்புறமாக திறக்கவும் + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + பற்றி + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-tr.ts b/translations/harbour-seriesfinale-tr.ts new file mode 100644 index 0000000..b96557a --- /dev/null +++ b/translations/harbour-seriesfinale-tr.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Veri + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Programlama + + + + Icon Design + Simge Tasarımı + + + + Translations + Çeviriler + + + + English + İngilizce + + + + Spanish + İspanyolca + + + + Swedish + İsveççe + + + + German + Almanca + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Lisans Metni + + + + Opal.About + + + About + Hakkında + + + + Version %1 + Sürüm %1 + + + + + + Development + Geliştirme + + + + show contributors + katkıda bulunanları göster + + + + + + + Homepage + Ana sayfa + + + + + Changelog + Değişim günlüğü + + + + Translations + Çeviriler + + + + + + + Source Code + Kaynak Kodları + + + + Donations + Bağışlar + + + + License + Lisans + + + + show license(s) + + lisansı göster + + + + + News + Haberler + + + + Changes since version %1 + %1 sürümünden bu yana değişiklikler + + + + show details + ayrıntıları göster + + + + Thank you! + Teşekkürler! + + + + + Details + Ayrıntılar + + + + Contributors + Katkıda Bulunanlar + + + + Acknowledgements + Teşekkürler + + + + Please refer to <a href="%1">%1</a> + Lütfen <a href="%1">%1</a>'e bakın + + + + Download license texts + Lisans metinlerini indir + + + + License(s) + + Lisans + + + + + Note: please check the source code for most accurate information. + Not: En doğru bilgi için lütfen kaynak kodlarına bakın. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Çalışmalarımı desteklemek istiyorsanız bana bir fincan kahve ısmarlayabilirsiniz. + + + + You can support this project by contributing, or by donating using any of these services. + Bu projeye katkıda bulunarak veya bu hizmetlerden herhangi biri aracılığıyla bağışta bulunarak destek olabilirsiniz. + + + + Your contributions to translations or code would be most welcome. + Çevirilere veya kodlara katkılarınız memnuniyetle karşılanacaktır. + + + + Opal.LinkHandler + + + Share link + Linki paylaş + + + + Copied to clipboard: %1 + Panoya kopyalandı: %1 + + + + External Link + Dış Bağlantı + + + + Copy text to clipboard + Metni panoya kopyala + + + + Copy to clipboard + Panoya kopyala + + + + Share + Paylaş + + + + Open in browser + Tarayıcıda aç + + + + Open externally + Harici olarak aç + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Hakkında + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-ug.ts b/translations/harbour-seriesfinale-ug.ts new file mode 100644 index 0000000..d2cec49 --- /dev/null +++ b/translations/harbour-seriesfinale-ug.ts @@ -0,0 +1,643 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + پىروگىرامىلار + + + + Icon Design + + + + + Translations + + + + + English + + + + + Spanish + + + + + Swedish + + + + + German + + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + + + + + Opal.About + + + About + + + + + Version %1 + + + + + + + Development + ئىجاد قىلىش + + + + show contributors + + + + + + + + Homepage + + + + + + Changelog + + + + + Translations + + + + + + + + Source Code + + + + + Donations + + + + + License + + + + + show license(s) + + + + + + + + News + + + + + Changes since version %1 + + + + + show details + + + + + Thank you! + + + + + + Details + + + + + Contributors + + + + + Acknowledgements + + + + + Please refer to <a href="%1">%1</a> + + + + + Download license texts + + + + + License(s) + + + + + + + + Note: please check the source code for most accurate information. + + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + + + + + You can support this project by contributing, or by donating using any of these services. + + + + + Your contributions to translations or code would be most welcome. + + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + + + + + External Link + + + + + Copy text to clipboard + + + + + Copy to clipboard + + + + + Share + + + + + Open in browser + + + + + Open externally + + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-uk.ts b/translations/harbour-seriesfinale-uk.ts new file mode 100644 index 0000000..3d583a6 --- /dev/null +++ b/translations/harbour-seriesfinale-uk.ts @@ -0,0 +1,645 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + Дані + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + Програмування + + + + Icon Design + Дизайн іконок + + + + Translations + Переклади + + + + English + Англійська + + + + Spanish + Іспанська + + + + Swedish + Шведська + + + + German + Німецька + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + Текст ліцензії + + + + Opal.About + + + About + Про застосунок + + + + Version %1 + Версія %1 + + + + + + Development + Розробка + + + + show contributors + показати учасників + + + + + + + Homepage + Головна + + + + + Changelog + Список змін + + + + Translations + Переклади + + + + + + + Source Code + Вихідний код + + + + Donations + Пожертви + + + + License + Ліцензія + + + + show license(s) + + показати ліцензію + показати ліцензії + показати ліцензій + + + + + News + Новини + + + + Changes since version %1 + Зміни з попередньої версії %1 + + + + show details + показати подробиці + + + + Thank you! + Дякую! + + + + + Details + Подробиці + + + + Contributors + Учасники + + + + Acknowledgements + Подяки + + + + Please refer to <a href="%1">%1</a> + Будь ласка, зверніться до <a href="%1">%1</a> + + + + Download license texts + Завантажити тексти ліцензій + + + + License(s) + + Ліцензія + Ліцензії + Ліцензій + + + + + Note: please check the source code for most accurate information. + Примітка: будь ласка, перевірте вихідний код для отримання найбільш точної інформації. + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + Якщо ви хочете підтримати мою роботу, ви можете пригостити мене чашкою кави. + + + + You can support this project by contributing, or by donating using any of these services. + Ви можете підтримати цей проєкт, зробивши свій внесок або пожертвувавши за допомогою будь-якого з цих сервісів. + + + + Your contributions to translations or code would be most welcome. + Ваш внесок у переклади або код буде дуже доречним. + + + + Opal.LinkHandler + + + Share link + Поділитися посиланням + + + + Copied to clipboard: %1 + Скопійовано до буфера обміну: %1 + + + + External Link + Зовнішнє посилання + + + + Copy text to clipboard + Копіювати текст у буфер обміну + + + + Copy to clipboard + Копіювати в буфер обміну + + + + Share + Поділіться + + + + Open in browser + Відкрити в браузері + + + + Open externally + Відкрити зовні + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + Про застосунок + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + diff --git a/translations/harbour-seriesfinale-zh_CN.ts b/translations/harbour-seriesfinale-zh_CN.ts new file mode 100644 index 0000000..92c809d --- /dev/null +++ b/translations/harbour-seriesfinale-zh_CN.ts @@ -0,0 +1,641 @@ + + + + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + + + + + Data + 数据 + + + + SeriesFinale uses <a href='%1'>TheTVDB</a> API but is not endorsed or certified by TheTVDB. Please contribute to it if you can. + Note: “TheTVDB” is a trademark, so don't translate that. + + + + + Programming + 编程 + + + + Icon Design + 图标设计 + + + + Translations + 翻译 + + + + English + 英语 + + + + Spanish + 西班牙语 + + + + Swedish + 瑞典语 + + + + German + 德语 + + + + AddShow + + + Search options + + + + + Add show + + + + + Search + + + + + No description available. + + + + + EpisodePage + + + Watched + + + + + Air date + + + + + Rating + + + + + Description + + + + + LicenseListPart + + + License text + 许可证文本 + + + + Opal.About + + + About + 关于 + + + + Version %1 + 版本 %1 + + + + + + Development + 开发 + + + + show contributors + 显示贡献者 + + + + + + + Homepage + 主页 + + + + + Changelog + 更改日志 + + + + Translations + 翻译 + + + + + + + Source Code + 源代码 + + + + Donations + 捐款 + + + + License + 许可协议 + + + + show license(s) + + 显示许可协议 + + + + + News + 新闻 + + + + Changes since version %1 + 自版本 %1 以来的更改 + + + + show details + 显示日志 + + + + Thank you! + 谢谢! + + + + + Details + 日志 + + + + Contributors + 贡献 + + + + Acknowledgements + 鸣谢 + + + + Please refer to <a href="%1">%1</a> + 请参考 <a href="%1">%1</a> + + + + Download license texts + 下载许可证文本 + + + + License(s) + + 许可协议 + + + + + Note: please check the source code for most accurate information. + 注意:请检查源代码以获得最准确的信息。 + + + + Opal.About.Common + + + If you want to support my work, you can buy me a cup of coffee. + 如果你想支持我的工作,你可以给我买一杯咖啡。 + + + + You can support this project by contributing, or by donating using any of these services. + 你可以通过捐款来支持这个项目,或者通过使用任何这些服务进行捐赠。 + + + + Your contributions to translations or code would be most welcome. + 我们非常欢迎你对翻译或代码的贡献。 + + + + Opal.LinkHandler + + + Share link + + + + + Copied to clipboard: %1 + 复制到剪贴板:%1 + + + + External Link + 外部链接 + + + + Copy text to clipboard + + + + + Copy to clipboard + 复制到剪切板 + + + + Share + + + + + Open in browser + 用浏览器打开 + + + + Open externally + 用外部应用打开 + + + + PrioritySelectionDialog + + + Select a priority + + + + + SearchSettingsPage + + + Search options + + + + + Language + + + + + SeasonPage + + + Mark all + + + + + Mark none + + + + + No episodes + + + + + SeriesPage + + + About + 关于 + + + + Settings + + + + + Refreshing... + + + + + Refresh + + + + + Add Show + + + + + Mark next episode + + + + + Mark show as watched + + + + + Delete show + + + + + No shows + + + + + SettingsPage + + + Settings + + + + + Save + + + + + Sorting + + + + + Show sorting + + + + + By title + + + + + By next episode date + + + + + By last aired episode + + + + + Seasons sorting + + + + + Episode sorting + + + + + Sort by genre + + + + + Add special seasons + + + + + Update ended shows + + + + + Other + + + + + Highlight season premiere + + + + + Sort by priority + + + + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + + + ShowPage + + + Refreshing... + + + + + Refresh + + + + + Info + + + + + Mark None + + + + + Mark All + + + + + Delete season + + + + + No seasons + + + + + StatisticsPage + + + Statistics + + + + + Number of shows: + + + + + Watched shows: + + + + + Number of episodes: + + + + + Watched episodes: + + + + + Days spent watching: + + + + + Ended shows: + + + + + Last refresh: + + + + + SurveyPage + + + Add Show + + + + + Survey Page + + + + + Delete show + + + + + No shows + + + + + Change show priority + + + + + Refreshing... + + + + + harbour-seriesfinale + + + None + + + + + Pilot + + + + + Episode + + + + + Season + + + + + Finale + + + + From 90e66a257a45648244fc9d2d1c2d63eacdd77229 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:43 +0200 Subject: [PATCH 28/30] Actually build all translations --- harbour-seriesfinale.pro | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/harbour-seriesfinale.pro b/harbour-seriesfinale.pro index 40942cb..ca08c92 100644 --- a/harbour-seriesfinale.pro +++ b/harbour-seriesfinale.pro @@ -37,13 +37,7 @@ INSTALLS += src # following CONFIG line CONFIG += sailfishapp_i18n -# German translation is enabled as an example. If you aren't -# planning to localize your app, remember to comment out the -# following TRANSLATIONS line. And also do not forget to -# modify the localized app name in the the .desktop file. -TRANSLATIONS += translations/harbour-seriesfinale-de.ts \ - translations/harbour-seriesfinale-es.ts \ - translations/harbour-seriesfinale-sv.ts +TRANSLATIONS += translations/harbour-seriesfinale-*.ts DISTFILES += \ qml/pages/PrioritySelectionDialog.qml \ From a252fdf41295516295d3be44b7a7831070985484 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:09:45 +0200 Subject: [PATCH 29/30] Update German translation --- translations/harbour-seriesfinale-de.ts | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/translations/harbour-seriesfinale-de.ts b/translations/harbour-seriesfinale-de.ts index 7e0f280..ba0c054 100644 --- a/translations/harbour-seriesfinale-de.ts +++ b/translations/harbour-seriesfinale-de.ts @@ -1,17 +1,18 @@ - + AboutPage A TV series database app that helps you keep track of what you are watching. - + Eine App, die dir dabei hilft, den Überblick über deine Fernsehserien zu behalten. + Statistics - Statistik + Statistik @@ -80,7 +81,7 @@ No description available. - + Keine Beschreibung verfügbar. @@ -93,17 +94,17 @@ Air date - + Austrahlung Rating - + Bewertung Description - + Beschreibung @@ -309,7 +310,7 @@ Select a priority - + Priorität wählen @@ -474,28 +475,28 @@ Links - + Links Runtime - + Länge %1 min as in “this episode is 30 minutes long - + %1 min Genre - + Genre Description - + Beschreibung @@ -609,7 +610,7 @@ Refreshing... - Aktualisieren ... + Aktualisieren ... From 1f0e5b6635aacef7b996130cc85b77fdf2013df5 Mon Sep 17 00:00:00 2001 From: Mirian Margiani Date: Tue, 12 Aug 2025 15:40:54 +0200 Subject: [PATCH 30/30] Don't animate deleting shows to avoid visually removing the next one too Due to how the shows list model is updated, removing must be handled completely by the updater. --- qml/pages/SeriesPage.qml | 1 - qml/pages/SurveyPage.qml | 1 - 2 files changed, 2 deletions(-) diff --git a/qml/pages/SeriesPage.qml b/qml/pages/SeriesPage.qml index f612a63..284c1dc 100644 --- a/qml/pages/SeriesPage.qml +++ b/qml/pages/SeriesPage.qml @@ -217,7 +217,6 @@ Page { item.remorseDelete((function(){ this.python.call('seriesfinale.seriesfinale.series_manager.delete_show_by_name', [this.model.showName]) - this.item.animateRemoval(this.item) }).bind({python: python, item: item, model: model})) } } diff --git a/qml/pages/SurveyPage.qml b/qml/pages/SurveyPage.qml index e6fd7b3..e5ede1b 100644 --- a/qml/pages/SurveyPage.qml +++ b/qml/pages/SurveyPage.qml @@ -136,7 +136,6 @@ Page { item.remorseDelete((function(){ this.python.call('seriesfinale.seriesfinale.series_manager.delete_show_by_name', [this.model.showName]) - this.item.animateRemoval(this.item) }).bind({python: python, item: item, model: model})) } }