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 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) 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/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/ diff --git a/harbour-seriesfinale.pro b/harbour-seriesfinale.pro index 56a0563..ca08c92 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 @@ -37,15 +37,12 @@ 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 \ + qml/pages/ShowInfoDialog.qml \ + qml/pages/components/OpalAboutAttribution.qml \ qml/pages/AboutPage.qml \ qml/pages/AddShow.qml \ qml/pages/EpisodeListRowDelegate.qml \ @@ -56,6 +53,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/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/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 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-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 + + + + + + + + + + + + + + + + + diff --git a/icons/108x108/harbour-seriesfinale.png b/icons/108x108/harbour-seriesfinale.png index 0d3323f..0e84f62 100644 Binary files a/icons/108x108/harbour-seriesfinale.png and b/icons/108x108/harbour-seriesfinale.png differ diff --git a/icons/128x128/harbour-seriesfinale.png b/icons/128x128/harbour-seriesfinale.png index 4d45810..63ee843 100644 Binary files a/icons/128x128/harbour-seriesfinale.png and b/icons/128x128/harbour-seriesfinale.png differ diff --git a/icons/172x172/harbour-seriesfinale.png b/icons/172x172/harbour-seriesfinale.png new file mode 100644 index 0000000..f926415 Binary files /dev/null and b/icons/172x172/harbour-seriesfinale.png differ diff --git a/icons/256x256/harbour-seriesfinale.png b/icons/256x256/harbour-seriesfinale.png deleted file mode 100644 index fc94314..0000000 Binary files a/icons/256x256/harbour-seriesfinale.png and /dev/null differ diff --git a/icons/86x86/harbour-seriesfinale.png b/icons/86x86/harbour-seriesfinale.png index 3fd38ce..3b7b15c 100644 Binary files a/icons/86x86/harbour-seriesfinale.png and b/icons/86x86/harbour-seriesfinale.png differ 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/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/CoverPage.qml b/qml/cover/CoverPage.qml index f55dd7e..9cd6281 100644 --- a/qml/cover/CoverPage.qml +++ b/qml/cover/CoverPage.qml @@ -1,22 +1,49 @@ +/* + * 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 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: app.coverImage + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + height: parent.height + sourceSize { + 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 diff --git a/qml/cover/seriesfinale_cover.png b/qml/cover/seriesfinale_cover.png deleted file mode 100644 index 316de38..0000000 Binary files a/qml/cover/seriesfinale_cover.png and /dev/null differ diff --git a/qml/harbour-seriesfinale.qml b/qml/harbour-seriesfinale.qml index ccea258..2b7aad6 100644 --- a/qml/harbour-seriesfinale.qml +++ b/qml/harbour-seriesfinale.qml @@ -4,17 +4,18 @@ import "pages" import "cover" import io.thp.pyotherside 1.3 -import org.nemomobile.notifications 1.0 +import Nemo.Notifications 1.0 -ApplicationWindow -{ - initialPage: Component { id: seriesPage; SeriesPage {} } - cover: Component { id: coverPage; CoverPage {} } +ApplicationWindow { + id: app + + initialPage: Component { SeriesPage {} } + cover: Component { CoverPage {} } 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" }, @@ -45,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/images/harbour-seriesfinale.png b/qml/images/harbour-seriesfinale.png new file mode 100644 index 0000000..5d8dc0d Binary files /dev/null and b/qml/images/harbour-seriesfinale.png differ diff --git a/qml/images/seriesfinale_cover.png b/qml/images/seriesfinale_cover.png new file mode 100644 index 0000000..a63c801 Binary files /dev/null and b/qml/images/seriesfinale_cover.png differ 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 diff --git a/qml/pages/AboutPage.qml b/qml/pages/AboutPage.qml index e3242ea..9f92fc5 100644 --- a/qml/pages/AboutPage.qml +++ b/qml/pages/AboutPage.qml @@ -1,95 +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"] } - } + ] } - } - - Component { id: statisticsComponent; StatisticsPage {} } - onStatusChanged: { - if (status === PageStatus.Active) { - pageStack.pushAttached(statisticsComponent); - } - } + ] } diff --git a/qml/pages/AddShow.qml b/qml/pages/AddShow.qml index 357d393..6a57437 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,13 +72,23 @@ Page { } } - Column { id: column - width: searchPage.width + width: root.width 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 { @@ -87,34 +116,69 @@ 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 - anchors { - top: parent.top - topMargin: 10*Theme.paddingLarge - 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 5433947..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,26 +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 - Component { - id: episodePageComponent - EpisodePage { - 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, + }) } - onClicked: pageStack.push(episodePageComponent.createObject(pageStack)) 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 67dd411..284c1dc 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) { @@ -38,20 +55,28 @@ Page { }) } - - Component { id: surveyPage; SurveyPage {} } onStatusChanged: { if (status === PageStatus.Activating && hasChanged) { update(); } - if (status === PageStatus.Active) { - pageStack.pushAttached(surveyPage); + + if (status === PageStatus.Active && !canNavigateForward) { + pageStack.pushAttached(Qt.resolvedUrl("SurveyPage.qml"), { + isUpdating: Qt.binding(function(){return isUpdating}), + hasChanged: Qt.binding(function(){return hasChanged}), + doHighlight: Qt.binding(function(){return doHighlight}), + }); } } Connections { target: python + onSettingsChanged: { + hasChanged = true + update() + } + onLoadingChanged: { seriesPage.isLoading = true; if(!loading) { @@ -104,7 +129,6 @@ Page { SilicaListView { id: listView anchors.fill: parent - spacing: Theme.paddingMedium // PullDownMenu PullDownMenu { @@ -112,18 +136,15 @@ 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: 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', []); @@ -132,8 +153,12 @@ 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 { + visible: isUpdating + text: qsTr("Refreshing...") } } @@ -142,6 +167,11 @@ Page { title: "SeriesFinale" } + footer: Item { + width: parent.width + height: Theme.horizontalPageMargin + } + model: ListModel { id: seriesList } @@ -153,58 +183,48 @@ 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 - Component { - id: showPageComponent - ShowPage { show: model } - } + 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]) + }).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(showPageComponent.createObject(pageStack)); + pageStack.push(Qt.resolvedUrl("ShowPage.qml"), {show: model}); } } @@ -222,6 +242,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 baf5158..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: { @@ -42,7 +43,6 @@ Dialog { python.call('seriesfinale.seriesfinale.settingsWrapper.getHighlightSpecial', [], function(result) { highlightSpecialSwitch.checked = result; }) - seriesPage.hasChanged = true } SilicaFlickable { 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 580f1a7..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,53 +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: seasonPageComponent - SeasonPage { show: showPage.show; season: model } - } - 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(seasonPageComponent.createObject(pageStack)) } 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 3ccec57..e5ede1b 100644 --- a/qml/pages/SurveyPage.qml +++ b/qml/pages/SurveyPage.qml @@ -1,13 +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-2017 Core Comic + */ + import QtQuick 2.0 import Sailfish.Silica 1.0 +import "../modules/Opal/SmartScrollbar" as S import '../util.js' as Util 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) { @@ -28,6 +38,10 @@ Page { Connections { target: python + onSettingsChanged: { + update() + } + onLoadingChanged: { surveyPage.isLoading = true; if(!loading) { @@ -57,7 +71,6 @@ Page { SilicaListView { id: listView anchors.fill: parent - spacing: Theme.paddingMedium // PullDownMenu PullDownMenu { @@ -65,9 +78,13 @@ Page { MenuItem { text: qsTr("Add Show") - visible: !seriesPage.isUpdating - onClicked: { pageStack.push(addShowComponent.createObject(pageStack)) } - Component { id: addShowComponent; AddShow {} } + visible: !isUpdating + onClicked: { pageStack.push(Qt.resolvedUrl("AddShow.qml")) } + } + + MenuLabel { + visible: isUpdating + text: qsTr("Refreshing...") } } @@ -76,6 +93,11 @@ Page { title: qsTr("Survey Page") } + footer: Item { + width: parent.width + height: Theme.horizontalPageMargin + } + model: ListModel { id: seriesListByPrio } @@ -87,55 +109,50 @@ 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 - Component { - id: showPageComponent - ShowPage { show: model } - } + 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]) + }).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(showPageComponent.createObject(pageStack)); + pageStack.push(Qt.resolvedUrl("ShowPage.qml"), {show: model}); } } ViewPlaceholder { id: emptyText text: qsTr('No shows') - enabled: seriesListByPrio.count == 0 && !surveyPage.isLoading + enabled: surveyPage.status == PageStatus.Active && + !surveyPage.isLoading && + seriesListByPrio.count == 0 } BusyIndicator { @@ -146,65 +163,21 @@ Page { size: BusyIndicatorSize.Large } - VerticalScrollDecorator {} - } - - Dialog { - id: selectionDialog - - property string showName: '' - property int selectedIndex: -1 - - canAccept: false + 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 + } - DialogHeader { - id: dialogHeader - anchors { top: parent.top; left: parent.left; right: parent.right } + text: !!listView.currentSection ? prioListModel[listView.currentSection].name : " " + description: "%1 / %2".arg(scrollIndex+2).arg(flickable.count) } + } - 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) - } - } - } + 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 + } +} 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/lib/thetvdbapi.py b/src/SeriesFinale/lib/thetvdbapi.py index 15d1337..18d182a 100644 --- a/src/SeriesFinale/lib/thetvdbapi.py +++ b/src/SeriesFinale/lib/thetvdbapi.py @@ -25,13 +25,38 @@ 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 - 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): @@ -47,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")) @@ -65,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) @@ -88,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") @@ -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 @@ -193,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) @@ -218,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"): diff --git a/src/SeriesFinale/locale/de/LC_MESSAGES/seriesfinale.mo b/src/SeriesFinale/locale/de/LC_MESSAGES/seriesfinale.mo index c542b36..eab1a9b 100644 Binary files a/src/SeriesFinale/locale/de/LC_MESSAGES/seriesfinale.mo and b/src/SeriesFinale/locale/de/LC_MESSAGES/seriesfinale.mo differ diff --git a/src/SeriesFinale/locale/es/LC_MESSAGES/seriesfinale.mo b/src/SeriesFinale/locale/es/LC_MESSAGES/seriesfinale.mo index 5ee70c8..d4fbc1b 100644 Binary files a/src/SeriesFinale/locale/es/LC_MESSAGES/seriesfinale.mo and b/src/SeriesFinale/locale/es/LC_MESSAGES/seriesfinale.mo differ diff --git a/src/SeriesFinale/locale/sv/LC_MESSAGES/seriesfinale.mo b/src/SeriesFinale/locale/sv/LC_MESSAGES/seriesfinale.mo index 81ad044..a4d5799 100644 Binary files a/src/SeriesFinale/locale/sv/LC_MESSAGES/seriesfinale.mo and b/src/SeriesFinale/locale/sv/LC_MESSAGES/seriesfinale.mo differ diff --git a/src/SeriesFinale/placeholderimage.png b/src/SeriesFinale/placeholderimage.png index 92b2aae..5aca7c7 100644 Binary files a/src/SeriesFinale/placeholderimage.png and b/src/SeriesFinale/placeholderimage.png differ diff --git a/src/SeriesFinale/series.py b/src/SeriesFinale/series.py index 46b5ae1..7709eab 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 @@ -497,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): @@ -599,7 +611,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 +671,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 +690,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) 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 -*- ########################################################################### 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 8c07a53..ba0c054 100644 --- a/translations/harbour-seriesfinale-de.ts +++ b/translations/harbour-seriesfinale-de.ts @@ -1,47 +1,327 @@ - + + + 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 + + + + Data + Daten + + + + 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 + Programmierung + + + + Icon Design + Symbol-Design + + + + Translations + Übersetzungen + + + + English + Englisch + + + + Spanish + Spanisch + + + + Swedish + Schwedisch + + + + German + Deutsch + + AddShow + Search options Suchoptionen + Add show Serie hinzufügen + Search Suchen + + + No description available. + Keine Beschreibung verfügbar. + EpisodePage - Air date: - Sendedatum: + + Watched + Gesehen - Rating: - Bewertung: + + Air date + Austrahlung - Overview: - Beschreibung: + + Rating + Bewertung - Watched - Gesehen + + Description + Beschreibung + + + + LicenseListPart + + + License text + Lizenztext + + + + Opal.About + + + About + Über + + + + Version %1 + Version %1 + + + + + + Development + Entwicklung + + + + show contributors + Mitwirkende zeigen + + + + + + + Homepage + Webseite + + + + + Changelog + Änderungsverlauf + + + + Translations + Übersetzungen + + + + + + + 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. + + + + Opal.About.Common + + + 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. + + + + Opal.LinkHandler + + + 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 + + + + PrioritySelectionDialog + + + Select a priority + Priorität wählen SearchSettingsPage + Search options Suchoptionen + Language Sprache @@ -49,14 +329,17 @@ SeasonPage + Mark all Alle markieren + Mark none Keine markieren + No episodes Keine Folgen @@ -64,42 +347,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 - Deleting - Löschen - - + No shows Keine Serien @@ -107,97 +395,144 @@ 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 + + ShowInfoDialog + + + Links + Links + + + + Runtime + Länge + + + + %1 min + as in “this episode is 30 minutes long + %1 min + + + + Genre + Genre + + + + Description + Beschreibung + + ShowPage + Refreshing... Aktualisieren ... + Refresh Aktualisieren + Info Informationen + Mark None Keine markieren + Mark All Alle markieren + Delete season Staffel löschen - Deleting - Löschen - - + No seasons Keine Staffeln @@ -205,34 +540,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: @@ -240,49 +583,60 @@ SurveyPage + Add Show Serie hinzufügen + Survey Page Erkunden + Delete show Serie löschen - Deleting - Löschen - - + No shows Keine Serien + Change show priority Priorität ändern + + + Refreshing... + Aktualisieren ... + harbour-seriesfinale + None Keine + Pilot Pilot + Episode Episode + Season Staffel + Finale Finale 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 56adb33..1d33b65 100644 --- a/translations/harbour-seriesfinale-es.ts +++ b/translations/harbour-seriesfinale-es.ts @@ -1,47 +1,326 @@ + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + Estadísticas + + + + Data + Datos + + + + 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 + Programación + + + + Icon Design + Diseño de icono + + + + Translations + Traducciones + + + + English + Inglés + + + + Spanish + Español + + + + Swedish + Sueco + + + + German + Alemán + + AddShow + Search options Opciones de búsqueda + Add show Añadir programa + 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 + Texto de la licencia + + + + Opal.About + + + About + Acerca de + + + + Version %1 + Versión %1 + + + + + + Development + Desarrollo + + + + show contributors + Mostrar contribuidores + + + + + + + Homepage + Página web + + + + + Changelog + Registro de cambios + + + + Translations + Traducciones + + + + + + + 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. + + + + Opal.About.Common + + + 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. + + + + Opal.LinkHandler + + + 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 + + + + PrioritySelectionDialog + + + Select a priority + SearchSettingsPage + Search options Opciones de búsqueda + Language Idioma @@ -49,14 +328,17 @@ SeasonPage + Mark all Marcar todo + Mark none Desmarcar todo + No episodes No hay episodios @@ -64,42 +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 - Deleting - Borrando - - + No shows No hay programas @@ -107,97 +394,144 @@ 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 + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + ShowPage + Refreshing... Actualizando... + Refresh Actualizar + Info Información + Mark None Desmarcar todo + Mark All Marcar todo + Delete season Borrar temporada - Deleting - Borrando - - + No seasons No hay temporadas @@ -205,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: @@ -240,49 +582,60 @@ SurveyPage + Add Show Añadir programa + Survey Page Página de valoración + Delete show Borrar programa - Deleting - Borrando - - + No shows No hay programas + Change show priority Cambiar preferencia del programa + + + Refreshing... + Actualizando... + harbour-seriesfinale + None Ninguno + Pilot Piloto + Episode Episodio + Season Temporada + Finale Final 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 25608ac..2dc871b 100644 --- a/translations/harbour-seriesfinale-sv.ts +++ b/translations/harbour-seriesfinale-sv.ts @@ -1,47 +1,326 @@ + + AboutPage + + + A TV series database app that helps you keep track of what you are watching. + + + + + Statistics + Statistik + + + + 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 + Programmering + + + + Icon Design + Ikondesign + + + + Translations + Översättningar + + + + English + Engelska + + + + Spanish + Spanska + + + + Swedish + Svenska + + + + German + Tyska + + AddShow + Search options Sökalternativ + Add show Lägg till TV-serie + 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 + Licenstext + + + + Opal.About + + + About + Om + + + + Version %1 + Version %1 + + + + + + Development + Utveckling + + + + show contributors + visa medverkande + + + + + + + Homepage + Hemsida + + + + + Changelog + Ändringslogg + + + + Translations + Översättningar + + + + + + + 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. + + + + Opal.About.Common + + + 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. + + + + Opal.LinkHandler + + + 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 + + + + PrioritySelectionDialog + + + Select a priority + SearchSettingsPage + Search options Sökalternativ + Language Språk @@ -49,14 +328,17 @@ SeasonPage + Mark all Märk alla + Mark none Avmarkera alla + No episodes Inga avsnitt @@ -64,42 +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 - Deleting - Tar bort - - + No shows Inga serier @@ -107,97 +394,144 @@ 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 + + ShowInfoDialog + + + Links + + + + + Runtime + + + + + %1 min + as in “this episode is 30 minutes long + + + + + Genre + + + + + Description + + + ShowPage + Refreshing... Uppdaterar... + Refresh Uppdatera + Info Info + Mark None Märk ingen + Mark All Märk alla + Delete season Ta bort säsong - Deleting - Tar bort - - + No seasons Inga säsonger @@ -205,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: @@ -240,49 +582,60 @@ SurveyPage + Add Show Lägg till TV-serie + Survey Page Enkätsida + Delete show Ta bort serien - Deleting - Tar bort - - + No shows Inga serier + Change show priority Ändra TV-serieprioritet + + + Refreshing... + Uppdaterar... + harbour-seriesfinale + None Ingen + Pilot Pilotavsnitt + Episode Avsnitt + Season Säsong + Finale Säsongsfinal 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 + + + + diff --git a/translations/harbour-seriesfinale.ts b/translations/harbour-seriesfinale.ts index 521edb9..f7cc7f8 100644 --- a/translations/harbour-seriesfinale.ts +++ b/translations/harbour-seriesfinale.ts @@ -1,47 +1,324 @@ + + 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 - 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 SearchSettingsPage + Search options + Language @@ -49,14 +326,17 @@ SeasonPage + Mark all + Mark none + No episodes @@ -64,42 +344,47 @@ SeriesPage + About + Settings + Refreshing... + Refresh + Add Show + Mark next episode + Mark show as watched + Delete show - Deleting - - - + No shows @@ -107,97 +392,144 @@ 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 - Deleting - - - + No seasons @@ -205,34 +537,42 @@ StatisticsPage + Statistics + Number of shows: + Watched shows: + Number of episodes: + Watched episodes: + Days spent watching: + Ended shows: + Last refresh: @@ -240,49 +580,60 @@ SurveyPage + Add Show + Survey Page + Delete show - Deleting + + No shows - No shows + + Change show priority - Change show priority + + Refreshing... harbour-seriesfinale + None + Pilot + Episode + Season + Finale 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 +