+ Thank you to everyone involved in this release!
+
+
+
diff --git a/data/dev.alextren.Spot.desktop b/data/dev.alextren.Spot.desktop
index 8433f51f..6f1feed1 100644
--- a/data/dev.alextren.Spot.desktop
+++ b/data/dev.alextren.Spot.desktop
@@ -1,10 +1,12 @@
[Desktop Entry]
Version=1.0
Name=Spot
-Exec=spot
+Exec=spot %u
+GenericName=Music Player
Icon=dev.alextren.Spot
Terminal=false
Type=Application
Categories=GTK;GNOME;Music;AudioVideo;
+MimeType=x-scheme-handler/spotify;
StartupNotify=true
X-Purism-FormFactor=Workstation;Mobile;
diff --git a/data/hicolor/128x128/apps/dev.alextren.Spot.png b/data/hicolor/128x128/apps/dev.alextren.Spot.png
deleted file mode 100644
index 54c9f237..00000000
Binary files a/data/hicolor/128x128/apps/dev.alextren.Spot.png and /dev/null differ
diff --git a/data/hicolor/64x64/apps/dev.alextren.Spot.png b/data/hicolor/64x64/apps/dev.alextren.Spot.png
deleted file mode 100644
index 54c9f237..00000000
Binary files a/data/hicolor/64x64/apps/dev.alextren.Spot.png and /dev/null differ
diff --git a/data/hicolor/scalable/apps/dev.alextren.Spot.svg b/data/hicolor/scalable/apps/dev.alextren.Spot.svg
index 8d382040..71f857d9 100644
--- a/data/hicolor/scalable/apps/dev.alextren.Spot.svg
+++ b/data/hicolor/scalable/apps/dev.alextren.Spot.svg
@@ -1,236 +1,89 @@
-
-
diff --git a/data/hicolor/symbolic/apps/dev.alextren.Spot-symbolic.svg b/data/hicolor/symbolic/apps/dev.alextren.Spot-symbolic.svg
new file mode 100644
index 00000000..b4029bc0
--- /dev/null
+++ b/data/hicolor/symbolic/apps/dev.alextren.Spot-symbolic.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev.alextren.Spot.development.json b/dev.alextren.Spot.development.json
index 8fa7e565..129b9bcc 100644
--- a/dev.alextren.Spot.development.json
+++ b/dev.alextren.Spot.development.json
@@ -42,15 +42,16 @@
"builddir": true,
"buildsystem": "meson",
"config-opts": [
- "-Doffline=false",
+ "-Doffline=true",
"-Dbuildtype=debug"
],
"sources": [
{
"type": "dir",
"path": "."
- }
+ },
+ "cargo-sources.json"
]
}
]
-}
+}
\ No newline at end of file
diff --git a/dev.alextren.Spot.snapshots.json b/dev.alextren.Spot.snapshots.json
index 61be3326..b6c57b4a 100644
--- a/dev.alextren.Spot.snapshots.json
+++ b/dev.alextren.Spot.snapshots.json
@@ -1,7 +1,7 @@
{
"app-id": "dev.alextren.Spot",
"runtime": "org.gnome.Platform",
- "runtime-version": "41",
+ "runtime-version": "42",
"sdk": "org.gnome.Sdk",
"sdk-extensions": [
"org.freedesktop.Sdk.Extension.rust-stable"
@@ -40,45 +40,6 @@
"*.a"
],
"modules": [
- {
- "name": "libadwaita",
- "buildsystem": "meson",
- "config-opts": [
- "-Dexamples=false",
- "-Dtests=false"
- ],
- "sources": [
- {
- "type": "git",
- "url": "https://gitlab.gnome.org/GNOME/libadwaita.git",
- "branch": "1.0.0.alpha.4"
- }
- ],
- "modules": [
- {
- "name": "libsass",
- "buildsystem": "meson",
- "sources": [
- {
- "type": "git",
- "url": "https://github.com/lazka/libsass.git",
- "branch": "meson"
- }
- ]
- },
- {
- "name": "sassc",
- "buildsystem": "meson",
- "sources": [
- {
- "type": "git",
- "url": "https://github.com/lazka/sassc.git",
- "branch": "meson"
- }
- ]
- }
- ]
- },
{
"name": "spot",
"builddir": true,
diff --git a/doc/.latexmkrc b/doc/.latexmkrc
new file mode 100644
index 00000000..96515912
--- /dev/null
+++ b/doc/.latexmkrc
@@ -0,0 +1,4 @@
+$pdf_mode = 1;
+$pdf_previewer = '';
+$pdflatex = 'lualatex -interaction=nonstopmode -synctex=1 -shell-escape %O %S';
+$out_dir = 'target';
\ No newline at end of file
diff --git a/doc/Dockerfile b/doc/Dockerfile
new file mode 100644
index 00000000..a7e83671
--- /dev/null
+++ b/doc/Dockerfile
@@ -0,0 +1,4 @@
+FROM atrendel/doxerlive:15-basic
+RUN apk add gettext py3-pygments
+ADD Makefile /var/doxerlive/
+RUN make install
\ No newline at end of file
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 00000000..9ef43293
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,30 @@
+all: install build
+
+build: doc.tex
+ latexmk -c doc.tex
+
+watch: doc.tex
+ latexmk -pvc doc.tex
+
+DEPENDENCIES = luatex $\
+ fontspec $\
+ lm $\
+ xcolor $\
+ xcolor-solarized $\
+ fontawesome $\
+ xifthen $\
+ ifmtarg $\
+ pgf $\
+ pgf-blur $\
+ ec $\
+ etoolbox $\
+ xkeyval $\
+ minted kvoptions fancyvrb fvextra upquote float ifplatform pdftexcmds xstring lineno framed catchfile
+
+install:
+ tlmgr update --self
+ tlmgr update texlive-scripts
+ tlmgr install $(DEPENDENCIES)
+
+clean:
+ latexmk -C
\ No newline at end of file
diff --git a/doc/doc.pdf b/doc/doc.pdf
new file mode 100644
index 00000000..5c6f7208
Binary files /dev/null and b/doc/doc.pdf differ
diff --git a/doc/doc.tex b/doc/doc.tex
new file mode 100644
index 00000000..3c9750f5
--- /dev/null
+++ b/doc/doc.tex
@@ -0,0 +1,191 @@
+\documentclass[12pt, a4paper]{article}
+\usepackage[margin=25mm]{geometry}
+\usepackage{tikz}
+\usepackage[outputdir=target]{minted}
+
+\usemintedstyle{lovelace}
+
+\renewcommand\familydefault{\sfdefault}
+
+\definecolor{spotifygreen}{HTML}{1DB954}
+
+\usetikzlibrary{calc}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{decorations.pathreplacing}
+\usetikzlibrary{shapes}
+\usetikzlibrary{positioning}
+
+\tikzstyle{box}=[fill=black, solid, line width=0mm, text=white, rounded corners=2mm, font={\bfseries}, inner sep=3mm]
+\tikzstyle{sizedbox}=[box, text width=3cm, anchor=north, align=center]
+\tikzstyle{link}=[->, >=latex, line width=.5mm, rounded corners, shorten >=1pt]
+\tikzstyle{smalllink}=[->, >=latex, line width=.2mm, rounded corners, shorten >=1pt, dashed, gray]
+
+
+\begin{document}
+
+\section{Data flow within Spot}
+
+\subsection{Overview}
+
+\paragraph{Single source of truth.} There is a single place that is considered the source of truth for anything that is related to the app state, and that is, well, the \texttt{AppState}. The app state aggregates the state of the UI, as well as the player state. This makes it easier to keep things in sync -- when possible, anything state-related should be read from the app state over some local, possibly out-of-date state.
+
+\paragraph{Centralized.} That state is centralized and unique. This allows various parts of the application to access any part of it, and conversely makes it easy to perform state updates that affect various and sometimes unrelated parts of the application.
+
+\paragraph{Controlled mutations.} There is only one way to modify the app state, and that is by dispatching \emph{actions} -- plain structs that represent a mutation to the state. Updates to the state produce \emph{events}, which \texttt{EventListeners} can use to update the UI.
+
+\begin{figure}[!h]
+
+ \centering
+
+ \begin{tikzpicture}
+
+ \node[box, fill=spotifygreen, minimum height=2cm] (model) at (0, 0) {\ttfamily AppModel};
+ \node[box] (ui) at (-4, -3) {Gtk widgets};
+ \node[box] (listeners) at (4, -3) {Listeners};
+
+ \draw[link] (ui) edge[bend left=20] node[above, sloped] {\footnotesize actions} (model);
+ \draw[link] (model) edge[bend left=10] node[above, sloped] {\footnotesize events} (listeners);
+ \draw[link] (listeners) edge[bend left=60] node[below, sloped] {\footnotesize update} (ui);
+ \draw[link, dashed] (listeners) edge[bend left=10] node[below, sloped] {\footnotesize read-only access} (model);
+
+ \end{tikzpicture}
+
+ \caption{The data flow and and its relation to the UI -- the \texttt{AppModel} enforces read-only access to the state.}
+ \label{fig:flow}
+
+\end{figure}
+
+This draws heavy inspiration from the Flux architecture\footnote{See https://facebook.github.io/flux/docs/in-depth-overview for instance}; the one big difference here is that there is no way to automatically find out which portion of the UI should be updated. Instead, listeners are responsible for figuring out the updates to apply based on the events.
+
+It should be noted that the app state is only readable from the main thread for simplicity.
+
+\subsection{How actions are handled}
+
+Here is the relevant part of the code\footnote{Variables have been renamed for clarity...} related to handling actions and notifying listeners:
+
+\begin{minted}{rust}
+let events = self.model.update_state(action);
+
+for event in events.iter() {
+ for listener in self.listeners.iter_mut() {
+ listener.on_event(event);
+ }
+}
+\end{minted}
+
+That first line is the only time that the app state is borrowed mutably -- to apply actions.
+
+On the technical side: all actions being dispatched, synchronous or not, are eventually sent through a \texttt{futures::channel::mpsc} channel. The consumer on the other end of the channel is a future that will be executed by GLib. This allows Gtk to process \emph{all actions} at its own pace, as part of its main loop.
+
+Note: futures are used a lot in the code to perform asynchronous operations such as calls to the Spotify API. To ease the use of futures, the dispatcher allows working with asynchronous actions, that is, futures that output one or more actions. Again, these futures are eventually handled in the main Gtk loop.
+
+\subsection{A listener: the player subsystem}
+
+Any element that wishes to update the state or react to changes from the state has to follow that same pattern. For instance, the ``player'' part of Spot receives \texttt{Commands} (mapped from events by a \texttt{PlayerNotifier}) to start playing music, and dispatches actions back the app through a \texttt{SpotifyPlayerDelegate} (see figure \ref{fig:player}).
+
+These two extra elements add some indirection so that the player is not too strongly coupled to the rest of the app (it does not and should not care about most events, afterall!). Moreover, those commands are handled in a separate thread where the player lives.
+
+\begin{figure}[!ht]
+ \centering
+
+ \begin{tikzpicture}
+
+ \node[box, fill=spotifygreen, minimum height=2cm] (model) at (0, 0) {\ttfamily AppModel};
+
+ \draw[smalllink] (-5, -3) node[sizedbox] (listeners) {Components}
+ -- +(0, -1.5) node[right] {update}
+ -- +(0, -2) node[sizedbox] (ui) {Gtk widgets};
+
+ \draw[smalllink] (5, -3) node[sizedbox, fill=gray] (notifier) {\ttfamily PlayerNotifier}
+ -- +(0, -1.5) node[right] {command}
+ -- +(0, -2) node[sizedbox, fill=gray] (player) {\ttfamily SpotifyPlayer}
+ -- +(0, -3.5) node[right] {calls}
+ -- +(0, -4) node[sizedbox, fill=gray] (delegate) {\parbox{\textwidth}{\ttfamily SpotifyPlayer Delegate}};
+
+ \draw[link] (ui) edge[bend right=32] node[below, sloped] {\footnotesize actions} (model);
+ \draw[link] (model) edge[bend right=10] node[above, sloped] {\footnotesize events} (listeners);
+
+ \draw[link] (model) edge[bend left=10] node[above, sloped] {\footnotesize events} (notifier);
+ \draw[link] (delegate) edge[bend left=32] node[below, sloped] {\footnotesize actions} (model);
+
+ \draw[dashed, gray] ($(notifier.north west) + (-0.25, 0.25)$) rectangle ($(delegate.south east) + (0.25, -0.25)$);
+
+ \draw[dashed, gray] ($(listeners.north west) + (-0.25, 0.25)$) rectangle ($(ui.south east) + (0.25, -0.25)$);
+
+
+ \end{tikzpicture}
+
+ \caption{The player subsystem}
+ \label{fig:player}
+
+\end{figure}
+
+
+\subsection{Another listener: the MPRIS subsystem}
+
+Similarly, the MPRIS subsystem follows that same pattern. It spawns a small DBUS server that translates DBUS messages to actions, and an \texttt{AppPlaybackStateListener} listens to incoming events.
+
+One major difference is that the MPRIS server maintains its own state here, since the app state cannot be accessed from outside the main thread. To make sure this local state stays in sync, DBUS messages should not alter the local state directly -- instead, we should wait for a roundtrip through the app and incoming events.
+
+\section{Components}
+
+\subsection{Overview}
+
+Components are thin wrappers around Gtk widgets, dedicated to binding them so that they produce the right actions, and updating them when specific events occur by conforming to \texttt{EventListener}.
+
+\subsection{Modeling interactions}
+
+Components should have some associated \texttt{struct} to model the interactions with the rest of the app. Let's consider the play/pause button as an example. Its behavior is defined in the \texttt{PlaybackModel}:
+
+\begin{minted}{rust}
+impl PlaybackModel {
+ fn is_playing(&self) -> bool { /**/ }
+ fn toggle_playback(&self) { /**/ }
+}
+\end{minted}
+
+What we need to make our button work is a way to know its current state (is a song playing?) and a way to change that state (toggling on activation). Note that it would be tempting to simply query the widget's state, which \emph{should} be in sync with the actual playback state, but what we should really do instead is query the app state, which is the one source of truth for anything state-related.
+
+Why do this? First, toggling the playback might fail (e.g. if no song is playing), but more importantly something else could alter the playback state (e.g. a DBUS query).
+
+\begin{minted}{rust}
+fn is_playing(&self) -> bool {
+ self.app_model.get_state().playback.is_playing()
+}
+\end{minted}
+
+As for toggling the playback, remember that we can only mutate the state through actions (the \mintinline{rust}|get_state| call above returns some \mintinline{rust}|Deref|). In other words, we express what kind of action we want to perform, with no guarantee that it'll succeed.
+
+\begin{minted}{rust}
+fn toggle_playback(&self) {
+ self.dispatcher.dispatch(PlaybackAction::TogglePlay.into());
+}
+\end{minted}
+
+\subsection{Binding the widget}
+
+All that's left is binding the widget to our model. By wrapping our model in an \texttt{Rc}, it becomes easy to clone it into the kind of \texttt{'static} closure Gtk needs.
+
+\begin{minted}{rust}
+// model is an Rc
+widget.connect_play_pause(clone!(@weak model => move || model.toggle_playback()));
+\end{minted}
+
+Finally, we need our component to listen to relevant events, and update our widget accordingly.
+
+\begin{minted}{rust}
+impl EventListener for PlaybackControl {
+ fn on_event(&mut self, event: &AppEvent) {
+ match event {
+ AppEvent::PlaybackEvent(PlaybackEvent::PlaybackPaused)
+ | AppEvent::PlaybackEvent(PlaybackEvent::PlaybackResumed) => {
+ let is_playing = self.model.is_playing();
+ self.widget.set_playing(is_playing);
+ }
+ /**/
+ }
+ }
+}
+\end{minted}
+
+\end{document}
\ No newline at end of file
diff --git a/doc/enter.sh b/doc/enter.sh
new file mode 100755
index 00000000..59d5ed07
--- /dev/null
+++ b/doc/enter.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+docker build --network=host -t spot-doc .
+docker run --rm -it -e THEUID="$(id -u "$USER")" -v "$PWD":/var/doxerlive spot-doc ash
diff --git a/meson.build b/meson.build
index 2c9f7a5a..e1d6d9d3 100644
--- a/meson.build
+++ b/meson.build
@@ -1,6 +1,6 @@
project(
'spot',
- version: '0.3.1',
+ version: '0.3.2',
meson_version: '>= 0.50.0',
default_options: ['warning_level=2', 'buildtype=release'],
)
diff --git a/po/LINGUAS b/po/LINGUAS
index 489a6d29..96adb403 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1 +1 @@
-en ru fr nl de ca cs pl es pt tr id pt-br fi eu ia nb sl ja ar
+en ru fr nl de ca cs pl es pt tr id pt-br fi eu ia nb sl ja ar it uk bn
diff --git a/po/POTFILES b/po/POTFILES
index a4204043..7842c63a 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -1,6 +1,5 @@
# grep gettext src/**/*.rs | cut -d: -f1 | uniq
src/app/batch_loader.rs
-src/app/components/details/release_details.rs
src/app/components/labels.rs
src/app/components/login/login_model.rs
src/app/components/mod.rs
@@ -9,6 +8,7 @@ src/app/components/navigation/home.rs
src/app/components/now_playing/now_playing_model.rs
src/app/components/playback/playback_controls.rs
src/app/components/playback/playback_info.rs
+src/app/components/selection/component.rs
src/app/components/user_menu/user_menu.rs
src/app/state/login_state.rs
src/main.rs
@@ -18,10 +18,13 @@ src/window.ui.in
src/app/components/saved_playlists/saved_playlists.ui
src/app/components/artist_details/artist_details.ui
src/app/components/saved_tracks/saved_tracks.ui
+src/app/components/sidebar_listbox/sidebar_icon_widget.ui
src/app/components/search/search.ui
+src/app/components/settings/settings.ui
src/app/components/artist/artist.ui
src/app/components/user_details/user_details.ui
src/app/components/selection/selection_toolbar.ui
+src/app/components/details/album_header.ui
src/app/components/details/release_details.ui
src/app/components/details/details.ui
src/app/components/now_playing/now_playing.ui
diff --git a/po/ar.po b/po/ar.po
index 8fc56e79..8ebf7ccd 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -20,7 +20,7 @@ msgstr "نسخ الرابط"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "أضف إلى الصف"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "لايمكن حفظ كلمة المرور. تحقق من أن ال Session Keyring مفتوح."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "حدث خطأ. تحقق من الlog لمزيد التفاصيل!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "مكتبة"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "قائمة أغاني"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "يشتغل الأن"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "لا توجد أغنية طور التشغيل"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "عن"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "غادر"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "تسجيل الخروج"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "إعادة الاتصال"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "أفضل الأغاني"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "أصدارات"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "تسجيل دخول"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "ألبومات"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "الفنانين"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "أغاني محفوظة"
@@ -187,6 +187,7 @@ msgstr "ليس لديك ألبومات مسجلة."
msgid "Your library will be shown here."
msgstr "المكتبة خاصتك ستظهر هنا."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -198,31 +199,31 @@ msgstr[4] "{} تم تحديد عديد الأغاني"
msgstr[5] "{} الأغاني الأخرى المحددة"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "أبحث في Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "أكتب للبجث."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "أحدف"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "أضف إلى قائمة التشغيل..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "ألغاء"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "اختر الكل"
@@ -252,7 +253,7 @@ msgstr "الأغاني"
msgid "Duration"
msgstr "المدة"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "حقوق النشر"
@@ -261,3 +262,99 @@ msgstr "حقوق النشر"
msgid "{} by {}"
msgstr "{}بواسطة {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 00000000..d0632f42
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,405 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: POEditor.com\n"
+"Project-Id-Version: Spot\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry allows viewing the album containing a specific track.
+#: src/app/components/labels.rs:5
+#, fuzzy
+msgid "View album"
+msgstr "অ্যালবাম দেখুন"
+
+#. translators: This is part of a contextual menu attached to a single track; the intent is to copy the link (public URL) to a specific track.
+#: src/app/components/labels.rs:8
+#, fuzzy
+msgid "Copy link"
+msgstr "লিংক কপি করুন"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
+#: src/app/components/labels.rs:11
+#: src/app/components/selection/selection_toolbar.ui:39
+#, fuzzy
+msgid "Add to queue"
+msgstr "সারিতে যোগ করুন"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry removes a track from the play queue.
+#: src/app/components/labels.rs:14
+#, fuzzy
+msgid "Remove from queue"
+msgstr "সারি থেকে সরান"
+
+#. translators: This is part of a larger text that says "Add to ". This text should be as short as possible.
+#: src/app/components/labels.rs:21
+#, fuzzy
+msgid "Add to {}"
+msgstr "{} তে যোগ করুন"
+
+#. translators: This notification shows up right after login if the password could not be stored in the keyring (that is, GNOME's keyring aka seahorse, or any other libsecret compliant secret store).
+#: src/app/components/login/login_model.rs:56
+#, fuzzy
+msgid "Could not save password. Make sure the session keyring is unlocked."
+msgstr "পাসওয়ার্ড সেভ করা যায়নি। সেশন কীরিং আনলক করা আছে কিনা নিশ্চিত করুন।"
+
+#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
+#, fuzzy
+msgid "An error occured. Check logs for details!"
+msgstr "একটি ত্রুটি ঘটেছে। বিস্তারিত জানতে লগ চেক করুন!"
+
+#. translators: This is a sidebar entry to browse to saved albums.
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
+#, fuzzy
+msgid "Library"
+msgstr "লাইব্রেরী"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
+#, fuzzy
+msgid "Playlists"
+msgstr "প্লেলিস্ট"
+
+#. This is the visible name for the play queue. It appears in the sidebar as well.
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
+#, fuzzy
+msgid "Now playing"
+msgstr "এখন প্লে হচ্ছে"
+
+#. translators: Short text displayed instead of a song title when nothing plays
+#. Short text displayed instead of a song title when nothing plays
+#: src/app/components/playback/playback_info.rs:58
+#: src/app/components/playback/playback_info.ui:32
+#, fuzzy
+msgid "No song playing"
+msgstr "কোনো গান প্লে হচ্ছেনা"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:67
+#, fuzzy
+msgid "About"
+msgstr "অ্যাবাউট"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:69
+#, fuzzy
+msgid "Quit"
+msgstr "প্রস্থান করুন"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:74
+#, fuzzy
+msgid "Log out"
+msgstr "লগ আউট"
+
+#: src/app/state/login_state.rs:110
+#, fuzzy
+msgid "Connection restored"
+msgstr "সংযোগ পুনরুদ্ধার করা হয়েছে"
+
+#. Title of the section that shows 5 of the top tracks for an artist, as defined by Spotify.
+#: src/app/components/artist_details/artist_details.ui:26
+#, fuzzy
+msgid "Top tracks"
+msgstr "টপ ট্র্যাকগুলি"
+
+#. Title of the sections that contains all releases from an artist (both singles and albums).
+#: src/app/components/artist_details/artist_details.ui:53
+#, fuzzy
+msgid "Releases"
+msgstr "রিলিজ"
+
+#. Login window title -- shouldn't be too long, but must mention Premium (a premium account is required).
+#: src/app/components/login/login.ui:45
+#, fuzzy
+msgid "Login to Spotify Premium"
+msgstr "স্পটিফাই প্রিমিয়ামে লগইন করুন"
+
+#. Placeholder for the username field
+#: src/app/components/login/login.ui:64
+#, fuzzy
+msgid "Username"
+msgstr "ইউজারনেম"
+
+#. Placeholder for the password field
+#: src/app/components/login/login.ui:72
+#, fuzzy
+msgid "Password"
+msgstr "পাসওয়ার্ড"
+
+#. This error is shown when authentication fails.
+#: src/app/components/login/login.ui:126
+#, fuzzy
+msgid "Authentication failed!"
+msgstr "অথেন্টিকেশন ব্যর্থ হয়েছে!"
+
+#. Log in button label
+#: src/app/components/login/login.ui:141
+#, fuzzy
+msgid "Log in"
+msgstr "লগ ইন"
+
+#. This is the title of a section of the search results
+#: src/app/components/search/search.ui:72
+#, fuzzy
+msgid "Albums"
+msgstr "অ্যালবাম"
+
+#. This is the title of a section of the search results
+#: src/app/components/search/search.ui:105
+#, fuzzy
+msgid "Artists"
+msgstr "আর্টিস্ট"
+
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
+#, fuzzy
+msgid "Saved tracks"
+msgstr "সেভ করা ট্র্যাকগুলি"
+
+#. This information is shown when Caps Lock is enabled.
+#: src/app/components/login/login.ui:95
+#, fuzzy
+msgid "Caps Lock is enabled!"
+msgstr "ক্যাপস লক সক্রিয় আছে!"
+
+#: src/app/components/playback/playback_controls.rs:64
+#, fuzzy
+msgid "Pause"
+msgstr "পজ"
+
+#: src/app/components/playback/playback_controls.rs:66
+#, fuzzy
+msgid "Play"
+msgstr "প্লে"
+
+#: src/app/components/playback/playback_controls.ui:17
+#, fuzzy
+msgid "Shuffle"
+msgstr "শাফল"
+
+#: src/app/components/playback/playback_controls.ui:27
+#, fuzzy
+msgid "Previous"
+msgstr "পূর্ববর্তী"
+
+#: src/app/components/playback/playback_controls.ui:50
+#, fuzzy
+msgid "Next"
+msgstr "পরবর্তী"
+
+#: src/app/components/playback/playback_controls.ui:60
+#, fuzzy
+msgid "Repeat"
+msgstr "রিপিট"
+
+#. A title that is shown when the user has not saved any playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:26
+#, fuzzy
+msgid "You have no saved playlists."
+msgstr "আপনার কোনো সেভ করা প্লেলিস্ট নেই।"
+
+#. A description of what happens when the user has saved playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:27
+#, fuzzy
+msgid "Your playlists will be shown here."
+msgstr "আপনার প্লেলিস্ট এখানে দেখানো হবে।"
+
+#. A title that is shown when the user has not saved any albums.
+#: src/app/components/library/library.ui:26
+#, fuzzy
+msgid "You have no saved albums."
+msgstr "আপনার কোনো সেভ করা অ্যালবাম নেই।"
+
+#. A description of what happens when the user has saved albums.
+#: src/app/components/library/library.ui:27
+#, fuzzy
+msgid "Your library will be shown here."
+msgstr "আপনার লাইব্রেরী এখানে দেখানো হবে।"
+
+#. translators: This shows up when in selection mode. This text should be as short as possible.
+#: src/app/components/labels.rs:30
+#, fuzzy
+msgid "{} song selected"
+msgid_plural "{} songs selected"
+msgstr[0] "{} টি গান সিলেক্ট করা হয়েছে"
+msgstr[1] "{} টি গান সিলেক্ট করা হয়েছে"
+
+#. Title for the empty search page (initial state).
+#: src/app/components/search/search.ui:116
+#, fuzzy
+msgid "Search Spotify."
+msgstr "স্পটিফাইয়ে খুঁজুন।"
+
+#. Subtitle for the empty search page (initial state).
+#: src/app/components/search/search.ui:117
+#, fuzzy
+msgid "Type to search."
+msgstr "খোঁজার জন্য এখানে টাইপ করুন।"
+
+#: src/app/components/selection/selection_toolbar.ui:69
+#, fuzzy
+msgid "Remove"
+msgstr "রিমুভ করুন"
+
+#. playlist2-symbolic
+#: src/app/components/selection/selection_toolbar.ui:56
+#, fuzzy
+msgid "Add to playlist..."
+msgstr "প্লেলিস্টে যোগ করুন..."
+
+#. Button label. Exits selection mode.
+#: src/app/components/headerbar/headerbar.ui:47
+#, fuzzy
+msgid "Cancel"
+msgstr "বাতিল করুন"
+
+#. Button label. Selects all visible songs.
+#: src/app/components/headerbar/headerbar.ui:58
+#, fuzzy
+msgid "Select all"
+msgstr "সবকিছু সিলেক্ট করুন"
+
+#. translators: This is part of a contextual menu attached to a single track; the full text is "More from ".
+#: src/app/components/labels.rs:39
+#, fuzzy
+msgid "More from {}"
+msgstr "{} -র থেকে আরও"
+
+#. This refers to a music label
+#: src/app/components/details/release_details.ui:38
+#, fuzzy
+msgid "Label"
+msgstr "লেবেল"
+
+#. This refers to a release date
+#: src/app/components/details/release_details.ui:48
+#, fuzzy
+msgid "Released"
+msgstr "রিলিজ হয়েছে"
+
+#. This refers to a number of tracks
+#: src/app/components/details/release_details.ui:58
+#, fuzzy
+msgid "Tracks"
+msgstr "ট্র্যাক গুলি"
+
+#. This refers to the duration of a release
+#: src/app/components/details/release_details.ui:68
+#, fuzzy
+msgid "Duration"
+msgstr "সময়"
+
+#: src/app/components/details/release_details.ui:68
+#, fuzzy
+msgid "Copyright"
+msgstr "কপিরাইট"
+
+#. translators: This is part of a larger label that reads " by "
+#: src/app/components/labels.rs:48
+#, fuzzy
+msgid "{} by {}"
+msgstr "{} বাই {}"
+
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/ca.po b/po/ca.po
index e5c68109..b04a788b 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -1,16 +1,12 @@
msgid ""
msgstr ""
-"Project-Id-Version: Spot\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
-"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: POEditor.com\n"
+"Project-Id-Version: Spot\n"
+"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 3.0.1\n"
#. translators: This is part of a contextual menu attached to a single track; this entry allows viewing the album containing a specific track.
#: src/app/components/labels.rs:5
@@ -24,7 +20,7 @@ msgstr "Copia l'enllaç"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Afegeix a la cua"
@@ -44,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "No s'ha pogut desar la sessió. Assegura't que l'anell de claus de la sessió està desbloquejat."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Ha ocorregut un error. Comprova els registres per més detalls!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Biblioteca"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Llistes de reproducció"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "S'està reproduïnt"
@@ -74,21 +70,21 @@ msgid "No song playing"
msgstr "Cap cançó en reproducció"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Quant a"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Surt"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Tanca la sessió"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Connexió restablerta"
@@ -98,7 +94,7 @@ msgid "Top tracks"
msgstr "Millors pistes"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Llançaments"
@@ -128,17 +124,17 @@ msgid "Log in"
msgstr "Inicia sessió"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Àlbums"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistes"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Pistes desades"
@@ -191,6 +187,7 @@ msgstr "No teniu àlbums desats."
msgid "Your library will be shown here."
msgstr "Aquí es mostrarà la vostra biblioteca."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -198,31 +195,31 @@ msgstr[0] "{} cançó seleccionada"
msgstr[1] "{} cançons seleccionades"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Cerca a Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Escriu per començar a buscar."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Elimina"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Afegeix a la llista..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Cancel·la"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Selecciona-ho tot"
@@ -253,7 +250,7 @@ msgstr "Millors pistes"
msgid "Duration"
msgstr "Duració"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -261,3 +258,100 @@ msgstr "Copyright"
#: src/app/components/labels.rs:48
msgid "{} by {}"
msgstr "{} per {}"
+
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/cs.po b/po/cs.po
index 86d466b4..52e70fe0 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -20,7 +20,7 @@ msgstr "Zkopírovat odkaz"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Přidat do fronty"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Heslo nelze uložit. Zkontrolujte, že je klíčenka (session keyring) odemčená."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Došlo k chybě. Podrobnosti najdete v protokolu."
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Knihovna"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Playlisty"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Právě hraje"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Nic nehraje"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "O aplikaci"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Konec"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Odhlásit se"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Připojení obnoveno"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Populární"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Diskografie"
@@ -124,20 +124,20 @@ msgid "Log in"
msgstr "Přihlásit se"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Alba"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Umělci"
#. Where is this text displayed?
#. I see it is supposed to be in `src/app/components/navigation/home.rs:47`, but that does not seem to be the case: https://github.com/xou816/spot/blob/1b96cd07129f27c7f3f3a2e66299c44a52e489d4/src/app/components/navigation/home.rs
#. Maybe it is something that has not been commited yet (2021-10-02T10:42:52+02:00), but @xou816 has it locally and has generated pot / po files from it in https://github.com/xou816/spot/commit/86414c03d207cdf4e2c1cbddd47c7ca5629d1303
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Uložené skladby"
@@ -190,6 +190,7 @@ msgstr "Nemáte žádná uložená alba."
msgid "Your library will be shown here."
msgstr "Tady bude zobrazena vaše knihovna."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -198,31 +199,31 @@ msgstr[1] "{} skladby vybrány"
msgstr[2] "{} skladeb vybráno"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Hledat na Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Zadejte a vyhledejte."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Odstranit"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Přidat do playlistu..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Zrušit"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Vybrat vše"
@@ -251,7 +252,7 @@ msgstr "Počet skladeb"
msgid "Duration"
msgstr "Délka"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -260,3 +261,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr "{} od {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr "Playlist bez názvu"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr "Všechny playlisty"
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr "Skladby uloženy!"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr "Nastavení"
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr "Nepodařilo se otevřít odkaz!"
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr "Zvuk"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr "Zvukový backend"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr "ALSA zařízení"
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr "Použito pouze pokud zvukový backend je ALSA"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr "Kvalita zvuku"
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr "Normální"
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr "Vysoká"
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr "Velmi vysoká"
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr "Vzhled"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr "Téma"
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr "Světlé"
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr "Tmavé"
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr "Síť"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr "Port Access Pointu"
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr "Port používaný pro připojení ke Spotify Access Point. Nastavte na 0 pokud lze použít libovolný port."
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr "Uložit do knihovny"
+
diff --git a/po/de.po b/po/de.po
index a6df08b8..86f0cd5a 100644
--- a/po/de.po
+++ b/po/de.po
@@ -20,7 +20,7 @@ msgstr "Link kopieren"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Zur Warteschlange hinzufügen"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Das Passwort konnte nicht gespeichert werden. Stellen Sie sicher, dass der Sitzungs-Schlüsselbund entsperrt ist."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Es ist ein Fehler aufgetreten. Überprüfen Sie die Protokolle für Details!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Bibliothek"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Playlists"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Es läuft"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Es wird kein Titel gespielt"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Info"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Beenden"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Abmelden"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Verbindung wiederhergestellt"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Beliebte Titel"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Diskografie"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Anmelden"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Alben"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Künstler"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Gespeicherte Titel"
@@ -187,6 +187,7 @@ msgstr "Keine gespeicherten Alben vorhanden."
msgid "Your library will be shown here."
msgstr "Die Bibliothek wird hier angezeigt."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} Titel ausgewählt"
msgstr[1] "{} Titel ausgewählt"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Auf Spotify suchen."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Tippe um zu suchen."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Entfernen"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Zur Playlist hinzufügen..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Abbrechen"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Alle auswählen"
@@ -247,7 +248,7 @@ msgstr "Titel"
msgid "Duration"
msgstr "Dauer"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr "{} von {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr "Unbenannte Playlist"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr "Alle Playlist"
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr "Titel gespeichert!"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr "Einstellungen"
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr "Öffnen des Links fehlgschlagen!"
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr "Audio"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr "Audio Backend"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr "ALSA Gerät"
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr "Wird nur angewendet, wenn das Audio-Backend ALSA ist"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr "Audio Qualität"
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr "Normal"
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr "Hoch"
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr "Sehr hoch"
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr "Aussehen"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr "Thema"
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr "Hell"
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr "Dunkel"
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr "Netzwerk"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr "Access Point Port"
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr "Port, der für Verbindungen mit dem Spotify Access Point verwendet wird. Setze den Wert auf 0 für einen beliebigen Port."
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr "Speichere in Bibliothek"
+
diff --git a/po/en.po b/po/en.po
index 281f6dac..5fe7d6c2 100644
--- a/po/en.po
+++ b/po/en.po
@@ -1,20 +1,13 @@
msgid ""
msgstr ""
-"Project-Id-Version: Spot\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-13 09:46-0500\n"
-"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: POEditor.com\n"
+"Project-Id-Version: Spot\n"
+"Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
-msgid "An error occured. Check logs for details!"
-msgstr "An error occured. Check logs for details!"
-
#. translators: This is part of a contextual menu attached to a single track; this entry allows viewing the album containing a specific track.
#: src/app/components/labels.rs:5
msgid "View album"
@@ -27,7 +20,7 @@ msgstr "Copy link"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Add to queue"
@@ -41,59 +34,34 @@ msgstr "Remove from queue"
msgid "Add to {}"
msgstr "Add to {}"
-#. translators: This shows up when in selection mode. This text should be as short as possible.
-#: src/app/components/labels.rs:30
-msgid "{} song selected"
-msgid_plural "{} songs selected"
-msgstr[0] "{} song selected"
-msgstr[1] "{} songs selected"
-
-#. translators: This is part of a contextual menu attached to a single track; the full text is "More from ".
-#: src/app/components/labels.rs:39
-msgid "More from {}"
-msgstr "More from {}"
-
-#. translators: This is part of a larger label that reads " by "
-#: src/app/components/labels.rs:48
-msgid "{} by {}"
-msgstr ""
-
#. translators: This notification shows up right after login if the password could not be stored in the keyring (that is, GNOME's keyring aka seahorse, or any other libsecret compliant secret store).
#: src/app/components/login/login_model.rs:56
msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Could not save password. Make sure the session keyring is unlocked."
+#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
+msgid "An error occured. Check logs for details!"
+msgstr "An error occured. Check logs for details!"
+
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Library"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Playlists"
-#. translators: This is a sidebar entry to browse to saved tracks.
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
-msgid "Saved tracks"
-msgstr ""
-
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#. This is the visible name for the play queue. It appears in the sidebar as well.
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Now playing"
-#: src/app/components/playback/playback_controls.rs:64
-msgid "Pause"
-msgstr ""
-
-#: src/app/components/playback/playback_controls.rs:66
-msgid "Play"
-msgstr ""
-
#. translators: Short text displayed instead of a song title when nothing plays
#. Short text displayed instead of a song title when nothing plays
#: src/app/components/playback/playback_info.rs:58
@@ -102,72 +70,163 @@ msgid "No song playing"
msgstr "No song playing"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "About"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Quit"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Log out"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Connection restored"
-#. A title that is shown when the user has not saved any playlists.
-#: src/app/components/saved_playlists/saved_playlists.ui:26
-msgid "You have no saved playlists."
-msgstr ""
-
-#. A description of what happens when the user has saved playlists.
-#: src/app/components/saved_playlists/saved_playlists.ui:27
-msgid "Your playlists will be shown here."
-msgstr ""
-
#. Title of the section that shows 5 of the top tracks for an artist, as defined by Spotify.
#: src/app/components/artist_details/artist_details.ui:26
msgid "Top tracks"
msgstr "Top tracks"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Releases"
+#. Login window title -- shouldn't be too long, but must mention Premium (a premium account is required).
+#: src/app/components/login/login.ui:45
+msgid "Login to Spotify Premium"
+msgstr "Login to Spotify Premium"
+
+#. Placeholder for the username field
+#: src/app/components/login/login.ui:64
+msgid "Username"
+msgstr "Username"
+
+#. Placeholder for the password field
+#: src/app/components/login/login.ui:72
+msgid "Password"
+msgstr "Password"
+
+#. This error is shown when authentication fails.
+#: src/app/components/login/login.ui:126
+msgid "Authentication failed!"
+msgstr "Authentication failed!"
+
+#. Log in button label
+#: src/app/components/login/login.ui:141
+msgid "Log in"
+msgstr "Log in"
+
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albums"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artists"
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
+msgid "Saved tracks"
+msgstr "Saved Tracks"
+
+#. This information is shown when Caps Lock is enabled.
+#: src/app/components/login/login.ui:95
+msgid "Caps Lock is enabled!"
+msgstr "Caps Lock is enabled!"
+
+#: src/app/components/playback/playback_controls.rs:64
+msgid "Pause"
+msgstr "Pause"
+
+#: src/app/components/playback/playback_controls.rs:66
+msgid "Play"
+msgstr "Play"
+
+#: src/app/components/playback/playback_controls.ui:17
+msgid "Shuffle"
+msgstr "Shuffle"
+
+#: src/app/components/playback/playback_controls.ui:27
+msgid "Previous"
+msgstr "Previous"
+
+#: src/app/components/playback/playback_controls.ui:50
+msgid "Next"
+msgstr "Next"
+
+#: src/app/components/playback/playback_controls.ui:60
+msgid "Repeat"
+msgstr "Repeat"
+
+#. A title that is shown when the user has not saved any playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:26
+msgid "You have no saved playlists."
+msgstr "You have no saved playlists."
+
+#. A description of what happens when the user has saved playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:27
+msgid "Your playlists will be shown here."
+msgstr "Your playlists will be shown here."
+
+#. A title that is shown when the user has not saved any albums.
+#: src/app/components/library/library.ui:26
+msgid "You have no saved albums."
+msgstr "You have no saved albums."
+
+#. A description of what happens when the user has saved albums.
+#: src/app/components/library/library.ui:27
+msgid "Your library will be shown here."
+msgstr "Your library will be shown here."
+
+#. translators: This shows up when in selection mode. This text should be as short as possible.
+#: src/app/components/labels.rs:30
+msgid "{} song selected"
+msgid_plural "{} songs selected"
+msgstr[0] "{} song selected"
+msgstr[1] "{} songs selected"
+
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
-msgstr ""
+msgstr "Search Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
-msgstr ""
+msgstr "Type to search."
+
+#: src/app/components/selection/selection_toolbar.ui:69
+msgid "Remove"
+msgstr "Remove"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
-msgstr ""
+msgstr "Add to playlist..."
-#: src/app/components/selection/selection_toolbar.ui:58
-msgid "Remove"
-msgstr ""
+#. Button label. Exits selection mode.
+#: src/app/components/headerbar/headerbar.ui:47
+msgid "Cancel"
+msgstr "Cancel"
+
+#. Button label. Selects all visible songs.
+#: src/app/components/headerbar/headerbar.ui:58
+msgid "Select all"
+msgstr "Select all"
+
+#. translators: This is part of a contextual menu attached to a single track; the full text is "More from ".
+#: src/app/components/labels.rs:39
+msgid "More from {}"
+msgstr "More from {}"
#. This refers to a music label
#: src/app/components/details/release_details.ui:38
@@ -189,75 +248,108 @@ msgstr "Tracks"
msgid "Duration"
msgstr "Duration"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
-#. Login window title -- shouldn't be too long, but must mention Premium (a premium account is required).
-#: src/app/components/login/login.ui:45
-msgid "Login to Spotify Premium"
-msgstr "Login to Spotify Premium"
+#. translators: This is part of a larger label that reads " by "
+#: src/app/components/labels.rs:48
+msgid "{} by {}"
+msgstr "{} by {}"
-#. Placeholder for the username field
-#: src/app/components/login/login.ui:64
-msgid "Username"
-msgstr "Username"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
-#. Placeholder for the password field
-#: src/app/components/login/login.ui:72
-msgid "Password"
-msgstr "Password"
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
-#. This information is shown when Caps Lock is enabled.
-#: src/app/components/login/login.ui:95
-msgid "Caps Lock is enabled!"
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
msgstr ""
-#. This error is shown when authentication fails.
-#: src/app/components/login/login.ui:126
-msgid "Authentication failed!"
-msgstr "Authentication failed!"
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
-#. Log in button label
-#: src/app/components/login/login.ui:141
-msgid "Log in"
-msgstr "Log in"
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
-#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
-msgid "Cancel"
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
msgstr ""
-#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
-msgid "Select all"
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
msgstr ""
-#: src/app/components/playback/playback_controls.ui:17
-msgid "Shuffle"
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
msgstr ""
-#: src/app/components/playback/playback_controls.ui:27
-msgid "Previous"
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
msgstr ""
-#: src/app/components/playback/playback_controls.ui:50
-msgid "Next"
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
msgstr ""
-#: src/app/components/playback/playback_controls.ui:60
-msgid "Repeat"
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
msgstr ""
-#. A title that is shown when the user has not saved any albums.
-#: src/app/components/library/library.ui:26
-msgid "You have no saved albums."
+#: src/app/components/settings/settings.ui:45
+msgid "High"
msgstr ""
-#. A description of what happens when the user has saved albums.
-#: src/app/components/library/library.ui:27
-msgid "Your library will be shown here."
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
msgstr ""
-#~ msgid "by"
-#~ msgstr "by"
diff --git a/po/es.po b/po/es.po
index 527181d0..d029224c 100644
--- a/po/es.po
+++ b/po/es.po
@@ -20,7 +20,7 @@ msgstr "Copiar enlace"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Añadir a la cola"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "No se pudo guardar la contraseña. Asegúrate de que el anillo de claves esta desbloqueado."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Ha ocurrido un error. ¡Revisa los logs para más detalles!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Biblioteca"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Lista de reproducción"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Reproduciendo ahora"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Ninguna canción en reproducción"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Acerca de"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Salir"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Cerrar sesión"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Conexión restaurada"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Mejores canciones"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Lanzamientos"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Iniciar sesión"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Álbumes"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistas"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Pistas guardadas"
@@ -187,6 +187,7 @@ msgstr "No tienes álbumes guardados."
msgid "Your library will be shown here."
msgstr "Tu biblioteca se mostrará aquí."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} canción seleccionada"
msgstr[1] "{} canciones seleccionadas"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Buscar en Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Escribe para buscar."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Retirar"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Añadir a la lista de reproducción..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Cancelar"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Seleccionar todo"
@@ -247,7 +248,7 @@ msgstr "Canciones"
msgid "Duration"
msgstr "Duración"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr "{} de {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr "Lista de reproducción sin nombre"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr "Todas las listas de reproducción"
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr "¡Pistas guardadas!"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr "¡No se ha podido abrir el enlace!"
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr "Sonido"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr "Backend de audio"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr "Dispositivo ALSA"
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr "Sólo se aplica si el backend de audio es ALSA"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr "Calidad de sonido"
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr "Normal"
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr "Alta"
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr "Muy alta"
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr "Apariencia"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr "Tema"
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr "Claro"
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr "Oscuro"
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr "Red"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr "Puerto del punto de acceso"
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr "Puerto utilizado para las conexiones con el punto de acceso de Spotify. Poner a 0 si cualquier puerto está bien."
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr "Guardar en la biblioteca"
+
diff --git a/po/eu.po b/po/eu.po
index 9cdf8861..0e081bb1 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -20,7 +20,7 @@ msgstr "Kopiatu esteka"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Gehitu isatsari"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Ezin izan da pasahitza gorde. Ziurtatu saioko giltzatakoa desblokeatuta dagoela."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Errore bat gertatu da. Egiaztatu xehetasunak erregistroetan!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Biblioteka"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Erreprodukzio-zerrendak"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Orain erreproduzitzen"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Ez da abestirik erreproduzitzen ari"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Honi buruz"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Utzi"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Saioa itxi"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Konexioa leheneratu da"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Pista nagusiak"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Jaurtiketak"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Hasi saioa"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albumak"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistak"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Gordetako pistak"
@@ -187,6 +187,7 @@ msgstr "Ez duzu albumik gordeta."
msgid "Your library will be shown here."
msgstr "Zure liburutegia hemen agertuko da."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} Aukeratutako abesti bat"
msgstr[1] "{} Aukeratutako abestiak"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Bilatu Spotifyn."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Idatzi bilatzeko."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Ezabatu"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Erreprodukzio-zerrendara gehitu..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Ezeztatu"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Hautatu dena"
@@ -247,7 +248,7 @@ msgstr "Pistak"
msgid "Duration"
msgstr "Iraupena"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Egile-eskubideak"
@@ -256,3 +257,99 @@ msgstr "Egile-eskubideak"
msgid "{} by {}"
msgstr "{} {} -ek eginda"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/fi.po b/po/fi.po
index 8e8168e8..4cd28e5d 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -20,7 +20,7 @@ msgstr "Kopioi linkki"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Lisää jonoon"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Salasanaa ei voitu tallentaa. Varmista että avainnippua ei ole lukittu."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Tapahti virhe. Katso lisätiedot lokista!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Kirjasto"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Soittolistat"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Nyt toistetaan"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Ei toistettavaa kappaletta"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Tietoja"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Lopeta"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Kirjaudu ulos"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Yhteys palautunut"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Suosituimmat kappaleet"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Julkaisut"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Kirjaudu sisään"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albumit"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Esittäjät"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Tallennetut kappaleet"
@@ -187,6 +187,7 @@ msgstr "Ei tallennettuja albumeja."
msgid "Your library will be shown here."
msgstr "Kirjastosi näytetään täällä."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} kappale valittu"
msgstr[1] "{} kappaletta valittu"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Etsi Spotifysta."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Kirjoita etsiäksesi."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Poista"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Lisää soittolistaan..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Peru"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Valitse kaikki"
@@ -247,7 +248,7 @@ msgstr "Kappaleita"
msgid "Duration"
msgstr "Kesto"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Tekijänoikeus"
@@ -256,3 +257,99 @@ msgstr "Tekijänoikeus"
msgid "{} by {}"
msgstr "{} tehnyt {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr "Nimetön soittolista"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr "Kaikki soittolistat"
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr "Kappaleet tallennettu!"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr "Asetukset"
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr "Linkin avaaminen epäonnistui!"
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr "Ääni"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr "Äänen taustaosa"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr "ALSA-laite"
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr "Sovelletaan vain jos äänen taustaosa on ALSA"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr "Äänenlaatu"
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr "Normaali"
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr "Korkea"
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr "Hyvin korkea"
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr "Ulkoasu"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr "Teema"
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr "Vaalea"
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr "Tumma"
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr "Verkko"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr "Access Pointin portti"
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr "Spotifyn Access Pointiin tuleviin yhteyksiin käytettävä portti. Aseta arvoksi 0, jos mikä tahansa portti kelpaa."
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr "Tallenna kirjastoon"
+
diff --git a/po/fr.po b/po/fr.po
index e16bfc88..758df8a2 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -20,7 +20,7 @@ msgstr "Copier le lien"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Ajouter à la file d'attente"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Le mot de passe n'a pu être enregistré, assurez-vous que le Trousseau de session est déverouillé."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Une erreur est survenue. Consultez les journaux de débogage pour plus d'information."
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Bibliothèque"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Listes de lecture"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "En cours de lecture"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Aucune lecture en cours"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "À propos"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Quitter"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Déconnexion"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Connexion rétablie"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Morceaux populaires"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Discographie"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Connexion"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albums"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistes"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Titres aimés"
@@ -187,6 +187,7 @@ msgstr "Aucun album dans votre bibliothèque."
msgid "Your library will be shown here."
msgstr "Vos albums apparaîtrons ici."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} morceau sélectionné"
msgstr[1] "{} morceaux sélectionnés"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Rechercher dans Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Saisissez un terme à rechercher."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Retirer"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Ajouter à..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Annuler"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Tout sélectionner"
@@ -247,7 +248,7 @@ msgstr "Morceaux"
msgid "Duration"
msgstr "Durée"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr "{} de {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/ia.po b/po/ia.po
index 5291af89..e0cbded5 100644
--- a/po/ia.po
+++ b/po/ia.po
@@ -20,7 +20,7 @@ msgstr "Copiar ligamine"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Adder al cauda"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Non poteva salvar le contrasigno. Assecura te qui le magazin de claves es disblocate."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Ocurreva un error. Verifica le registros pro detalios!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Bibliotheca"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Listas de reproduction"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Ora in reproduction"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Nulle canto in reproduction"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "A proposito de"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Quitar"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Clauder le session"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Connexion restabilite"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Melior tracias"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Lanciamentos"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Initiar session"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albumes"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistas"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Tracias salvate"
@@ -187,6 +187,7 @@ msgstr "Tu ha nulle albumes salvate."
msgid "Your library will be shown here."
msgstr "Tu bibliotheca essera monstrate ci."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} canto seligite"
msgstr[1] "{} cantos seligite"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Cercar Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Scribe pro cercar."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Remover"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Adder al lista de reproduction..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Cancellar"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Seliger toto"
@@ -247,7 +248,7 @@ msgstr "Tracias"
msgid "Duration"
msgstr "Duration"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr "{} per {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/id.po b/po/id.po
index 1f13697b..51745116 100644
--- a/po/id.po
+++ b/po/id.po
@@ -20,7 +20,7 @@ msgstr "Salin tautan"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Tambah ke Antrian"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Tak bisa menyimpan sandi. Pastikan bahwa kunci sesi tidak terkunci."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Timbul galat. Periksa log untuk detailnya!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Pustaka"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Daftar putar"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Sedang memutar"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Tidak ada lagu yang diputar"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Tentang"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Keluar"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Log keluar"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Sambungan dipulihkan"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Trek teratas"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Rilis"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Log masuk"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Album"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artis"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Trek yang disimpan"
@@ -187,37 +187,38 @@ msgstr "Anda tidak memiliki album yang disimpan."
msgid "Your library will be shown here."
msgstr "Pustaka Anda akan ditampilkan di sini."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
msgstr[0] "{} lagu dipilih"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Cari Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Ketik untuk mencari."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Buang"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Tambah ke daftar putar…"
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Batal"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Pilih semua"
@@ -246,7 +247,7 @@ msgstr "Trek"
msgid "Duration"
msgstr "Durasi"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Hak Cipta"
@@ -255,3 +256,99 @@ msgstr "Hak Cipta"
msgid "{} by {}"
msgstr "{} oleh {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 00000000..0b4f3abe
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,265 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Spot\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-01-19 19:46-0500\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: POEditor.com\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+msgid "An error occured. Check logs for details!"
+msgstr "C'è stato un errore. Controlla i log per i dettagli!"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry allows viewing the album containing a specific track.
+#: src/app/components/labels.rs:5
+msgid "View album"
+msgstr "Guarda l'album"
+
+#. translators: This is part of a contextual menu attached to a single track; the intent is to copy the link (public URL) to a specific track.
+#: src/app/components/labels.rs:8
+msgid "Copy link"
+msgstr "Copia link"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
+#: src/app/components/labels.rs:11
+#: src/app/components/selection/selection_toolbar.ui:37
+msgid "Add to queue"
+msgstr "Aggiungi alla coda di riproduzione"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry removes a track from the play queue.
+#: src/app/components/labels.rs:14
+msgid "Remove from queue"
+msgstr "Rimuovi dalla coda di riproduzione"
+
+#. translators: This is part of a larger text that says "Add to ". This text should be as short as possible.
+#: src/app/components/labels.rs:21
+msgid "Add to {}"
+msgstr "Aggiungi a {}"
+
+#. translators: This shows up when in selection mode. This text should be as short as possible.
+#: src/app/components/labels.rs:30
+msgid "{} song selected"
+msgid_plural "{} songs selected"
+msgstr[0] "{} brano selezionato"
+msgstr[1] "{} brani selezionati"
+
+#. translators: This is part of a contextual menu attached to a single track; the full text is "More from ".
+#: src/app/components/labels.rs:39
+msgid "More from {}"
+msgstr "Di più da {}"
+
+#. translators: This is part of a larger label that reads " by "
+#: src/app/components/labels.rs:48
+msgid "{} by {}"
+msgstr "{} di {}"
+
+#. translators: This notification shows up right after login if the password could not be stored in the keyring (that is, GNOME's keyring aka seahorse, or any other libsecret compliant secret store).
+#: src/app/components/login/login_model.rs:56
+msgid "Could not save password. Make sure the session keyring is unlocked."
+msgstr ""
+"Impossibile salvare la password. Controlla che la session keyring sia "
+"sbloccata."
+
+#. translators: This is a sidebar entry to browse to saved albums.
+#: src/app/components/navigation/factory.rs:29
+#: src/app/components/navigation/home.rs:36
+msgid "Library"
+msgstr "Raccolta"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/factory.rs:44
+#: src/app/components/navigation/home.rs:42
+msgid "Playlists"
+msgstr "Playlist"
+
+#. translators: This is a sidebar entry to browse to saved tracks.
+#: src/app/components/navigation/factory.rs:73
+#: src/app/components/navigation/home.rs:48
+msgid "Saved tracks"
+msgstr "Tracce salvate"
+
+#: src/app/components/navigation/home.rs:53
+#: src/app/components/now_playing/now_playing_model.rs:152
+msgid "Now playing"
+msgstr "In riproduzione"
+
+#: src/app/components/playback/playback_controls.rs:64
+msgid "Pause"
+msgstr "Pausa"
+
+#: src/app/components/playback/playback_controls.rs:66
+msgid "Play"
+msgstr "Riproduci"
+
+#. translators: Short text displayed instead of a song title when nothing plays
+#. Short text displayed instead of a song title when nothing plays
+#: src/app/components/playback/playback_info.rs:58
+#: src/app/components/playback/playback_info.ui:32
+msgid "No song playing"
+msgstr "Nessun brano in riproduzione"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:56
+msgid "About"
+msgstr "Informazioni su"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:58
+msgid "Quit"
+msgstr "Esci"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:63
+msgid "Log out"
+msgstr "Log out"
+
+#: src/app/state/login_state.rs:117
+msgid "Connection restored"
+msgstr "Connessione ripristinata"
+
+#. A title that is shown when the user has not saved any playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:26
+msgid "You have no saved playlists."
+msgstr "Non hai playlist salvate."
+
+#. A description of what happens when the user has saved playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:27
+msgid "Your playlists will be shown here."
+msgstr "Le tue playlist verranno mostrate qui."
+
+#. Title of the section that shows 5 of the top tracks for an artist, as defined by Spotify.
+#: src/app/components/artist_details/artist_details.ui:26
+msgid "Top tracks"
+msgstr "Brani più popolari"
+
+#. Title of the sections that contains all releases from an artist (both singles and albums).
+#: src/app/components/artist_details/artist_details.ui:55
+msgid "Releases"
+msgstr "Releases"
+
+#. This is the title of a section of the search results
+#: src/app/components/search/search.ui:70
+msgid "Albums"
+msgstr "Album"
+
+#. This is the title of a section of the search results
+#: src/app/components/search/search.ui:103
+msgid "Artists"
+msgstr "Artisti"
+
+#. Title for the empty search page (initial state).
+#: src/app/components/search/search.ui:114
+msgid "Search Spotify."
+msgstr "Cerca Spotify."
+
+#. Subtitle for the empty search page (initial state).
+#: src/app/components/search/search.ui:115
+msgid "Type to search."
+msgstr "Digita per cercare."
+
+#. playlist2-symbolic
+#: src/app/components/selection/selection_toolbar.ui:47
+msgid "Add to playlist..."
+msgstr "Aggiungi alla playlist..."
+
+#: src/app/components/selection/selection_toolbar.ui:58
+msgid "Remove"
+msgstr "Rimuovi"
+
+#. This refers to a music label
+#: src/app/components/details/release_details.ui:38
+msgid "Label"
+msgstr "Etichetta discografica"
+
+#. This refers to a release date
+#: src/app/components/details/release_details.ui:48
+msgid "Released"
+msgstr "Data di uscita"
+
+#. This refers to a number of tracks
+#: src/app/components/details/release_details.ui:58
+msgid "Tracks"
+msgstr "Traccia"
+
+#. This refers to the duration of a release
+#: src/app/components/details/release_details.ui:68
+msgid "Duration"
+msgstr "Durata"
+
+#: src/app/components/details/release_details.ui:78
+msgid "Copyright"
+msgstr "Copyright"
+
+#. Login window title -- shouldn't be too long, but must mention Premium (a premium account is required).
+#: src/app/components/login/login.ui:45
+msgid "Login to Spotify Premium"
+msgstr "Login su Spotify Premium"
+
+#. Placeholder for the username field
+#: src/app/components/login/login.ui:64
+msgid "Username"
+msgstr "Username"
+
+#. Placeholder for the password field
+#: src/app/components/login/login.ui:72
+msgid "Password"
+msgstr "Password"
+
+#. This information is shown when Caps Lock is enabled.
+#: src/app/components/login/login.ui:95
+msgid "Caps Lock is enabled!"
+msgstr "Il blocco maiuscole è abilitato!"
+
+#. This error is shown when authentication fails.
+#: src/app/components/login/login.ui:126
+msgid "Authentication failed!"
+msgstr "Autenticazione fallita!"
+
+#. Log in button label
+#: src/app/components/login/login.ui:141
+msgid "Log in"
+msgstr "Log in"
+
+#. Button label. Exits selection mode.
+#: src/app/components/headerbar/headerbar.ui:46
+msgid "Cancel"
+msgstr "Annulla"
+
+#. Button label. Selects all visible songs.
+#: src/app/components/headerbar/headerbar.ui:57
+msgid "Select all"
+msgstr "Seleziona tutto"
+
+#: src/app/components/playback/playback_controls.ui:17
+msgid "Shuffle"
+msgstr "Mescola"
+
+#: src/app/components/playback/playback_controls.ui:27
+msgid "Previous"
+msgstr "Precedente"
+
+#: src/app/components/playback/playback_controls.ui:50
+msgid "Next"
+msgstr "Successivo"
+
+#: src/app/components/playback/playback_controls.ui:60
+msgid "Repeat"
+msgstr "Ripeti"
+
+#. A title that is shown when the user has not saved any albums.
+#: src/app/components/library/library.ui:26
+msgid "You have no saved albums."
+msgstr "Non hai album salvati."
+
+#. A description of what happens when the user has saved albums.
+#: src/app/components/library/library.ui:27
+msgid "Your library will be shown here."
+msgstr "La tua libreria verrà mostrata qui."
+
+#~ msgid "by"
+#~ msgstr "by"
diff --git a/po/ja.po b/po/ja.po
index 1d67c790..8d14b9c3 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -20,7 +20,7 @@ msgstr "リンクをコピー"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "キューに追加"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "パスワードを保存できませんでした。セッションキーリングのロックを解除してください。"
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "エラーが発生しました。詳細はログを確認してください。"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "ライブラリ"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "プレイリスト"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "再生中"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "再生中の曲はありません"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "このアプリについて"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "終了"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "ログアウト"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "再接続しました"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "人気のトラック"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "作品"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "ログイン"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "アルバム"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "アーティスト"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "お気に入り"
@@ -187,37 +187,38 @@ msgstr "保存したアルバムがありません。"
msgid "Your library will be shown here."
msgstr "ライブラリはここに表示されます。"
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
msgstr[0] "{}曲選択中"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "検索する。"
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "検索ワードを入力してください。"
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "削除"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "プレイリストに追加…"
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "選択解除"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "すべて選択"
@@ -247,7 +248,7 @@ msgstr "曲数"
msgid "Duration"
msgstr "再生時間"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "著作権表示"
@@ -256,3 +257,99 @@ msgstr "著作権表示"
msgid "{} by {}"
msgstr "{} から {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/nb.po b/po/nb.po
index 7fb00e5c..28c509c4 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -20,7 +20,7 @@ msgstr "Kopier lenke"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Legg til i køen"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Kunne ikke lagre passordet. Sørg for at nøkkelringen til sesjonen er låst opp."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "En feil oppstod. Sjekk logger for detaljer!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Bibliotek"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Spillelister"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Nå spiller"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Ingen sang spilles"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Om"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Avslutt"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Logg ut"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Tilkoblingen er gjenopprettet"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Topp spor"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Utgivelser"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Logg inn"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Album"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artister"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Lagrede spor"
@@ -187,6 +187,7 @@ msgstr "Du har ingen lagrede album."
msgid "Your library will be shown here."
msgstr "Biblioteket ditt vises her."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
#, fuzzy
msgid "{} song selected"
@@ -195,31 +196,31 @@ msgstr[0] "{} sang valgt"
msgstr[1] "{} sanger valgt"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Søk Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Skriv for å søke."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Fjern"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Legg til spilleliste..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Avbryt"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Velg alle"
@@ -248,7 +249,7 @@ msgstr "Spor"
msgid "Duration"
msgstr "Varighet"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Opphavsrett"
@@ -257,3 +258,99 @@ msgstr "Opphavsrett"
msgid "{} by {}"
msgstr "{} av {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/nl.po b/po/nl.po
index 7a2e0aca..d94a3cf8 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -20,7 +20,7 @@ msgstr "Link kopiëren"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Toevoegen aan wachtrij"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Het wachtwoord kan niet worden opgeslagen - zorg dat de sessiesleutelhanger ontgrendeld is."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Er is een fout opgetreden - bekijk het logboek!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Verzameling"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Afspeellijsten"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Je luistert naar"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Er wordt niks afgespeeld"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Over"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Afsluiten"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Uitloggen"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "De verbinding is hersteld"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Topnummers"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Uitgaven"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Inloggen"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albums"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artiesten"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Opgeslagen nummers"
@@ -187,6 +187,7 @@ msgstr "Je hebt nog geen opgeslagen albums."
msgid "Your library will be shown here."
msgstr "Je verzameling wordt hier getoond."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} nummer geselecteerd"
msgstr[1] "{} nummers geselecteerd"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Doorzoek Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Typ om te zoeken"
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Verwijderen"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Toevoegen aan afspeellijst…"
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Annuleren"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Alles selecteren"
@@ -247,7 +248,7 @@ msgstr "Nummers"
msgid "Duration"
msgstr "Duur"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr "{} van {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr "Naamloze afspeellijst"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr "Alle afspeellijsten"
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr "De nummers zijn opgeslagen!"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr "Voorkeuren"
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr "De link kan niet worden geopend!"
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr "Audio"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr "Audiobackend"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr "ALSA-apparaat"
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr "Alleen van toepassing als het audiobackend is ingesteld op ALSA"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr "Audiokwaliteit"
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr "Normaal"
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr "Hoog"
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr "Hoogst"
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr "Vormgeving"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr "Thema"
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr "Licht"
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr "Donker"
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr "Netwerk"
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr "Poort van toegangspunt"
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr "De poort die wordt gebruikt om verbinding te maken met Spotify's toegangspunt. 0 = elke poort."
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr "Opslaan in verzameling"
+
diff --git a/po/pl.po b/po/pl.po
index 4dbe2720..8c43a628 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -20,7 +20,7 @@ msgstr "Skopiuj link"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Dodaj do kolejki"
@@ -32,7 +32,7 @@ msgstr "Usuń z kolejki"
#. translators: This is part of a larger text that says "Add to ". This text should be as short as possible.
#: src/app/components/labels.rs:21
msgid "Add to {}"
-msgstr "Dodaj do {}"
+msgstr "Dodaj do"
#. translators: This notification shows up right after login if the password could not be stored in the keyring (that is, GNOME's keyring aka seahorse, or any other libsecret compliant secret store).
#: src/app/components/login/login_model.rs:56
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Nie można zapisać hasła. Upewnij się że narzędzie zarządzające kluczami jest odblokowane."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Wystąpił błąd. Sprawdź logi po więcej informacji!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Biblioteka"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Playlisty"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Aktualnie odtwarzane"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Aktualnie nie gra żadna piosenka"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "O programie"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Wyjdź"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Wyloguj się"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Odzyskano połączenie"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Najlepsze piosenki"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Premiery"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Zaloguj"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albumy"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artyści"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Zachowane piosenki"
@@ -187,6 +187,7 @@ msgstr "Nie masz zapisanych albumów."
msgid "Your library will be shown here."
msgstr "Twoja biblioteka będzie tu pokazana."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -196,31 +197,31 @@ msgstr[2] "{} wybranych piosenek"
msgstr[3] ""
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr ""
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr ""
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr ""
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr ""
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr ""
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr ""
@@ -249,7 +250,7 @@ msgstr "Najlepsze piosenki"
msgid "Duration"
msgstr "Długość"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Prawa autorskie"
@@ -258,3 +259,99 @@ msgstr "Prawa autorskie"
msgid "{} by {}"
msgstr ""
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/pt-br.po b/po/pt-br.po
index e1d083f5..6529d167 100644
--- a/po/pt-br.po
+++ b/po/pt-br.po
@@ -20,7 +20,7 @@ msgstr "Copiar link"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Adicionar a fila"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Não foi possível salvar a senha. Verifique se o seu chaveiro de sessão está desbloqueado."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Ocorreu um erro. Verifique os logs para mais detalhes!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Biblioteca"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Listas de reprodução"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Tocando agora"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Nenhum música sendo executada"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Sobre"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Fechar"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Sair"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Conexão reestabelecida"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Melhores faixas"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Lançamentos"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Entrar"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Álbuns"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistas"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr ""
@@ -187,6 +187,7 @@ msgstr ""
msgid "Your library will be shown here."
msgstr ""
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} música selecionada"
msgstr[1] "{} músicas selecionadas"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr ""
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr ""
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr ""
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr ""
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr ""
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr ""
@@ -247,7 +248,7 @@ msgstr "Faixas"
msgid "Duration"
msgstr "Duração"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr ""
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/pt.po b/po/pt.po
index 29a040b6..9173087c 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -20,7 +20,7 @@ msgstr "Copiar ligação"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Adicionar à fila"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Não foi possível guardar a palavra-passe. Garanta que o chaveiro da sessão está desbloqueado."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Ocorreu um erro! Verifique os logs para mais detalhes!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Biblioteca"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Listas de reprodução"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "A reproduzir"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Nenhuma canção a ser reproduzida"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Sobre"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Sair"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Terminar sessão"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Conexão restaurada"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Melhores faixas"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Lançamentos"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Autenticar"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Álbums"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Artistas"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr ""
@@ -187,6 +187,7 @@ msgstr ""
msgid "Your library will be shown here."
msgstr ""
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} canção selecionada"
msgstr[1] "{} canções selecionadas"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr ""
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr ""
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr ""
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr ""
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr ""
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr ""
@@ -247,7 +248,7 @@ msgstr "Faixas"
msgid "Duration"
msgstr "Duração"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Copyright"
@@ -256,3 +257,99 @@ msgstr "Copyright"
msgid "{} by {}"
msgstr ""
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/ru.po b/po/ru.po
index acd27569..140c34fe 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -20,7 +20,7 @@ msgstr "Скопировать ссылку"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Добавить в очередь"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Не удалось сохранить пароль. Убедитесь, что связка ключей сеанса разблокирована."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Произошла ошибка. Смотрите подробности в логах!"
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Фонотека"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Плейлисты"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Воспроизводится сейчас"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Песня сейчас не играет"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "О Spot"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Выйти из программы"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Выйти из аккаунта"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Подключение восстановлено"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Топ треков"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Релизы"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Войти"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Альбомы"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Исполнители"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Сохраненные треки"
@@ -187,6 +187,7 @@ msgstr "У вас нет сохраненных альбомов."
msgid "Your library will be shown here."
msgstr "Здесь будет показана ваша фонотека."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -196,31 +197,31 @@ msgstr[2] "{} композиций выбрано"
msgstr[3] ""
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Поиск в Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Введите для поиска."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Удалить"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Добавить в плейлист..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Отменить"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Выбрать все"
@@ -249,7 +250,7 @@ msgstr "Треки"
msgid "Duration"
msgstr "Продолжительность"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Авторское право"
@@ -258,3 +259,99 @@ msgstr "Авторское право"
msgid "{} by {}"
msgstr "{} в исполнении {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/sl.po b/po/sl.po
index ad275997..fa55a402 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -20,7 +20,7 @@ msgstr "Kopiraj povezavo"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Dodaj v vrsto"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Gesla ni bilo mogoče shraniti. Preveri, da je session keyring odklenjen."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Napaka! Poglej v dnevnik od programa za podrobnosti."
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Moja zbirka"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Seznami predvajanja"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Se predvaja"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Ni skladb za predvajanje"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "O programu"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Izhod"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Odjava"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Povezava ponovno vzpovstavljena"
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "Priljubljene skladbe"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Izdaje"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Prijava"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albumi"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Izvajalci"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr "Shranjene skladbe"
@@ -187,6 +187,7 @@ msgstr "Nimaš shranjenih albumov."
msgid "Your library will be shown here."
msgstr "Tvoja zbirka bo prikazana tukaj."
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -196,31 +197,31 @@ msgstr[2] "{} izbrane skladbe"
msgstr[3] "{} izbranih skladb"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr "Razišči Spotify."
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr "Napiši za iskanje."
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr "Odstrani"
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr "Dodaj na seznam predvajanja..."
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr "Prekliči"
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr "Izberi vse"
@@ -249,7 +250,7 @@ msgstr "Skladbe"
msgid "Duration"
msgstr "Trajanje"
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr "Avtorska pravica"
@@ -258,3 +259,99 @@ msgstr "Avtorska pravica"
msgid "{} by {}"
msgstr "{} od {}"
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/spot.pot b/po/spot.pot
index e68de333..fbd6f1aa 100644
--- a/po/spot.pot
+++ b/po/spot.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: spot\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-22 18:12+0100\n"
+"POT-Creation-Date: 2022-03-13 13:00-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -19,7 +19,7 @@ msgstr ""
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:118
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr ""
@@ -35,7 +35,7 @@ msgstr ""
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr ""
@@ -72,19 +72,19 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr ""
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
+#: src/app/components/navigation/factory.rs:32
#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr ""
#. translators: This is a sidebar entry that marks that the entries below are playlists.
-#: src/app/components/navigation/factory.rs:47
+#: src/app/components/navigation/factory.rs:51
#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr ""
#. translators: This is a sidebar entry to browse to saved tracks.
-#: src/app/components/navigation/factory.rs:76
+#: src/app/components/navigation/factory.rs:82
#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr ""
@@ -94,7 +94,7 @@ msgid "Unnamed playlist"
msgstr ""
#: src/app/components/navigation/home.rs:87
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr ""
@@ -118,25 +118,38 @@ msgstr ""
msgid "No song playing"
msgstr ""
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr ""
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr ""
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr ""
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr ""
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
#. A title that is shown when the user has not saved any playlists.
#: src/app/components/saved_playlists/saved_playlists.ui:26
msgid "You have no saved playlists."
@@ -153,39 +166,115 @@ msgid "Top tracks"
msgstr ""
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr ""
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr ""
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr ""
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr ""
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr ""
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid ""
+"Port used for connections to Spotify's Access Point. Set to 0 if any port is "
+"fine."
+msgstr ""
+
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr ""
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr ""
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
#. This refers to a music label
#: src/app/components/details/release_details.ui:38
msgid "Label"
@@ -201,12 +290,7 @@ msgstr ""
msgid "Tracks"
msgstr ""
-#. This refers to the duration of a release
#: src/app/components/details/release_details.ui:68
-msgid "Duration"
-msgstr ""
-
-#: src/app/components/details/release_details.ui:78
msgid "Copyright"
msgstr ""
@@ -241,12 +325,12 @@ msgid "Log in"
msgstr ""
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr ""
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr ""
diff --git a/po/tr.po b/po/tr.po
index e06dae69..5637788d 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -20,7 +20,7 @@ msgstr "Bağlantıyı kopyala"
#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
#: src/app/components/labels.rs:11
-#: src/app/components/selection/selection_toolbar.ui:37
+#: src/app/components/selection/selection_toolbar.ui:39
msgid "Add to queue"
msgstr "Sıraya ekle"
@@ -40,25 +40,25 @@ msgid "Could not save password. Make sure the session keyring is unlocked."
msgstr "Şifreniz kaydedilemedi. Oturum anahtarlığınızın kilidinin açık olduğundan emin olun."
#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
-#: src/app/batch_loader.rs:91 src/app/components/mod.rs:117
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
msgid "An error occured. Check logs for details!"
msgstr "Bir hata meydana geldi. Günlükleri kontrol edin."
#. translators: This is a sidebar entry to browse to saved albums.
-#: src/app/components/navigation/factory.rs:29
-#: src/app/components/navigation/home.rs:36
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
msgid "Library"
msgstr "Kütüphane"
#. translators: This is a sidebar entry to browse to saved playlists.
-#: src/app/components/navigation/factory.rs:44
-#: src/app/components/navigation/home.rs:42
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
msgid "Playlists"
msgstr "Oynatma listesi"
#. This is the visible name for the play queue. It appears in the sidebar as well.
-#: src/app/components/navigation/home.rs:53
-#: src/app/components/now_playing/now_playing_model.rs:152
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
msgid "Now playing"
msgstr "Şu an oynatılıyor"
@@ -70,21 +70,21 @@ msgid "No song playing"
msgstr "Herhangi bir şarkı oynatılmıyor"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:56
+#: src/app/components/user_menu/user_menu.rs:67
msgid "About"
msgstr "Hakkında"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:58
+#: src/app/components/user_menu/user_menu.rs:69
msgid "Quit"
msgstr "Çıkış"
#. translators: This is a menu entry.
-#: src/app/components/user_menu/user_menu.rs:63
+#: src/app/components/user_menu/user_menu.rs:74
msgid "Log out"
msgstr "Oturumdan çık"
-#: src/app/state/login_state.rs:117
+#: src/app/state/login_state.rs:110
msgid "Connection restored"
msgstr "Bağlantı geri yüklendi."
@@ -94,7 +94,7 @@ msgid "Top tracks"
msgstr "En çok dinlenenler"
#. Title of the sections that contains all releases from an artist (both singles and albums).
-#: src/app/components/artist_details/artist_details.ui:55
+#: src/app/components/artist_details/artist_details.ui:53
msgid "Releases"
msgstr "Parçalar"
@@ -124,17 +124,17 @@ msgid "Log in"
msgstr "Giriş yap"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:70
+#: src/app/components/search/search.ui:72
msgid "Albums"
msgstr "Albümler"
#. This is the title of a section of the search results
-#: src/app/components/search/search.ui:103
+#: src/app/components/search/search.ui:105
msgid "Artists"
msgstr "Sanatçılar"
-#: src/app/components/navigation/factory.rs:73
-#: src/app/components/navigation/home.rs:48
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
msgid "Saved tracks"
msgstr ""
@@ -187,6 +187,7 @@ msgstr ""
msgid "Your library will be shown here."
msgstr ""
+#. translators: This shows up when in selection mode. This text should be as short as possible.
#: src/app/components/labels.rs:30
msgid "{} song selected"
msgid_plural "{} songs selected"
@@ -194,31 +195,31 @@ msgstr[0] "{} seçildi"
msgstr[1] "{} seçildi"
#. Title for the empty search page (initial state).
-#: src/app/components/search/search.ui:114
+#: src/app/components/search/search.ui:116
msgid "Search Spotify."
msgstr ""
#. Subtitle for the empty search page (initial state).
-#: src/app/components/search/search.ui:115
+#: src/app/components/search/search.ui:117
msgid "Type to search."
msgstr ""
-#: src/app/components/selection/selection_toolbar.ui:58
+#: src/app/components/selection/selection_toolbar.ui:69
msgid "Remove"
msgstr ""
#. playlist2-symbolic
-#: src/app/components/selection/selection_toolbar.ui:47
+#: src/app/components/selection/selection_toolbar.ui:56
msgid "Add to playlist..."
msgstr ""
#. Button label. Exits selection mode.
-#: src/app/components/headerbar/headerbar.ui:46
+#: src/app/components/headerbar/headerbar.ui:47
msgid "Cancel"
msgstr ""
#. Button label. Selects all visible songs.
-#: src/app/components/headerbar/headerbar.ui:57
+#: src/app/components/headerbar/headerbar.ui:58
msgid "Select all"
msgstr ""
@@ -249,7 +250,7 @@ msgstr "En çok dinlenenler"
msgid "Duration"
msgstr ""
-#: src/app/components/details/release_details.ui:78
+#: src/app/components/details/release_details.ui:68
msgid "Copyright"
msgstr ""
@@ -258,3 +259,99 @@ msgstr ""
msgid "{} by {}"
msgstr ""
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 00000000..ec336439
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,357 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: POEditor.com\n"
+"Project-Id-Version: Spot\n"
+"Language: uk\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry allows viewing the album containing a specific track.
+#: src/app/components/labels.rs:5
+msgid "View album"
+msgstr "Подивитися альбом"
+
+#. translators: This is part of a contextual menu attached to a single track; the intent is to copy the link (public URL) to a specific track.
+#: src/app/components/labels.rs:8
+msgid "Copy link"
+msgstr "Копіювати посилання"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry adds a track at the end of the play queue.
+#: src/app/components/labels.rs:11
+#: src/app/components/selection/selection_toolbar.ui:39
+msgid "Add to queue"
+msgstr "Додати в чергу"
+
+#. translators: This is part of a contextual menu attached to a single track; this entry removes a track from the play queue.
+#: src/app/components/labels.rs:14
+msgid "Remove from queue"
+msgstr "Видалити з черги"
+
+#. translators: This is part of a larger text that says "Add to ". This text should be as short as possible.
+#: src/app/components/labels.rs:21
+msgid "Add to {}"
+msgstr "Додати в {}"
+
+#. translators: This notification shows up right after login if the password could not be stored in the keyring (that is, GNOME's keyring aka seahorse, or any other libsecret compliant secret store).
+#: src/app/components/login/login_model.rs:56
+msgid "Could not save password. Make sure the session keyring is unlocked."
+msgstr "Не вдалося зберегти пароль. Переконайтесь, що зв'язка ключів сеансу розблокована."
+
+#. translators: This notification is the default message for unhandled errors. Logs refer to console output.
+#: src/app/batch_loader.rs:91 src/app/components/mod.rs:122
+msgid "An error occured. Check logs for details!"
+msgstr "Сталася помилка. Перевірте журнал для детальної інформації!"
+
+#. translators: This is a sidebar entry to browse to saved albums.
+#: src/app/components/navigation/factory.rs:32
+#: src/app/components/navigation/home.rs:68
+msgid "Library"
+msgstr "Бібліотека"
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/factory.rs:51
+#: src/app/components/navigation/home.rs:94
+msgid "Playlists"
+msgstr "Плейлисти"
+
+#. This is the visible name for the play queue. It appears in the sidebar as well.
+#: src/app/components/navigation/home.rs:87
+#: src/app/components/now_playing/now_playing_model.rs:134
+msgid "Now playing"
+msgstr "Відтворюється зараз"
+
+#. translators: Short text displayed instead of a song title when nothing plays
+#. Short text displayed instead of a song title when nothing plays
+#: src/app/components/playback/playback_info.rs:58
+#: src/app/components/playback/playback_info.ui:32
+msgid "No song playing"
+msgstr "Пісня зараз не грає"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:67
+msgid "About"
+msgstr "Про Spot"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:69
+msgid "Quit"
+msgstr "Вийти з програми"
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:74
+msgid "Log out"
+msgstr "Вийти з аккаунту"
+
+#: src/app/state/login_state.rs:110
+msgid "Connection restored"
+msgstr "З'єднання відновлено"
+
+#. Title of the section that shows 5 of the top tracks for an artist, as defined by Spotify.
+#: src/app/components/artist_details/artist_details.ui:26
+msgid "Top tracks"
+msgstr "Топ треків"
+
+#. Title of the sections that contains all releases from an artist (both singles and albums).
+#: src/app/components/artist_details/artist_details.ui:53
+msgid "Releases"
+msgstr "Релізи"
+
+#. Login window title -- shouldn't be too long, but must mention Premium (a premium account is required).
+#: src/app/components/login/login.ui:45
+msgid "Login to Spotify Premium"
+msgstr "Увійти в Spotify Premium"
+
+#. Placeholder for the username field
+#: src/app/components/login/login.ui:64
+msgid "Username"
+msgstr "Логін"
+
+#. Placeholder for the password field
+#: src/app/components/login/login.ui:72
+msgid "Password"
+msgstr "Пароль"
+
+#. This error is shown when authentication fails.
+#: src/app/components/login/login.ui:126
+msgid "Authentication failed!"
+msgstr "Помилка входу!"
+
+#. Log in button label
+#: src/app/components/login/login.ui:141
+msgid "Log in"
+msgstr "Увійти"
+
+#. This is the title of a section of the search results
+#: src/app/components/search/search.ui:72
+msgid "Albums"
+msgstr "Альбоми"
+
+#. This is the title of a section of the search results
+#: src/app/components/search/search.ui:105
+msgid "Artists"
+msgstr "Виконавці"
+
+#: src/app/components/navigation/factory.rs:82
+#: src/app/components/navigation/home.rs:78
+msgid "Saved tracks"
+msgstr ""
+
+#. This information is shown when Caps Lock is enabled.
+#: src/app/components/login/login.ui:95
+msgid "Caps Lock is enabled!"
+msgstr ""
+
+#: src/app/components/playback/playback_controls.rs:64
+msgid "Pause"
+msgstr ""
+
+#: src/app/components/playback/playback_controls.rs:66
+msgid "Play"
+msgstr ""
+
+#: src/app/components/playback/playback_controls.ui:17
+msgid "Shuffle"
+msgstr ""
+
+#: src/app/components/playback/playback_controls.ui:27
+msgid "Previous"
+msgstr ""
+
+#: src/app/components/playback/playback_controls.ui:50
+msgid "Next"
+msgstr ""
+
+#: src/app/components/playback/playback_controls.ui:60
+msgid "Repeat"
+msgstr ""
+
+#. A title that is shown when the user has not saved any playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:26
+msgid "You have no saved playlists."
+msgstr ""
+
+#. A description of what happens when the user has saved playlists.
+#: src/app/components/saved_playlists/saved_playlists.ui:27
+msgid "Your playlists will be shown here."
+msgstr ""
+
+#. A title that is shown when the user has not saved any albums.
+#: src/app/components/library/library.ui:26
+msgid "You have no saved albums."
+msgstr ""
+
+#. A description of what happens when the user has saved albums.
+#: src/app/components/library/library.ui:27
+msgid "Your library will be shown here."
+msgstr ""
+
+#. translators: This shows up when in selection mode. This text should be as short as possible.
+#: src/app/components/labels.rs:30
+msgid "{} song selected"
+msgid_plural "{} songs selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#. Title for the empty search page (initial state).
+#: src/app/components/search/search.ui:116
+msgid "Search Spotify."
+msgstr ""
+
+#. Subtitle for the empty search page (initial state).
+#: src/app/components/search/search.ui:117
+msgid "Type to search."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:69
+msgid "Remove"
+msgstr ""
+
+#. playlist2-symbolic
+#: src/app/components/selection/selection_toolbar.ui:56
+msgid "Add to playlist..."
+msgstr ""
+
+#. Button label. Exits selection mode.
+#: src/app/components/headerbar/headerbar.ui:47
+msgid "Cancel"
+msgstr ""
+
+#. Button label. Selects all visible songs.
+#: src/app/components/headerbar/headerbar.ui:58
+msgid "Select all"
+msgstr ""
+
+#. translators: This is part of a contextual menu attached to a single track; the full text is "More from ".
+#: src/app/components/labels.rs:39
+msgid "More from {}"
+msgstr ""
+
+#. This refers to a music label
+#: src/app/components/details/release_details.ui:38
+msgid "Label"
+msgstr ""
+
+#. This refers to a release date
+#: src/app/components/details/release_details.ui:48
+msgid "Released"
+msgstr ""
+
+#. This refers to a number of tracks
+#: src/app/components/details/release_details.ui:58
+msgid "Tracks"
+msgstr ""
+
+#. This refers to the duration of a release
+#: src/app/components/details/release_details.ui:68
+msgid "Duration"
+msgstr ""
+
+#: src/app/components/details/release_details.ui:68
+msgid "Copyright"
+msgstr ""
+
+#. translators: This is part of a larger label that reads " by "
+#: src/app/components/labels.rs:48
+msgid "{} by {}"
+msgstr ""
+
+#: src/app/components/navigation/home.rs:32
+msgid "Unnamed playlist"
+msgstr ""
+
+#. translators: This is a sidebar entry to browse to saved playlists.
+#: src/app/components/navigation/home.rs:104
+msgid "All Playlists"
+msgstr ""
+
+#: src/app/components/selection/component.rs:66
+msgid "Tracks saved!"
+msgstr ""
+
+#. translators: This is a menu entry.
+#: src/app/components/user_menu/user_menu.rs:65
+msgid "Preferences"
+msgstr ""
+
+#: src/main.rs:81
+msgid "Failed to open link!"
+msgstr ""
+
+#. Header for a group of preference items regarding audio
+#: src/app/components/settings/settings.ui:13
+msgid "Audio"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:16
+msgid "Audio Backend"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:29
+msgid "ALSA Device"
+msgstr ""
+
+#. Description for the item (ALSA Device) in preferences
+#: src/app/components/settings/settings.ui:30
+msgid "Applied only if audio backend is ALSA"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:40
+msgid "Audio Quality"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:44
+msgid "Normal"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:45
+msgid "High"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:46
+msgid "Very high"
+msgstr ""
+
+#. Header for a group of preference items regarding the application's appearance
+#: src/app/components/settings/settings.ui:56
+msgid "Appearance"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:59
+msgid "Theme"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:63
+msgid "Light"
+msgstr ""
+
+#: src/app/components/settings/settings.ui:64
+msgid "Dark"
+msgstr ""
+
+#. Header for a group of preference items regarding network
+#: src/app/components/settings/settings.ui:74
+msgid "Network"
+msgstr ""
+
+#. Title for an item in preferences
+#: src/app/components/settings/settings.ui:77
+msgid "Access Point Port"
+msgstr ""
+
+#. Longer description for an item (Access Point Port) in preferences
+#: src/app/components/settings/settings.ui:78
+msgid "Port used for connections to Spotify's Access Point. Set to 0 if any port is fine."
+msgstr ""
+
+#: src/app/components/selection/selection_toolbar.ui:90
+msgid "Save to library"
+msgstr ""
+
diff --git a/src/api/api_models.rs b/src/api/api_models.rs
index 61525997..b96f1592 100644
--- a/src/api/api_models.rs
+++ b/src/api/api_models.rs
@@ -13,6 +13,11 @@ pub struct Uris {
pub uris: Vec,
}
+#[derive(Serialize)]
+pub struct Ids {
+ pub ids: Vec,
+}
+
pub enum SearchType {
Artist,
Album,
@@ -114,7 +119,7 @@ impl IntoIterator for Page {
type IntoIter = IntoIter;
fn into_iter(self) -> Self::IntoIter {
- self.items.unwrap_or_else(Vec::new).into_iter()
+ self.items.unwrap_or_default().into_iter()
}
}
@@ -208,6 +213,7 @@ pub struct Album {
pub struct AlbumInfo {
pub label: String,
pub copyrights: Vec,
+ pub total_tracks: u32,
}
#[derive(Deserialize, Debug, Clone)]
@@ -435,12 +441,10 @@ impl From for AlbumDescription {
name: a.name.clone(),
})
.collect::>();
- let songs = SongList::new_from_initial_batch(
- album
- .clone()
- .try_into()
- .unwrap_or_else(|_| SongBatch::empty()),
- ); //FIXME
+ let songs = album
+ .clone()
+ .try_into()
+ .unwrap_or_else(|_| SongBatch::empty());
let art = album.best_image_for_width(200).map(|i| i.url.clone());
Self {
@@ -456,7 +460,13 @@ impl From for AlbumDescription {
}
impl From for AlbumReleaseDetails {
- fn from(AlbumInfo { label, copyrights }: AlbumInfo) -> Self {
+ fn from(
+ AlbumInfo {
+ label,
+ copyrights,
+ total_tracks,
+ }: AlbumInfo,
+ ) -> Self {
let copyright_text = copyrights
.iter()
.map(|c| format!("[{}] {}", c.type_, c.text))
@@ -466,6 +476,7 @@ impl From for AlbumReleaseDetails {
Self {
label,
copyright_text,
+ total_tracks: total_tracks as usize,
}
}
}
@@ -489,7 +500,7 @@ impl From for PlaylistDescription {
id,
title: name,
art,
- songs: SongList::new_from_initial_batch(song_batch),
+ songs: song_batch,
owner: UserRef {
id: owner_id,
display_name,
diff --git a/src/api/cache.rs b/src/api/cache.rs
index e29e7f31..e2359a7a 100644
--- a/src/api/cache.rs
+++ b/src/api/cache.rs
@@ -1,5 +1,6 @@
use async_std::fs;
use async_std::io;
+use async_std::path::Path;
use async_std::path::PathBuf;
use async_std::prelude::*;
use core::mem::size_of;
@@ -10,6 +11,8 @@ use std::future::Future;
use std::time::{Duration, SystemTime};
use thiserror::Error;
+const EXPIRY_FILE_EXT: &str = ".expiry";
+
#[derive(Error, Debug)]
pub enum CacheError {
#[error("No content available")]
@@ -80,13 +83,12 @@ pub struct CacheManager {
}
impl CacheManager {
- pub fn new(dirs: &[&str]) -> Option {
+ pub fn for_dir(dir: &str) -> Option {
let root: PathBuf = glib::user_cache_dir().into();
+ let root = root.join(dir);
let mask = 0o744;
- for &dir in dirs.iter() {
- glib::mkdir_with_parents(root.join(dir), mask);
- }
+ glib::mkdir_with_parents(&root, mask);
Some(Self { root })
}
@@ -96,7 +98,7 @@ impl CacheManager {
}
fn cache_meta_path(&self, resource: &str) -> PathBuf {
- let full = format!("{}.{}", resource, "expiry");
+ let full = resource.to_string() + EXPIRY_FILE_EXT;
self.root.join(&full)
}
}
@@ -178,10 +180,8 @@ impl CacheManager {
Ok(())
}
- pub async fn clear_cache_pattern(&self, dir: &str, regex: &Regex) -> Result<(), CacheError> {
- let dir_path = self.cache_path(dir);
-
- let mut entries = fs::read_dir(dir_path)
+ pub async fn clear_cache_pattern(&self, regex: &Regex) -> Result<(), CacheError> {
+ let mut entries = fs::read_dir(&self.root)
.await
.map_err(CacheError::ReadError)?;
@@ -192,19 +192,25 @@ impl CacheManager {
.map(|s| regex.is_match(s))
.unwrap_or(false);
if matches {
+ info!("Removing {}...", entry.file_name().to_str().unwrap_or(""));
fs::remove_file(entry.path())
.await
.map_err(CacheError::RemoveError)?;
+ if let Some(expiry_file_path) = entry
+ .path()
+ .to_str()
+ .map(|path| path.to_string() + EXPIRY_FILE_EXT)
+ {
+ let _ = fs::remove_file(Path::new(&expiry_file_path)).await;
+ }
}
}
Ok(())
}
- pub async fn set_expired_pattern(&self, dir: &str, regex: &Regex) -> Result<(), CacheError> {
- let dir_path = self.cache_path(dir);
-
- let mut entries = fs::read_dir(dir_path)
+ pub async fn set_expired_pattern(&self, regex: &Regex) -> Result<(), CacheError> {
+ let mut entries = fs::read_dir(&self.root)
.await
.map_err(CacheError::ReadError)?;
@@ -212,6 +218,7 @@ impl CacheManager {
let matches = entry
.file_name()
.to_str()
+ .and_then(|s| s.strip_suffix(EXPIRY_FILE_EXT))
.map(|s| regex.is_match(s))
.unwrap_or(false);
if matches {
diff --git a/src/api/cached_client.rs b/src/api/cached_client.rs
index c5b467fe..c7702cd8 100644
--- a/src/api/cached_client.rs
+++ b/src/api/cached_client.rs
@@ -10,24 +10,6 @@ use super::cache::{CacheExpiry, CacheManager, CachePolicy, FetchResult};
use super::client::{SpotifyApiError, SpotifyClient, SpotifyResponse, SpotifyResponseKind};
use crate::app::models::*;
-lazy_static! {
- pub static ref ME_ALBUMS_CACHE: Regex =
- Regex::new(r"^me_albums_\w+_\w+\.json\.expiry$").unwrap();
- pub static ref USER_CACHE: Regex =
- Regex::new(r"^me_(albums|playlists)_\w+_\w+\.json(\.expiry)?$").unwrap();
- pub static ref ALL_CACHE: Regex =
- Regex::new(r"^(me_albums_|me_playlists_|album_|playlist_|artist_)\w+\.json(\.expiry)?$")
- .unwrap();
-}
-
-fn _playlist_cache(id: &str) -> Regex {
- Regex::new(&format!(
- r"^playlist(_{}|item_{}_\w+_\w+)\.json\.expiry$",
- id, id
- ))
- .unwrap()
-}
-
pub type SpotifyResult = Result;
pub trait SpotifyApiClient {
@@ -61,8 +43,12 @@ pub trait SpotifyApiClient {
fn save_album(&self, id: &str) -> BoxFuture>;
+ fn save_tracks(&self, ids: Vec) -> BoxFuture>;
+
fn remove_saved_album(&self, id: &str) -> BoxFuture>;
+ fn remove_saved_tracks(&self, ids: Vec) -> BoxFuture>;
+
fn get_saved_playlists(
&self,
offset: usize,
@@ -145,6 +131,17 @@ impl<'a> SpotCacheKey<'a> {
}
}
+lazy_static! {
+ pub static ref ME_TRACKS_CACHE: Regex = Regex::new(r"^me_tracks_\w+_\w+\.json$").unwrap();
+ pub static ref ME_ALBUMS_CACHE: Regex = Regex::new(r"^me_albums_\w+_\w+\.json$").unwrap();
+ pub static ref USER_CACHE: Regex =
+ Regex::new(r"^me_(albums|playlists|tracks)_\w+_\w+\.json$").unwrap();
+}
+
+fn playlist_cache_key(id: &str) -> Regex {
+ Regex::new(&format!(r"^playlist(_{}|item_{}_\w+_\w+)\.json$", id, id)).unwrap()
+}
+
pub struct CachedSpotifyClient {
client: SpotifyClient,
cache: CacheManager,
@@ -154,7 +151,7 @@ impl CachedSpotifyClient {
pub fn new() -> CachedSpotifyClient {
CachedSpotifyClient {
client: SpotifyClient::new(),
- cache: CacheManager::new(&["spot/net"]).unwrap(),
+ cache: CacheManager::for_dir("spot/net").unwrap(),
}
}
@@ -201,7 +198,7 @@ impl CachedSpotifyClient {
T: DeserializeOwned,
{
let write = &write;
- let cache_key = format!("spot/net/{}", key.into_raw());
+ let cache_key = key.into_raw();
let raw = self
.cache
.get_or_write(
@@ -302,7 +299,7 @@ impl SpotifyApiClient for CachedSpotifyClient {
Box::pin(async move {
self.cache
- .set_expired_pattern("spot/net", &_playlist_cache(&id))
+ .set_expired_pattern(&playlist_cache_key(&id))
.await
.unwrap_or(());
@@ -319,7 +316,7 @@ impl SpotifyApiClient for CachedSpotifyClient {
Box::pin(async move {
self.cache
- .set_expired_pattern("spot/net", &_playlist_cache(&id))
+ .set_expired_pattern(&playlist_cache_key(&id))
.await
.unwrap_or(());
@@ -362,27 +359,39 @@ impl SpotifyApiClient for CachedSpotifyClient {
let id = id.to_owned();
Box::pin(async move {
- self.cache
- .set_expired_pattern("spot/net", &*ME_ALBUMS_CACHE)
- .await
- .unwrap_or(());
+ let _ = self.cache.set_expired_pattern(&*ME_ALBUMS_CACHE).await;
self.client.save_album(&id).send_no_response().await?;
self.get_album(&id[..]).await.map(|a| a.description)
})
}
+ fn save_tracks(&self, ids: Vec) -> BoxFuture> {
+ Box::pin(async move {
+ let _ = self.cache.set_expired_pattern(&*ME_TRACKS_CACHE).await;
+ self.client.save_tracks(ids).send_no_response().await?;
+ Ok(())
+ })
+ }
+
fn remove_saved_album(&self, id: &str) -> BoxFuture> {
let id = id.to_owned();
Box::pin(async move {
- self.cache
- .set_expired_pattern("spot/net", &*ME_ALBUMS_CACHE)
- .await
- .unwrap_or(());
+ let _ = self.cache.set_expired_pattern(&*ME_ALBUMS_CACHE).await;
self.client.remove_saved_album(&id).send_no_response().await
})
}
+ fn remove_saved_tracks(&self, ids: Vec) -> BoxFuture> {
+ Box::pin(async move {
+ let _ = self.cache.set_expired_pattern(&*ME_TRACKS_CACHE).await;
+ self.client
+ .remove_saved_tracks(ids)
+ .send_no_response()
+ .await
+ })
+ }
+
fn get_album_tracks(
&self,
id: &str,
@@ -485,7 +494,7 @@ impl SpotifyApiClient for CachedSpotifyClient {
})
}
- fn get_artist(&self, id: &str) -> BoxFuture> {
+ fn get_artist(&self, id: &str) -> BoxFuture> {
let id = id.to_owned();
Box::pin(async move {
@@ -579,7 +588,7 @@ impl SpotifyApiClient for CachedSpotifyClient {
})
}
- fn get_user(&self, id: &str) -> BoxFuture> {
+ fn get_user(&self, id: &str) -> BoxFuture> {
let id = id.to_owned();
Box::pin(async move {
diff --git a/src/api/client.rs b/src/api/client.rs
index fda516e3..13022f50 100644
--- a/src/api/client.rs
+++ b/src/api/client.rs
@@ -152,8 +152,8 @@ pub enum SpotifyApiError {
NoToken,
#[error("No content from request")]
NoContent,
- #[error("Request failed with status {0}")]
- BadStatus(u16),
+ #[error("Request failed ({0}): {1}")]
+ BadStatus(u16, String),
#[error(transparent)]
ClientError(#[from] isahc::Error),
#[error(transparent)]
@@ -253,7 +253,13 @@ impl SpotifyClient {
max_age: cache_control.unwrap_or(10),
etag,
}),
- s => Err(SpotifyApiError::BadStatus(s.as_u16())),
+ s => Err(SpotifyApiError::BadStatus(
+ s.as_u16(),
+ result
+ .text()
+ .await
+ .unwrap_or_else(|_| "(no details available)".to_string()),
+ )),
}
}
@@ -261,7 +267,7 @@ impl SpotifyClient {
where
B: Into,
{
- let result = self.client.send_async(request).await?;
+ let mut result = self.client.send_async(request).await?;
match result.status() {
StatusCode::UNAUTHORIZED => {
self.clear_token();
@@ -269,7 +275,13 @@ impl SpotifyClient {
}
StatusCode::NOT_MODIFIED => Ok(()),
s if s.is_success() => Ok(()),
- s => Err(SpotifyApiError::BadStatus(s.as_u16())),
+ s => Err(SpotifyApiError::BadStatus(
+ s.as_u16(),
+ result
+ .text()
+ .await
+ .unwrap_or_else(|_| "(no details available)".to_string()),
+ )),
}
}
}
@@ -323,6 +335,13 @@ impl SpotifyClient {
.uri("/v1/me/albums".to_string(), Some(&query))
}
+ pub(crate) fn save_tracks(&self, ids: Vec) -> SpotifyRequest<'_, Vec, ()> {
+ self.request()
+ .method(Method::PUT)
+ .uri("/v1/me/tracks".to_string(), None)
+ .json_body(Ids { ids })
+ }
+
pub(crate) fn remove_saved_album(&self, id: &str) -> SpotifyRequest<'_, (), ()> {
let query = make_query_params().append_pair("ids", id).finish();
self.request()
@@ -330,6 +349,13 @@ impl SpotifyClient {
.uri("/v1/me/albums".to_string(), Some(&query))
}
+ pub(crate) fn remove_saved_tracks(&self, ids: Vec) -> SpotifyRequest<'_, Vec, ()> {
+ self.request()
+ .method(Method::DELETE)
+ .uri("/v1/me/tracks".to_string(), None)
+ .json_body(Ids { ids })
+ }
+
pub(crate) fn get_album(&self, id: &str) -> SpotifyRequest<'_, (), FullAlbum> {
self.request()
.method(Method::GET)
diff --git a/src/api/mod.rs b/src/api/mod.rs
index e089f611..8d986401 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -8,8 +8,8 @@ pub use cached_client::{CachedSpotifyClient, SpotifyApiClient, SpotifyResult};
pub use client::SpotifyApiError;
pub async fn clear_user_cache() -> Option<()> {
- cache::CacheManager::new(&[])?
- .clear_cache_pattern("spot/net", &*cached_client::USER_CACHE)
+ cache::CacheManager::for_dir("spot/net")?
+ .clear_cache_pattern(&*cached_client::USER_CACHE)
.await
.ok()
}
diff --git a/src/app.css b/src/app.css
index a623528c..762abf36 100644
--- a/src/app.css
+++ b/src/app.css
@@ -1,16 +1,6 @@
@define-color accent_bg_color @green_5;
@define-color accent_color @green_3;
-.notification {
- opacity: 0;
- transition: opacity 0.3s ease;
- border-radius: 6px;
-}
-
-.notification--shown {
- opacity: 1;
-}
-
.container {
transition: opacity 0.3s ease;
opacity: 0;
@@ -18,4 +8,4 @@
.container--loaded {
opacity: 1;
-}
+}
\ No newline at end of file
diff --git a/src/app/batch_loader.rs b/src/app/batch_loader.rs
index 708ff8c9..71664f66 100644
--- a/src/app/batch_loader.rs
+++ b/src/app/batch_loader.rs
@@ -85,7 +85,7 @@ impl BatchLoader {
match result {
Ok(batch) => create_action(batch),
Err(err) => {
- error!("Error: {:?}", err);
+ error!("Spotify API error: {}", err);
AppAction::ShowNotification(gettext(
// translators: This notification is the default message for unhandled errors. Logs refer to console output.
"An error occured. Check logs for details!",
diff --git a/src/app/components/artist_details/artist_details.rs b/src/app/components/artist_details/artist_details.rs
index 0425621c..729a81f1 100644
--- a/src/app/components/artist_details/artist_details.rs
+++ b/src/app/components/artist_details/artist_details.rs
@@ -90,7 +90,7 @@ impl ArtistDetailsWidget {
store: &ListStore,
on_album_pressed: F,
) where
- F: Fn(&String) + Clone + 'static,
+ F: Fn(String) + Clone + 'static,
{
self.widget()
.artist_releases
@@ -100,9 +100,7 @@ impl ArtistDetailsWidget {
let album = AlbumWidget::for_model(item, worker.clone());
let f = on_album_pressed.clone();
album.connect_album_pressed(clone!(@weak item => move |_| {
- if let Some(id) = item.uri().as_ref() {
- f(id);
- }
+ f(item.uri());
}));
child.set_child(Some(&album));
child.upcast::()
@@ -140,7 +138,6 @@ impl ArtistDetails {
widget.top_tracks_widget().clone(),
Rc::clone(&model),
worker,
- true,
));
Self {
diff --git a/src/app/components/artist_details/artist_details_model.rs b/src/app/components/artist_details/artist_details_model.rs
index 94316d9f..c8ccecec 100644
--- a/src/app/components/artist_details/artist_details_model.rs
+++ b/src/app/components/artist_details/artist_details_model.rs
@@ -3,6 +3,7 @@ use gio::SimpleActionGroup;
use std::ops::Deref;
use std::rc::Rc;
+use crate::api::SpotifyApiError;
use crate::app::components::SimpleHeaderBarModel;
use crate::app::components::{labels, PlaylistModel};
use crate::app::models::*;
@@ -10,7 +11,7 @@ use crate::app::state::SelectionContext;
use crate::app::state::{
BrowserAction, BrowserEvent, PlaybackAction, SelectionAction, SelectionState,
};
-use crate::app::{ActionDispatcher, AppAction, AppEvent, AppModel, ListDiff, ListStore};
+use crate::app::{ActionDispatcher, AppAction, AppEvent, AppModel, ListStore};
pub struct ArtistDetailsModel {
pub id: String,
@@ -27,11 +28,6 @@ impl ArtistDetailsModel {
}
}
- fn songs_ref(&self) -> Option> + '_> {
- self.app_model
- .map_state_opt(|s| Some(&s.browser.artist_state(&self.id)?.top_tracks))
- }
-
pub fn get_artist_name(&self) -> Option + '_> {
self.app_model
.map_state_opt(|s| s.browser.artist_state(&self.id)?.artist.as_ref())
@@ -46,15 +42,20 @@ impl ArtistDetailsModel {
let api = self.app_model.get_spotify();
self.dispatcher
.call_spotify_and_dispatch(move || async move {
- api.get_artist(&id)
- .await
- .map(|artist| BrowserAction::SetArtistDetails(Box::new(artist)).into())
+ let artist = api.get_artist(&id).await;
+ match artist {
+ Ok(artist) => Ok(BrowserAction::SetArtistDetails(Box::new(artist)).into()),
+ Err(SpotifyApiError::BadStatus(400, _))
+ | Err(SpotifyApiError::BadStatus(404, _)) => {
+ Ok(BrowserAction::NavigationPop.into())
+ }
+ Err(e) => Err(e),
+ }
});
}
- pub fn open_album(&self, id: &str) {
- self.dispatcher
- .dispatch(AppAction::ViewAlbum(id.to_string()));
+ pub fn open_album(&self, id: String) {
+ self.dispatcher.dispatch(AppAction::ViewAlbum(id));
}
pub fn load_more(&self) -> Option<()> {
@@ -70,7 +71,7 @@ impl ArtistDetailsModel {
.call_spotify_and_dispatch(move || async move {
api.get_artist_albums(&id, offset, batch_size)
.await
- .map(|albums| BrowserAction::AppendArtistReleases(albums).into())
+ .map(|albums| BrowserAction::AppendArtistReleases(id, albums).into())
});
Some(())
@@ -78,39 +79,31 @@ impl ArtistDetailsModel {
}
impl PlaylistModel for ArtistDetailsModel {
- fn current_song_id(&self) -> Option {
+ fn song_list_model(&self) -> SongListModel {
self.app_model
.get_state()
- .playback
- .current_song_id()
- .cloned()
+ .browser
+ .artist_state(&self.id)
+ .expect("illegal attempt to read artist_state")
+ .top_tracks
+ .clone()
}
- fn play_song_at(&self, _pos: usize, id: &str) {
- let tracks = self.songs_ref();
- if let Some(tracks) = tracks {
- self.dispatcher
- .dispatch(PlaybackAction::LoadSongs(tracks.clone()).into());
- self.dispatcher
- .dispatch(PlaybackAction::Load(id.to_string()).into());
- }
+ fn current_song_id(&self) -> Option {
+ self.app_model.get_state().playback.current_song_id()
}
- fn diff_for_event(&self, event: &AppEvent) -> Option> {
- if matches!(
- event,
- AppEvent::BrowserEvent(BrowserEvent::ArtistDetailsUpdated(id)) if id == &self.id
- ) {
- let tracks = self.songs_ref()?;
- Some(ListDiff::Set(tracks.iter().map(|s| s.into()).collect()))
- } else {
- None
- }
+ fn play_song_at(&self, _pos: usize, id: &str) {
+ let tracks: Vec = self.song_list_model().collect();
+ self.dispatcher
+ .dispatch(PlaybackAction::LoadSongs(tracks).into());
+ self.dispatcher
+ .dispatch(PlaybackAction::Load(id.to_string()).into());
}
fn actions_for(&self, id: &str) -> Option {
- let songs = self.songs_ref()?;
- let song = songs.iter().find(|&song| song.id == id)?;
+ let song = self.song_list_model().get(id)?;
+ let song = song.description();
let group = SimpleActionGroup::new();
@@ -125,8 +118,8 @@ impl PlaylistModel for ArtistDetailsModel {
}
fn menu_for(&self, id: &str) -> Option {
- let songs = self.songs_ref()?;
- let song = songs.iter().find(|&song| song.id == id)?;
+ let song = self.song_list_model().get(id)?;
+ let song = song.description();
let menu = gio::Menu::new();
menu.append(Some(&*labels::VIEW_ALBUM), Some("song.view_album"));
@@ -143,12 +136,10 @@ impl PlaylistModel for ArtistDetailsModel {
}
fn select_song(&self, id: &str) {
- let song = self
- .songs_ref()
- .and_then(|songs| songs.iter().find(|&song| song.id == id).cloned());
+ let song = self.song_list_model().get(id);
if let Some(song) = song {
self.dispatcher
- .dispatch(SelectionAction::Select(vec![song]).into());
+ .dispatch(SelectionAction::Select(vec![song.into_description()]).into());
}
}
@@ -185,10 +176,8 @@ impl SimpleHeaderBarModel for ArtistDetailsModel {
}
fn select_all(&self) {
- if let Some(songs) = self.songs_ref() {
- let songs: Vec = songs.iter().cloned().collect();
- self.dispatcher
- .dispatch(SelectionAction::Select(songs).into());
- }
+ let songs: Vec = self.song_list_model().collect();
+ self.dispatcher
+ .dispatch(SelectionAction::Select(songs).into());
}
}
diff --git a/src/app/components/details/details.rs b/src/app/components/details/details.rs
index 9dca0b13..fcb36c33 100644
--- a/src/app/components/details/details.rs
+++ b/src/app/components/details/details.rs
@@ -207,7 +207,7 @@ pub struct Details {
}
impl Details {
- pub fn new(model: Rc, worker: Worker) -> Self {
+ pub fn new(model: Rc, worker: Worker, leaflet: &libadwaita::Leaflet) -> Self {
if model.get_album_info().is_none() {
model.load_album_info();
}
@@ -218,10 +218,10 @@ impl Details {
widget.album_tracks_widget().clone(),
model.clone(),
worker.clone(),
- false,
));
let headerbar_widget = widget.headerbar_widget();
+ headerbar_widget.bind_to_leaflet(leaflet);
let headerbar = Box::new(HeaderBarComponent::new(
headerbar_widget.clone(),
model.to_headerbar_model(),
@@ -288,8 +288,7 @@ impl Details {
&album.artists_name(),
&details.label,
album.release_date.as_ref().unwrap(),
- album.songs.len(),
- &album.formatted_time(),
+ details.total_tracks,
&details.copyright_text,
);
diff --git a/src/app/components/details/details_model.rs b/src/app/components/details/details_model.rs
index 29c89f8b..12d98315 100644
--- a/src/app/components/details/details_model.rs
+++ b/src/app/components/details/details_model.rs
@@ -4,6 +4,7 @@ use std::cell::Ref;
use std::ops::Deref;
use std::rc::Rc;
+use crate::api::SpotifyApiError;
use crate::app::components::labels;
use crate::app::components::HeaderBarModel;
use crate::app::components::PlaylistModel;
@@ -12,10 +13,8 @@ use crate::app::components::SimpleHeaderBarModelWrapper;
use crate::app::dispatch::ActionDispatcher;
use crate::app::models::*;
use crate::app::state::SelectionContext;
-use crate::app::state::{
- BrowserAction, BrowserEvent, PlaybackAction, SelectionAction, SelectionState,
-};
-use crate::app::{AppAction, AppEvent, AppModel, AppState, BatchQuery, ListDiff, SongsSource};
+use crate::app::state::{BrowserAction, PlaybackAction, SelectionAction, SelectionState};
+use crate::app::{AppAction, AppEvent, AppModel, AppState, BatchQuery, SongsSource};
pub struct DetailsModel {
pub id: String,
@@ -36,19 +35,6 @@ impl DetailsModel {
self.app_model.get_state()
}
- fn songs_ref(&self) -> Option + '_> {
- self.app_model.map_state_opt(|s| {
- Some(
- &s.browser
- .details_state(&self.id)?
- .content
- .as_ref()?
- .description
- .songs,
- )
- })
- }
-
pub fn get_album_info(&self) -> Option + '_> {
self.app_model
.map_state_opt(|s| s.browser.details_state(&self.id)?.content.as_ref())
@@ -71,9 +57,15 @@ impl DetailsModel {
let api = self.app_model.get_spotify();
self.dispatcher
.call_spotify_and_dispatch(move || async move {
- api.get_album(&id)
- .await
- .map(|album| BrowserAction::SetAlbumDetails(Box::new(album)).into())
+ let album = api.get_album(&id).await;
+ match album {
+ Ok(album) => Ok(BrowserAction::SetAlbumDetails(Box::new(album)).into()),
+ Err(SpotifyApiError::BadStatus(400, _))
+ | Err(SpotifyApiError::BadStatus(404, _)) => {
+ Ok(BrowserAction::NavigationPop.into())
+ }
+ Err(e) => Err(e),
+ }
});
}
@@ -108,7 +100,7 @@ impl DetailsModel {
}
pub fn load_more(&self) -> Option<()> {
- let last_batch = self.songs_ref()?.last_batch()?;
+ let last_batch = self.song_list_model().last_batch()?;
let query = BatchQuery {
source: SongsSource::Album(self.id.clone()),
batch: last_batch,
@@ -140,11 +132,25 @@ impl DetailsModel {
}
impl PlaylistModel for DetailsModel {
+ fn song_list_model(&self) -> SongListModel {
+ self.app_model
+ .get_state()
+ .browser
+ .details_state(&self.id)
+ .expect("illegal attempt to read details_state")
+ .songs
+ .clone()
+ }
+
+ fn show_song_covers(&self) -> bool {
+ false
+ }
+
fn select_song(&self, id: &str) {
- let song = self.songs_ref().and_then(|songs| songs.get(id).cloned());
- if let Some(song) = song {
+ let songs = self.song_list_model();
+ if let Some(song) = songs.get(id) {
self.dispatcher
- .dispatch(SelectionAction::Select(vec![song]).into());
+ .dispatch(SelectionAction::Select(vec![song.description().clone()]).into());
}
}
@@ -164,12 +170,12 @@ impl PlaylistModel for DetailsModel {
}
fn current_song_id(&self) -> Option {
- self.state().playback.current_song_id().cloned()
+ self.state().playback.current_song_id()
}
fn play_song_at(&self, pos: usize, id: &str) {
let source = SongsSource::Album(self.id.clone());
- let batch = self.songs_ref().and_then(|songs| songs.song_batch_for(pos));
+ let batch = self.song_list_model().song_batch_for(pos);
if let Some(batch) = batch {
self.dispatcher
.dispatch(PlaybackAction::LoadPagedSongs(source, batch).into());
@@ -178,27 +184,9 @@ impl PlaylistModel for DetailsModel {
}
}
- fn diff_for_event(&self, event: &AppEvent) -> Option> {
- match event {
- AppEvent::BrowserEvent(BrowserEvent::AlbumDetailsLoaded(id)) if id == &self.id => {
- let songs = self.songs_ref()?;
- Some(ListDiff::Set(songs.iter().map(|s| s.into()).collect()))
- }
- AppEvent::BrowserEvent(BrowserEvent::AlbumTracksAppended(id, index))
- if id == &self.id =>
- {
- let songs = self.songs_ref()?;
- Some(ListDiff::Append(
- songs.iter().skip(*index).map(|s| s.into()).collect(),
- ))
- }
- _ => None,
- }
- }
-
fn actions_for(&self, id: &str) -> Option {
- let songs = self.songs_ref()?;
- let song = songs.get(id)?;
+ let song = self.song_list_model().get(id)?;
+ let song = song.description();
let group = SimpleActionGroup::new();
@@ -212,8 +200,8 @@ impl PlaylistModel for DetailsModel {
}
fn menu_for(&self, id: &str) -> Option {
- let songs = self.songs_ref()?;
- let song = songs.get(id)?;
+ let song = self.song_list_model().get(id)?;
+ let song = song.description();
let menu = gio::Menu::new();
for artist in song.artists.iter() {
@@ -243,10 +231,8 @@ impl SimpleHeaderBarModel for DetailsModel {
}
fn select_all(&self) {
- if let Some(songs) = self.songs_ref() {
- let songs: Vec = songs.iter().cloned().collect();
- self.dispatcher
- .dispatch(SelectionAction::Select(songs).into());
- }
+ let songs: Vec = self.song_list_model().collect();
+ self.dispatcher
+ .dispatch(SelectionAction::Select(songs).into());
}
}
diff --git a/src/app/components/details/release_details.rs b/src/app/components/details/release_details.rs
index fd46d752..4226a433 100644
--- a/src/app/components/details/release_details.rs
+++ b/src/app/components/details/release_details.rs
@@ -24,9 +24,6 @@ mod imp {
#[template_child]
pub tracks: TemplateChild,
- #[template_child]
- pub duration: TemplateChild,
-
#[template_child]
pub copyright: TemplateChild,
}
@@ -78,7 +75,6 @@ impl ReleaseDetailsWindow {
label: &str,
release_date: &str,
track_count: usize,
- duration: &str,
copyright: &str,
) {
let widget = self.widget();
@@ -90,7 +86,6 @@ impl ReleaseDetailsWindow {
widget.label.set_text(label);
widget.release.set_text(release_date);
widget.tracks.set_text(&track_count.to_string());
- widget.duration.set_text(duration);
widget.copyright.set_text(copyright);
}
}
diff --git a/src/app/components/details/release_details.ui b/src/app/components/details/release_details.ui
index 00745763..9f3cbee4 100644
--- a/src/app/components/details/release_details.ui
+++ b/src/app/components/details/release_details.ui
@@ -63,16 +63,6 @@
-
-
- Copyright
diff --git a/src/app/components/headerbar/component.rs b/src/app/components/headerbar/component.rs
index 4f6e2912..3aaaf699 100644
--- a/src/app/components/headerbar/component.rs
+++ b/src/app/components/headerbar/component.rs
@@ -248,11 +248,16 @@ impl StandardScreen
where
Model: HeaderBarModel + 'static,
{
- pub fn new(wrapped: impl ListenerComponent + 'static, model: Rc) -> Self {
+ pub fn new(
+ wrapped: impl ListenerComponent + 'static,
+ leaflet: &libadwaita::Leaflet,
+ model: Rc,
+ ) -> Self {
let widget = HeaderBarWidget::new();
common::bind_headerbar(&widget, &model);
+ widget.bind_to_leaflet(leaflet);
- let root = gtk::BoxBuilder::new()
+ let root = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
.build();
root.append(&widget);
diff --git a/src/app/components/headerbar/headerbar.ui b/src/app/components/headerbar/headerbar.ui
index f220d584..57238c61 100644
--- a/src/app/components/headerbar/headerbar.ui
+++ b/src/app/components/headerbar/headerbar.ui
@@ -34,6 +34,7 @@
0
+ 00
-
-
@@ -175,6 +155,7 @@
@VERSION@https://github.com/xou816/spot@AUTHORS@
+ @ARTISTS@@TRANSLATORS@dev.alextren.Spotmit-x11